diff --git a/composer.lock b/composer.lock index 99ada530..0a8a6a99 100644 --- a/composer.lock +++ b/composer.lock @@ -4,30 +4,30 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "468d26156a7c908d7932bac2791be589", + "content-hash": "f404ae21128813210c90625b666ab019", "packages": [ { "name": "brick/math", - "version": "0.10.2", + "version": "0.9.3", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f" + "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/459f2781e1a08d52ee56b0b1444086e038561e3f", - "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f", + "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae", + "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae", "shasum": "" }, "require": { "ext-json": "*", - "php": "^7.4 || ^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^9.0", - "vimeo/psalm": "4.25.0" + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0", + "vimeo/psalm": "4.9.2" }, "type": "library", "autoload": { @@ -52,15 +52,19 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.10.2" + "source": "https://github.com/brick/math/tree/0.9.3" }, "funding": [ { "url": "https://github.com/BenMorel", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/brick/math", + "type": "tidelift" } ], - "time": "2022-08-10T22:54:19+00:00" + "time": "2021-08-15T20:50:18+00:00" }, { "name": "clue/stream-filter", @@ -3449,20 +3453,20 @@ }, { "name": "psr/cache", - "version": "3.0.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", "shasum": "" }, "require": { - "php": ">=8.0.0" + "php": ">=5.3.0" }, "type": "library", "extra": { @@ -3482,7 +3486,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "homepage": "http://www.php-fig.org/" } ], "description": "Common interface for caching libraries", @@ -3492,9 +3496,9 @@ "psr-6" ], "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" + "source": "https://github.com/php-fig/cache/tree/master" }, - "time": "2021-02-03T23:26:27+00:00" + "time": "2016-08-06T20:24:11+00:00" }, { "name": "psr/container", @@ -3756,30 +3760,30 @@ }, { "name": "psr/log", - "version": "2.0.0", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { - "php": ">=8.0.0" + "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "src" + "Psr\\Log\\": "Psr/Log/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3800,9 +3804,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/2.0.0" + "source": "https://github.com/php-fig/log/tree/1.1.4" }, - "time": "2021-07-14T16:41:46+00:00" + "time": "2021-05-03T11:20:27+00:00" }, { "name": "psr/simple-cache", @@ -4056,23 +4060,25 @@ }, { "name": "ramsey/uuid", - "version": "4.6.0", + "version": "4.2.3", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "ad63bc700e7d021039e30ce464eba384c4a1d40f" + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/ad63bc700e7d021039e30ce464eba384c4a1d40f", - "reference": "ad63bc700e7d021039e30ce464eba384c4a1d40f", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10", + "brick/math": "^0.8 || ^0.9", "ext-json": "*", - "php": "^8.0", - "ramsey/collection": "^1.0" + "php": "^7.2 || ^8.0", + "ramsey/collection": "^1.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php80": "^1.14" }, "replace": { "rhumsaa/uuid": "self.version" @@ -4084,23 +4090,24 @@ "doctrine/annotations": "^1.8", "ergebnis/composer-normalize": "^2.15", "mockery/mockery": "^1.3", + "moontoast/math": "^1.1", "paragonie/random-lib": "^2", "php-mock/php-mock": "^2.2", "php-mock/php-mock-mockery": "^1.3", "php-parallel-lint/php-parallel-lint": "^1.1", "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.1", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", "phpunit/phpunit": "^8.5 || ^9", - "ramsey/composer-repl": "^1.4", - "slevomat/coding-standard": "^8.4", + "slevomat/coding-standard": "^7.0", "squizlabs/php_codesniffer": "^3.5", "vimeo/psalm": "^4.9" }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-ctype": "Enables faster processing of character classification using ctype functions.", "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", @@ -4108,6 +4115,9 @@ }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "4.x-dev" + }, "captainhook": { "force-install": true } @@ -4132,7 +4142,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.6.0" + "source": "https://github.com/ramsey/uuid/tree/4.2.3" }, "funding": [ { @@ -4144,7 +4154,7 @@ "type": "tidelift" } ], - "time": "2022-11-05T23:03:38+00:00" + "time": "2021-09-25T23:10:38+00:00" }, { "name": "swiftmailer/swiftmailer", @@ -4224,57 +4234,58 @@ }, { "name": "symfony/cache", - "version": "v6.1.7", + "version": "v5.4.15", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "ee5d5b88162684a1377706f9c25125e97685ee61" + "reference": "60e87188abbacd29ccde44d69c5392a33e888e98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/ee5d5b88162684a1377706f9c25125e97685ee61", - "reference": "ee5d5b88162684a1377706f9c25125e97685ee61", + "url": "https://api.github.com/repos/symfony/cache/zipball/60e87188abbacd29ccde44d69c5392a33e888e98", + "reference": "60e87188abbacd29ccde44d69c5392a33e888e98", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/cache": "^2.0|^3.0", + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^1.1.7|^2|^3", + "symfony/cache-contracts": "^1.1.7|^2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2|^3", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/var-exporter": "^4.4|^5.0|^6.0" }, "conflict": { "doctrine/dbal": "<2.13.1", - "symfony/dependency-injection": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/var-dumper": "<5.4" + "symfony/dependency-injection": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/var-dumper": "<4.4" }, "provide": { - "psr/cache-implementation": "2.0|3.0", - "psr/simple-cache-implementation": "1.0|2.0|3.0", - "symfony/cache-implementation": "1.1|2.0|3.0" + "psr/cache-implementation": "1.0|2.0", + "psr/simple-cache-implementation": "1.0|2.0", + "symfony/cache-implementation": "1.0|2.0" }, "require-dev": { "cache/integration-tests": "dev-master", + "doctrine/cache": "^1.6|^2.0", "doctrine/dbal": "^2.13.1|^3.0", "predis/predis": "^1.1", - "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/filesystem": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "psr/simple-cache": "^1.0|^2.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Cache\\": "" }, - "classmap": [ - "Traits/ValueWrapper.php" - ], "exclude-from-classmap": [ "/Tests/" ] @@ -4300,7 +4311,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.1.7" + "source": "https://github.com/symfony/cache/tree/v5.4.15" }, "funding": [ { @@ -4316,25 +4327,25 @@ "type": "tidelift" } ], - "time": "2022-10-28T16:23:08+00:00" + "time": "2022-10-27T07:55:40+00:00" }, { "name": "symfony/cache-contracts", - "version": "v3.1.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "2eab7fa459af6d75c6463e63e633b667a9b761d3" + "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/2eab7fa459af6d75c6463e63e633b667a9b761d3", - "reference": "2eab7fa459af6d75c6463e63e633b667a9b761d3", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", + "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/cache": "^3.0" + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0|^3.0" }, "suggest": { "symfony/cache-implementation": "" @@ -4342,7 +4353,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -4379,7 +4390,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2" }, "funding": [ { @@ -4395,7 +4406,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T11:15:52+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/console", @@ -4498,20 +4509,21 @@ }, { "name": "symfony/css-selector", - "version": "v6.1.3", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "0dd5e36b80e1de97f8f74ed7023ac2b837a36443" + "reference": "c1681789f059ab756001052164726ae88512ae3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/0dd5e36b80e1de97f8f74ed7023ac2b837a36443", - "reference": "0dd5e36b80e1de97f8f74ed7023ac2b837a36443", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/c1681789f059ab756001052164726ae88512ae3d", + "reference": "c1681789f059ab756001052164726ae88512ae3d", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -4543,7 +4555,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.1.3" + "source": "https://github.com/symfony/css-selector/tree/v5.4.11" }, "funding": [ { @@ -4559,29 +4571,29 @@ "type": "tidelift" } ], - "time": "2022-06-27T17:24:16+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.1.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918" + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", - "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -4610,7 +4622,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { @@ -4626,7 +4638,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T11:15:52+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/error-handler", @@ -4701,38 +4713,40 @@ }, { "name": "symfony/event-dispatcher", - "version": "v6.1.0", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347" + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a0449a7ad7daa0f7c0acd508259f80544ab5a347", - "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2|^3" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<4.4" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0|3.0" + "symfony/event-dispatcher-implementation": "2.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^5.4|^6.0" + "symfony/stopwatch": "^4.4|^5.0|^6.0" }, "suggest": { "symfony/dependency-injection": "", @@ -4764,7 +4778,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.1.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9" }, "funding": [ { @@ -4780,24 +4794,24 @@ "type": "tidelift" } ], - "time": "2022-05-05T16:51:07+00:00" + "time": "2022-05-05T16:45:39+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.1.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "02ff5eea2f453731cfbc6bc215e456b781480448" + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/02ff5eea2f453731cfbc6bc215e456b781480448", - "reference": "02ff5eea2f453731cfbc6bc215e456b781480448", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=7.2.5", "psr/event-dispatcher": "^1" }, "suggest": { @@ -4806,7 +4820,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -4843,7 +4857,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" }, "funding": [ { @@ -4859,7 +4873,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T11:15:52+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/finder", @@ -5198,21 +5212,23 @@ }, { "name": "symfony/options-resolver", - "version": "v6.1.0", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4" + "reference": "54f14e36aa73cb8f7261d7686691fd4d75ea2690" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a3016f5442e28386ded73c43a32a5b68586dd1c4", - "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/54f14e36aa73cb8f7261d7686691fd4d75ea2690", + "reference": "54f14e36aa73cb8f7261d7686691fd4d75ea2690", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -5245,7 +5261,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.1.0" + "source": "https://github.com/symfony/options-resolver/tree/v5.4.11" }, "funding": [ { @@ -5261,7 +5277,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T11:15:52+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/polyfill-ctype", @@ -6317,33 +6333,34 @@ }, { "name": "symfony/string", - "version": "v6.1.7", + "version": "v5.4.15", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "823f143370880efcbdfa2dbca946b3358c4707e5" + "reference": "571334ce9f687e3e6af72db4d3b2a9431e4fd9ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/823f143370880efcbdfa2dbca946b3358c4707e5", - "reference": "823f143370880efcbdfa2dbca946b3358c4707e5", + "url": "https://api.github.com/repos/symfony/string/zipball/571334ce9f687e3e6af72db4d3b2a9431e4fd9ed", + "reference": "571334ce9f687e3e6af72db4d3b2a9431e4fd9ed", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": ">=3.0" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/translation-contracts": "^2.0|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" }, "type": "library", "autoload": { @@ -6382,7 +6399,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.1.7" + "source": "https://github.com/symfony/string/tree/v5.4.15" }, "funding": [ { @@ -6398,51 +6415,52 @@ "type": "tidelift" } ], - "time": "2022-10-10T09:34:31+00:00" + "time": "2022-10-05T15:16:54+00:00" }, { "name": "symfony/translation", - "version": "v6.1.6", + "version": "v5.4.14", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "e6cd330e5a072518f88d65148f3f165541807494" + "reference": "f0ed07675863aa6e3939df8b1bc879450b585cab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/e6cd330e5a072518f88d65148f3f165541807494", - "reference": "e6cd330e5a072518f88d65148f3f165541807494", + "url": "https://api.github.com/repos/symfony/translation/zipball/f0ed07675863aa6e3939df8b1bc879450b585cab", + "reference": "f0ed07675863aa6e3939df8b1bc879450b585cab", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.3|^3.0" + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^2.3" }, "conflict": { - "symfony/config": "<5.4", - "symfony/console": "<5.4", - "symfony/dependency-injection": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/twig-bundle": "<5.4", - "symfony/yaml": "<5.4" + "symfony/config": "<4.4", + "symfony/console": "<5.3", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" }, "provide": { - "symfony/translation-implementation": "2.3|3.0" + "symfony/translation-implementation": "2.3" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", + "symfony/config": "^4.4|^5.0|^6.0", "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", + "symfony/dependency-injection": "^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", "symfony/http-client-contracts": "^1.1|^2.0|^3.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/intl": "^5.4|^6.0", + "symfony/http-kernel": "^5.0|^6.0", + "symfony/intl": "^4.4|^5.0|^6.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^5.4|^6.0", "symfony/service-contracts": "^1.1.2|^2|^3", - "symfony/yaml": "^5.4|^6.0" + "symfony/yaml": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log-implementation": "To use logging capability in translator", @@ -6478,7 +6496,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.1.6" + "source": "https://github.com/symfony/translation/tree/v5.4.14" }, "funding": [ { @@ -6494,24 +6512,24 @@ "type": "tidelift" } ], - "time": "2022-10-07T08:04:03+00:00" + "time": "2022-10-07T08:01:20+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.1.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "606be0f48e05116baef052f7f3abdb345c8e02cc" + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/606be0f48e05116baef052f7f3abdb345c8e02cc", - "reference": "606be0f48e05116baef052f7f3abdb345c8e02cc", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.2.5" }, "suggest": { "symfony/translation-implementation": "" @@ -6519,7 +6537,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -6529,10 +6547,7 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6559,7 +6574,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" }, "funding": [ { @@ -6575,7 +6590,7 @@ "type": "tidelift" } ], - "time": "2022-06-27T17:24:16+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/var-dumper", @@ -6668,23 +6683,24 @@ }, { "name": "symfony/var-exporter", - "version": "v6.1.3", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "b49350f45cebbba6e5286485264b912f2bcfc9ef" + "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b49350f45cebbba6e5286485264b912f2bcfc9ef", - "reference": "b49350f45cebbba6e5286485264b912f2bcfc9ef", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8fc03ee75eeece3d9be1ef47d26d79bea1afb340", + "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "symfony/var-dumper": "^5.4|^6.0" + "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0" }, "type": "library", "autoload": { @@ -6720,7 +6736,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.1.3" + "source": "https://github.com/symfony/var-exporter/tree/v5.4.10" }, "funding": [ { @@ -6736,7 +6752,7 @@ "type": "tidelift" } ], - "time": "2022-07-04T16:01:56+00:00" + "time": "2022-05-27T12:56:18+00:00" }, { "name": "symfony/yaml", @@ -7156,32 +7172,30 @@ }, { "name": "fzaninotto/faker", - "version": "v1.5.0", + "version": "v1.9.2", "source": { "type": "git", "url": "https://github.com/fzaninotto/Faker.git", - "reference": "d0190b156bcca848d401fb80f31f504f37141c8d" + "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d", - "reference": "d0190b156bcca848d401fb80f31f504f37141c8d", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/848d8125239d7dbf8ab25cb7f054f1a630e68c2e", + "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.5" - }, - "suggest": { - "ext-intl": "*" + "ext-intl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7", + "squizlabs/php_codesniffer": "^2.9.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.5.x-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -7206,10 +7220,10 @@ ], "support": { "issues": "https://github.com/fzaninotto/Faker/issues", - "source": "https://github.com/fzaninotto/Faker/tree/master" + "source": "https://github.com/fzaninotto/Faker/tree/v1.9.2" }, "abandoned": true, - "time": "2015-05-29T06:29:14+00:00" + "time": "2020-12-11T09:56:16+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -9007,7 +9021,8 @@ "prefer-lowest": false, "platform": { "php": ">=7.3.0", - "ext-json": "*" + "ext-json": "*", + "ext-intl": "*" }, "platform-dev": [], "plugin-api-version": "2.3.0" diff --git a/vendor/autoload.php b/vendor/autoload.php index 4b3995f2..67857639 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -3,10 +3,23 @@ // autoload.php @generated by Composer if (PHP_VERSION_ID < 50600) { - echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; - exit(1); + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, $err); + } elseif (!headers_sent()) { + echo $err; + } + } + trigger_error( + $err, + E_USER_ERROR + ); } require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit4b6fb9210a1ea37c2db27b8ff53a1ecf::getLoader(); +return ComposerAutoloaderInitb2555e5ff7197b9e020da74bbd3b7cfa::getLoader(); diff --git a/vendor/brick/math/CHANGELOG.md b/vendor/brick/math/CHANGELOG.md index c5c5893b..03c3d824 100644 --- a/vendor/brick/math/CHANGELOG.md +++ b/vendor/brick/math/CHANGELOG.md @@ -2,29 +2,11 @@ All notable changes to this project will be documented in this file. -## [0.10.2](https://github.com/brick/math/releases/tag/0.10.2) - 2022-08-11 - -👌 **Improvements** - -- `BigRational::toFloat()` now simplifies the fraction before performing division (#73) thanks to @olsavmic - -## [0.10.1](https://github.com/brick/math/releases/tag/0.10.1) - 2022-08-02 - -✨ **New features** - -- `BigInteger::gcdMultiple()` returns the GCD of multiple `BigInteger` numbers - -## [0.10.0](https://github.com/brick/math/releases/tag/0.10.0) - 2022-06-18 - -💥 **Breaking changes** - -- Minimum PHP version is now 7.4 - ## [0.9.3](https://github.com/brick/math/releases/tag/0.9.3) - 2021-08-15 🚀 **Compatibility with PHP 8.1** -- Support for custom object serialization; this removes a warning on PHP 8.1 due to the `Serializable` interface being deprecated (#60) thanks @TRowbotham +- Support for custom object serialization; this removes a warning on PHP 8.1 due to the `Serializable` interface being deprecated (thanks @TRowbotham) ## [0.9.2](https://github.com/brick/math/releases/tag/0.9.2) - 2021-01-20 @@ -34,7 +16,7 @@ All notable changes to this project will be documented in this file. ## [0.9.1](https://github.com/brick/math/releases/tag/0.9.1) - 2020-08-19 -✨ **New features** +✨ New features - `BigInteger::not()` returns the bitwise `NOT` value diff --git a/vendor/brick/math/SECURITY.md b/vendor/brick/math/SECURITY.md new file mode 100644 index 00000000..cc8289bb --- /dev/null +++ b/vendor/brick/math/SECURITY.md @@ -0,0 +1,17 @@ +# Security Policy + +## Supported Versions + +Only the last two release streams are supported. + +| Version | Supported | +| ------- | ------------------ | +| 0.9.x | :white_check_mark: | +| 0.8.x | :white_check_mark: | +| < 0.8 | :x: | + +## 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/brick/math/composer.json b/vendor/brick/math/composer.json index a8124e92..ec196632 100644 --- a/vendor/brick/math/composer.json +++ b/vendor/brick/math/composer.json @@ -14,13 +14,13 @@ ], "license": "MIT", "require": { - "php": "^7.4 || ^8.0", + "php": "^7.1 || ^8.0", "ext-json": "*" }, "require-dev": { - "phpunit/phpunit": "^9.0", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0", "php-coveralls/php-coveralls": "^2.2", - "vimeo/psalm": "4.25.0" + "vimeo/psalm": "4.9.2" }, "autoload": { "psr-4": { diff --git a/vendor/brick/math/src/BigDecimal.php b/vendor/brick/math/src/BigDecimal.php index fd2babb8..78246500 100644 --- a/vendor/brick/math/src/BigDecimal.php +++ b/vendor/brick/math/src/BigDecimal.php @@ -22,15 +22,19 @@ final class BigDecimal extends BigNumber * This is a string of digits with an optional leading minus sign. * No leading zero must be present. * No leading minus sign must be present if the value is 0. + * + * @var string */ - private string $value; + private $value; /** * The scale (number of digits after the decimal point) of this decimal number. * * This must be zero or more. + * + * @var int */ - private int $scale; + private $scale; /** * Protected constructor. Use a factory method to obtain an instance. diff --git a/vendor/brick/math/src/BigInteger.php b/vendor/brick/math/src/BigInteger.php index f58e1c59..f213fbed 100644 --- a/vendor/brick/math/src/BigInteger.php +++ b/vendor/brick/math/src/BigInteger.php @@ -26,8 +26,10 @@ final class BigInteger extends BigNumber * * No leading zeros must be present. * No leading minus sign must be present if the number is zero. + * + * @var string */ - private string $value; + private $value; /** * Protected constructor. Use a factory method to obtain an instance. @@ -359,21 +361,6 @@ final class BigInteger extends BigNumber return $ten; } - public static function gcdMultiple(BigInteger $a, BigInteger ...$n): BigInteger - { - $result = $a; - - foreach ($n as $next) { - $result = $result->gcd($next); - - if ($result->isEqualTo(1)) { - return $result; - } - } - - return $result; - } - /** * Returns the sum of this number and the given one. * diff --git a/vendor/brick/math/src/BigNumber.php b/vendor/brick/math/src/BigNumber.php index 44f26e35..38c8c554 100644 --- a/vendor/brick/math/src/BigNumber.php +++ b/vendor/brick/math/src/BigNumber.php @@ -81,7 +81,9 @@ abstract class BigNumber implements \Serializable, \JsonSerializable $throw(); } - $getMatch = static fn(string $value): ?string => (($matches[$value] ?? '') !== '') ? $matches[$value] : null; + $getMatch = static function(string $value) use ($matches) : ?string { + return isset($matches[$value]) && $matches[$value] !== '' ? $matches[$value] : null; + }; $sign = $getMatch('sign'); $numerator = $getMatch('numerator'); diff --git a/vendor/brick/math/src/BigRational.php b/vendor/brick/math/src/BigRational.php index 46257814..bee094f7 100644 --- a/vendor/brick/math/src/BigRational.php +++ b/vendor/brick/math/src/BigRational.php @@ -20,13 +20,17 @@ final class BigRational extends BigNumber { /** * The numerator. + * + * @var BigInteger */ - private BigInteger $numerator; + private $numerator; /** * The denominator. Always strictly positive. + * + * @var BigInteger */ - private BigInteger $denominator; + private $denominator; /** * Protected constructor. Use a factory method to obtain an instance. @@ -429,8 +433,7 @@ final class BigRational extends BigNumber */ public function toFloat() : float { - $simplified = $this->simplified(); - return $simplified->numerator->toFloat() / $simplified->denominator->toFloat(); + return $this->numerator->toFloat() / $this->denominator->toFloat(); } /** diff --git a/vendor/brick/math/src/Internal/Calculator.php b/vendor/brick/math/src/Internal/Calculator.php index 99bebbe5..a6eac799 100644 --- a/vendor/brick/math/src/Internal/Calculator.php +++ b/vendor/brick/math/src/Internal/Calculator.php @@ -34,8 +34,10 @@ abstract class Calculator /** * The Calculator instance in use. + * + * @var Calculator|null */ - private static ?Calculator $instance = null; + private static $instance; /** * Sets the Calculator instance to use. @@ -232,7 +234,7 @@ abstract class Calculator * @param string $a The dividend. * @param string $b The divisor, must not be zero. * - * @return array{string, string} An array containing the quotient and remainder. + * @return string[] An array containing the quotient and remainder. */ abstract public function divQR(string $a, string $b) : array; @@ -281,7 +283,9 @@ abstract class Calculator $modVal = $this->mod($x, $m); } - [$g, $x] = $this->gcdExtended($modVal, $m); + $x = '0'; + $y = '0'; + $g = $this->gcdExtended($modVal, $m, $x, $y); if ($g !== '1') { return null; @@ -325,21 +329,24 @@ abstract class Calculator return $this->gcd($b, $this->divR($a, $b)); } - /** - * @return array{string, string, string} GCD, X, Y - */ - private function gcdExtended(string $a, string $b) : array + private function gcdExtended(string $a, string $b, string &$x, string &$y) : string { if ($a === '0') { - return [$b, '0', '1']; + $x = '0'; + $y = '1'; + + return $b; } - [$gcd, $x1, $y1] = $this->gcdExtended($this->mod($b, $a), $a); + $x1 = '0'; + $y1 = '0'; + + $gcd = $this->gcdExtended($this->mod($b, $a), $a, $x1, $y1); $x = $this->sub($y1, $this->mul($this->divQ($b, $a), $x1)); $y = $x1; - return [$gcd, $x, $y]; + return $gcd; } /** @@ -486,8 +493,6 @@ abstract class Calculator * * @throws \InvalidArgumentException If the rounding mode is invalid. * @throws RoundingNecessaryException If RoundingMode::UNNECESSARY is provided but rounding is necessary. - * - * @psalm-suppress ImpureFunctionCall */ final public function divRound(string $a, string $b, int $roundingMode) : string { @@ -611,9 +616,9 @@ abstract class Calculator /** * Performs a bitwise operation on a decimal number. * - * @param 'and'|'or'|'xor' $operator The operator to use. - * @param string $a The left operand. - * @param string $b The right operand. + * @param string $operator The operator to use, must be "and", "or" or "xor". + * @param string $a The left operand. + * @param string $b The right operand. * * @return string */ diff --git a/vendor/brick/math/src/Internal/Calculator/BcMathCalculator.php b/vendor/brick/math/src/Internal/Calculator/BcMathCalculator.php index 34078687..6632b378 100644 --- a/vendor/brick/math/src/Internal/Calculator/BcMathCalculator.php +++ b/vendor/brick/math/src/Internal/Calculator/BcMathCalculator.php @@ -94,6 +94,9 @@ class BcMathCalculator extends Calculator /** * {@inheritdoc} + * + * @psalm-suppress InvalidNullableReturnType + * @psalm-suppress NullableReturnStatement */ public function modPow(string $base, string $exp, string $mod) : string { @@ -102,6 +105,9 @@ class BcMathCalculator extends Calculator /** * {@inheritDoc} + * + * @psalm-suppress NullableReturnStatement + * @psalm-suppress InvalidNullableReturnType */ public function sqrt(string $n) : string { diff --git a/vendor/brick/math/src/Internal/Calculator/NativeCalculator.php b/vendor/brick/math/src/Internal/Calculator/NativeCalculator.php index a7eb23b9..020a6338 100644 --- a/vendor/brick/math/src/Internal/Calculator/NativeCalculator.php +++ b/vendor/brick/math/src/Internal/Calculator/NativeCalculator.php @@ -22,8 +22,10 @@ class NativeCalculator extends Calculator * For addition, it is assumed that an extra digit can hold a carry (1) without overflowing. * Example: 32-bit: max number 1,999,999,999 (9 digits + carry) * 64-bit: max number 1,999,999,999,999,999,999 (18 digits + carry) + * + * @var int */ - private int $maxDigits; + private $maxDigits; /** * Class constructor. diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 4132010f..c03e89d2 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -43,6 +43,18 @@ return array( 'App\\SettingGroup' => $baseDir . '/app/SettingGroup.php', 'App\\SettingUser' => $baseDir . '/app/SettingUser.php', 'App\\SupportedApps' => $baseDir . '/app/SupportedApps.php', + 'App\\SupportedApps\\AVMFritzbox\\AVMFritzbox' => $baseDir . '/app/SupportedApps/AVMFritzbox/AVMFritzbox.php', + 'App\\SupportedApps\\Ackee\\Ackee' => $baseDir . '/app/SupportedApps/Ackee/Ackee.php', + 'App\\SupportedApps\\Airsonic\\Airsonic' => $baseDir . '/app/SupportedApps/Airsonic/Airsonic.php', + 'App\\SupportedApps\\Alertmanager\\Alertmanager' => $baseDir . '/app/SupportedApps/Alertmanager/Alertmanager.php', + 'App\\SupportedApps\\ArchiSteamFarm\\ArchiSteamFarm' => $baseDir . '/app/SupportedApps/ArchiSteamFarm/ArchiSteamFarm.php', + 'App\\SupportedApps\\ArchiveBox\\ArchiveBox' => $baseDir . '/app/SupportedApps/ArchiveBox/ArchiveBox.php', + 'App\\SupportedApps\\ArgoCD\\ArgoCD' => $baseDir . '/app/SupportedApps/ArgoCD/ArgoCD.php', + 'App\\SupportedApps\\AriaNg\\AriaNg' => $baseDir . '/app/SupportedApps/AriaNg/AriaNg.php', + 'App\\SupportedApps\\Artifactory\\Artifactory' => $baseDir . '/app/SupportedApps/Artifactory/Artifactory.php', + 'App\\SupportedApps\\Pihole\\Pihole' => $baseDir . '/app/SupportedApps/Pihole/Pihole.php', + 'App\\SupportedApps\\XP900\\XP900' => $baseDir . '/app/SupportedApps/XP900/XP900.php', + 'App\\SupportedApps\\authentik\\authentik' => $baseDir . '/app/SupportedApps/authentik/authentik.php', 'App\\User' => $baseDir . '/app/User.php', 'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Brick\\Math\\BigDecimal' => $vendorDir . '/brick/math/src/BigDecimal.php', @@ -488,7 +500,11 @@ return array( 'Facade\\Ignition\\Views\\Concerns\\CollectsViewExceptions' => $vendorDir . '/facade/ignition/src/Views/Concerns/CollectsViewExceptions.php', 'Facade\\Ignition\\Views\\Engines\\CompilerEngine' => $vendorDir . '/facade/ignition/src/Views/Engines/CompilerEngine.php', 'Facade\\Ignition\\Views\\Engines\\PhpEngine' => $vendorDir . '/facade/ignition/src/Views/Engines/PhpEngine.php', + 'Faker\\Calculator\\Ean' => $vendorDir . '/fzaninotto/faker/src/Faker/Calculator/Ean.php', + 'Faker\\Calculator\\Iban' => $vendorDir . '/fzaninotto/faker/src/Faker/Calculator/Iban.php', + 'Faker\\Calculator\\Inn' => $vendorDir . '/fzaninotto/faker/src/Faker/Calculator/Inn.php', 'Faker\\Calculator\\Luhn' => $vendorDir . '/fzaninotto/faker/src/Faker/Calculator/Luhn.php', + 'Faker\\Calculator\\TCNo' => $vendorDir . '/fzaninotto/faker/src/Faker/Calculator/TCNo.php', 'Faker\\DefaultGenerator' => $vendorDir . '/fzaninotto/faker/src/Faker/DefaultGenerator.php', 'Faker\\Documentor' => $vendorDir . '/fzaninotto/faker/src/Faker/Documentor.php', 'Faker\\Factory' => $vendorDir . '/fzaninotto/faker/src/Faker/Factory.php', @@ -503,9 +519,15 @@ return array( 'Faker\\ORM\\Mandango\\ColumnTypeGuesser' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Mandango/ColumnTypeGuesser.php', 'Faker\\ORM\\Mandango\\EntityPopulator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Mandango/EntityPopulator.php', 'Faker\\ORM\\Mandango\\Populator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Mandango/Populator.php', + 'Faker\\ORM\\Propel2\\ColumnTypeGuesser' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Propel2/ColumnTypeGuesser.php', + 'Faker\\ORM\\Propel2\\EntityPopulator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Propel2/EntityPopulator.php', + 'Faker\\ORM\\Propel2\\Populator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Propel2/Populator.php', 'Faker\\ORM\\Propel\\ColumnTypeGuesser' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php', 'Faker\\ORM\\Propel\\EntityPopulator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Propel/EntityPopulator.php', 'Faker\\ORM\\Propel\\Populator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Propel/Populator.php', + 'Faker\\ORM\\Spot\\ColumnTypeGuesser' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Spot/ColumnTypeGuesser.php', + 'Faker\\ORM\\Spot\\EntityPopulator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Spot/EntityPopulator.php', + 'Faker\\ORM\\Spot\\Populator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Spot/Populator.php', 'Faker\\Provider\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Address.php', 'Faker\\Provider\\Barcode' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Barcode.php', 'Faker\\Provider\\Base' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Base.php', @@ -514,6 +536,7 @@ return array( 'Faker\\Provider\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Company.php', 'Faker\\Provider\\DateTime' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/DateTime.php', 'Faker\\Provider\\File' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/File.php', + 'Faker\\Provider\\HtmlLorem' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/HtmlLorem.php', 'Faker\\Provider\\Image' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Image.php', 'Faker\\Provider\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Internet.php', 'Faker\\Provider\\Lorem' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Lorem.php', @@ -529,8 +552,14 @@ return array( 'Faker\\Provider\\ar_JO\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_JO/Internet.php', 'Faker\\Provider\\ar_JO\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_JO/Person.php', 'Faker\\Provider\\ar_JO\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_JO/Text.php', + 'Faker\\Provider\\ar_SA\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Address.php', + 'Faker\\Provider\\ar_SA\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Color.php', + 'Faker\\Provider\\ar_SA\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Company.php', + 'Faker\\Provider\\ar_SA\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Internet.php', + 'Faker\\Provider\\ar_SA\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Payment.php', + 'Faker\\Provider\\ar_SA\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Person.php', + 'Faker\\Provider\\ar_SA\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Text.php', 'Faker\\Provider\\at_AT\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/at_AT/Payment.php', - 'Faker\\Provider\\be_BE\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/be_BE/Payment.php', 'Faker\\Provider\\bg_BG\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/bg_BG/Internet.php', 'Faker\\Provider\\bg_BG\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/bg_BG/Payment.php', 'Faker\\Provider\\bg_BG\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/bg_BG/Person.php', @@ -560,6 +589,14 @@ return array( 'Faker\\Provider\\de_AT\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_AT/Payment.php', 'Faker\\Provider\\de_AT\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_AT/Person.php', 'Faker\\Provider\\de_AT\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_AT/PhoneNumber.php', + 'Faker\\Provider\\de_AT\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_AT/Text.php', + 'Faker\\Provider\\de_CH\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_CH/Address.php', + 'Faker\\Provider\\de_CH\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_CH/Company.php', + 'Faker\\Provider\\de_CH\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_CH/Internet.php', + 'Faker\\Provider\\de_CH\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_CH/Payment.php', + 'Faker\\Provider\\de_CH\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_CH/Person.php', + 'Faker\\Provider\\de_CH\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_CH/PhoneNumber.php', + 'Faker\\Provider\\de_CH\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_CH/Text.php', 'Faker\\Provider\\de_DE\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_DE/Address.php', 'Faker\\Provider\\de_DE\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_DE/Company.php', 'Faker\\Provider\\de_DE\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_DE/Internet.php', @@ -567,10 +604,18 @@ return array( 'Faker\\Provider\\de_DE\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_DE/Person.php', 'Faker\\Provider\\de_DE\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_DE/PhoneNumber.php', 'Faker\\Provider\\de_DE\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_DE/Text.php', + 'Faker\\Provider\\el_CY\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_CY/Address.php', + 'Faker\\Provider\\el_CY\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_CY/Company.php', + 'Faker\\Provider\\el_CY\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_CY/Internet.php', + 'Faker\\Provider\\el_CY\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_CY/Payment.php', + 'Faker\\Provider\\el_CY\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_CY/Person.php', + 'Faker\\Provider\\el_CY\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_CY/PhoneNumber.php', 'Faker\\Provider\\el_GR\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_GR/Address.php', + 'Faker\\Provider\\el_GR\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_GR/Company.php', 'Faker\\Provider\\el_GR\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_GR/Payment.php', 'Faker\\Provider\\el_GR\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_GR/Person.php', 'Faker\\Provider\\el_GR\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_GR/PhoneNumber.php', + 'Faker\\Provider\\el_GR\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_GR/Text.php', 'Faker\\Provider\\en_AU\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_AU/Address.php', 'Faker\\Provider\\en_AU\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_AU/Internet.php', 'Faker\\Provider\\en_AU\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_AU/PhoneNumber.php', @@ -581,20 +626,36 @@ return array( 'Faker\\Provider\\en_GB\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_GB/Payment.php', 'Faker\\Provider\\en_GB\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_GB/Person.php', 'Faker\\Provider\\en_GB\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_GB/PhoneNumber.php', + 'Faker\\Provider\\en_HK\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_HK/Address.php', + 'Faker\\Provider\\en_HK\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_HK/Internet.php', + 'Faker\\Provider\\en_HK\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_HK/PhoneNumber.php', + 'Faker\\Provider\\en_IN\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_IN/Address.php', + 'Faker\\Provider\\en_IN\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_IN/Internet.php', + 'Faker\\Provider\\en_IN\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_IN/Person.php', + 'Faker\\Provider\\en_IN\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_IN/PhoneNumber.php', + 'Faker\\Provider\\en_NG\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_NG/Address.php', + 'Faker\\Provider\\en_NG\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_NG/Internet.php', + 'Faker\\Provider\\en_NG\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_NG/Person.php', + 'Faker\\Provider\\en_NG\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_NG/PhoneNumber.php', 'Faker\\Provider\\en_NZ\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_NZ/Address.php', 'Faker\\Provider\\en_NZ\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_NZ/Internet.php', 'Faker\\Provider\\en_NZ\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_NZ/PhoneNumber.php', 'Faker\\Provider\\en_PH\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_PH/Address.php', + 'Faker\\Provider\\en_PH\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_PH/PhoneNumber.php', + 'Faker\\Provider\\en_SG\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_SG/Address.php', + 'Faker\\Provider\\en_SG\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_SG/PhoneNumber.php', 'Faker\\Provider\\en_UG\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php', 'Faker\\Provider\\en_UG\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_UG/Internet.php', 'Faker\\Provider\\en_UG\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_UG/Person.php', 'Faker\\Provider\\en_UG\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_UG/PhoneNumber.php', 'Faker\\Provider\\en_US\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_US/Address.php', 'Faker\\Provider\\en_US\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_US/Company.php', + 'Faker\\Provider\\en_US\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_US/Payment.php', 'Faker\\Provider\\en_US\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_US/Person.php', 'Faker\\Provider\\en_US\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_US/PhoneNumber.php', 'Faker\\Provider\\en_US\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_US/Text.php', 'Faker\\Provider\\en_ZA\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_ZA/Address.php', + 'Faker\\Provider\\en_ZA\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_ZA/Company.php', 'Faker\\Provider\\en_ZA\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_ZA/Internet.php', 'Faker\\Provider\\en_ZA\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_ZA/Person.php', 'Faker\\Provider\\en_ZA\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_ZA/PhoneNumber.php', @@ -603,11 +664,13 @@ return array( 'Faker\\Provider\\es_AR\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_AR/Person.php', 'Faker\\Provider\\es_AR\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_AR/PhoneNumber.php', 'Faker\\Provider\\es_ES\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_ES/Address.php', + 'Faker\\Provider\\es_ES\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_ES/Color.php', 'Faker\\Provider\\es_ES\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_ES/Company.php', 'Faker\\Provider\\es_ES\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_ES/Internet.php', 'Faker\\Provider\\es_ES\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_ES/Payment.php', 'Faker\\Provider\\es_ES\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_ES/Person.php', 'Faker\\Provider\\es_ES\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_ES/PhoneNumber.php', + 'Faker\\Provider\\es_ES\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_ES/Text.php', 'Faker\\Provider\\es_PE\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_PE/Address.php', 'Faker\\Provider\\es_PE\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_PE/Company.php', 'Faker\\Provider\\es_PE\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_PE/Person.php', @@ -617,12 +680,17 @@ return array( 'Faker\\Provider\\es_VE\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_VE/Internet.php', 'Faker\\Provider\\es_VE\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_VE/Person.php', 'Faker\\Provider\\es_VE\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_VE/PhoneNumber.php', + 'Faker\\Provider\\et_EE\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/et_EE/Person.php', + 'Faker\\Provider\\fa_IR\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Address.php', + 'Faker\\Provider\\fa_IR\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Company.php', 'Faker\\Provider\\fa_IR\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Internet.php', 'Faker\\Provider\\fa_IR\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Person.php', + 'Faker\\Provider\\fa_IR\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fa_IR/PhoneNumber.php', 'Faker\\Provider\\fa_IR\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Text.php', 'Faker\\Provider\\fi_FI\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Address.php', 'Faker\\Provider\\fi_FI\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Company.php', 'Faker\\Provider\\fi_FI\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Internet.php', + 'Faker\\Provider\\fi_FI\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Payment.php', 'Faker\\Provider\\fi_FI\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Person.php', 'Faker\\Provider\\fi_FI\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fi_FI/PhoneNumber.php', 'Faker\\Provider\\fr_BE\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_BE/Address.php', @@ -632,7 +700,16 @@ return array( 'Faker\\Provider\\fr_BE\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_BE/Person.php', 'Faker\\Provider\\fr_BE\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_BE/PhoneNumber.php', 'Faker\\Provider\\fr_CA\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CA/Address.php', + 'Faker\\Provider\\fr_CA\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CA/Company.php', 'Faker\\Provider\\fr_CA\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CA/Person.php', + 'Faker\\Provider\\fr_CA\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CA/Text.php', + 'Faker\\Provider\\fr_CH\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Address.php', + 'Faker\\Provider\\fr_CH\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Company.php', + 'Faker\\Provider\\fr_CH\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Internet.php', + 'Faker\\Provider\\fr_CH\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Payment.php', + 'Faker\\Provider\\fr_CH\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Person.php', + 'Faker\\Provider\\fr_CH\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CH/PhoneNumber.php', + 'Faker\\Provider\\fr_CH\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Text.php', 'Faker\\Provider\\fr_FR\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Address.php', 'Faker\\Provider\\fr_FR\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Company.php', 'Faker\\Provider\\fr_FR\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Internet.php', @@ -640,17 +717,30 @@ return array( 'Faker\\Provider\\fr_FR\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Person.php', 'Faker\\Provider\\fr_FR\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_FR/PhoneNumber.php', 'Faker\\Provider\\fr_FR\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Text.php', + 'Faker\\Provider\\he_IL\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/he_IL/Address.php', + 'Faker\\Provider\\he_IL\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/he_IL/Company.php', + 'Faker\\Provider\\he_IL\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/he_IL/Payment.php', + 'Faker\\Provider\\he_IL\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/he_IL/Person.php', + 'Faker\\Provider\\he_IL\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/he_IL/PhoneNumber.php', + 'Faker\\Provider\\hr_HR\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hr_HR/Address.php', + 'Faker\\Provider\\hr_HR\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hr_HR/Company.php', + 'Faker\\Provider\\hr_HR\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hr_HR/Payment.php', + 'Faker\\Provider\\hr_HR\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hr_HR/Person.php', + 'Faker\\Provider\\hr_HR\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hr_HR/PhoneNumber.php', 'Faker\\Provider\\hu_HU\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Address.php', 'Faker\\Provider\\hu_HU\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Company.php', + 'Faker\\Provider\\hu_HU\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Payment.php', 'Faker\\Provider\\hu_HU\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Person.php', 'Faker\\Provider\\hu_HU\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hu_HU/PhoneNumber.php', 'Faker\\Provider\\hu_HU\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Text.php', 'Faker\\Provider\\hy_AM\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Address.php', + 'Faker\\Provider\\hy_AM\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Color.php', 'Faker\\Provider\\hy_AM\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Company.php', 'Faker\\Provider\\hy_AM\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Internet.php', 'Faker\\Provider\\hy_AM\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Person.php', 'Faker\\Provider\\hy_AM\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hy_AM/PhoneNumber.php', 'Faker\\Provider\\id_ID\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/id_ID/Address.php', + 'Faker\\Provider\\id_ID\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/id_ID/Color.php', 'Faker\\Provider\\id_ID\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/id_ID/Company.php', 'Faker\\Provider\\id_ID\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/id_ID/Internet.php', 'Faker\\Provider\\id_ID\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/id_ID/Person.php', @@ -661,6 +751,13 @@ return array( 'Faker\\Provider\\is_IS\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/is_IS/Payment.php', 'Faker\\Provider\\is_IS\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/is_IS/Person.php', 'Faker\\Provider\\is_IS\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/is_IS/PhoneNumber.php', + 'Faker\\Provider\\it_CH\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_CH/Address.php', + 'Faker\\Provider\\it_CH\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_CH/Company.php', + 'Faker\\Provider\\it_CH\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_CH/Internet.php', + 'Faker\\Provider\\it_CH\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_CH/Payment.php', + 'Faker\\Provider\\it_CH\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_CH/Person.php', + 'Faker\\Provider\\it_CH\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_CH/PhoneNumber.php', + 'Faker\\Provider\\it_CH\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_CH/Text.php', 'Faker\\Provider\\it_IT\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_IT/Address.php', 'Faker\\Provider\\it_IT\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_IT/Company.php', 'Faker\\Provider\\it_IT\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_IT/Internet.php', @@ -673,7 +770,15 @@ return array( 'Faker\\Provider\\ja_JP\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ja_JP/Internet.php', 'Faker\\Provider\\ja_JP\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ja_JP/Person.php', 'Faker\\Provider\\ja_JP\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ja_JP/PhoneNumber.php', + 'Faker\\Provider\\ja_JP\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ja_JP/Text.php', + 'Faker\\Provider\\ka_GE\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Address.php', + 'Faker\\Provider\\ka_GE\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Color.php', + 'Faker\\Provider\\ka_GE\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Company.php', + 'Faker\\Provider\\ka_GE\\DateTime' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/DateTime.php', + 'Faker\\Provider\\ka_GE\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Internet.php', + 'Faker\\Provider\\ka_GE\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Payment.php', 'Faker\\Provider\\ka_GE\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Person.php', + 'Faker\\Provider\\ka_GE\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/PhoneNumber.php', 'Faker\\Provider\\ka_GE\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Text.php', 'Faker\\Provider\\kk_KZ\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Address.php', 'Faker\\Provider\\kk_KZ\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Color.php', @@ -688,7 +793,15 @@ return array( 'Faker\\Provider\\ko_KR\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ko_KR/Internet.php', 'Faker\\Provider\\ko_KR\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ko_KR/Person.php', 'Faker\\Provider\\ko_KR\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ko_KR/PhoneNumber.php', + 'Faker\\Provider\\ko_KR\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ko_KR/Text.php', + 'Faker\\Provider\\lt_LT\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Address.php', + 'Faker\\Provider\\lt_LT\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Company.php', + 'Faker\\Provider\\lt_LT\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Internet.php', + 'Faker\\Provider\\lt_LT\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Payment.php', + 'Faker\\Provider\\lt_LT\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Person.php', + 'Faker\\Provider\\lt_LT\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lt_LT/PhoneNumber.php', 'Faker\\Provider\\lv_LV\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Address.php', + 'Faker\\Provider\\lv_LV\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Color.php', 'Faker\\Provider\\lv_LV\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Internet.php', 'Faker\\Provider\\lv_LV\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Payment.php', 'Faker\\Provider\\lv_LV\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Person.php', @@ -698,6 +811,19 @@ return array( 'Faker\\Provider\\me_ME\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/me_ME/Payment.php', 'Faker\\Provider\\me_ME\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/me_ME/Person.php', 'Faker\\Provider\\me_ME\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/me_ME/PhoneNumber.php', + 'Faker\\Provider\\mn_MN\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/mn_MN/Person.php', + 'Faker\\Provider\\mn_MN\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/mn_MN/PhoneNumber.php', + 'Faker\\Provider\\ms_MY\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Address.php', + 'Faker\\Provider\\ms_MY\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Company.php', + 'Faker\\Provider\\ms_MY\\Miscellaneous' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Miscellaneous.php', + 'Faker\\Provider\\ms_MY\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Payment.php', + 'Faker\\Provider\\ms_MY\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Person.php', + 'Faker\\Provider\\ms_MY\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ms_MY/PhoneNumber.php', + 'Faker\\Provider\\nb_NO\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nb_NO/Address.php', + 'Faker\\Provider\\nb_NO\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nb_NO/Company.php', + 'Faker\\Provider\\nb_NO\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nb_NO/Payment.php', + 'Faker\\Provider\\nb_NO\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nb_NO/Person.php', + 'Faker\\Provider\\nb_NO\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nb_NO/PhoneNumber.php', 'Faker\\Provider\\ne_NP\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ne_NP/Address.php', 'Faker\\Provider\\ne_NP\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ne_NP/Internet.php', 'Faker\\Provider\\ne_NP\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ne_NP/Person.php', @@ -708,6 +834,7 @@ return array( 'Faker\\Provider\\nl_BE\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_BE/Payment.php', 'Faker\\Provider\\nl_BE\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_BE/Person.php', 'Faker\\Provider\\nl_BE\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_BE/PhoneNumber.php', + 'Faker\\Provider\\nl_BE\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_BE/Text.php', 'Faker\\Provider\\nl_NL\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Address.php', 'Faker\\Provider\\nl_NL\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Color.php', 'Faker\\Provider\\nl_NL\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Company.php', @@ -715,10 +842,7 @@ return array( 'Faker\\Provider\\nl_NL\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Payment.php', 'Faker\\Provider\\nl_NL\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Person.php', 'Faker\\Provider\\nl_NL\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_NL/PhoneNumber.php', - 'Faker\\Provider\\no_NO\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/no_NO/Address.php', - 'Faker\\Provider\\no_NO\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/no_NO/Company.php', - 'Faker\\Provider\\no_NO\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/no_NO/Person.php', - 'Faker\\Provider\\no_NO\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/no_NO/PhoneNumber.php', + 'Faker\\Provider\\nl_NL\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Text.php', 'Faker\\Provider\\pl_PL\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Address.php', 'Faker\\Provider\\pl_PL\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Company.php', 'Faker\\Provider\\pl_PL\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Internet.php', @@ -733,15 +857,21 @@ return array( 'Faker\\Provider\\pt_BR\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_BR/Person.php', 'Faker\\Provider\\pt_BR\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_BR/PhoneNumber.php', 'Faker\\Provider\\pt_PT\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Address.php', + 'Faker\\Provider\\pt_PT\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Company.php', + 'Faker\\Provider\\pt_PT\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Internet.php', 'Faker\\Provider\\pt_PT\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Payment.php', 'Faker\\Provider\\pt_PT\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Person.php', 'Faker\\Provider\\pt_PT\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_PT/PhoneNumber.php', 'Faker\\Provider\\ro_MD\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_MD/Address.php', + 'Faker\\Provider\\ro_MD\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_MD/Payment.php', 'Faker\\Provider\\ro_MD\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_MD/Person.php', 'Faker\\Provider\\ro_MD\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_MD/PhoneNumber.php', + 'Faker\\Provider\\ro_MD\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_MD/Text.php', 'Faker\\Provider\\ro_RO\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_RO/Address.php', + 'Faker\\Provider\\ro_RO\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_RO/Payment.php', 'Faker\\Provider\\ro_RO\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_RO/Person.php', 'Faker\\Provider\\ro_RO\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_RO/PhoneNumber.php', + 'Faker\\Provider\\ro_RO\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_RO/Text.php', 'Faker\\Provider\\ru_RU\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Address.php', 'Faker\\Provider\\ru_RU\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Color.php', 'Faker\\Provider\\ru_RU\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Company.php', @@ -757,6 +887,7 @@ return array( 'Faker\\Provider\\sk_SK\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sk_SK/Person.php', 'Faker\\Provider\\sk_SK\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sk_SK/PhoneNumber.php', 'Faker\\Provider\\sl_SI\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Address.php', + 'Faker\\Provider\\sl_SI\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Company.php', 'Faker\\Provider\\sl_SI\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Internet.php', 'Faker\\Provider\\sl_SI\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Payment.php', 'Faker\\Provider\\sl_SI\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Person.php', @@ -772,10 +903,19 @@ return array( 'Faker\\Provider\\sr_RS\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sr_RS/Person.php', 'Faker\\Provider\\sv_SE\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sv_SE/Address.php', 'Faker\\Provider\\sv_SE\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sv_SE/Company.php', + 'Faker\\Provider\\sv_SE\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sv_SE/Payment.php', 'Faker\\Provider\\sv_SE\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sv_SE/Person.php', 'Faker\\Provider\\sv_SE\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sv_SE/PhoneNumber.php', + 'Faker\\Provider\\th_TH\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/th_TH/Address.php', + 'Faker\\Provider\\th_TH\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/th_TH/Color.php', + 'Faker\\Provider\\th_TH\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/th_TH/Company.php', + 'Faker\\Provider\\th_TH\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/th_TH/Internet.php', + 'Faker\\Provider\\th_TH\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/th_TH/Payment.php', + 'Faker\\Provider\\th_TH\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/th_TH/Person.php', + 'Faker\\Provider\\th_TH\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/th_TH/PhoneNumber.php', 'Faker\\Provider\\tr_TR\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Address.php', 'Faker\\Provider\\tr_TR\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Color.php', + 'Faker\\Provider\\tr_TR\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Company.php', 'Faker\\Provider\\tr_TR\\DateTime' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/tr_TR/DateTime.php', 'Faker\\Provider\\tr_TR\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Internet.php', 'Faker\\Provider\\tr_TR\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Payment.php', @@ -785,6 +925,7 @@ return array( 'Faker\\Provider\\uk_UA\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Color.php', 'Faker\\Provider\\uk_UA\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Company.php', 'Faker\\Provider\\uk_UA\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Internet.php', + 'Faker\\Provider\\uk_UA\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Payment.php', 'Faker\\Provider\\uk_UA\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Person.php', 'Faker\\Provider\\uk_UA\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/uk_UA/PhoneNumber.php', 'Faker\\Provider\\uk_UA\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Text.php', @@ -794,8 +935,11 @@ return array( 'Faker\\Provider\\vi_VN\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/vi_VN/Person.php', 'Faker\\Provider\\vi_VN\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/vi_VN/PhoneNumber.php', 'Faker\\Provider\\zh_CN\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Address.php', + 'Faker\\Provider\\zh_CN\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Color.php', 'Faker\\Provider\\zh_CN\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Company.php', + 'Faker\\Provider\\zh_CN\\DateTime' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_CN/DateTime.php', 'Faker\\Provider\\zh_CN\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Internet.php', + 'Faker\\Provider\\zh_CN\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Payment.php', 'Faker\\Provider\\zh_CN\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Person.php', 'Faker\\Provider\\zh_CN\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_CN/PhoneNumber.php', 'Faker\\Provider\\zh_TW\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Address.php', @@ -808,6 +952,7 @@ return array( 'Faker\\Provider\\zh_TW\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_TW/PhoneNumber.php', 'Faker\\Provider\\zh_TW\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Text.php', 'Faker\\UniqueGenerator' => $vendorDir . '/fzaninotto/faker/src/Faker/UniqueGenerator.php', + 'Faker\\ValidGenerator' => $vendorDir . '/fzaninotto/faker/src/Faker/ValidGenerator.php', 'Fideloper\\Proxy\\TrustProxies' => $vendorDir . '/fideloper/proxy/src/TrustProxies.php', 'Fideloper\\Proxy\\TrustedProxyServiceProvider' => $vendorDir . '/fideloper/proxy/src/TrustedProxyServiceProvider.php', 'Github\\Api\\AbstractApi' => $vendorDir . '/knplabs/github-api/lib/Github/Api/AbstractApi.php', @@ -2802,6 +2947,7 @@ return array( 'Monolog\\Handler\\DoctrineCouchDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php', 'Monolog\\Handler\\DynamoDbHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php', 'Monolog\\Handler\\ElasticaHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php', + 'Monolog\\Handler\\ElasticsearchHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php', 'Monolog\\Handler\\ErrorLogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php', 'Monolog\\Handler\\FallbackGroupHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php', 'Monolog\\Handler\\FilterHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FilterHandler.php', @@ -3288,7 +3434,7 @@ return array( 'PHPUnit\\Util\\ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php', 'PHPUnit\\Util\\Exception' => $vendorDir . '/phpunit/phpunit/src/Util/Exception.php', 'PHPUnit\\Util\\ExcludeList' => $vendorDir . '/phpunit/phpunit/src/Util/ExcludeList.php', - 'PHPUnit\\Util\\FileLoader' => $vendorDir . '/phpunit/phpunit/src/Util/Fileloader.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\\GlobalState' => $vendorDir . '/phpunit/phpunit/src/Util/GlobalState.php', @@ -3678,14 +3824,17 @@ return array( 'Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php', 'Psr\\Http\\Message\\UriFactoryInterface' => $vendorDir . '/psr/http-factory/src/UriFactoryInterface.php', 'Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php', - 'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/src/AbstractLogger.php', - 'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/src/InvalidArgumentException.php', - 'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/src/LogLevel.php', - 'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/src/LoggerAwareInterface.php', - 'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/src/LoggerAwareTrait.php', - 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/src/LoggerInterface.php', - 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/src/LoggerTrait.php', - 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/src/NullLogger.php', + 'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php', + 'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php', + 'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php', + 'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php', + 'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php', + 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php', + 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php', + 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php', + 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/DummyTest.php', + 'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', + 'Psr\\Log\\Test\\TestLogger' => $vendorDir . '/psr/log/Psr/Log/Test/TestLogger.php', 'Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php', 'Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php', 'Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php', @@ -3944,7 +4093,6 @@ return array( 'Ramsey\\Uuid\\Converter\\Time\\DegradedTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php', 'Ramsey\\Uuid\\Converter\\Time\\GenericTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php', 'Ramsey\\Uuid\\Converter\\Time\\PhpTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php', - 'Ramsey\\Uuid\\Converter\\Time\\UnixTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/UnixTimeConverter.php', 'Ramsey\\Uuid\\DegradedUuid' => $vendorDir . '/ramsey/uuid/src/DegradedUuid.php', 'Ramsey\\Uuid\\DeprecatedUuidInterface' => $vendorDir . '/ramsey/uuid/src/DeprecatedUuidInterface.php', 'Ramsey\\Uuid\\DeprecatedUuidMethodsTrait' => $vendorDir . '/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php', @@ -3980,7 +4128,6 @@ return array( 'Ramsey\\Uuid\\Generator\\RandomLibAdapter' => $vendorDir . '/ramsey/uuid/src/Generator/RandomLibAdapter.php', 'Ramsey\\Uuid\\Generator\\TimeGeneratorFactory' => $vendorDir . '/ramsey/uuid/src/Generator/TimeGeneratorFactory.php', 'Ramsey\\Uuid\\Generator\\TimeGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/TimeGeneratorInterface.php', - 'Ramsey\\Uuid\\Generator\\UnixTimeGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/UnixTimeGenerator.php', 'Ramsey\\Uuid\\Guid\\Fields' => $vendorDir . '/ramsey/uuid/src/Guid/Fields.php', 'Ramsey\\Uuid\\Guid\\Guid' => $vendorDir . '/ramsey/uuid/src/Guid/Guid.php', 'Ramsey\\Uuid\\Guid\\GuidBuilder' => $vendorDir . '/ramsey/uuid/src/Guid/GuidBuilder.php', @@ -4005,11 +4152,8 @@ return array( 'Ramsey\\Uuid\\Provider\\Time\\SystemTimeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php', 'Ramsey\\Uuid\\Rfc4122\\Fields' => $vendorDir . '/ramsey/uuid/src/Rfc4122/Fields.php', 'Ramsey\\Uuid\\Rfc4122\\FieldsInterface' => $vendorDir . '/ramsey/uuid/src/Rfc4122/FieldsInterface.php', - 'Ramsey\\Uuid\\Rfc4122\\MaxTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/MaxTrait.php', - 'Ramsey\\Uuid\\Rfc4122\\MaxUuid' => $vendorDir . '/ramsey/uuid/src/Rfc4122/MaxUuid.php', 'Ramsey\\Uuid\\Rfc4122\\NilTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/NilTrait.php', 'Ramsey\\Uuid\\Rfc4122\\NilUuid' => $vendorDir . '/ramsey/uuid/src/Rfc4122/NilUuid.php', - 'Ramsey\\Uuid\\Rfc4122\\TimeTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/TimeTrait.php', 'Ramsey\\Uuid\\Rfc4122\\UuidBuilder' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidBuilder.php', 'Ramsey\\Uuid\\Rfc4122\\UuidInterface' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidInterface.php', 'Ramsey\\Uuid\\Rfc4122\\UuidV1' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV1.php', @@ -4017,9 +4161,6 @@ return array( 'Ramsey\\Uuid\\Rfc4122\\UuidV3' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV3.php', 'Ramsey\\Uuid\\Rfc4122\\UuidV4' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV4.php', 'Ramsey\\Uuid\\Rfc4122\\UuidV5' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV5.php', - 'Ramsey\\Uuid\\Rfc4122\\UuidV6' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV6.php', - 'Ramsey\\Uuid\\Rfc4122\\UuidV7' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV7.php', - 'Ramsey\\Uuid\\Rfc4122\\UuidV8' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV8.php', 'Ramsey\\Uuid\\Rfc4122\\Validator' => $vendorDir . '/ramsey/uuid/src/Rfc4122/Validator.php', 'Ramsey\\Uuid\\Rfc4122\\VariantTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/VariantTrait.php', 'Ramsey\\Uuid\\Rfc4122\\VersionTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/VersionTrait.php', @@ -4245,6 +4386,7 @@ return array( 'Symfony\\Component\\Cache\\Adapter\\ChainAdapter' => $vendorDir . '/symfony/cache/Adapter/ChainAdapter.php', 'Symfony\\Component\\Cache\\Adapter\\CouchbaseBucketAdapter' => $vendorDir . '/symfony/cache/Adapter/CouchbaseBucketAdapter.php', 'Symfony\\Component\\Cache\\Adapter\\CouchbaseCollectionAdapter' => $vendorDir . '/symfony/cache/Adapter/CouchbaseCollectionAdapter.php', + 'Symfony\\Component\\Cache\\Adapter\\DoctrineAdapter' => $vendorDir . '/symfony/cache/Adapter/DoctrineAdapter.php', 'Symfony\\Component\\Cache\\Adapter\\DoctrineDbalAdapter' => $vendorDir . '/symfony/cache/Adapter/DoctrineDbalAdapter.php', 'Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter' => $vendorDir . '/symfony/cache/Adapter/FilesystemAdapter.php', 'Symfony\\Component\\Cache\\Adapter\\FilesystemTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/FilesystemTagAwareAdapter.php', @@ -4268,6 +4410,7 @@ return array( 'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolClearerPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolClearerPass.php', 'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolPass.php', 'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPrunerPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolPrunerPass.php', + 'Symfony\\Component\\Cache\\DoctrineProvider' => $vendorDir . '/symfony/cache/DoctrineProvider.php', 'Symfony\\Component\\Cache\\Exception\\CacheException' => $vendorDir . '/symfony/cache/Exception/CacheException.php', 'Symfony\\Component\\Cache\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/cache/Exception/InvalidArgumentException.php', 'Symfony\\Component\\Cache\\Exception\\LogicException' => $vendorDir . '/symfony/cache/Exception/LogicException.php', @@ -4476,6 +4619,7 @@ return array( 'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => $vendorDir . '/symfony/event-dispatcher/EventSubscriberInterface.php', 'Symfony\\Component\\EventDispatcher\\GenericEvent' => $vendorDir . '/symfony/event-dispatcher/GenericEvent.php', 'Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/ImmutableEventDispatcher.php', + 'Symfony\\Component\\EventDispatcher\\LegacyEventDispatcherProxy' => $vendorDir . '/symfony/event-dispatcher/LegacyEventDispatcherProxy.php', 'Symfony\\Component\\Finder\\Comparator\\Comparator' => $vendorDir . '/symfony/finder/Comparator/Comparator.php', 'Symfony\\Component\\Finder\\Comparator\\DateComparator' => $vendorDir . '/symfony/finder/Comparator/DateComparator.php', 'Symfony\\Component\\Finder\\Comparator\\NumberComparator' => $vendorDir . '/symfony/finder/Comparator/NumberComparator.php', @@ -4908,7 +5052,6 @@ return array( 'Symfony\\Component\\String\\Slugger\\AsciiSlugger' => $vendorDir . '/symfony/string/Slugger/AsciiSlugger.php', 'Symfony\\Component\\String\\Slugger\\SluggerInterface' => $vendorDir . '/symfony/string/Slugger/SluggerInterface.php', 'Symfony\\Component\\String\\UnicodeString' => $vendorDir . '/symfony/string/UnicodeString.php', - 'Symfony\\Component\\Translation\\CatalogueMetadataAwareInterface' => $vendorDir . '/symfony/translation/CatalogueMetadataAwareInterface.php', 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => $vendorDir . '/symfony/translation/Catalogue/AbstractOperation.php', 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => $vendorDir . '/symfony/translation/Catalogue/MergeOperation.php', 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => $vendorDir . '/symfony/translation/Catalogue/OperationInterface.php', @@ -4970,7 +5113,6 @@ return array( 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => $vendorDir . '/symfony/translation/Loader/QtFileLoader.php', 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => $vendorDir . '/symfony/translation/Loader/XliffFileLoader.php', 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/translation/Loader/YamlFileLoader.php', - 'Symfony\\Component\\Translation\\LocaleSwitcher' => $vendorDir . '/symfony/translation/LocaleSwitcher.php', 'Symfony\\Component\\Translation\\LoggingTranslator' => $vendorDir . '/symfony/translation/LoggingTranslator.php', 'Symfony\\Component\\Translation\\MessageCatalogue' => $vendorDir . '/symfony/translation/MessageCatalogue.php', 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => $vendorDir . '/symfony/translation/MessageCatalogueInterface.php', @@ -5098,6 +5240,7 @@ return array( 'Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberTrait.php', 'Symfony\\Contracts\\Service\\Test\\ServiceLocatorTest' => $vendorDir . '/symfony/service-contracts/Test/ServiceLocatorTest.php', 'Symfony\\Contracts\\Translation\\LocaleAwareInterface' => $vendorDir . '/symfony/translation-contracts/LocaleAwareInterface.php', + 'Symfony\\Contracts\\Translation\\Test\\TranslatorTest' => $vendorDir . '/symfony/translation-contracts/Test/TranslatorTest.php', 'Symfony\\Contracts\\Translation\\TranslatableInterface' => $vendorDir . '/symfony/translation-contracts/TranslatableInterface.php', 'Symfony\\Contracts\\Translation\\TranslatorInterface' => $vendorDir . '/symfony/translation-contracts/TranslatorInterface.php', 'Symfony\\Contracts\\Translation\\TranslatorTrait' => $vendorDir . '/symfony/translation-contracts/TranslatorTrait.php', @@ -5122,7 +5265,8 @@ return array( 'Tests\\CreatesApplication' => $baseDir . '/tests/CreatesApplication.php', 'Tests\\Feature\\ExampleTest' => $baseDir . '/tests/Feature/ExampleTest.php', 'Tests\\TestCase' => $baseDir . '/tests/TestCase.php', - 'Tests\\Unit\\ExampleTest' => $baseDir . '/tests/Unit/ExampleTest.php', + 'Tests\\Unit\\database\\seeders\\SettingsSeederTest' => $baseDir . '/tests/Unit/database/seeders/SettingsSeederTest.php', + 'Tests\\Unit\\lang\\LangTest' => $baseDir . '/tests/Unit/lang/LangTest.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', @@ -5161,5 +5305,4 @@ return array( 'Whoops\\Util\\SystemFacade' => $vendorDir . '/filp/whoops/src/Whoops/Util/SystemFacade.php', 'Whoops\\Util\\TemplateHelper' => $vendorDir . '/filp/whoops/src/Whoops/Util/TemplateHelper.php', 'voku\\helper\\ASCII' => $vendorDir . '/voku/portable-ascii/src/voku/helper/ASCII.php', - '©' => $vendorDir . '/symfony/cache/Traits/ValueWrapper.php', ); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php index fc0485ef..7303497d 100644 --- a/vendor/composer/autoload_files.php +++ b/vendor/composer/autoload_files.php @@ -9,12 +9,12 @@ return array( 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', + '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php', 'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php', - '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', '9c67151ae59aff4788964ce8eb2a0f43' => $vendorDir . '/clue/stream-filter/src/functions_include.php', '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php', '8cff32064859f4559445b89279f3199c' => $vendorDir . '/php-http/message/src/filters.php', diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index fc65d267..453d3c94 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -47,8 +47,8 @@ return array( 'Ramsey\\Collection\\' => array($vendorDir . '/ramsey/collection/src'), 'Psy\\' => array($vendorDir . '/psy/psysh/src'), 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), - 'Psr\\Log\\' => array($vendorDir . '/psr/log/src'), - 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'), + 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), + 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src', $vendorDir . '/psr/http-factory/src'), 'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'), 'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'), 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), @@ -70,7 +70,7 @@ return array( 'Illuminate\\' => array($vendorDir . '/laravel/framework/src/Illuminate'), 'Http\\Promise\\' => array($vendorDir . '/php-http/promise/src'), 'Http\\Message\\MultipartStream\\' => array($vendorDir . '/php-http/multipart-stream-builder/src'), - 'Http\\Message\\' => array($vendorDir . '/php-http/message/src', $vendorDir . '/php-http/message-factory/src'), + 'Http\\Message\\' => array($vendorDir . '/php-http/message-factory/src', $vendorDir . '/php-http/message/src'), 'Http\\Discovery\\' => array($vendorDir . '/php-http/discovery/src'), 'Http\\Client\\Common\\Plugin\\' => array($vendorDir . '/php-http/cache-plugin/src'), 'Http\\Client\\Common\\' => array($vendorDir . '/php-http/client-common/src'), diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 72b8284c..d4acc170 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit4b6fb9210a1ea37c2db27b8ff53a1ecf +class ComposerAutoloaderInitb2555e5ff7197b9e020da74bbd3b7cfa { private static $loader; @@ -24,18 +24,18 @@ class ComposerAutoloaderInit4b6fb9210a1ea37c2db27b8ff53a1ecf require __DIR__ . '/platform_check.php'; - spl_autoload_register(array('ComposerAutoloaderInit4b6fb9210a1ea37c2db27b8ff53a1ecf', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInitb2555e5ff7197b9e020da74bbd3b7cfa', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit4b6fb9210a1ea37c2db27b8ff53a1ecf', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInitb2555e5ff7197b9e020da74bbd3b7cfa', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInitb2555e5ff7197b9e020da74bbd3b7cfa::getInitializer($loader)); $loader->register(true); - $includeFiles = \Composer\Autoload\ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf::$files; + $includeFiles = \Composer\Autoload\ComposerStaticInitb2555e5ff7197b9e020da74bbd3b7cfa::$files; foreach ($includeFiles as $fileIdentifier => $file) { - composerRequire4b6fb9210a1ea37c2db27b8ff53a1ecf($fileIdentifier, $file); + composerRequireb2555e5ff7197b9e020da74bbd3b7cfa($fileIdentifier, $file); } return $loader; @@ -47,7 +47,7 @@ class ComposerAutoloaderInit4b6fb9210a1ea37c2db27b8ff53a1ecf * @param string $file * @return void */ -function composerRequire4b6fb9210a1ea37c2db27b8ff53a1ecf($fileIdentifier, $file) +function composerRequireb2555e5ff7197b9e020da74bbd3b7cfa($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index fc4d9ab9..f06d448e 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -4,18 +4,18 @@ namespace Composer\Autoload; -class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf +class ComposerStaticInitb2555e5ff7197b9e020da74bbd3b7cfa { public static $files = array ( 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', + '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php', 'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php', - '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', '9c67151ae59aff4788964ce8eb2a0f43' => __DIR__ . '/..' . '/clue/stream-filter/src/functions_include.php', '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php', '8cff32064859f4559445b89279f3199c' => __DIR__ . '/..' . '/php-http/message/src/filters.php', @@ -366,12 +366,12 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf ), 'Psr\\Log\\' => array ( - 0 => __DIR__ . '/..' . '/psr/log/src', + 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', ), 'Psr\\Http\\Message\\' => array ( - 0 => __DIR__ . '/..' . '/psr/http-factory/src', - 1 => __DIR__ . '/..' . '/psr/http-message/src', + 0 => __DIR__ . '/..' . '/psr/http-message/src', + 1 => __DIR__ . '/..' . '/psr/http-factory/src', ), 'Psr\\Http\\Client\\' => array ( @@ -460,8 +460,8 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf ), 'Http\\Message\\' => array ( - 0 => __DIR__ . '/..' . '/php-http/message/src', - 1 => __DIR__ . '/..' . '/php-http/message-factory/src', + 0 => __DIR__ . '/..' . '/php-http/message-factory/src', + 1 => __DIR__ . '/..' . '/php-http/message/src', ), 'Http\\Discovery\\' => array ( @@ -641,6 +641,18 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'App\\SettingGroup' => __DIR__ . '/../..' . '/app/SettingGroup.php', 'App\\SettingUser' => __DIR__ . '/../..' . '/app/SettingUser.php', 'App\\SupportedApps' => __DIR__ . '/../..' . '/app/SupportedApps.php', + 'App\\SupportedApps\\AVMFritzbox\\AVMFritzbox' => __DIR__ . '/../..' . '/app/SupportedApps/AVMFritzbox/AVMFritzbox.php', + 'App\\SupportedApps\\Ackee\\Ackee' => __DIR__ . '/../..' . '/app/SupportedApps/Ackee/Ackee.php', + 'App\\SupportedApps\\Airsonic\\Airsonic' => __DIR__ . '/../..' . '/app/SupportedApps/Airsonic/Airsonic.php', + 'App\\SupportedApps\\Alertmanager\\Alertmanager' => __DIR__ . '/../..' . '/app/SupportedApps/Alertmanager/Alertmanager.php', + 'App\\SupportedApps\\ArchiSteamFarm\\ArchiSteamFarm' => __DIR__ . '/../..' . '/app/SupportedApps/ArchiSteamFarm/ArchiSteamFarm.php', + 'App\\SupportedApps\\ArchiveBox\\ArchiveBox' => __DIR__ . '/../..' . '/app/SupportedApps/ArchiveBox/ArchiveBox.php', + 'App\\SupportedApps\\ArgoCD\\ArgoCD' => __DIR__ . '/../..' . '/app/SupportedApps/ArgoCD/ArgoCD.php', + 'App\\SupportedApps\\AriaNg\\AriaNg' => __DIR__ . '/../..' . '/app/SupportedApps/AriaNg/AriaNg.php', + 'App\\SupportedApps\\Artifactory\\Artifactory' => __DIR__ . '/../..' . '/app/SupportedApps/Artifactory/Artifactory.php', + 'App\\SupportedApps\\Pihole\\Pihole' => __DIR__ . '/../..' . '/app/SupportedApps/Pihole/Pihole.php', + 'App\\SupportedApps\\XP900\\XP900' => __DIR__ . '/../..' . '/app/SupportedApps/XP900/XP900.php', + 'App\\SupportedApps\\authentik\\authentik' => __DIR__ . '/../..' . '/app/SupportedApps/authentik/authentik.php', 'App\\User' => __DIR__ . '/../..' . '/app/User.php', 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Brick\\Math\\BigDecimal' => __DIR__ . '/..' . '/brick/math/src/BigDecimal.php', @@ -1086,7 +1098,11 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Facade\\Ignition\\Views\\Concerns\\CollectsViewExceptions' => __DIR__ . '/..' . '/facade/ignition/src/Views/Concerns/CollectsViewExceptions.php', 'Facade\\Ignition\\Views\\Engines\\CompilerEngine' => __DIR__ . '/..' . '/facade/ignition/src/Views/Engines/CompilerEngine.php', 'Facade\\Ignition\\Views\\Engines\\PhpEngine' => __DIR__ . '/..' . '/facade/ignition/src/Views/Engines/PhpEngine.php', + 'Faker\\Calculator\\Ean' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Calculator/Ean.php', + 'Faker\\Calculator\\Iban' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Calculator/Iban.php', + 'Faker\\Calculator\\Inn' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Calculator/Inn.php', 'Faker\\Calculator\\Luhn' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Calculator/Luhn.php', + 'Faker\\Calculator\\TCNo' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Calculator/TCNo.php', 'Faker\\DefaultGenerator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/DefaultGenerator.php', 'Faker\\Documentor' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Documentor.php', 'Faker\\Factory' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Factory.php', @@ -1101,9 +1117,15 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\ORM\\Mandango\\ColumnTypeGuesser' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Mandango/ColumnTypeGuesser.php', 'Faker\\ORM\\Mandango\\EntityPopulator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Mandango/EntityPopulator.php', 'Faker\\ORM\\Mandango\\Populator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Mandango/Populator.php', + 'Faker\\ORM\\Propel2\\ColumnTypeGuesser' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Propel2/ColumnTypeGuesser.php', + 'Faker\\ORM\\Propel2\\EntityPopulator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Propel2/EntityPopulator.php', + 'Faker\\ORM\\Propel2\\Populator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Propel2/Populator.php', 'Faker\\ORM\\Propel\\ColumnTypeGuesser' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php', 'Faker\\ORM\\Propel\\EntityPopulator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Propel/EntityPopulator.php', 'Faker\\ORM\\Propel\\Populator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Propel/Populator.php', + 'Faker\\ORM\\Spot\\ColumnTypeGuesser' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Spot/ColumnTypeGuesser.php', + 'Faker\\ORM\\Spot\\EntityPopulator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Spot/EntityPopulator.php', + 'Faker\\ORM\\Spot\\Populator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Spot/Populator.php', 'Faker\\Provider\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Address.php', 'Faker\\Provider\\Barcode' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Barcode.php', 'Faker\\Provider\\Base' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Base.php', @@ -1112,6 +1134,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Company.php', 'Faker\\Provider\\DateTime' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/DateTime.php', 'Faker\\Provider\\File' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/File.php', + 'Faker\\Provider\\HtmlLorem' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/HtmlLorem.php', 'Faker\\Provider\\Image' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Image.php', 'Faker\\Provider\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Internet.php', 'Faker\\Provider\\Lorem' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Lorem.php', @@ -1127,8 +1150,14 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\ar_JO\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_JO/Internet.php', 'Faker\\Provider\\ar_JO\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_JO/Person.php', 'Faker\\Provider\\ar_JO\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_JO/Text.php', + 'Faker\\Provider\\ar_SA\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Address.php', + 'Faker\\Provider\\ar_SA\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Color.php', + 'Faker\\Provider\\ar_SA\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Company.php', + 'Faker\\Provider\\ar_SA\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Internet.php', + 'Faker\\Provider\\ar_SA\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Payment.php', + 'Faker\\Provider\\ar_SA\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Person.php', + 'Faker\\Provider\\ar_SA\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Text.php', 'Faker\\Provider\\at_AT\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/at_AT/Payment.php', - 'Faker\\Provider\\be_BE\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/be_BE/Payment.php', 'Faker\\Provider\\bg_BG\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/bg_BG/Internet.php', 'Faker\\Provider\\bg_BG\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/bg_BG/Payment.php', 'Faker\\Provider\\bg_BG\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/bg_BG/Person.php', @@ -1158,6 +1187,14 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\de_AT\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_AT/Payment.php', 'Faker\\Provider\\de_AT\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_AT/Person.php', 'Faker\\Provider\\de_AT\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_AT/PhoneNumber.php', + 'Faker\\Provider\\de_AT\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_AT/Text.php', + 'Faker\\Provider\\de_CH\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_CH/Address.php', + 'Faker\\Provider\\de_CH\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_CH/Company.php', + 'Faker\\Provider\\de_CH\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_CH/Internet.php', + 'Faker\\Provider\\de_CH\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_CH/Payment.php', + 'Faker\\Provider\\de_CH\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_CH/Person.php', + 'Faker\\Provider\\de_CH\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_CH/PhoneNumber.php', + 'Faker\\Provider\\de_CH\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_CH/Text.php', 'Faker\\Provider\\de_DE\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_DE/Address.php', 'Faker\\Provider\\de_DE\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_DE/Company.php', 'Faker\\Provider\\de_DE\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_DE/Internet.php', @@ -1165,10 +1202,18 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\de_DE\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_DE/Person.php', 'Faker\\Provider\\de_DE\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_DE/PhoneNumber.php', 'Faker\\Provider\\de_DE\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_DE/Text.php', + 'Faker\\Provider\\el_CY\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_CY/Address.php', + 'Faker\\Provider\\el_CY\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_CY/Company.php', + 'Faker\\Provider\\el_CY\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_CY/Internet.php', + 'Faker\\Provider\\el_CY\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_CY/Payment.php', + 'Faker\\Provider\\el_CY\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_CY/Person.php', + 'Faker\\Provider\\el_CY\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_CY/PhoneNumber.php', 'Faker\\Provider\\el_GR\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_GR/Address.php', + 'Faker\\Provider\\el_GR\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_GR/Company.php', 'Faker\\Provider\\el_GR\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_GR/Payment.php', 'Faker\\Provider\\el_GR\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_GR/Person.php', 'Faker\\Provider\\el_GR\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_GR/PhoneNumber.php', + 'Faker\\Provider\\el_GR\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_GR/Text.php', 'Faker\\Provider\\en_AU\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_AU/Address.php', 'Faker\\Provider\\en_AU\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_AU/Internet.php', 'Faker\\Provider\\en_AU\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_AU/PhoneNumber.php', @@ -1179,20 +1224,36 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\en_GB\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_GB/Payment.php', 'Faker\\Provider\\en_GB\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_GB/Person.php', 'Faker\\Provider\\en_GB\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_GB/PhoneNumber.php', + 'Faker\\Provider\\en_HK\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_HK/Address.php', + 'Faker\\Provider\\en_HK\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_HK/Internet.php', + 'Faker\\Provider\\en_HK\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_HK/PhoneNumber.php', + 'Faker\\Provider\\en_IN\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_IN/Address.php', + 'Faker\\Provider\\en_IN\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_IN/Internet.php', + 'Faker\\Provider\\en_IN\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_IN/Person.php', + 'Faker\\Provider\\en_IN\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_IN/PhoneNumber.php', + 'Faker\\Provider\\en_NG\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_NG/Address.php', + 'Faker\\Provider\\en_NG\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_NG/Internet.php', + 'Faker\\Provider\\en_NG\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_NG/Person.php', + 'Faker\\Provider\\en_NG\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_NG/PhoneNumber.php', 'Faker\\Provider\\en_NZ\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_NZ/Address.php', 'Faker\\Provider\\en_NZ\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_NZ/Internet.php', 'Faker\\Provider\\en_NZ\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_NZ/PhoneNumber.php', 'Faker\\Provider\\en_PH\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_PH/Address.php', + 'Faker\\Provider\\en_PH\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_PH/PhoneNumber.php', + 'Faker\\Provider\\en_SG\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_SG/Address.php', + 'Faker\\Provider\\en_SG\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_SG/PhoneNumber.php', 'Faker\\Provider\\en_UG\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php', 'Faker\\Provider\\en_UG\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_UG/Internet.php', 'Faker\\Provider\\en_UG\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_UG/Person.php', 'Faker\\Provider\\en_UG\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_UG/PhoneNumber.php', 'Faker\\Provider\\en_US\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_US/Address.php', 'Faker\\Provider\\en_US\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_US/Company.php', + 'Faker\\Provider\\en_US\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_US/Payment.php', 'Faker\\Provider\\en_US\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_US/Person.php', 'Faker\\Provider\\en_US\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_US/PhoneNumber.php', 'Faker\\Provider\\en_US\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_US/Text.php', 'Faker\\Provider\\en_ZA\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_ZA/Address.php', + 'Faker\\Provider\\en_ZA\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_ZA/Company.php', 'Faker\\Provider\\en_ZA\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_ZA/Internet.php', 'Faker\\Provider\\en_ZA\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_ZA/Person.php', 'Faker\\Provider\\en_ZA\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_ZA/PhoneNumber.php', @@ -1201,11 +1262,13 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\es_AR\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_AR/Person.php', 'Faker\\Provider\\es_AR\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_AR/PhoneNumber.php', 'Faker\\Provider\\es_ES\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_ES/Address.php', + 'Faker\\Provider\\es_ES\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_ES/Color.php', 'Faker\\Provider\\es_ES\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_ES/Company.php', 'Faker\\Provider\\es_ES\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_ES/Internet.php', 'Faker\\Provider\\es_ES\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_ES/Payment.php', 'Faker\\Provider\\es_ES\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_ES/Person.php', 'Faker\\Provider\\es_ES\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_ES/PhoneNumber.php', + 'Faker\\Provider\\es_ES\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_ES/Text.php', 'Faker\\Provider\\es_PE\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_PE/Address.php', 'Faker\\Provider\\es_PE\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_PE/Company.php', 'Faker\\Provider\\es_PE\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_PE/Person.php', @@ -1215,12 +1278,17 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\es_VE\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_VE/Internet.php', 'Faker\\Provider\\es_VE\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_VE/Person.php', 'Faker\\Provider\\es_VE\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_VE/PhoneNumber.php', + 'Faker\\Provider\\et_EE\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/et_EE/Person.php', + 'Faker\\Provider\\fa_IR\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Address.php', + 'Faker\\Provider\\fa_IR\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Company.php', 'Faker\\Provider\\fa_IR\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Internet.php', 'Faker\\Provider\\fa_IR\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Person.php', + 'Faker\\Provider\\fa_IR\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fa_IR/PhoneNumber.php', 'Faker\\Provider\\fa_IR\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Text.php', 'Faker\\Provider\\fi_FI\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Address.php', 'Faker\\Provider\\fi_FI\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Company.php', 'Faker\\Provider\\fi_FI\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Internet.php', + 'Faker\\Provider\\fi_FI\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Payment.php', 'Faker\\Provider\\fi_FI\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Person.php', 'Faker\\Provider\\fi_FI\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fi_FI/PhoneNumber.php', 'Faker\\Provider\\fr_BE\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_BE/Address.php', @@ -1230,7 +1298,16 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\fr_BE\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_BE/Person.php', 'Faker\\Provider\\fr_BE\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_BE/PhoneNumber.php', 'Faker\\Provider\\fr_CA\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CA/Address.php', + 'Faker\\Provider\\fr_CA\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CA/Company.php', 'Faker\\Provider\\fr_CA\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CA/Person.php', + 'Faker\\Provider\\fr_CA\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CA/Text.php', + 'Faker\\Provider\\fr_CH\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Address.php', + 'Faker\\Provider\\fr_CH\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Company.php', + 'Faker\\Provider\\fr_CH\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Internet.php', + 'Faker\\Provider\\fr_CH\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Payment.php', + 'Faker\\Provider\\fr_CH\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Person.php', + 'Faker\\Provider\\fr_CH\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CH/PhoneNumber.php', + 'Faker\\Provider\\fr_CH\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Text.php', 'Faker\\Provider\\fr_FR\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Address.php', 'Faker\\Provider\\fr_FR\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Company.php', 'Faker\\Provider\\fr_FR\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Internet.php', @@ -1238,17 +1315,30 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\fr_FR\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Person.php', 'Faker\\Provider\\fr_FR\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_FR/PhoneNumber.php', 'Faker\\Provider\\fr_FR\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Text.php', + 'Faker\\Provider\\he_IL\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/he_IL/Address.php', + 'Faker\\Provider\\he_IL\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/he_IL/Company.php', + 'Faker\\Provider\\he_IL\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/he_IL/Payment.php', + 'Faker\\Provider\\he_IL\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/he_IL/Person.php', + 'Faker\\Provider\\he_IL\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/he_IL/PhoneNumber.php', + 'Faker\\Provider\\hr_HR\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hr_HR/Address.php', + 'Faker\\Provider\\hr_HR\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hr_HR/Company.php', + 'Faker\\Provider\\hr_HR\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hr_HR/Payment.php', + 'Faker\\Provider\\hr_HR\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hr_HR/Person.php', + 'Faker\\Provider\\hr_HR\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hr_HR/PhoneNumber.php', 'Faker\\Provider\\hu_HU\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Address.php', 'Faker\\Provider\\hu_HU\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Company.php', + 'Faker\\Provider\\hu_HU\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Payment.php', 'Faker\\Provider\\hu_HU\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Person.php', 'Faker\\Provider\\hu_HU\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hu_HU/PhoneNumber.php', 'Faker\\Provider\\hu_HU\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Text.php', 'Faker\\Provider\\hy_AM\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Address.php', + 'Faker\\Provider\\hy_AM\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Color.php', 'Faker\\Provider\\hy_AM\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Company.php', 'Faker\\Provider\\hy_AM\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Internet.php', 'Faker\\Provider\\hy_AM\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Person.php', 'Faker\\Provider\\hy_AM\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hy_AM/PhoneNumber.php', 'Faker\\Provider\\id_ID\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/id_ID/Address.php', + 'Faker\\Provider\\id_ID\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/id_ID/Color.php', 'Faker\\Provider\\id_ID\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/id_ID/Company.php', 'Faker\\Provider\\id_ID\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/id_ID/Internet.php', 'Faker\\Provider\\id_ID\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/id_ID/Person.php', @@ -1259,6 +1349,13 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\is_IS\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/is_IS/Payment.php', 'Faker\\Provider\\is_IS\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/is_IS/Person.php', 'Faker\\Provider\\is_IS\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/is_IS/PhoneNumber.php', + 'Faker\\Provider\\it_CH\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_CH/Address.php', + 'Faker\\Provider\\it_CH\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_CH/Company.php', + 'Faker\\Provider\\it_CH\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_CH/Internet.php', + 'Faker\\Provider\\it_CH\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_CH/Payment.php', + 'Faker\\Provider\\it_CH\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_CH/Person.php', + 'Faker\\Provider\\it_CH\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_CH/PhoneNumber.php', + 'Faker\\Provider\\it_CH\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_CH/Text.php', 'Faker\\Provider\\it_IT\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_IT/Address.php', 'Faker\\Provider\\it_IT\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_IT/Company.php', 'Faker\\Provider\\it_IT\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_IT/Internet.php', @@ -1271,7 +1368,15 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\ja_JP\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ja_JP/Internet.php', 'Faker\\Provider\\ja_JP\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ja_JP/Person.php', 'Faker\\Provider\\ja_JP\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ja_JP/PhoneNumber.php', + 'Faker\\Provider\\ja_JP\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ja_JP/Text.php', + 'Faker\\Provider\\ka_GE\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Address.php', + 'Faker\\Provider\\ka_GE\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Color.php', + 'Faker\\Provider\\ka_GE\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Company.php', + 'Faker\\Provider\\ka_GE\\DateTime' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/DateTime.php', + 'Faker\\Provider\\ka_GE\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Internet.php', + 'Faker\\Provider\\ka_GE\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Payment.php', 'Faker\\Provider\\ka_GE\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Person.php', + 'Faker\\Provider\\ka_GE\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/PhoneNumber.php', 'Faker\\Provider\\ka_GE\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Text.php', 'Faker\\Provider\\kk_KZ\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Address.php', 'Faker\\Provider\\kk_KZ\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Color.php', @@ -1286,7 +1391,15 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\ko_KR\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ko_KR/Internet.php', 'Faker\\Provider\\ko_KR\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ko_KR/Person.php', 'Faker\\Provider\\ko_KR\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ko_KR/PhoneNumber.php', + 'Faker\\Provider\\ko_KR\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ko_KR/Text.php', + 'Faker\\Provider\\lt_LT\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Address.php', + 'Faker\\Provider\\lt_LT\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Company.php', + 'Faker\\Provider\\lt_LT\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Internet.php', + 'Faker\\Provider\\lt_LT\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Payment.php', + 'Faker\\Provider\\lt_LT\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Person.php', + 'Faker\\Provider\\lt_LT\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lt_LT/PhoneNumber.php', 'Faker\\Provider\\lv_LV\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Address.php', + 'Faker\\Provider\\lv_LV\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Color.php', 'Faker\\Provider\\lv_LV\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Internet.php', 'Faker\\Provider\\lv_LV\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Payment.php', 'Faker\\Provider\\lv_LV\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Person.php', @@ -1296,6 +1409,19 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\me_ME\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/me_ME/Payment.php', 'Faker\\Provider\\me_ME\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/me_ME/Person.php', 'Faker\\Provider\\me_ME\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/me_ME/PhoneNumber.php', + 'Faker\\Provider\\mn_MN\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/mn_MN/Person.php', + 'Faker\\Provider\\mn_MN\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/mn_MN/PhoneNumber.php', + 'Faker\\Provider\\ms_MY\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Address.php', + 'Faker\\Provider\\ms_MY\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Company.php', + 'Faker\\Provider\\ms_MY\\Miscellaneous' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Miscellaneous.php', + 'Faker\\Provider\\ms_MY\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Payment.php', + 'Faker\\Provider\\ms_MY\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Person.php', + 'Faker\\Provider\\ms_MY\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ms_MY/PhoneNumber.php', + 'Faker\\Provider\\nb_NO\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nb_NO/Address.php', + 'Faker\\Provider\\nb_NO\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nb_NO/Company.php', + 'Faker\\Provider\\nb_NO\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nb_NO/Payment.php', + 'Faker\\Provider\\nb_NO\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nb_NO/Person.php', + 'Faker\\Provider\\nb_NO\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nb_NO/PhoneNumber.php', 'Faker\\Provider\\ne_NP\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ne_NP/Address.php', 'Faker\\Provider\\ne_NP\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ne_NP/Internet.php', 'Faker\\Provider\\ne_NP\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ne_NP/Person.php', @@ -1306,6 +1432,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\nl_BE\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_BE/Payment.php', 'Faker\\Provider\\nl_BE\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_BE/Person.php', 'Faker\\Provider\\nl_BE\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_BE/PhoneNumber.php', + 'Faker\\Provider\\nl_BE\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_BE/Text.php', 'Faker\\Provider\\nl_NL\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Address.php', 'Faker\\Provider\\nl_NL\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Color.php', 'Faker\\Provider\\nl_NL\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Company.php', @@ -1313,10 +1440,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\nl_NL\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Payment.php', 'Faker\\Provider\\nl_NL\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Person.php', 'Faker\\Provider\\nl_NL\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_NL/PhoneNumber.php', - 'Faker\\Provider\\no_NO\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/no_NO/Address.php', - 'Faker\\Provider\\no_NO\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/no_NO/Company.php', - 'Faker\\Provider\\no_NO\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/no_NO/Person.php', - 'Faker\\Provider\\no_NO\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/no_NO/PhoneNumber.php', + 'Faker\\Provider\\nl_NL\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Text.php', 'Faker\\Provider\\pl_PL\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Address.php', 'Faker\\Provider\\pl_PL\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Company.php', 'Faker\\Provider\\pl_PL\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Internet.php', @@ -1331,15 +1455,21 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\pt_BR\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_BR/Person.php', 'Faker\\Provider\\pt_BR\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_BR/PhoneNumber.php', 'Faker\\Provider\\pt_PT\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Address.php', + 'Faker\\Provider\\pt_PT\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Company.php', + 'Faker\\Provider\\pt_PT\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Internet.php', 'Faker\\Provider\\pt_PT\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Payment.php', 'Faker\\Provider\\pt_PT\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Person.php', 'Faker\\Provider\\pt_PT\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_PT/PhoneNumber.php', 'Faker\\Provider\\ro_MD\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_MD/Address.php', + 'Faker\\Provider\\ro_MD\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_MD/Payment.php', 'Faker\\Provider\\ro_MD\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_MD/Person.php', 'Faker\\Provider\\ro_MD\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_MD/PhoneNumber.php', + 'Faker\\Provider\\ro_MD\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_MD/Text.php', 'Faker\\Provider\\ro_RO\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_RO/Address.php', + 'Faker\\Provider\\ro_RO\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_RO/Payment.php', 'Faker\\Provider\\ro_RO\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_RO/Person.php', 'Faker\\Provider\\ro_RO\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_RO/PhoneNumber.php', + 'Faker\\Provider\\ro_RO\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_RO/Text.php', 'Faker\\Provider\\ru_RU\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Address.php', 'Faker\\Provider\\ru_RU\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Color.php', 'Faker\\Provider\\ru_RU\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Company.php', @@ -1355,6 +1485,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\sk_SK\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sk_SK/Person.php', 'Faker\\Provider\\sk_SK\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sk_SK/PhoneNumber.php', 'Faker\\Provider\\sl_SI\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Address.php', + 'Faker\\Provider\\sl_SI\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Company.php', 'Faker\\Provider\\sl_SI\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Internet.php', 'Faker\\Provider\\sl_SI\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Payment.php', 'Faker\\Provider\\sl_SI\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Person.php', @@ -1370,10 +1501,19 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\sr_RS\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sr_RS/Person.php', 'Faker\\Provider\\sv_SE\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sv_SE/Address.php', 'Faker\\Provider\\sv_SE\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sv_SE/Company.php', + 'Faker\\Provider\\sv_SE\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sv_SE/Payment.php', 'Faker\\Provider\\sv_SE\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sv_SE/Person.php', 'Faker\\Provider\\sv_SE\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sv_SE/PhoneNumber.php', + 'Faker\\Provider\\th_TH\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/th_TH/Address.php', + 'Faker\\Provider\\th_TH\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/th_TH/Color.php', + 'Faker\\Provider\\th_TH\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/th_TH/Company.php', + 'Faker\\Provider\\th_TH\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/th_TH/Internet.php', + 'Faker\\Provider\\th_TH\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/th_TH/Payment.php', + 'Faker\\Provider\\th_TH\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/th_TH/Person.php', + 'Faker\\Provider\\th_TH\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/th_TH/PhoneNumber.php', 'Faker\\Provider\\tr_TR\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Address.php', 'Faker\\Provider\\tr_TR\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Color.php', + 'Faker\\Provider\\tr_TR\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Company.php', 'Faker\\Provider\\tr_TR\\DateTime' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/tr_TR/DateTime.php', 'Faker\\Provider\\tr_TR\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Internet.php', 'Faker\\Provider\\tr_TR\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Payment.php', @@ -1383,6 +1523,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\uk_UA\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Color.php', 'Faker\\Provider\\uk_UA\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Company.php', 'Faker\\Provider\\uk_UA\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Internet.php', + 'Faker\\Provider\\uk_UA\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Payment.php', 'Faker\\Provider\\uk_UA\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Person.php', 'Faker\\Provider\\uk_UA\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/uk_UA/PhoneNumber.php', 'Faker\\Provider\\uk_UA\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Text.php', @@ -1392,8 +1533,11 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\vi_VN\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/vi_VN/Person.php', 'Faker\\Provider\\vi_VN\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/vi_VN/PhoneNumber.php', 'Faker\\Provider\\zh_CN\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Address.php', + 'Faker\\Provider\\zh_CN\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Color.php', 'Faker\\Provider\\zh_CN\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Company.php', + 'Faker\\Provider\\zh_CN\\DateTime' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_CN/DateTime.php', 'Faker\\Provider\\zh_CN\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Internet.php', + 'Faker\\Provider\\zh_CN\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Payment.php', 'Faker\\Provider\\zh_CN\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Person.php', 'Faker\\Provider\\zh_CN\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_CN/PhoneNumber.php', 'Faker\\Provider\\zh_TW\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Address.php', @@ -1406,6 +1550,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Faker\\Provider\\zh_TW\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_TW/PhoneNumber.php', 'Faker\\Provider\\zh_TW\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Text.php', 'Faker\\UniqueGenerator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/UniqueGenerator.php', + 'Faker\\ValidGenerator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ValidGenerator.php', 'Fideloper\\Proxy\\TrustProxies' => __DIR__ . '/..' . '/fideloper/proxy/src/TrustProxies.php', 'Fideloper\\Proxy\\TrustedProxyServiceProvider' => __DIR__ . '/..' . '/fideloper/proxy/src/TrustedProxyServiceProvider.php', 'Github\\Api\\AbstractApi' => __DIR__ . '/..' . '/knplabs/github-api/lib/Github/Api/AbstractApi.php', @@ -3400,6 +3545,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Monolog\\Handler\\DoctrineCouchDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php', 'Monolog\\Handler\\DynamoDbHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php', 'Monolog\\Handler\\ElasticaHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php', + 'Monolog\\Handler\\ElasticsearchHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php', 'Monolog\\Handler\\ErrorLogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php', 'Monolog\\Handler\\FallbackGroupHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php', 'Monolog\\Handler\\FilterHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FilterHandler.php', @@ -3886,7 +4032,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'PHPUnit\\Util\\ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php', 'PHPUnit\\Util\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception.php', 'PHPUnit\\Util\\ExcludeList' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ExcludeList.php', - 'PHPUnit\\Util\\FileLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Fileloader.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\\GlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/GlobalState.php', @@ -4276,14 +4422,17 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php', 'Psr\\Http\\Message\\UriFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/UriFactoryInterface.php', 'Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php', - 'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/src/AbstractLogger.php', - 'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/src/InvalidArgumentException.php', - 'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/src/LogLevel.php', - 'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareInterface.php', - 'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareTrait.php', - 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerInterface.php', - 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerTrait.php', - 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/src/NullLogger.php', + 'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php', + 'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php', + 'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php', + 'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php', + 'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php', + 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php', + 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php', + 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php', + 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/DummyTest.php', + 'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', + 'Psr\\Log\\Test\\TestLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/TestLogger.php', 'Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php', 'Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php', 'Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php', @@ -4542,7 +4691,6 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Ramsey\\Uuid\\Converter\\Time\\DegradedTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php', 'Ramsey\\Uuid\\Converter\\Time\\GenericTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php', 'Ramsey\\Uuid\\Converter\\Time\\PhpTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php', - 'Ramsey\\Uuid\\Converter\\Time\\UnixTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/UnixTimeConverter.php', 'Ramsey\\Uuid\\DegradedUuid' => __DIR__ . '/..' . '/ramsey/uuid/src/DegradedUuid.php', 'Ramsey\\Uuid\\DeprecatedUuidInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/DeprecatedUuidInterface.php', 'Ramsey\\Uuid\\DeprecatedUuidMethodsTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php', @@ -4578,7 +4726,6 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Ramsey\\Uuid\\Generator\\RandomLibAdapter' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomLibAdapter.php', 'Ramsey\\Uuid\\Generator\\TimeGeneratorFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/TimeGeneratorFactory.php', 'Ramsey\\Uuid\\Generator\\TimeGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/TimeGeneratorInterface.php', - 'Ramsey\\Uuid\\Generator\\UnixTimeGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/UnixTimeGenerator.php', 'Ramsey\\Uuid\\Guid\\Fields' => __DIR__ . '/..' . '/ramsey/uuid/src/Guid/Fields.php', 'Ramsey\\Uuid\\Guid\\Guid' => __DIR__ . '/..' . '/ramsey/uuid/src/Guid/Guid.php', 'Ramsey\\Uuid\\Guid\\GuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Guid/GuidBuilder.php', @@ -4603,11 +4750,8 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Ramsey\\Uuid\\Provider\\Time\\SystemTimeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php', 'Ramsey\\Uuid\\Rfc4122\\Fields' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/Fields.php', 'Ramsey\\Uuid\\Rfc4122\\FieldsInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/FieldsInterface.php', - 'Ramsey\\Uuid\\Rfc4122\\MaxTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/MaxTrait.php', - 'Ramsey\\Uuid\\Rfc4122\\MaxUuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/MaxUuid.php', 'Ramsey\\Uuid\\Rfc4122\\NilTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/NilTrait.php', 'Ramsey\\Uuid\\Rfc4122\\NilUuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/NilUuid.php', - 'Ramsey\\Uuid\\Rfc4122\\TimeTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/TimeTrait.php', 'Ramsey\\Uuid\\Rfc4122\\UuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidBuilder.php', 'Ramsey\\Uuid\\Rfc4122\\UuidInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidInterface.php', 'Ramsey\\Uuid\\Rfc4122\\UuidV1' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV1.php', @@ -4615,9 +4759,6 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Ramsey\\Uuid\\Rfc4122\\UuidV3' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV3.php', 'Ramsey\\Uuid\\Rfc4122\\UuidV4' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV4.php', 'Ramsey\\Uuid\\Rfc4122\\UuidV5' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV5.php', - 'Ramsey\\Uuid\\Rfc4122\\UuidV6' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV6.php', - 'Ramsey\\Uuid\\Rfc4122\\UuidV7' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV7.php', - 'Ramsey\\Uuid\\Rfc4122\\UuidV8' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV8.php', 'Ramsey\\Uuid\\Rfc4122\\Validator' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/Validator.php', 'Ramsey\\Uuid\\Rfc4122\\VariantTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/VariantTrait.php', 'Ramsey\\Uuid\\Rfc4122\\VersionTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/VersionTrait.php', @@ -4843,6 +4984,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Symfony\\Component\\Cache\\Adapter\\ChainAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ChainAdapter.php', 'Symfony\\Component\\Cache\\Adapter\\CouchbaseBucketAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/CouchbaseBucketAdapter.php', 'Symfony\\Component\\Cache\\Adapter\\CouchbaseCollectionAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/CouchbaseCollectionAdapter.php', + 'Symfony\\Component\\Cache\\Adapter\\DoctrineAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/DoctrineAdapter.php', 'Symfony\\Component\\Cache\\Adapter\\DoctrineDbalAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/DoctrineDbalAdapter.php', 'Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/FilesystemAdapter.php', 'Symfony\\Component\\Cache\\Adapter\\FilesystemTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/FilesystemTagAwareAdapter.php', @@ -4866,6 +5008,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolClearerPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolClearerPass.php', 'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolPass.php', 'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPrunerPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolPrunerPass.php', + 'Symfony\\Component\\Cache\\DoctrineProvider' => __DIR__ . '/..' . '/symfony/cache/DoctrineProvider.php', 'Symfony\\Component\\Cache\\Exception\\CacheException' => __DIR__ . '/..' . '/symfony/cache/Exception/CacheException.php', 'Symfony\\Component\\Cache\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/cache/Exception/InvalidArgumentException.php', 'Symfony\\Component\\Cache\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/cache/Exception/LogicException.php', @@ -5074,6 +5217,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventSubscriberInterface.php', 'Symfony\\Component\\EventDispatcher\\GenericEvent' => __DIR__ . '/..' . '/symfony/event-dispatcher/GenericEvent.php', 'Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/ImmutableEventDispatcher.php', + 'Symfony\\Component\\EventDispatcher\\LegacyEventDispatcherProxy' => __DIR__ . '/..' . '/symfony/event-dispatcher/LegacyEventDispatcherProxy.php', 'Symfony\\Component\\Finder\\Comparator\\Comparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/Comparator.php', 'Symfony\\Component\\Finder\\Comparator\\DateComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/DateComparator.php', 'Symfony\\Component\\Finder\\Comparator\\NumberComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/NumberComparator.php', @@ -5506,7 +5650,6 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Symfony\\Component\\String\\Slugger\\AsciiSlugger' => __DIR__ . '/..' . '/symfony/string/Slugger/AsciiSlugger.php', 'Symfony\\Component\\String\\Slugger\\SluggerInterface' => __DIR__ . '/..' . '/symfony/string/Slugger/SluggerInterface.php', 'Symfony\\Component\\String\\UnicodeString' => __DIR__ . '/..' . '/symfony/string/UnicodeString.php', - 'Symfony\\Component\\Translation\\CatalogueMetadataAwareInterface' => __DIR__ . '/..' . '/symfony/translation/CatalogueMetadataAwareInterface.php', 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/AbstractOperation.php', 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/MergeOperation.php', 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => __DIR__ . '/..' . '/symfony/translation/Catalogue/OperationInterface.php', @@ -5568,7 +5711,6 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/QtFileLoader.php', 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/XliffFileLoader.php', 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/YamlFileLoader.php', - 'Symfony\\Component\\Translation\\LocaleSwitcher' => __DIR__ . '/..' . '/symfony/translation/LocaleSwitcher.php', 'Symfony\\Component\\Translation\\LoggingTranslator' => __DIR__ . '/..' . '/symfony/translation/LoggingTranslator.php', 'Symfony\\Component\\Translation\\MessageCatalogue' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogue.php', 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogueInterface.php', @@ -5696,6 +5838,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberTrait.php', 'Symfony\\Contracts\\Service\\Test\\ServiceLocatorTest' => __DIR__ . '/..' . '/symfony/service-contracts/Test/ServiceLocatorTest.php', 'Symfony\\Contracts\\Translation\\LocaleAwareInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/LocaleAwareInterface.php', + 'Symfony\\Contracts\\Translation\\Test\\TranslatorTest' => __DIR__ . '/..' . '/symfony/translation-contracts/Test/TranslatorTest.php', 'Symfony\\Contracts\\Translation\\TranslatableInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatableInterface.php', 'Symfony\\Contracts\\Translation\\TranslatorInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatorInterface.php', 'Symfony\\Contracts\\Translation\\TranslatorTrait' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatorTrait.php', @@ -5720,7 +5863,8 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Tests\\CreatesApplication' => __DIR__ . '/../..' . '/tests/CreatesApplication.php', 'Tests\\Feature\\ExampleTest' => __DIR__ . '/../..' . '/tests/Feature/ExampleTest.php', 'Tests\\TestCase' => __DIR__ . '/../..' . '/tests/TestCase.php', - 'Tests\\Unit\\ExampleTest' => __DIR__ . '/../..' . '/tests/Unit/ExampleTest.php', + 'Tests\\Unit\\database\\seeders\\SettingsSeederTest' => __DIR__ . '/../..' . '/tests/Unit/database/seeders/SettingsSeederTest.php', + 'Tests\\Unit\\lang\\LangTest' => __DIR__ . '/../..' . '/tests/Unit/lang/LangTest.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', @@ -5759,16 +5903,15 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Whoops\\Util\\SystemFacade' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Util/SystemFacade.php', 'Whoops\\Util\\TemplateHelper' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Util/TemplateHelper.php', 'voku\\helper\\ASCII' => __DIR__ . '/..' . '/voku/portable-ascii/src/voku/helper/ASCII.php', - '©' => __DIR__ . '/..' . '/symfony/cache/Traits/ValueWrapper.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf::$prefixDirsPsr4; - $loader->prefixesPsr0 = ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf::$prefixesPsr0; - $loader->classMap = ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInitb2555e5ff7197b9e020da74bbd3b7cfa::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitb2555e5ff7197b9e020da74bbd3b7cfa::$prefixDirsPsr4; + $loader->prefixesPsr0 = ComposerStaticInitb2555e5ff7197b9e020da74bbd3b7cfa::$prefixesPsr0; + $loader->classMap = ComposerStaticInitb2555e5ff7197b9e020da74bbd3b7cfa::$classMap; }, null, ClassLoader::class); } diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 04ce3202..838fe25a 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -2,29 +2,29 @@ "packages": [ { "name": "brick/math", - "version": "0.10.2", - "version_normalized": "0.10.2.0", + "version": "0.9.3", + "version_normalized": "0.9.3.0", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f" + "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/459f2781e1a08d52ee56b0b1444086e038561e3f", - "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f", + "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae", + "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae", "shasum": "" }, "require": { "ext-json": "*", - "php": "^7.4 || ^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^9.0", - "vimeo/psalm": "4.25.0" + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0", + "vimeo/psalm": "4.9.2" }, - "time": "2022-08-10T22:54:19+00:00", + "time": "2021-08-15T20:50:18+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -49,12 +49,16 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.10.2" + "source": "https://github.com/brick/math/tree/0.9.3" }, "funding": [ { "url": "https://github.com/BenMorel", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/brick/math", + "type": "tidelift" } ], "install-path": "../brick/math" @@ -929,34 +933,32 @@ }, { "name": "fzaninotto/faker", - "version": "v1.5.0", - "version_normalized": "1.5.0.0", + "version": "v1.9.2", + "version_normalized": "1.9.2.0", "source": { "type": "git", "url": "https://github.com/fzaninotto/Faker.git", - "reference": "d0190b156bcca848d401fb80f31f504f37141c8d" + "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d", - "reference": "d0190b156bcca848d401fb80f31f504f37141c8d", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/848d8125239d7dbf8ab25cb7f054f1a630e68c2e", + "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.5" + "ext-intl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7", + "squizlabs/php_codesniffer": "^2.9.2" }, - "suggest": { - "ext-intl": "*" - }, - "time": "2015-05-29T06:29:14+00:00", + "time": "2020-12-11T09:56:16+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "1.5.x-dev" + "dev-master": "1.9-dev" } }, "installation-source": "dist", @@ -982,7 +984,7 @@ ], "support": { "issues": "https://github.com/fzaninotto/Faker/issues", - "source": "https://github.com/fzaninotto/Faker/tree/master" + "source": "https://github.com/fzaninotto/Faker/tree/v1.9.2" }, "abandoned": true, "install-path": "../fzaninotto/faker" @@ -3808,6 +3810,10 @@ "stream", "uri" ], + "support": { + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/master" + }, "install-path": "../php-http/message-factory" }, { @@ -4453,23 +4459,23 @@ }, { "name": "psr/cache", - "version": "3.0.0", - "version_normalized": "3.0.0.0", + "version": "1.0.1", + "version_normalized": "1.0.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", "shasum": "" }, "require": { - "php": ">=8.0.0" + "php": ">=5.3.0" }, - "time": "2021-02-03T23:26:27+00:00", + "time": "2016-08-06T20:24:11+00:00", "type": "library", "extra": { "branch-alias": { @@ -4489,7 +4495,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "homepage": "http://www.php-fig.org/" } ], "description": "Common interface for caching libraries", @@ -4499,7 +4505,7 @@ "psr-6" ], "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" + "source": "https://github.com/php-fig/cache/tree/master" }, "install-path": "../psr/cache" }, @@ -4771,37 +4777,40 @@ "request", "response" ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, "install-path": "../psr/http-message" }, { "name": "psr/log", - "version": "2.0.0", - "version_normalized": "2.0.0.0", + "version": "1.1.4", + "version_normalized": "1.1.4.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { - "php": ">=8.0.0" + "php": ">=5.3.0" }, - "time": "2021-07-14T16:41:46+00:00", + "time": "2021-05-03T11:20:27+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.1.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { - "Psr\\Log\\": "src" + "Psr\\Log\\": "Psr/Log/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4822,7 +4831,7 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/2.0.0" + "source": "https://github.com/php-fig/log/tree/1.1.4" }, "install-path": "../psr/log" }, @@ -4875,6 +4884,9 @@ "psr-16", "simple-cache" ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, "install-path": "../psr/simple-cache" }, { @@ -5087,24 +5099,26 @@ }, { "name": "ramsey/uuid", - "version": "4.6.0", - "version_normalized": "4.6.0.0", + "version": "4.2.3", + "version_normalized": "4.2.3.0", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "ad63bc700e7d021039e30ce464eba384c4a1d40f" + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/ad63bc700e7d021039e30ce464eba384c4a1d40f", - "reference": "ad63bc700e7d021039e30ce464eba384c4a1d40f", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10", + "brick/math": "^0.8 || ^0.9", "ext-json": "*", - "php": "^8.0", - "ramsey/collection": "^1.0" + "php": "^7.2 || ^8.0", + "ramsey/collection": "^1.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php80": "^1.14" }, "replace": { "rhumsaa/uuid": "self.version" @@ -5116,31 +5130,35 @@ "doctrine/annotations": "^1.8", "ergebnis/composer-normalize": "^2.15", "mockery/mockery": "^1.3", + "moontoast/math": "^1.1", "paragonie/random-lib": "^2", "php-mock/php-mock": "^2.2", "php-mock/php-mock-mockery": "^1.3", "php-parallel-lint/php-parallel-lint": "^1.1", "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.1", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", "phpunit/phpunit": "^8.5 || ^9", - "ramsey/composer-repl": "^1.4", - "slevomat/coding-standard": "^8.4", + "slevomat/coding-standard": "^7.0", "squizlabs/php_codesniffer": "^3.5", "vimeo/psalm": "^4.9" }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-ctype": "Enables faster processing of character classification using ctype functions.", "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." }, - "time": "2022-11-05T23:03:38+00:00", + "time": "2021-09-25T23:10:38+00:00", "type": "library", "extra": { + "branch-alias": { + "dev-main": "4.x-dev" + }, "captainhook": { "force-install": true } @@ -5166,7 +5184,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.6.0" + "source": "https://github.com/ramsey/uuid/tree/4.2.3" }, "funding": [ { @@ -6273,60 +6291,61 @@ }, { "name": "symfony/cache", - "version": "v6.1.7", - "version_normalized": "6.1.7.0", + "version": "v5.4.15", + "version_normalized": "5.4.15.0", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "ee5d5b88162684a1377706f9c25125e97685ee61" + "reference": "60e87188abbacd29ccde44d69c5392a33e888e98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/ee5d5b88162684a1377706f9c25125e97685ee61", - "reference": "ee5d5b88162684a1377706f9c25125e97685ee61", + "url": "https://api.github.com/repos/symfony/cache/zipball/60e87188abbacd29ccde44d69c5392a33e888e98", + "reference": "60e87188abbacd29ccde44d69c5392a33e888e98", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/cache": "^2.0|^3.0", + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^1.1.7|^2|^3", + "symfony/cache-contracts": "^1.1.7|^2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2|^3", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/var-exporter": "^4.4|^5.0|^6.0" }, "conflict": { "doctrine/dbal": "<2.13.1", - "symfony/dependency-injection": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/var-dumper": "<5.4" + "symfony/dependency-injection": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/var-dumper": "<4.4" }, "provide": { - "psr/cache-implementation": "2.0|3.0", - "psr/simple-cache-implementation": "1.0|2.0|3.0", - "symfony/cache-implementation": "1.1|2.0|3.0" + "psr/cache-implementation": "1.0|2.0", + "psr/simple-cache-implementation": "1.0|2.0", + "symfony/cache-implementation": "1.0|2.0" }, "require-dev": { "cache/integration-tests": "dev-master", + "doctrine/cache": "^1.6|^2.0", "doctrine/dbal": "^2.13.1|^3.0", "predis/predis": "^1.1", - "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/filesystem": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "psr/simple-cache": "^1.0|^2.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, - "time": "2022-10-28T16:23:08+00:00", + "time": "2022-10-27T07:55:40+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "Symfony\\Component\\Cache\\": "" }, - "classmap": [ - "Traits/ValueWrapper.php" - ], "exclude-from-classmap": [ "/Tests/" ] @@ -6352,7 +6371,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.1.7" + "source": "https://github.com/symfony/cache/tree/v5.4.15" }, "funding": [ { @@ -6372,31 +6391,31 @@ }, { "name": "symfony/cache-contracts", - "version": "v3.1.1", - "version_normalized": "3.1.1.0", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "2eab7fa459af6d75c6463e63e633b667a9b761d3" + "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/2eab7fa459af6d75c6463e63e633b667a9b761d3", - "reference": "2eab7fa459af6d75c6463e63e633b667a9b761d3", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", + "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/cache": "^3.0" + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0|^3.0" }, "suggest": { "symfony/cache-implementation": "" }, - "time": "2022-02-25T11:15:52+00:00", + "time": "2022-01-02T09:53:40+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -6434,7 +6453,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2" }, "funding": [ { @@ -6556,23 +6575,24 @@ }, { "name": "symfony/css-selector", - "version": "v6.1.3", - "version_normalized": "6.1.3.0", + "version": "v5.4.11", + "version_normalized": "5.4.11.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "0dd5e36b80e1de97f8f74ed7023ac2b837a36443" + "reference": "c1681789f059ab756001052164726ae88512ae3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/0dd5e36b80e1de97f8f74ed7023ac2b837a36443", - "reference": "0dd5e36b80e1de97f8f74ed7023ac2b837a36443", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/c1681789f059ab756001052164726ae88512ae3d", + "reference": "c1681789f059ab756001052164726ae88512ae3d", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, - "time": "2022-06-27T17:24:16+00:00", + "time": "2022-06-27T16:58:25+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -6604,7 +6624,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.1.3" + "source": "https://github.com/symfony/css-selector/tree/v5.4.11" }, "funding": [ { @@ -6624,27 +6644,27 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.1.1", - "version_normalized": "3.1.1.0", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918" + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", - "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.1" }, - "time": "2022-02-25T11:15:52+00:00", + "time": "2022-01-02T09:53:40+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -6674,7 +6694,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { @@ -6768,45 +6788,47 @@ }, { "name": "symfony/event-dispatcher", - "version": "v6.1.0", - "version_normalized": "6.1.0.0", + "version": "v5.4.9", + "version_normalized": "5.4.9.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347" + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a0449a7ad7daa0f7c0acd508259f80544ab5a347", - "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2|^3" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<4.4" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0|3.0" + "symfony/event-dispatcher-implementation": "2.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^5.4|^6.0" + "symfony/stopwatch": "^4.4|^5.0|^6.0" }, "suggest": { "symfony/dependency-injection": "", "symfony/http-kernel": "" }, - "time": "2022-05-05T16:51:07+00:00", + "time": "2022-05-05T16:45:39+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -6834,7 +6856,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.1.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9" }, "funding": [ { @@ -6854,31 +6876,31 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.1.1", - "version_normalized": "3.1.1.0", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "02ff5eea2f453731cfbc6bc215e456b781480448" + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/02ff5eea2f453731cfbc6bc215e456b781480448", - "reference": "02ff5eea2f453731cfbc6bc215e456b781480448", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=7.2.5", "psr/event-dispatcher": "^1" }, "suggest": { "symfony/event-dispatcher-implementation": "" }, - "time": "2022-02-25T11:15:52+00:00", + "time": "2022-01-02T09:53:40+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -6916,7 +6938,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" }, "funding": [ { @@ -7283,24 +7305,26 @@ }, { "name": "symfony/options-resolver", - "version": "v6.1.0", - "version_normalized": "6.1.0.0", + "version": "v5.4.11", + "version_normalized": "5.4.11.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4" + "reference": "54f14e36aa73cb8f7261d7686691fd4d75ea2690" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a3016f5442e28386ded73c43a32a5b68586dd1c4", - "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/54f14e36aa73cb8f7261d7686691fd4d75ea2690", + "reference": "54f14e36aa73cb8f7261d7686691fd4d75ea2690", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.16" }, - "time": "2022-02-25T11:15:52+00:00", + "time": "2022-07-20T13:00:38+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -7333,7 +7357,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.1.0" + "source": "https://github.com/symfony/options-resolver/tree/v5.4.11" }, "funding": [ { @@ -8444,36 +8468,37 @@ }, { "name": "symfony/string", - "version": "v6.1.7", - "version_normalized": "6.1.7.0", + "version": "v5.4.15", + "version_normalized": "5.4.15.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "823f143370880efcbdfa2dbca946b3358c4707e5" + "reference": "571334ce9f687e3e6af72db4d3b2a9431e4fd9ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/823f143370880efcbdfa2dbca946b3358c4707e5", - "reference": "823f143370880efcbdfa2dbca946b3358c4707e5", + "url": "https://api.github.com/repos/symfony/string/zipball/571334ce9f687e3e6af72db4d3b2a9431e4fd9ed", + "reference": "571334ce9f687e3e6af72db4d3b2a9431e4fd9ed", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": ">=3.0" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/translation-contracts": "^2.0|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" }, - "time": "2022-10-10T09:34:31+00:00", + "time": "2022-10-05T15:16:54+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -8512,7 +8537,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.1.7" + "source": "https://github.com/symfony/string/tree/v5.4.15" }, "funding": [ { @@ -8596,55 +8621,56 @@ }, { "name": "symfony/translation", - "version": "v6.1.6", - "version_normalized": "6.1.6.0", + "version": "v5.4.14", + "version_normalized": "5.4.14.0", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "e6cd330e5a072518f88d65148f3f165541807494" + "reference": "f0ed07675863aa6e3939df8b1bc879450b585cab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/e6cd330e5a072518f88d65148f3f165541807494", - "reference": "e6cd330e5a072518f88d65148f3f165541807494", + "url": "https://api.github.com/repos/symfony/translation/zipball/f0ed07675863aa6e3939df8b1bc879450b585cab", + "reference": "f0ed07675863aa6e3939df8b1bc879450b585cab", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.3|^3.0" + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^2.3" }, "conflict": { - "symfony/config": "<5.4", - "symfony/console": "<5.4", - "symfony/dependency-injection": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/twig-bundle": "<5.4", - "symfony/yaml": "<5.4" + "symfony/config": "<4.4", + "symfony/console": "<5.3", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" }, "provide": { - "symfony/translation-implementation": "2.3|3.0" + "symfony/translation-implementation": "2.3" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", + "symfony/config": "^4.4|^5.0|^6.0", "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", + "symfony/dependency-injection": "^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", "symfony/http-client-contracts": "^1.1|^2.0|^3.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/intl": "^5.4|^6.0", + "symfony/http-kernel": "^5.0|^6.0", + "symfony/intl": "^4.4|^5.0|^6.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^5.4|^6.0", "symfony/service-contracts": "^1.1.2|^2|^3", - "symfony/yaml": "^5.4|^6.0" + "symfony/yaml": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log-implementation": "To use logging capability in translator", "symfony/config": "", "symfony/yaml": "" }, - "time": "2022-10-07T08:04:03+00:00", + "time": "2022-10-07T08:01:20+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -8675,7 +8701,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.1.6" + "source": "https://github.com/symfony/translation/tree/v5.4.14" }, "funding": [ { @@ -8695,30 +8721,30 @@ }, { "name": "symfony/translation-contracts", - "version": "v3.1.1", - "version_normalized": "3.1.1.0", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "606be0f48e05116baef052f7f3abdb345c8e02cc" + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/606be0f48e05116baef052f7f3abdb345c8e02cc", - "reference": "606be0f48e05116baef052f7f3abdb345c8e02cc", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.2.5" }, "suggest": { "symfony/translation-implementation": "" }, - "time": "2022-06-27T17:24:16+00:00", + "time": "2022-06-27T16:58:25+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -8729,10 +8755,7 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8759,7 +8782,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" }, "funding": [ { @@ -8871,26 +8894,27 @@ }, { "name": "symfony/var-exporter", - "version": "v6.1.3", - "version_normalized": "6.1.3.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "b49350f45cebbba6e5286485264b912f2bcfc9ef" + "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b49350f45cebbba6e5286485264b912f2bcfc9ef", - "reference": "b49350f45cebbba6e5286485264b912f2bcfc9ef", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8fc03ee75eeece3d9be1ef47d26d79bea1afb340", + "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "symfony/var-dumper": "^5.4|^6.0" + "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0" }, - "time": "2022-07-04T16:01:56+00:00", + "time": "2022-05-27T12:56:18+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -8926,7 +8950,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.1.3" + "source": "https://github.com/symfony/var-exporter/tree/v5.4.10" }, "funding": [ { diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 730ce208..e56b8571 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'laravel/laravel', 'pretty_version' => '2.x-dev', 'version' => '2.9999999.9999999.9999999-dev', - 'reference' => '0966639699d170d667543f4cf2b681876c36ea8a', + 'reference' => '8972a11c0abc02f24b8a061b2c017a2e086b59bb', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -11,9 +11,9 @@ ), 'versions' => array( 'brick/math' => array( - 'pretty_version' => '0.10.2', - 'version' => '0.10.2.0', - 'reference' => '459f2781e1a08d52ee56b0b1444086e038561e3f', + 'pretty_version' => '0.9.3', + 'version' => '0.9.3.0', + 'reference' => 'ca57d18f028f84f777b2168cd1911b0dee2343ae', 'type' => 'library', 'install_path' => __DIR__ . '/../brick/math', 'aliases' => array(), @@ -140,9 +140,9 @@ 'dev_requirement' => false, ), 'fzaninotto/faker' => array( - 'pretty_version' => 'v1.5.0', - 'version' => '1.5.0.0', - 'reference' => 'd0190b156bcca848d401fb80f31f504f37141c8d', + 'pretty_version' => 'v1.9.2', + 'version' => '1.9.2.0', + 'reference' => '848d8125239d7dbf8ab25cb7f054f1a630e68c2e', 'type' => 'library', 'install_path' => __DIR__ . '/../fzaninotto/faker', 'aliases' => array(), @@ -433,7 +433,7 @@ 'laravel/laravel' => array( 'pretty_version' => '2.x-dev', 'version' => '2.9999999.9999999.9999999-dev', - 'reference' => '0966639699d170d667543f4cf2b681876c36ea8a', + 'reference' => '8972a11c0abc02f24b8a061b2c017a2e086b59bb', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -758,9 +758,9 @@ 'dev_requirement' => true, ), 'psr/cache' => array( - 'pretty_version' => '3.0.0', - 'version' => '3.0.0.0', - 'reference' => 'aa5030cfa5405eccfdcb1083ce040c2cb8d253bf', + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/cache', 'aliases' => array(), @@ -769,7 +769,7 @@ 'psr/cache-implementation' => array( 'dev_requirement' => false, 'provided' => array( - 0 => '2.0|3.0', + 0 => '1.0|2.0', ), ), 'psr/container' => array( @@ -848,9 +848,9 @@ ), ), 'psr/log' => array( - 'pretty_version' => '2.0.0', - 'version' => '2.0.0.0', - 'reference' => 'ef29f6d262798707a9edd554e2b82517ef3a9376', + 'pretty_version' => '1.1.4', + 'version' => '1.1.4.0', + 'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/log', 'aliases' => array(), @@ -859,8 +859,8 @@ 'psr/log-implementation' => array( 'dev_requirement' => false, 'provided' => array( - 0 => '1.0.0 || 2.0.0 || 3.0.0', - 1 => '1.0|2.0', + 0 => '1.0|2.0', + 1 => '1.0.0 || 2.0.0 || 3.0.0', ), ), 'psr/simple-cache' => array( @@ -875,8 +875,8 @@ 'psr/simple-cache-implementation' => array( 'dev_requirement' => false, 'provided' => array( - 0 => '1.0', - 1 => '1.0|2.0|3.0', + 0 => '1.0|2.0', + 1 => '1.0', ), ), 'psy/psysh' => array( @@ -907,9 +907,9 @@ 'dev_requirement' => false, ), 'ramsey/uuid' => array( - 'pretty_version' => '4.6.0', - 'version' => '4.6.0.0', - 'reference' => 'ad63bc700e7d021039e30ce464eba384c4a1d40f', + 'pretty_version' => '4.2.3', + 'version' => '4.2.3.0', + 'reference' => 'fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df', 'type' => 'library', 'install_path' => __DIR__ . '/../ramsey/uuid', 'aliases' => array(), @@ -918,7 +918,7 @@ 'rhumsaa/uuid' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.6.0', + 0 => '4.2.3', ), ), 'sebastian/cli-parser' => array( @@ -1075,18 +1075,18 @@ 'dev_requirement' => false, ), 'symfony/cache' => array( - 'pretty_version' => 'v6.1.7', - 'version' => '6.1.7.0', - 'reference' => 'ee5d5b88162684a1377706f9c25125e97685ee61', + 'pretty_version' => 'v5.4.15', + 'version' => '5.4.15.0', + 'reference' => '60e87188abbacd29ccde44d69c5392a33e888e98', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/cache', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/cache-contracts' => array( - 'pretty_version' => 'v3.1.1', - 'version' => '3.1.1.0', - 'reference' => '2eab7fa459af6d75c6463e63e633b667a9b761d3', + 'pretty_version' => 'v2.5.2', + 'version' => '2.5.2.0', + 'reference' => '64be4a7acb83b6f2bf6de9a02cee6dad41277ebc', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/cache-contracts', 'aliases' => array(), @@ -1095,7 +1095,7 @@ 'symfony/cache-implementation' => array( 'dev_requirement' => false, 'provided' => array( - 0 => '1.1|2.0|3.0', + 0 => '1.0|2.0', ), ), 'symfony/console' => array( @@ -1108,18 +1108,18 @@ 'dev_requirement' => false, ), 'symfony/css-selector' => array( - 'pretty_version' => 'v6.1.3', - 'version' => '6.1.3.0', - 'reference' => '0dd5e36b80e1de97f8f74ed7023ac2b837a36443', + 'pretty_version' => 'v5.4.11', + 'version' => '5.4.11.0', + 'reference' => 'c1681789f059ab756001052164726ae88512ae3d', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/css-selector', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/deprecation-contracts' => array( - 'pretty_version' => 'v3.1.1', - 'version' => '3.1.1.0', - 'reference' => '07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918', + 'pretty_version' => 'v2.5.2', + 'version' => '2.5.2.0', + 'reference' => 'e8b495ea28c1d97b5e0c121748d6f9b53d075c66', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), @@ -1135,18 +1135,18 @@ 'dev_requirement' => false, ), 'symfony/event-dispatcher' => array( - 'pretty_version' => 'v6.1.0', - 'version' => '6.1.0.0', - 'reference' => 'a0449a7ad7daa0f7c0acd508259f80544ab5a347', + 'pretty_version' => 'v5.4.9', + 'version' => '5.4.9.0', + 'reference' => '8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/event-dispatcher', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/event-dispatcher-contracts' => array( - 'pretty_version' => 'v3.1.1', - 'version' => '3.1.1.0', - 'reference' => '02ff5eea2f453731cfbc6bc215e456b781480448', + 'pretty_version' => 'v2.5.2', + 'version' => '2.5.2.0', + 'reference' => 'f98b54df6ad059855739db6fcbc2d36995283fe1', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/event-dispatcher-contracts', 'aliases' => array(), @@ -1155,7 +1155,7 @@ 'symfony/event-dispatcher-implementation' => array( 'dev_requirement' => false, 'provided' => array( - 0 => '2.0|3.0', + 0 => '2.0', ), ), 'symfony/finder' => array( @@ -1195,9 +1195,9 @@ 'dev_requirement' => false, ), 'symfony/options-resolver' => array( - 'pretty_version' => 'v6.1.0', - 'version' => '6.1.0.0', - 'reference' => 'a3016f5442e28386ded73c43a32a5b68586dd1c4', + 'pretty_version' => 'v5.4.11', + 'version' => '5.4.11.0', + 'reference' => '54f14e36aa73cb8f7261d7686691fd4d75ea2690', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/options-resolver', 'aliases' => array(), @@ -1321,9 +1321,9 @@ 'dev_requirement' => false, ), 'symfony/string' => array( - 'pretty_version' => 'v6.1.7', - 'version' => '6.1.7.0', - 'reference' => '823f143370880efcbdfa2dbca946b3358c4707e5', + 'pretty_version' => 'v5.4.15', + 'version' => '5.4.15.0', + 'reference' => '571334ce9f687e3e6af72db4d3b2a9431e4fd9ed', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/string', 'aliases' => array(), @@ -1339,18 +1339,18 @@ 'dev_requirement' => true, ), 'symfony/translation' => array( - 'pretty_version' => 'v6.1.6', - 'version' => '6.1.6.0', - 'reference' => 'e6cd330e5a072518f88d65148f3f165541807494', + 'pretty_version' => 'v5.4.14', + 'version' => '5.4.14.0', + 'reference' => 'f0ed07675863aa6e3939df8b1bc879450b585cab', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/translation', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/translation-contracts' => array( - 'pretty_version' => 'v3.1.1', - 'version' => '3.1.1.0', - 'reference' => '606be0f48e05116baef052f7f3abdb345c8e02cc', + 'pretty_version' => 'v2.5.2', + 'version' => '2.5.2.0', + 'reference' => '136b19dd05cdf0709db6537d058bcab6dd6e2dbe', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/translation-contracts', 'aliases' => array(), @@ -1359,7 +1359,7 @@ 'symfony/translation-implementation' => array( 'dev_requirement' => false, 'provided' => array( - 0 => '2.3|3.0', + 0 => '2.3', ), ), 'symfony/var-dumper' => array( @@ -1372,9 +1372,9 @@ 'dev_requirement' => false, ), 'symfony/var-exporter' => array( - 'pretty_version' => 'v6.1.3', - 'version' => '6.1.3.0', - 'reference' => 'b49350f45cebbba6e5286485264b912f2bcfc9ef', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', + 'reference' => '8fc03ee75eeece3d9be1ef47d26d79bea1afb340', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/var-exporter', 'aliases' => array(), diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php index 4c3a5d68..3c97a351 100644 --- a/vendor/composer/platform_check.php +++ b/vendor/composer/platform_check.php @@ -4,8 +4,8 @@ $issues = array(); -if (!(PHP_VERSION_ID >= 80100)) { - $issues[] = 'Your Composer dependencies require a PHP version ">= 8.1.0". You are running ' . PHP_VERSION . '.'; +if (!(PHP_VERSION_ID >= 70415)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 7.4.15". You are running ' . PHP_VERSION . '.'; } if ($issues) { diff --git a/vendor/fzaninotto/faker/.github/ISSUE_TEMPLATE/bug_report.md b/vendor/fzaninotto/faker/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..3e8543bc --- /dev/null +++ b/vendor/fzaninotto/faker/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,39 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +### Summary + + + +### Versions + + + +| | Version | +|:--------------------|:--------| +| PHP | x.y.z | +| `fzaninotto/faker` | x.y.z | + +### Self-enclosed code snippet for reproduction + +```php + +``` + +### Expected output + +```txt + +``` + +### Actual output + +```txt + +``` diff --git a/vendor/fzaninotto/faker/.gitignore b/vendor/fzaninotto/faker/.gitignore deleted file mode 100644 index 7579f743..00000000 --- a/vendor/fzaninotto/faker/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -vendor -composer.lock diff --git a/vendor/fzaninotto/faker/.travis.yml b/vendor/fzaninotto/faker/.travis.yml deleted file mode 100644 index df3e0b18..00000000 --- a/vendor/fzaninotto/faker/.travis.yml +++ /dev/null @@ -1,17 +0,0 @@ -language: php - -php: - - 5.3 - - 5.4 - - 5.5 - - 5.6 - - 7.0 - - hhvm - -sudo: false - -before_script: - - travis_retry composer self-update - - travis_retry composer install --no-interaction --prefer-source --dev - -script: make sniff test diff --git a/vendor/fzaninotto/faker/.travis/xdebug.sh b/vendor/fzaninotto/faker/.travis/xdebug.sh new file mode 100644 index 00000000..c3cebe3c --- /dev/null +++ b/vendor/fzaninotto/faker/.travis/xdebug.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +# The problem is that we do not want to remove the configuration file, just disable it for a few tasks, then enable it +# +# For reference, see +# +# - https://docs.travis-ci.com/user/languages/php#Disabling-preinstalled-PHP-extensions +# - https://docs.travis-ci.com/user/languages/php#Custom-PHP-configuration + +config="/home/travis/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini" + +function xdebug-disable() { + if [[ -f $config ]]; then + mv $config "$config.bak" + fi +} + +function xdebug-enable() { + if [[ -f "$config.bak" ]]; then + mv "$config.bak" $config + fi +} diff --git a/vendor/fzaninotto/faker/CHANGELOG.md b/vendor/fzaninotto/faker/CHANGELOG.md index d0f1023f..d27a7bed 100644 --- a/vendor/fzaninotto/faker/CHANGELOG.md +++ b/vendor/fzaninotto/faker/CHANGELOG.md @@ -1,11 +1,466 @@ -CHANGELOG -========= +# CHANGELOG -To be released, v1.5.0 ----------------------- +## 2019-12-03, v1.9.1 + +- Add link to PHPStan extension to readme [\#1834](https://github.com/fzaninotto/Faker/pull/1834) ([finwe](https://github.com/finwe)) +- Enhancement: Collect code coverage [\#1824](https://github.com/fzaninotto/Faker/pull/1824) ([localheinz](https://github.com/localheinz)) +- Enhancement: Use all columns when running tests [\#1823](https://github.com/fzaninotto/Faker/pull/1823) ([localheinz](https://github.com/localheinz)) +- Enhancement: Configure verbose output via phpunit.xml.dist [\#1822](https://github.com/fzaninotto/Faker/pull/1822) ([localheinz](https://github.com/localheinz)) +- Curly braces for arrays is deprecated in PHP 7.4 [\#1843](https://github.com/fzaninotto/Faker/pull/1843) ([wimg](https://github.com/wimg)) +- Fix: Reduce visibility of setUp\(\) and tearDown\(\) [\#1821](https://github.com/fzaninotto/Faker/pull/1821) ([localheinz](https://github.com/localheinz)) +- Fix: Mark test classes as final [\#1820](https://github.com/fzaninotto/Faker/pull/1820) ([localheinz](https://github.com/localheinz)) +- Fix: Remove unnecessary class-level DocBlocks [\#1819](https://github.com/fzaninotto/Faker/pull/1819) ([localheinz](https://github.com/localheinz)) + +## 2019-11-10, v1.9.0 + +This will the last minor release in the `1.x` cycle. + +- Add all Iran's provinces land lines numbers [\#1806](https://github.com/fzaninotto/Faker/pull/1806) ([kingofnull](https://github.com/kingofnull)) +- replace latin "B" to cyrillic "B" for uk\_UA locale [\#1800](https://github.com/fzaninotto/Faker/pull/1800) ([FI-LIFE](https://github.com/FI-LIFE)) +- Add elgentos/masquerade to third-party library list [\#1798](https://github.com/fzaninotto/Faker/pull/1798) ([erikhansen](https://github.com/erikhansen)) +- Add link to Gravatar provider repository [\#1796](https://github.com/fzaninotto/Faker/pull/1796) ([ottaviano](https://github.com/ottaviano)) +- Add mobileNumber\(\) method for nb\_NO [\#1788](https://github.com/fzaninotto/Faker/pull/1788) ([carestad](https://github.com/carestad)) +- Enhancement: Slightly clean up Company provider [\#1783](https://github.com/fzaninotto/Faker/pull/1783) ([localheinz](https://github.com/localheinz)) +- Added some more information for autoloading in the readme [\#1780](https://github.com/fzaninotto/Faker/pull/1780) ([pimjansen](https://github.com/pimjansen)) +- Enhancement: Add issue template for bug report [\#1779](https://github.com/fzaninotto/Faker/pull/1779) ([localheinz](https://github.com/localheinz)) +- Add hslColor to ColorProvider [\#1776](https://github.com/fzaninotto/Faker/pull/1776) ([icanhazstring](https://github.com/icanhazstring)) +- Enhancement: Consistently use composer package name for link content [\#1770](https://github.com/fzaninotto/Faker/pull/1770) ([localheinz](https://github.com/localheinz)) +- Add Correct Thai words for streets,soi etc names and add Thai First a… [\#1769](https://github.com/fzaninotto/Faker/pull/1769) ([pierrejoye](https://github.com/pierrejoye)) +- Enhancement: Assert that postcode generated by Austrian Address provider matches format [\#1766](https://github.com/fzaninotto/Faker/pull/1766) ([localheinz](https://github.com/localheinz)) +- Enhancement: Update squizlabs/php\_codesniffer [\#1763](https://github.com/fzaninotto/Faker/pull/1763) ([localheinz](https://github.com/localheinz)) +- Enhancement: Assert that imageUrl can be used with gray flag [\#1762](https://github.com/fzaninotto/Faker/pull/1762) ([localheinz](https://github.com/localheinz)) +- Enhancement: Introduce build and help targets [\#1761](https://github.com/fzaninotto/Faker/pull/1761) ([localheinz](https://github.com/localheinz)) +- Enhancement: Disable Xdebug as early as possible [\#1758](https://github.com/fzaninotto/Faker/pull/1758) ([localheinz](https://github.com/localheinz)) +- Enhancement: Clean up .gitattributes [\#1756](https://github.com/fzaninotto/Faker/pull/1756) ([localheinz](https://github.com/localheinz)) +- Enhancement: Reference phpunit.xsd as installed with composer [\#1755](https://github.com/fzaninotto/Faker/pull/1755) ([localheinz](https://github.com/localheinz)) +- add id\_ID Color [\#1754](https://github.com/fzaninotto/Faker/pull/1754) ([cacing69](https://github.com/cacing69)) +- PHP 7.4 compatibility [\#1748](https://github.com/fzaninotto/Faker/pull/1748) ([pimjansen](https://github.com/pimjansen)) +- Add lastName gender specific on ru\_RU locale [\#1747](https://github.com/fzaninotto/Faker/pull/1747) ([aanfarhan](https://github.com/aanfarhan)) +- Update README - Add a new faker. [\#1731](https://github.com/fzaninotto/Faker/pull/1731) ([drupol](https://github.com/drupol)) +- Add faker-eddy-malou third-party library [\#1717](https://github.com/fzaninotto/Faker/pull/1717) ([Metrakit](https://github.com/Metrakit)) +- \[de\_DE\] Company\JobTitle: list of common german job titles [\#1716](https://github.com/fzaninotto/Faker/pull/1716) ([amacado](https://github.com/amacado)) +- Added 'red' to $safeColorNames [\#1701](https://github.com/fzaninotto/Faker/pull/1701) ([xfudox](https://github.com/xfudox)) +- \[pt\_PT/Address\] Add abbreviature to 'travessa' and 'largo' [\#1606](https://github.com/fzaninotto/Faker/pull/1606) ([simaolemos](https://github.com/simaolemos)) +- Fix method name for en\_NZ provider in readme [\#1595](https://github.com/fzaninotto/Faker/pull/1595) ([gdhnz](https://github.com/gdhnz)) +- Refactoring of the TextTest class [\#1590](https://github.com/fzaninotto/Faker/pull/1590) ([stevegrunwell](https://github.com/stevegrunwell)) +- add gender variants for last name \[lt\_LT\] [\#1586](https://github.com/fzaninotto/Faker/pull/1586) ([ikerasLT](https://github.com/ikerasLT)) +- add .id TLD [\#1566](https://github.com/fzaninotto/Faker/pull/1566) ([ad3n](https://github.com/ad3n)) +- Add Color provider to es\_ES locale [\#1559](https://github.com/fzaninotto/Faker/pull/1559) ([juananruiz](https://github.com/juananruiz)) +- Enhancement: Keep packages sorted in composer.json [\#1551](https://github.com/fzaninotto/Faker/pull/1551) ([localheinz](https://github.com/localheinz)) +- Portuguese providers for Companies and Internet [\#1537](https://github.com/fzaninotto/Faker/pull/1537) ([promatik](https://github.com/promatik)) +- Improve Dutch company names [\#1529](https://github.com/fzaninotto/Faker/pull/1529) ([koole](https://github.com/koole)) +- Document randomDigitNot base formatter. [\#1514](https://github.com/fzaninotto/Faker/pull/1514) ([shawnlindstrom](https://github.com/shawnlindstrom)) +- Estonian names [\#1461](https://github.com/fzaninotto/Faker/pull/1461) ([much-rebel](https://github.com/much-rebel)) +- add birthplace support for ID nik generator [\#1451](https://github.com/fzaninotto/Faker/pull/1451) ([mikk150](https://github.com/mikk150)) +- List of banks in Brazil added [\#1427](https://github.com/fzaninotto/Faker/pull/1427) ([diegohenicka](https://github.com/diegohenicka)) +- Remove last names from the male first names array \(et\_EE\) [\#1799](https://github.com/fzaninotto/Faker/pull/1799) ([Mihkel100](https://github.com/Mihkel100)) +- Update out-of-date currency codes [\#1795](https://github.com/fzaninotto/Faker/pull/1795) ([Brindster](https://github.com/Brindster)) +- Floor is not always returning an int [\#1790](https://github.com/fzaninotto/Faker/pull/1790) ([pimjansen](https://github.com/pimjansen)) +- typo [\#1789](https://github.com/fzaninotto/Faker/pull/1789) ([enumag](https://github.com/enumag)) +- Added batch inserts for doctrine orm populate [\#1781](https://github.com/fzaninotto/Faker/pull/1781) ([pimjansen](https://github.com/pimjansen)) +- FIx: Avoid deprecation warning in newer CakePHP version [\#1777](https://github.com/fzaninotto/Faker/pull/1777) ([icanhazstring](https://github.com/icanhazstring)) +- Fix: Consistently link to GitHub repositories [\#1774](https://github.com/fzaninotto/Faker/pull/1774) ([localheinz](https://github.com/localheinz)) +- Fix: Name of package [\#1772](https://github.com/fzaninotto/Faker/pull/1772) ([localheinz](https://github.com/localheinz)) +- Remove BV and HM country codes. [\#1767](https://github.com/fzaninotto/Faker/pull/1767) ([oliverpool](https://github.com/oliverpool)) +- Fix: Remove sudo configuration [\#1760](https://github.com/fzaninotto/Faker/pull/1760) ([localheinz](https://github.com/localheinz)) +- Fix: Allow nightly builds to fail [\#1759](https://github.com/fzaninotto/Faker/pull/1759) ([localheinz](https://github.com/localheinz)) +- Fix: No need to update composer itself [\#1757](https://github.com/fzaninotto/Faker/pull/1757) ([localheinz](https://github.com/localheinz)) +- duplicate first name and last name removal [\#1729](https://github.com/fzaninotto/Faker/pull/1729) ([sagautam5](https://github.com/sagautam5)) +- Fix-Isreal--Israel [\#1724](https://github.com/fzaninotto/Faker/pull/1724) ([GitEvil](https://github.com/GitEvil)) +- fix\(issue-1721\): add phpdoc method and properties annotations for php… [\#1722](https://github.com/fzaninotto/Faker/pull/1722) ([lugus](https://github.com/lugus)) +- Typo in function PHPDoc [\#1711](https://github.com/fzaninotto/Faker/pull/1711) ([Dzhuneyt](https://github.com/Dzhuneyt)) +- Fix: Add allowed type DateTime to param annotation [\#1697](https://github.com/fzaninotto/Faker/pull/1697) ([localheinz](https://github.com/localheinz)) +- Calling a non static method as static not allowed. [\#1696](https://github.com/fzaninotto/Faker/pull/1696) ([wilco-1985](https://github.com/wilco-1985)) +- Bug Fix en\_SG mobile number generation [\#1658](https://github.com/fzaninotto/Faker/pull/1658) ([ziming](https://github.com/ziming)) +- Update ja\_JP Address Provider [\#1649](https://github.com/fzaninotto/Faker/pull/1649) ([atmngw](https://github.com/atmngw)) +- Fixed realText on ja\_JP locale broken, /u missing [\#1634](https://github.com/fzaninotto/Faker/pull/1634) ([mihit](https://github.com/mihit)) +- Removed comma and space from $firstNameMale for en\_IN [\#1608](https://github.com/fzaninotto/Faker/pull/1608) ([phpspider](https://github.com/phpspider)) +- Prevent Transliterator class autoloading [\#1575](https://github.com/fzaninotto/Faker/pull/1575) ([MontealegreLuis](https://github.com/MontealegreLuis)) +- building numbers in Germany never start with a zero or are zero [\#1530](https://github.com/fzaninotto/Faker/pull/1530) ([fostam](https://github.com/fostam)) +- Fixing sk\_SK men last names set [\#1459](https://github.com/fzaninotto/Faker/pull/1459) ([pavoltanuska](https://github.com/pavoltanuska)) +- Taiwan ID. The initial letter must be a capital letter. p-\>P [\#1434](https://github.com/fzaninotto/Faker/pull/1434) ([slawa-dev](https://github.com/slawa-dev)) +- Revert "Added 'red' to $safeColorNames" [\#1778](https://github.com/fzaninotto/Faker/pull/1778) ([fzaninotto](https://github.com/fzaninotto)) +- Added realText capability for fr\_CA [\#1686](https://github.com/fzaninotto/Faker/pull/1686) ([bobanum](https://github.com/bobanum)) +- Add loremflickr.com Provider to the thrid parties [\#1683](https://github.com/fzaninotto/Faker/pull/1683) ([xvladxtremal](https://github.com/xvladxtremal)) +- Add Undeclared Faker Instance to PhoneNumber Test in en\_NG [\#1682](https://github.com/fzaninotto/Faker/pull/1682) ([thearsalan](https://github.com/thearsalan)) +- PSR-2 updates to readme [\#1679](https://github.com/fzaninotto/Faker/pull/1679) ([b3none](https://github.com/b3none)) +- PHPDoc for `passthrough` function on Generator [\#1678](https://github.com/fzaninotto/Faker/pull/1678) ([tabakhase](https://github.com/tabakhase)) +- Make en\_CA Phone Provider Extend the en\_US One [\#1676](https://github.com/fzaninotto/Faker/pull/1676) ([darrylhein](https://github.com/darrylhein)) +- Add Valid National Code Generator to fa\_IR Person [\#1675](https://github.com/fzaninotto/Faker/pull/1675) ([thearsalan](https://github.com/thearsalan)) +- Updated readme.md: added a missing backslash [\#1673](https://github.com/fzaninotto/Faker/pull/1673) ([aubryfr](https://github.com/aubryfr)) +- Add 'Faker\Provider\en\_US\Company::catchPhrase' to ru\_RU locale [\#1668](https://github.com/fzaninotto/Faker/pull/1668) ([axklim](https://github.com/axklim)) +- Update deprecated \PHPUnit\_Framework\_TestCase with PHPUnit\Framework\TestCase [\#1664](https://github.com/fzaninotto/Faker/pull/1664) ([thewhit](https://github.com/thewhit)) +- Support populating Doctrine's immutable date types [\#1639](https://github.com/fzaninotto/Faker/pull/1639) ([voronkovich](https://github.com/voronkovich)) +- add titleMale and titleFemale method to all Person classes [\#1635](https://github.com/fzaninotto/Faker/pull/1635) ([RiverDanceGit](https://github.com/RiverDanceGit)) +- Minor typo fix [\#1631](https://github.com/fzaninotto/Faker/pull/1631) ([nhedger](https://github.com/nhedger)) +- Add link to er1z/fakemock [\#1622](https://github.com/fzaninotto/Faker/pull/1622) ([er1z](https://github.com/er1z)) +- Add Dutch \(nl\_NL\) job titles [\#1618](https://github.com/fzaninotto/Faker/pull/1618) ([SjorsO](https://github.com/SjorsO)) +- Exclude files and folder from release archive [\#1617](https://github.com/fzaninotto/Faker/pull/1617) ([ankurk91](https://github.com/ankurk91)) +- Update doc block [\#1615](https://github.com/fzaninotto/Faker/pull/1615) ([ankurk91](https://github.com/ankurk91)) +- Suggest PSR-4 compliant autoloader in comment [\#1614](https://github.com/fzaninotto/Faker/pull/1614) ([samnela](https://github.com/samnela)) +- Fix dateTimeBetween\(\) Argument on Generator phpdoc [\#1583](https://github.com/fzaninotto/Faker/pull/1583) ([hisomura](https://github.com/hisomura)) +- Fix Dutch typo [\#1580](https://github.com/fzaninotto/Faker/pull/1580) ([gizburdt](https://github.com/gizburdt)) +- Old city names changed to new ones [\#1578](https://github.com/fzaninotto/Faker/pull/1578) ([goszowski](https://github.com/goszowski)) +- Correct documentation [\#1571](https://github.com/fzaninotto/Faker/pull/1571) ([rquadling](https://github.com/rquadling)) +- Make $suffix protected not private in nl\_NL\Person provider [\#1561](https://github.com/fzaninotto/Faker/pull/1561) ([SpadXIII](https://github.com/SpadXIII)) +- Add PicsumPhotos Provider to the thrid parties [\#1560](https://github.com/fzaninotto/Faker/pull/1560) ([bluemmb](https://github.com/bluemmb)) +- fix austrian postal codes starting with invalid 0 [\#1545](https://github.com/fzaninotto/Faker/pull/1545) ([mpge](https://github.com/mpge)) +- Restore a random seed when the Generator is destroyed [\#1534](https://github.com/fzaninotto/Faker/pull/1534) ([lyrixx](https://github.com/lyrixx)) +- Add a swiss social security number \(AVS13\) generator [\#1533](https://github.com/fzaninotto/Faker/pull/1533) ([nhedger](https://github.com/nhedger)) +- Small tweaks [\#1526](https://github.com/fzaninotto/Faker/pull/1526) ([carusogabriel](https://github.com/carusogabriel)) +- fix ukraine first name person, delete space [\#1525](https://github.com/fzaninotto/Faker/pull/1525) ([Yasuslik](https://github.com/Yasuslik)) +- Removed unknown postcode [\#1440](https://github.com/fzaninotto/Faker/pull/1440) ([ayanozturk](https://github.com/ayanozturk)) +- Add more PhoneNumber options for es\_ES [\#1219](https://github.com/fzaninotto/Faker/pull/1219) ([driade](https://github.com/driade)) +- Fix duplication in uk\_UA male first names [\#1214](https://github.com/fzaninotto/Faker/pull/1214) ([fre5h](https://github.com/fre5h)) +- Added missing grayscale option/flag to Image provider [\#928](https://github.com/fzaninotto/Faker/pull/928) ([sebastianvilla](https://github.com/sebastianvilla)) + +## 2018-07-12, v1.8.0 + +- Typo in readme [\#1521](https://github.com/fzaninotto/Faker/pull/1521) ([jmhobbs](https://github.com/jmhobbs)) +- Replaced Hilll with Hill [\#1516](https://github.com/fzaninotto/Faker/pull/1516) ([MarkVaughn](https://github.com/MarkVaughn)) +- \[it\_IT\] Improve vat ID generated using official rules [\#1508](https://github.com/fzaninotto/Faker/pull/1508) ([mavimo](https://github.com/mavimo)) +- \[hu\_HU\] Address: Fix unnecessary new line in string [\#1507](https://github.com/fzaninotto/Faker/pull/1507) ([ntomka](https://github.com/ntomka)) +- add phone numer format [\#1506](https://github.com/fzaninotto/Faker/pull/1506) ([Enosh-Yu](https://github.com/Enosh-Yu)) +- Fix typo in fr\_CA Provider [\#1505](https://github.com/fzaninotto/Faker/pull/1505) ([ultreson](https://github.com/ultreson)) +- Add fake-car provider link [\#1497](https://github.com/fzaninotto/Faker/pull/1497) ([pelmered](https://github.com/pelmered)) +- create `passthrough` function [\#1493](https://github.com/fzaninotto/Faker/pull/1493) ([browner12](https://github.com/browner12)) +- update Polish bank list [\#1482](https://github.com/fzaninotto/Faker/pull/1482) ([IonBazan](https://github.com/IonBazan)) +- Update the parameters to check if the setter is callable [\#1470](https://github.com/fzaninotto/Faker/pull/1470) ([rossmitchell](https://github.com/rossmitchell)) +- Push the max date far into the future so the test can pass [\#1469](https://github.com/fzaninotto/Faker/pull/1469) ([rossmitchell](https://github.com/rossmitchell)) +- Update Address.php [\#1465](https://github.com/fzaninotto/Faker/pull/1465) ([Saibamen](https://github.com/Saibamen)) +- Turkish identity number for tr\_TR [\#1462](https://github.com/fzaninotto/Faker/pull/1462) ([aykutaras](https://github.com/aykutaras)) +- Fixing rare iin with 13-digits. [\#1450](https://github.com/fzaninotto/Faker/pull/1450) ([vadimonus](https://github.com/vadimonus)) +- Fix Polish PESEL faker [\#1449](https://github.com/fzaninotto/Faker/pull/1449) ([Dartui](https://github.com/Dartui)) +- Adds valid 08 number formats for fr\_FR [\#1439](https://github.com/fzaninotto/Faker/pull/1439) ([ppelgrims](https://github.com/ppelgrims)) +- Add YouTube provider link [\#1422](https://github.com/fzaninotto/Faker/pull/1422) ([aalaap](https://github.com/aalaap)) +- Update PHPDoc of the DateTime provider. [\#1419](https://github.com/fzaninotto/Faker/pull/1419) ([tomzx](https://github.com/tomzx)) +- Normalize name of variable [\#1412](https://github.com/fzaninotto/Faker/pull/1412) ([eaglewu](https://github.com/eaglewu)) +- Added "blockchain" to en-us company provider catchPhrase method [\#1411](https://github.com/fzaninotto/Faker/pull/1411) ([samoldenburg](https://github.com/samoldenburg)) +- Fix for Spot2 ORM EntityPopulator [\#1408](https://github.com/fzaninotto/Faker/pull/1408) ([michal-borek](https://github.com/michal-borek)) +- TH color name [\#1404](https://github.com/fzaninotto/Faker/pull/1404) ([Naruedom](https://github.com/Naruedom)) +- added Malaysia \[ms\_MY\] locale [\#1403](https://github.com/fzaninotto/Faker/pull/1403) ([kenfai](https://github.com/kenfai)) +- Implementation of the function that generates Brazilian area codes fixed. [\#1401](https://github.com/fzaninotto/Faker/pull/1401) ([jackmiras](https://github.com/jackmiras)) +- VISA retired the 13 digit PAN moved to new cardParams [\#1400](https://github.com/fzaninotto/Faker/pull/1400) ([hppycoder](https://github.com/hppycoder)) +- Remove unused variable inside closure [\#1395](https://github.com/fzaninotto/Faker/pull/1395) ([carusogabriel](https://github.com/carusogabriel)) +- .nz domain updates [\#1393](https://github.com/fzaninotto/Faker/pull/1393) ([xurizaemon](https://github.com/xurizaemon)) +- Add licenceCode method in the to es\_ES person provider [\#1392](https://github.com/fzaninotto/Faker/pull/1392) ([ffiguereo](https://github.com/ffiguereo)) +- allow `randomElements` to accept a Traversable object [\#1389](https://github.com/fzaninotto/Faker/pull/1389) ([browner12](https://github.com/browner12)) +- Doc: rg remove formatting [\#1387](https://github.com/fzaninotto/Faker/pull/1387) ([emtudo](https://github.com/emtudo)) +- Add numbers with start 4 [\#1386](https://github.com/fzaninotto/Faker/pull/1386) ([emtudo](https://github.com/emtudo)) +- update th\_TH mobile number format [\#1385](https://github.com/fzaninotto/Faker/pull/1385) ([earthpyy](https://github.com/earthpyy)) +- Translate country names for lv\_LV provider. [\#1383](https://github.com/fzaninotto/Faker/pull/1383) ([ronaldsgailis](https://github.com/ronaldsgailis)) +- Clean elses [\#1382](https://github.com/fzaninotto/Faker/pull/1382) ([carusogabriel](https://github.com/carusogabriel)) +- French vat formatter [\#1381](https://github.com/fzaninotto/Faker/pull/1381) ([ppelgrims](https://github.com/ppelgrims)) +- Replaces rtrim with preg\_replace [\#1380](https://github.com/fzaninotto/Faker/pull/1380) ([ppelgrims](https://github.com/ppelgrims)) +- Refactoring tests [\#1375](https://github.com/fzaninotto/Faker/pull/1375) ([carusogabriel](https://github.com/carusogabriel)) +- Added link in readme to provider FakerRestaurant [\#1374](https://github.com/fzaninotto/Faker/pull/1374) ([jzonta](https://github.com/jzonta)) +- Remove obsolete currency codes [\#1373](https://github.com/fzaninotto/Faker/pull/1373) ([tpraxl](https://github.com/tpraxl)) +- \[ru\_RU\] Updated countries and added source link [\#1372](https://github.com/fzaninotto/Faker/pull/1372) ([ilyahoilik](https://github.com/ilyahoilik)) +- Test against PHP 7.2 [\#1371](https://github.com/fzaninotto/Faker/pull/1371) ([carusogabriel](https://github.com/carusogabriel)) +- Feature: nl\_BE text provider [\#1370](https://github.com/fzaninotto/Faker/pull/1370) ([rauwebieten](https://github.com/rauwebieten)) +- default value for Payment::iban\(\) country code [\#1369](https://github.com/fzaninotto/Faker/pull/1369) ([madmanmax](https://github.com/madmanmax)) +- skip test failing on bigendian [\#1365](https://github.com/fzaninotto/Faker/pull/1365) ([remicollet](https://github.com/remicollet)) +- Update Person.php [\#1364](https://github.com/fzaninotto/Faker/pull/1364) ([majamusan](https://github.com/majamusan)) +- Prevent errors on private methods [\#1363](https://github.com/fzaninotto/Faker/pull/1363) ([petecoop](https://github.com/petecoop)) +- adds rijksregisternummer [\#1361](https://github.com/fzaninotto/Faker/pull/1361) ([ppelgrims](https://github.com/ppelgrims)) +- Add secondary address to fr\_FR provider [\#1356](https://github.com/fzaninotto/Faker/pull/1356) ([nicodmf](https://github.com/nicodmf)) +- Add company provider for tr\_TR [\#1355](https://github.com/fzaninotto/Faker/pull/1355) ([yuks](https://github.com/yuks)) +- nb\_NO provider updates [\#1350](https://github.com/fzaninotto/Faker/pull/1350) ([alexqhj](https://github.com/alexqhj)) +- only test available date range on 32-bit [\#1348](https://github.com/fzaninotto/Faker/pull/1348) ([remicollet](https://github.com/remicollet)) +- Bump PHPUnit version for namespace compatibility [\#1345](https://github.com/fzaninotto/Faker/pull/1345) ([carusogabriel](https://github.com/carusogabriel)) +- Use PSR-1 for PHPUnit TestCase [\#1344](https://github.com/fzaninotto/Faker/pull/1344) ([carusogabriel](https://github.com/carusogabriel)) +- Fix FR\_fr 07 prefix mobile number generation [\#1343](https://github.com/fzaninotto/Faker/pull/1343) ([svanpoeck](https://github.com/svanpoeck)) +- Update Text.php [\#1339](https://github.com/fzaninotto/Faker/pull/1339) ([gulaandrij](https://github.com/gulaandrij)) +- Add two new company type in the Swiss Provider [\#1336](https://github.com/fzaninotto/Faker/pull/1336) ([pvullioud](https://github.com/pvullioud)) +- Change symbol 'minus' with code 226 to 'minus' with code 45 [\#1333](https://github.com/fzaninotto/Faker/pull/1333) ([Negasus](https://github.com/Negasus)) +- \[sl\_SI\] Created provider for Company [\#1331](https://github.com/fzaninotto/Faker/pull/1331) ([alesvaupotic](https://github.com/alesvaupotic)) +- Update city name [\#1328](https://github.com/fzaninotto/Faker/pull/1328) ([s9801077](https://github.com/s9801077)) +- Fix \#1305 realText in some cases breaks last character [\#1326](https://github.com/fzaninotto/Faker/pull/1326) ([iamraccoon](https://github.com/iamraccoon)) +- Real Dutch postal codes [\#1323](https://github.com/fzaninotto/Faker/pull/1323) ([ametad](https://github.com/ametad)) +- Added male and female titles for the en\_ZA locale [\#1321](https://github.com/fzaninotto/Faker/pull/1321) ([ViGouRCanberra](https://github.com/ViGouRCanberra)) +- Add German Email Providers [\#1320](https://github.com/fzaninotto/Faker/pull/1320) ([Stoffo](https://github.com/Stoffo)) +- Fix "Resource temporarily unavailable" [\#1319](https://github.com/fzaninotto/Faker/pull/1319) ([eberkund](https://github.com/eberkund)) +- Introduced the ability to specify a default timezone... [\#1316](https://github.com/fzaninotto/Faker/pull/1316) ([telkins](https://github.com/telkins)) +- South African licence codes [\#1315](https://github.com/fzaninotto/Faker/pull/1315) ([royalmitten](https://github.com/royalmitten)) +- Fix with incorrect name city. [\#1309](https://github.com/fzaninotto/Faker/pull/1309) ([zzenmate](https://github.com/zzenmate)) +- Fixed type-o in readme under section about Language specific formatters [\#1302](https://github.com/fzaninotto/Faker/pull/1302) ([espenkn](https://github.com/espenkn)) +- Update Person.php [\#1298](https://github.com/fzaninotto/Faker/pull/1298) ([yappkahowe](https://github.com/yappkahowe)) +- Allow children classes to access self::$suffix [\#1296](https://github.com/fzaninotto/Faker/pull/1296) ([greg0ire](https://github.com/greg0ire)) +- Fix with namespace payment provider for uk\_UA [\#1293](https://github.com/fzaninotto/Faker/pull/1293) ([zzenmate](https://github.com/zzenmate)) +- Update zh\_TW text provider [\#1292](https://github.com/fzaninotto/Faker/pull/1292) ([s9801077](https://github.com/s9801077)) +- Fix CURL status code in ImageTest.php [\#1290](https://github.com/fzaninotto/Faker/pull/1290) ([Sanfra1407](https://github.com/Sanfra1407)) +- Tax Id for companies and new formats for es\_VE [\#1287](https://github.com/fzaninotto/Faker/pull/1287) ([DIOHz0r](https://github.com/DIOHz0r)) +- Added idNumber for nl\_NL [\#1283](https://github.com/fzaninotto/Faker/pull/1283) ([artorozenga](https://github.com/artorozenga)) +- Feature/en us company ein [\#1273](https://github.com/fzaninotto/Faker/pull/1273) ([zachflower](https://github.com/zachflower)) + +## 2017-08-15, v1.7.0 + +- Added more Ukrainian banks [\#1271](https://github.com/fzaninotto/Faker/pull/1271) ([iamraccoon](https://github.com/iamraccoon)) +- Hotfix/failing unit tests [\#1269](https://github.com/fzaninotto/Faker/pull/1269) ([zachflower](https://github.com/zachflower)) +- Lock Travis-CI environment to Ubuntu Precise [\#1268](https://github.com/fzaninotto/Faker/pull/1268) ([zachflower](https://github.com/zachflower)) +- Added Ukrainian job title [\#1267](https://github.com/fzaninotto/Faker/pull/1267) ([iamraccoon](https://github.com/iamraccoon)) +- Add compliant en\_US SSN generator [\#1266](https://github.com/fzaninotto/Faker/pull/1266) ([zachflower](https://github.com/zachflower)) +- Added more Ukrainian streets and removed irrelevant names. Added more Ukrainian mobile formats [\#1265](https://github.com/fzaninotto/Faker/pull/1265) ([iamraccoon](https://github.com/iamraccoon)) +- Add Internet Format for ja\_JP. [\#1260](https://github.com/fzaninotto/Faker/pull/1260) ([itigoppo](https://github.com/itigoppo)) +- rectify ISO 4217 codes [\#1258](https://github.com/fzaninotto/Faker/pull/1258) ([eidng8](https://github.com/eidng8)) +- Corrected of grammar of Ukrainian middlenames and test added [\#1257](https://github.com/fzaninotto/Faker/pull/1257) ([vladbuk](https://github.com/vladbuk)) +- Update ISO 4217 active codes [\#1251](https://github.com/fzaninotto/Faker/pull/1251) ([eidng8](https://github.com/eidng8)) +- Update Composer File [\#1248](https://github.com/fzaninotto/Faker/pull/1248) ([vinkla](https://github.com/vinkla)) +- Set capitals to false [\#1243](https://github.com/fzaninotto/Faker/pull/1243) ([Stichoza](https://github.com/Stichoza)) +- Use static instead of self [\#1242](https://github.com/fzaninotto/Faker/pull/1242) ([Stichoza](https://github.com/Stichoza)) +- Add VAT french format [\#1241](https://github.com/fzaninotto/Faker/pull/1241) ([baptistedonaux](https://github.com/baptistedonaux)) +- Add swedish job titles [\#1234](https://github.com/fzaninotto/Faker/pull/1234) ([vinkla](https://github.com/vinkla)) +- Name Simo shouldn't have comma in it [\#1230](https://github.com/fzaninotto/Faker/pull/1230) ([simoheinonen](https://github.com/simoheinonen)) +- Fix: Add method annotation for ValidGenerator [\#1223](https://github.com/fzaninotto/Faker/pull/1223) ([localheinz](https://github.com/localheinz)) +- Add real text for es\_ES [\#1220](https://github.com/fzaninotto/Faker/pull/1220) ([driade](https://github.com/driade)) +- Fix spelling errors [\#1218](https://github.com/fzaninotto/Faker/pull/1218) ([driade](https://github.com/driade)) +- Fix spelling errors [\#1217](https://github.com/fzaninotto/Faker/pull/1217) ([driade](https://github.com/driade)) +- Fixes typo [\#1212](https://github.com/fzaninotto/Faker/pull/1212) ([skullboner](https://github.com/skullboner)) +- Add Person::middleName for ru\_RU provider [\#1209](https://github.com/fzaninotto/Faker/pull/1209) ([JustBlackBird](https://github.com/JustBlackBird)) +- Fix creditCardDetails type hint [\#1208](https://github.com/fzaninotto/Faker/pull/1208) ([jejung](https://github.com/jejung)) +- Expand dictionaries for ru\_RU locale [\#1206](https://github.com/fzaninotto/Faker/pull/1206) ([pwsdotru](https://github.com/pwsdotru)) +- Fix ng\_NG to en\_NG [\#1205](https://github.com/fzaninotto/Faker/pull/1205) ([raphaeldealmeida](https://github.com/raphaeldealmeida)) +- Add INN and KPP support for ru\_RU locale [\#1204](https://github.com/fzaninotto/Faker/pull/1204) ([pwsdotru](https://github.com/pwsdotru)) +- Remove break line on pt\_PT Address format [\#1203](https://github.com/fzaninotto/Faker/pull/1203) ([raphaeldealmeida](https://github.com/raphaeldealmeida)) +- Fix syntax of phpdoc boolean property [\#1198](https://github.com/fzaninotto/Faker/pull/1198) ([pavelkovar](https://github.com/pavelkovar)) +- add en\_HK provider [\#1196](https://github.com/fzaninotto/Faker/pull/1196) ([miklcct](https://github.com/miklcct)) +- use secure https [\#1186](https://github.com/fzaninotto/Faker/pull/1186) ([jpuck](https://github.com/jpuck)) +- Add PhoneNumberFormat for ja\_JP. [\#1185](https://github.com/fzaninotto/Faker/pull/1185) ([itigoppo](https://github.com/itigoppo)) +- Fix: Add class-level method annotations for DateTime provider [\#1183](https://github.com/fzaninotto/Faker/pull/1183) ([localheinz](https://github.com/localheinz)) +- Add ar\_SA Color Provider [\#1182](https://github.com/fzaninotto/Faker/pull/1182) ([alhoqbani](https://github.com/alhoqbani)) +- Added uk\_UA Payment provider with bank name generator [\#1181](https://github.com/fzaninotto/Faker/pull/1181) ([spaghettimaster](https://github.com/spaghettimaster)) +- Typos [\#1177](https://github.com/fzaninotto/Faker/pull/1177) ([ankitpokhrel](https://github.com/ankitpokhrel)) +- Fix XML document example [\#1176](https://github.com/fzaninotto/Faker/pull/1176) ([ankitpokhrel](https://github.com/ankitpokhrel)) +- Added Emoji to Miscellaneous [\#1175](https://github.com/fzaninotto/Faker/pull/1175) ([thomasfdm](https://github.com/thomasfdm)) +- Typos and doc block fixes [\#1170](https://github.com/fzaninotto/Faker/pull/1170) ([ankitpokhrel](https://github.com/ankitpokhrel)) +- Rewrote deprecated `each\(\)` usage [\#1168](https://github.com/fzaninotto/Faker/pull/1168) ([hboomsma](https://github.com/hboomsma)) +- Refactor text method to remove duplication [\#1163](https://github.com/fzaninotto/Faker/pull/1163) ([ankitpokhrel](https://github.com/ankitpokhrel)) +- Generate valid individual identification numbers kk\_KZ [\#1161](https://github.com/fzaninotto/Faker/pull/1161) ([YerlenZhubangaliyev](https://github.com/YerlenZhubangaliyev)) +- Added Address and Company \[fa\_IR\] [\#1160](https://github.com/fzaninotto/Faker/pull/1160) ([thisissorna](https://github.com/thisissorna)) +- Add Peruvian DNI generator [\#1158](https://github.com/fzaninotto/Faker/pull/1158) ([jgwong](https://github.com/jgwong)) +- Removed double semicolon [\#1154](https://github.com/fzaninotto/Faker/pull/1154) ([pjona](https://github.com/pjona)) +- Add prefixes for nl\_NL [\#1151](https://github.com/fzaninotto/Faker/pull/1151) ([hyperized](https://github.com/hyperized)) +- Separated male and female names for sr\_RS locale. [\#1144](https://github.com/fzaninotto/Faker/pull/1144) ([bogdanpet](https://github.com/bogdanpet)) +- Add personal ID, VAT for zh\_TW [\#1135](https://github.com/fzaninotto/Faker/pull/1135) ([Dagolin](https://github.com/Dagolin)) +- Updating ninth digit on whole country [\#1132](https://github.com/fzaninotto/Faker/pull/1132) ([gpressutto5](https://github.com/gpressutto5)) +- Indian states added to en\_IN locale [\#1131](https://github.com/fzaninotto/Faker/pull/1131) ([jiveshsg](https://github.com/jiveshsg)) +- Add Text provider for ro\_MD [\#1129](https://github.com/fzaninotto/Faker/pull/1129) ([wecerny](https://github.com/wecerny)) +- Add strict to randomNumber example [\#1124](https://github.com/fzaninotto/Faker/pull/1124) ([leepownall](https://github.com/leepownall)) +- Say Eloquent is supported [\#1123](https://github.com/fzaninotto/Faker/pull/1123) ([guidocella](https://github.com/guidocella)) +- Link Eloquent Populator [\#1120](https://github.com/fzaninotto/Faker/pull/1120) ([guidocella](https://github.com/guidocella)) +- Removed dead code from Luhn.php [\#1118](https://github.com/fzaninotto/Faker/pull/1118) ([Newman101](https://github.com/Newman101)) +- Improve Internet::transliterate performance [\#1112](https://github.com/fzaninotto/Faker/pull/1112) ([dunglas](https://github.com/dunglas)) +- fix typo [\#1109](https://github.com/fzaninotto/Faker/pull/1109) ([johannesnagl](https://github.com/johannesnagl)) +- \[cs\_CZ\] Fixed Czech phone numbers [\#1108](https://github.com/fzaninotto/Faker/pull/1108) ([tomasbedrich](https://github.com/tomasbedrich)) +- Update MasterCard BIN Range [\#1103](https://github.com/fzaninotto/Faker/pull/1103) ([andysnell](https://github.com/andysnell)) +- Add biggest german cities [\#1102](https://github.com/fzaninotto/Faker/pull/1102) ([Konafets](https://github.com/Konafets)) +- Change postal code format for ko\_KR [\#1094](https://github.com/fzaninotto/Faker/pull/1094) ([coozplz](https://github.com/coozplz)) +- Introduced the ability to specify the timezone for dateTimeThis\*\(\) methods [\#1090](https://github.com/fzaninotto/Faker/pull/1090) ([telkins](https://github.com/telkins)) +- Fixed Issue \#1086 [\#1088](https://github.com/fzaninotto/Faker/pull/1088) ([Newman101](https://github.com/Newman101)) +- \[ja\_JP\]kana of Japanese name by gender. [\#1087](https://github.com/fzaninotto/Faker/pull/1087) ([itigoppo](https://github.com/itigoppo)) +- Fix unused code [\#1083](https://github.com/fzaninotto/Faker/pull/1083) ([borgogelli](https://github.com/borgogelli)) +- Amended permissions for en\_GB AddressTest.php [\#1071](https://github.com/fzaninotto/Faker/pull/1071) ([Newman101](https://github.com/Newman101)) +- Ensure unique IDs in randomHtml [\#1068](https://github.com/fzaninotto/Faker/pull/1068) ([vlakoff](https://github.com/vlakoff)) +- Updated \[de\_DE\] city names [\#1067](https://github.com/fzaninotto/Faker/pull/1067) ([plxx](https://github.com/plxx)) +- Update method signature in Generator phpdoc [\#1066](https://github.com/fzaninotto/Faker/pull/1066) ([vlakoff](https://github.com/vlakoff)) +- Add Thai providers [\#1065](https://github.com/fzaninotto/Faker/pull/1065) ([tuwannu](https://github.com/tuwannu)) +- \(Minor\) Fixed the default locale stated in the readme [\#1064](https://github.com/fzaninotto/Faker/pull/1064) ([taylankasap](https://github.com/taylankasap)) +- \[nl\_NL\] Make person provider behave more realistically [\#1061](https://github.com/fzaninotto/Faker/pull/1061) ([curry684](https://github.com/curry684)) +- Add allowDuplicates option to randomElements\(\) [\#1060](https://github.com/fzaninotto/Faker/pull/1060) ([vlakoff](https://github.com/vlakoff)) +- Docblocks: Add some missing @method tags [\#1059](https://github.com/fzaninotto/Faker/pull/1059) ([Kurre](https://github.com/Kurre)) +- \[fi\_FI\] Improve phone number generator [\#1054](https://github.com/fzaninotto/Faker/pull/1054) ([Kurre](https://github.com/Kurre)) +- Add personalIdentityNumber\(\) to fi\_FI/Person.php [\#1053](https://github.com/fzaninotto/Faker/pull/1053) ([oittaa](https://github.com/oittaa)) +- Issue \#1041 [\#1052](https://github.com/fzaninotto/Faker/pull/1052) ([daleattree](https://github.com/daleattree)) +- Update Text.php [\#1051](https://github.com/fzaninotto/Faker/pull/1051) ([gulaandrij](https://github.com/gulaandrij)) +- Fix French phone numbers with 07 prefix [\#1046](https://github.com/fzaninotto/Faker/pull/1046) ([fzaninotto](https://github.com/fzaninotto)) +- \[Generator.php\] mt\_rand\(\) changed in PHP 7.1 [\#1045](https://github.com/fzaninotto/Faker/pull/1045) ([oittaa](https://github.com/oittaa)) +- Add 'FI' to Payment Provider [\#1044](https://github.com/fzaninotto/Faker/pull/1044) ([oittaa](https://github.com/oittaa)) +- Added id number generator to Person Provider for the en\_ZA locale [\#1039](https://github.com/fzaninotto/Faker/pull/1039) ([smithandre](https://github.com/smithandre)) +- \[Feature\] Add nigerian provider [\#1030](https://github.com/fzaninotto/Faker/pull/1030) ([elchroy](https://github.com/elchroy)) +- \[pl\_PL\] Handle state. [\#1029](https://github.com/fzaninotto/Faker/pull/1029) ([piotrooo](https://github.com/piotrooo)) +- Fixed polish text - change '--' into '-'. [\#1027](https://github.com/fzaninotto/Faker/pull/1027) ([piotrooo](https://github.com/piotrooo)) +- Update Text.php [\#1025](https://github.com/fzaninotto/Faker/pull/1025) ([gulaandrij](https://github.com/gulaandrij)) +- Adding Nationalized Citizens to DNI in Person.php [\#1021](https://github.com/fzaninotto/Faker/pull/1021) ([celisflen-bers](https://github.com/celisflen-bers)) +- Add nik to indonesia [\#1019](https://github.com/fzaninotto/Faker/pull/1019) ([Nuffic](https://github.com/Nuffic)) +- fix mb\_substr missing parameter error when generating japanese string with realText method [\#1018](https://github.com/fzaninotto/Faker/pull/1018) ([horan-geeker](https://github.com/horan-geeker)) +- IBAN Formatters for New Locales [\#1015](https://github.com/fzaninotto/Faker/pull/1015) ([okj579](https://github.com/okj579)) +- German Bank Names [\#1014](https://github.com/fzaninotto/Faker/pull/1014) ([okj579](https://github.com/okj579)) +- Adding countries for pl\_PL provider [\#1009](https://github.com/fzaninotto/Faker/pull/1009) ([mertcanesen](https://github.com/mertcanesen)) +- Adding Pattern Lab plugin to list of 3rd party libraries [\#1008](https://github.com/fzaninotto/Faker/pull/1008) ([EvanLovely](https://github.com/EvanLovely)) +- Korea top 100 lastName [\#1006](https://github.com/fzaninotto/Faker/pull/1006) ([tael](https://github.com/tael)) +- Use real Belgian postcodes instead of random number [\#1004](https://github.com/fzaninotto/Faker/pull/1004) ([toonevdb](https://github.com/toonevdb)) +- Add bankAccountNumber implementations [\#1000](https://github.com/fzaninotto/Faker/pull/1000) ([akramfares](https://github.com/akramfares)) +- Generates a random NIR number \(fr\_FR\) [\#997](https://github.com/fzaninotto/Faker/pull/997) ([Ultim4T0m](https://github.com/Ultim4T0m)) +- \#989 Fix country typo [\#996](https://github.com/fzaninotto/Faker/pull/996) ([adriantombu](https://github.com/adriantombu)) +- adding back CNP [\#988](https://github.com/fzaninotto/Faker/pull/988) ([the-noob](https://github.com/the-noob)) +- Fix phpunit tests fail on 64-bit systems \#982 [\#983](https://github.com/fzaninotto/Faker/pull/983) ([Powerhead13](https://github.com/Powerhead13)) +- Remove trailing dot in username if any [\#975](https://github.com/fzaninotto/Faker/pull/975) ([vlakoff](https://github.com/vlakoff)) +- HTML Lorem [\#971](https://github.com/fzaninotto/Faker/pull/971) ([rudkjobing](https://github.com/rudkjobing)) +- Fix a mixup between male and female last names in Icelandic. [\#970](https://github.com/fzaninotto/Faker/pull/970) ([arthur-olafsson](https://github.com/arthur-olafsson)) +- Remove duplicate [\#969](https://github.com/fzaninotto/Faker/pull/969) ([mijgame](https://github.com/mijgame)) +- fix \[zh\_CN\]PhoneNumber illegal operator prefix [\#966](https://github.com/fzaninotto/Faker/pull/966) ([zhwei](https://github.com/zhwei)) +- es\_ES: Generate VAT Number [\#964](https://github.com/fzaninotto/Faker/pull/964) ([miguelgf](https://github.com/miguelgf)) +- Update Image.php [\#963](https://github.com/fzaninotto/Faker/pull/963) ([gulaandrij](https://github.com/gulaandrij)) +- Remove cnp formatter from RO\_ro locale \(fails tests\) [\#962](https://github.com/fzaninotto/Faker/pull/962) ([fzaninotto](https://github.com/fzaninotto)) +- Adding valid en\_GB postcodes [\#961](https://github.com/fzaninotto/Faker/pull/961) ([the-noob](https://github.com/the-noob)) +- Adding Text for ro\_RO [\#959](https://github.com/fzaninotto/Faker/pull/959) ([the-noob](https://github.com/the-noob)) +- Minor: Fixed trailing space in DateTime provider [\#956](https://github.com/fzaninotto/Faker/pull/956) ([tifabien](https://github.com/tifabien)) +- Remove 'Stripper' from en\_US job titles [\#954](https://github.com/fzaninotto/Faker/pull/954) ([amcsi](https://github.com/amcsi)) +- fix 32bits issue [\#953](https://github.com/fzaninotto/Faker/pull/953) ([remicollet](https://github.com/remicollet)) +- Fix EAN8 checkSum generator [\#951](https://github.com/fzaninotto/Faker/pull/951) ([MatthieuMota](https://github.com/MatthieuMota)) +- Fixed description and the use of early undocumented parameters. [\#949](https://github.com/fzaninotto/Faker/pull/949) ([andrey-helldar](https://github.com/andrey-helldar)) +- Pushing new mobile prefixes in philippines [\#944](https://github.com/fzaninotto/Faker/pull/944) ([napoleon101392](https://github.com/napoleon101392)) +- Update Company.php [\#943](https://github.com/fzaninotto/Faker/pull/943) ([thiagotalma](https://github.com/thiagotalma)) +- Fix to Issue \#935 - German Locale [\#936](https://github.com/fzaninotto/Faker/pull/936) ([Newman101](https://github.com/Newman101)) +- el\_CY Locale [\#930](https://github.com/fzaninotto/Faker/pull/930) ([softius](https://github.com/softius)) +- Add phpdoc method dateTimeInInterval in Generator.php [\#926](https://github.com/fzaninotto/Faker/pull/926) ([KeithYeh](https://github.com/KeithYeh)) +- Harmonize fr\_\*\Company [\#918](https://github.com/fzaninotto/Faker/pull/918) ([Max13](https://github.com/Max13)) +- Fix: fix invalid parameter of mb\_substr\(\) [\#917](https://github.com/fzaninotto/Faker/pull/917) ([tkawaji](https://github.com/tkawaji)) +- kk\_KZ Company/person identification numbers unit tests [\#916](https://github.com/fzaninotto/Faker/pull/916) ([YerlenZhubangaliyev](https://github.com/YerlenZhubangaliyev)) +- ka\_GE: overall improvements to ka\_GE locale [\#913](https://github.com/fzaninotto/Faker/pull/913) ([hertzg](https://github.com/hertzg)) +- Fix: Do not pick a random float less than minimum [\#909](https://github.com/fzaninotto/Faker/pull/909) ([localheinz](https://github.com/localheinz)) +- Fix: Prefer dependencies installed from dist [\#908](https://github.com/fzaninotto/Faker/pull/908) ([localheinz](https://github.com/localheinz)) +- Add a building number with letter to German speaking locales. [\#903](https://github.com/fzaninotto/Faker/pull/903) ([markuspoerschke](https://github.com/markuspoerschke)) +- \[RFR\] Remove parts of the hu\_HU address formatters [\#902](https://github.com/fzaninotto/Faker/pull/902) ([fzaninotto](https://github.com/fzaninotto)) +- use Luhn to calculate ar\_SA id numbers. [\#875](https://github.com/fzaninotto/Faker/pull/875) ([FooBarQuaxx](https://github.com/FooBarQuaxx)) +- Fix Doctrine ODM Support [\#489](https://github.com/fzaninotto/Faker/pull/489) ([cbourgois](https://github.com/cbourgois)) + + +## 2016-04-29, v1.6.0 + +- Remove parts of the Hungarian (hu\_HU) address formatters [\#902](https://github.com/fzaninotto/Faker/pull/902) ([fzaninotto](https://github.com/fzaninotto)) +- Renamed norwegian (nb\_NO) locale [\#901](https://github.com/fzaninotto/Faker/pull/901) ([fzaninotto](https://github.com/fzaninotto)) +- Improveed German (de\_DE) titles [\#897](https://github.com/fzaninotto/Faker/pull/897) ([christianbartels](https://github.com/christianbartels)) +- Added VAT formatter to nl\_BE and fr\_BE providers [\#896](https://github.com/fzaninotto/Faker/pull/896) ([anvanza](https://github.com/anvanza)) +- Fixed provider namespace for Lithuanian (lt\_LT) [\#894](https://github.com/fzaninotto/Faker/pull/894) ([sanis](https://github.com/sanis)) +- Removed unnecessary (and incompatible) license from Russian and Ukrainian (uk\_UA & ru\_RU) Text providers [\#892](https://github.com/fzaninotto/Faker/pull/892) ([Newman101](https://github.com/Newman101)) +- Improved `languageCode` formatted to include all ISO-639-1 standard codes [\#889](https://github.com/fzaninotto/Faker/pull/889) ([andrewnicols](https://github.com/andrewnicols)) +- Improved Hungarian provider [\#883](https://github.com/fzaninotto/Faker/pull/883) ([balping](https://github.com/balping)) +- Fixed typo in Austrian Person provider [\#880](https://github.com/fzaninotto/Faker/pull/880) ([xelan](https://github.com/xelan)) +- Added Chines (zh\_CN) `catchPhrase` formatter [\#878](https://github.com/fzaninotto/Faker/pull/878) ([z-song](https://github.com/z-song)) +- Added mention of Brazilian (pt\_BR) providers in readme [\#877](https://github.com/fzaninotto/Faker/pull/877) ([iget-master](https://github.com/iget-master)) +- Updated composer `require` section to allow PHP 7 in safer way [\#874](https://github.com/fzaninotto/Faker/pull/874) ([TomasVotruba](https://github.com/TomasVotruba)) +- Added Greek (el\_GR) `mobilePhoneNumber` and `tollFreeNumber` formatters [\#869](https://github.com/fzaninotto/Faker/pull/869) ([sebdesign](https://github.com/sebdesign)) +- Added Lorempixel check for `ImageTest.php` to avoid test fails when the service is offline [\#866](https://github.com/fzaninotto/Faker/pull/866) ([Newman101](https://github.com/Newman101)) +- Added Chinese (zh\_CN) Providers [\#864](https://github.com/fzaninotto/Faker/pull/864) ([z-song](https://github.com/z-song)) +- Added unit tests for Canadian (en\_CA) provider [\#862](https://github.com/fzaninotto/Faker/pull/862) ([Newman101](https://github.com/Newman101)) +- Added Dutch BTW \(vat\) Number [\#861](https://github.com/fzaninotto/Faker/pull/861) ([LauLaman](https://github.com/LauLaman)) +- Improved Australian (en\_AU) provider [\#858](https://github.com/fzaninotto/Faker/pull/858) ([Newman101](https://github.com/Newman101)) +- Added Propel2 ORM support [\#852](https://github.com/fzaninotto/Faker/pull/852) ([iTechDhaval](https://github.com/iTechDhaval)) +- Added en\_IN unit test for `Address.php` [\#849](https://github.com/fzaninotto/Faker/pull/849) ([Newman101](https://github.com/Newman101)) +- Updated docs to clarify that `randomElements` does not repeat input elements [\#848](https://github.com/fzaninotto/Faker/pull/848) ([sustmi](https://github.com/sustmi)) +- Optimized Taiwanese (zh\_TW) `realText` provider [\#844](https://github.com/fzaninotto/Faker/pull/844) ([Newman101](https://github.com/Newman101)) +- Added more Iranian (fa\_IR) TLDs [\#843](https://github.com/fzaninotto/Faker/pull/843) ([VagrantStory](https://github.com/VagrantStory)) +- Added Hebrew (he\_IL) `country` formatter [\#841](https://github.com/fzaninotto/Faker/pull/841) ([yonirom](https://github.com/yonirom)) +- Documented `boolean` formatter [\#840](https://github.com/fzaninotto/Faker/pull/840) ([danieliancu](https://github.com/danieliancu)) +- Fixed modifiers anchor readme [\#838](https://github.com/fzaninotto/Faker/pull/838) ([danieliancu](https://github.com/danieliancu)) +- Added Dutch (nl\_NL) real text provider [\#837](https://github.com/fzaninotto/Faker/pull/837) ([endroid](https://github.com/endroid)) +- Added `valid` modifier [\#836](https://github.com/fzaninotto/Faker/pull/836) ([fzaninotto](https://github.com/fzaninotto)) +- Added Iranian (fa\_IR) `PhoneNumber` provider [\#833](https://github.com/fzaninotto/Faker/pull/833) ([ghost](https://github.com/ghost)) +- Add Brazilian (pt\_BR) `region` and `regionAbbr` formatters [\#828](https://github.com/fzaninotto/Faker/pull/828) ([francinaldo](https://github.com/francinaldo)) +- Improved Austrian (de\_AT) names, states, and realtext [\#826](https://github.com/fzaninotto/Faker/pull/826) ([Findus23](https://github.com/Findus23)) +- Improved German (de\_DE) names [\#825](https://github.com/fzaninotto/Faker/pull/825) ([Findus23](https://github.com/Findus23)) +- Improved Latvian (lv\_LV) first names [\#823](https://github.com/fzaninotto/Faker/pull/823) ([veisis](https://github.com/veisis)) +- Improved Latvian (lv\_LV) `phoneNumber` formatter [\#822](https://github.com/fzaninotto/Faker/pull/822) ([veisis](https://github.com/veisis)) +- Updated phpDoc link to IBAN format reference in `Payment` provider [\#821](https://github.com/fzaninotto/Faker/pull/821) ([god107](https://github.com/god107)) +- Updated Sport ORM populator to populate values for numeric fields [\#820](https://github.com/fzaninotto/Faker/pull/820) ([urisavka](https://github.com/urisavka)) +- Updated Chinese (zh\_CN) operators' phone number prefix. [\#819](https://github.com/fzaninotto/Faker/pull/819) ([vistart](https://github.com/vistart)) +- Optimized Spot ORM `EntityPopulator` [\#817](https://github.com/fzaninotto/Faker/pull/817) ([Newman101](https://github.com/Newman101)) +- Added Korean (ko\_KR) `realText` formatter [\#815](https://github.com/fzaninotto/Faker/pull/815) ([jdssem](https://github.com/jdssem)) +- Updated `imageUrl` formatter phpDoc [\#814](https://github.com/fzaninotto/Faker/pull/814) ([jonwurtzler](https://github.com/jonwurtzler)) +- Optimized Taiwanese (zh\_TW) text provider [\#809](https://github.com/fzaninotto/Faker/pull/809) ([BePsvPT](https://github.com/BePsvPT)) +- Added strict comparison to Czech (cs\_CS) `birthNumber` formatter [\#807](https://github.com/fzaninotto/Faker/pull/807) ([Newman101](https://github.com/Newman101)) +- Added Greek (el\_GR) `realText` formatter [\#805](https://github.com/fzaninotto/Faker/pull/805) ([hootlex](https://github.com/hootlex)) +- Added Simplified Chinese \(zh\_CN\) `state` and `stateAbbr` formatters [\#804](https://github.com/fzaninotto/Faker/pull/804) ([zhanghuanchong](https://github.com/zhanghuanchong)) +- Update `Image` provider to allow generation of grayscale images [\#801](https://github.com/fzaninotto/Faker/pull/801) ([neutralrockets](https://github.com/neutralrockets)) +- Fixed Taiwanese (zh_TW) incorrect `mb_substr()` arguments [\#799](https://github.com/fzaninotto/Faker/pull/799) ([BePsvPT](https://github.com/BePsvPT)) +- Added Spot ORM populator [\#796](https://github.com/fzaninotto/Faker/pull/796) ([urisavka](https://github.com/urisavka)) +- Added Italian (it\_IT) `vatId` and `taxId` formatters [\#790](https://github.com/fzaninotto/Faker/pull/790) ([brainrepo](https://github.com/brainrepo)) +- Added some fixes to Armenian (hy\_AM) locale [\#788](https://github.com/fzaninotto/Faker/pull/788) ([mhamlet](https://github.com/mhamlet)) +- Removed duplicate entries in `toAscii()` transliteration table, used in `Internet` provider [\#787](https://github.com/fzaninotto/Faker/pull/787) ([vlakoff](https://github.com/vlakoff)) +- Added Indian (en\_IN) providers [\#785](https://github.com/fzaninotto/Faker/pull/785) ([kartiksomani](https://github.com/kartiksomani)) +- Removed duplicate country names in various locales, removed non-random country arrays [\#784](https://github.com/fzaninotto/Faker/pull/784) ([fzaninotto](https://github.com/fzaninotto)) +- Improved Swiss (de\_CH) phone numbers [\#782](https://github.com/fzaninotto/Faker/pull/782) ([z38](https://github.com/z38)) +- Added Swiss (de\_CH) names [\#781](https://github.com/fzaninotto/Faker/pull/781) ([z38](https://github.com/z38)) +- Make capitalization of first word optional in Text Provider [\#778](https://github.com/fzaninotto/Faker/pull/778) ([LagunaJavier](https://github.com/LagunaJavier)) +- Added Georgian (ka\_GE) providers [\#777](https://github.com/fzaninotto/Faker/pull/777) ([akalongman](https://github.com/akalongman)) +- Fix CakePHP populator [\#776](https://github.com/fzaninotto/Faker/pull/776) ([daniel-mueller](https://github.com/daniel-mueller)) +- Added unit tests for `Address` provider in many locales [\#775](https://github.com/fzaninotto/Faker/pull/775) [\#773](https://github.com/fzaninotto/Faker/pull/773) [\#772](https://github.com/fzaninotto/Faker/pull/772) [\#767](https://github.com/fzaninotto/Faker/pull/767) [\#765](https://github.com/fzaninotto/Faker/pull/765) [\#764](https://github.com/fzaninotto/Faker/pull/764) [\#758](https://github.com/fzaninotto/Faker/pull/758) [\#756](https://github.com/fzaninotto/Faker/pull/756) [\#747](https://github.com/fzaninotto/Faker/pull/747) [\#741](https://github.com/fzaninotto/Faker/pull/741) ([Newman101](https://github.com/Newman101)) +- Added `dbi` formatter to Spanish (es\_ES) Person provider [\#763](https://github.com/fzaninotto/Faker/pull/763) ([mikk150](https://github.com/mikk150)) +- Added South Africa (en\_ZA) locale [\#761](https://github.com/fzaninotto/Faker/pull/761) ([smithandre](https://github.com/smithandre)) [\#760](https://github.com/fzaninotto/Faker/pull/760) ([smithandre](https://github.com/smithandre)) [\#759](https://github.com/fzaninotto/Faker/pull/759) ([smithandre](https://github.com/smithandre)) +- Added E.164 phone number generator [\#753](https://github.com/fzaninotto/Faker/pull/753) ([daleattree](https://github.com/daleattree)) +- Fixed serialization issue in `unique` modifier [\#749](https://github.com/fzaninotto/Faker/pull/749) ([EmanueleMinotto](https://github.com/EmanueleMinotto)) +- Added Switzerland (de\_CH, fr\_CH, it\_CH) providers [\#739](https://github.com/fzaninotto/Faker/pull/739) ([r3h6](https://github.com/r3h6)) +- Added PHPDocs, removed unused variable [\#738](https://github.com/fzaninotto/Faker/pull/738) ([daniel-mueller](https://github.com/daniel-mueller)) +- Fixed building numbers to have non-zero first bumber [\#737](https://github.com/fzaninotto/Faker/pull/737) ([jmauerhan](https://github.com/jmauerhan)) +- Updated ninth digit for Brazilian cell phone numbers [\#734](https://github.com/fzaninotto/Faker/pull/734) ([igorsantos07](https://github.com/igorsantos07)) +- Simplified Factory code [\#732](https://github.com/fzaninotto/Faker/pull/732) ([vlakoff](https://github.com/vlakoff)) +- Added mention of [images-generator](https://github.com/bruceheller/images-generator) in readme [\#731](https://github.com/fzaninotto/Faker/pull/731) ([bruceheller](https://github.com/bruceheller)) +- Optimize Internet::toAscii\(\) by using a static cache and translitteration [\#730](https://github.com/fzaninotto/Faker/pull/730) [\#729](https://github.com/fzaninotto/Faker/pull/729) +[\#725](https://github.com/fzaninotto/Faker/pull/725) [\#724](https://github.com/fzaninotto/Faker/pull/724) ([vlakoff](https://github.com/vlakoff)) +- Added more English (en\_GB) Phone Number formats [\#721](https://github.com/fzaninotto/Faker/pull/721) ([nickwebcouk](https://github.com/nickwebcouk)) +- Cleaned up `use` statements across the code [\#719](https://github.com/fzaninotto/Faker/pull/719) ([pomaxa](https://github.com/pomaxa)) +- Fixed CackePHP populator [\#718](https://github.com/fzaninotto/Faker/pull/718) ([sdustinh](https://github.com/sdustinh)) +- Cleaned up various phpmd notices [\#715](https://github.com/fzaninotto/Faker/pull/715) ([pomaxa](https://github.com/pomaxa)) +- Added `Color` provider to Latvian (lv_LV) locale [\#714](https://github.com/fzaninotto/Faker/pull/714) ([pomaxa](https://github.com/pomaxa)) +- Fixed bad randomization in Doctrine populator [\#713](https://github.com/fzaninotto/Faker/pull/713) ([pomaxa](https://github.com/pomaxa)) +- Added Mongolian (mn\_MN) providers [\#709](https://github.com/fzaninotto/Faker/pull/709) ([selmonal](https://github.com/selmonal)) +- Improved Australian (en\_AU) `postcode` formatter [\#703](https://github.com/fzaninotto/Faker/pull/703) ([xfxf](https://github.com/xfxf)) +- Added support for asterisks in `bothify` and `optimize` [\#701](https://github.com/fzaninotto/Faker/pull/701) ([nineinchnick](https://github.com/nineinchnick)) +- Fixed important distinction between ORM and database framework in README’s reference to an external Faker provider for POMM that I have never even tested. Anyway, POMM is highly recommended if you are a Postgres fan, or if you want to please Grégoire and help him finish his lifelong project of listening to music on a hi-fi audio equipment he built from his own hands [\#696](https://github.com/fzaninotto/Faker/pull/696) ([chanmix51](https://github.com/chanmix51)) +- Fixed example `text()` output in README [\#694](https://github.com/fzaninotto/Faker/pull/694) ([vlakoff](https://github.com/vlakoff)) +- Added mention of CakePHP 2.x Seeder Plugin to readme [\#691](https://github.com/fzaninotto/Faker/pull/691) ([ravage84](https://github.com/ravage84)) +- Fixed invalid email bug for Korean (ko\_KR) [\#690](https://github.com/fzaninotto/Faker/pull/690) ([pearlc](https://github.com/pearlc)) +- Removed an invalid Dutch (nl\_NL) lastname that breaks email generator [\#689](https://github.com/fzaninotto/Faker/pull/689) ([SpaceK33z](https://github.com/SpaceK33z)) +- Updated `numberBetween()` to be order agnostic [\#683](https://github.com/fzaninotto/Faker/pull/683) ([xfxf](https://github.com/xfxf)) +- Added several English (en\_US) bank-related formatters [\#682](https://github.com/fzaninotto/Faker/pull/682) ([okj579](https://github.com/okj579)) +- Fixed `ipv4` formatter to avoid generating special purpose addresses [\#681](https://github.com/fzaninotto/Faker/pull/681) ([ravage84](https://github.com/ravage84)) +- Moved `intl` extension to `require-dev` in `composer.json` file [\#680](https://github.com/fzaninotto/Faker/pull/680) ([jaschweder](https://github.com/jaschweder)) +- Added more Turkish (tr\_TR) phones number formats [\#678](https://github.com/fzaninotto/Faker/pull/678) ([Quanthir](https://github.com/Quanthir)) +- Fixed primary Key warning in CakePHP ORM populator [\#677](https://github.com/fzaninotto/Faker/pull/677) ([davidyell](https://github.com/davidyell)) +- Added time zone support for provider methods returning DateTime instance [\#675](https://github.com/fzaninotto/Faker/pull/675) ([bishopb](https://github.com/bishopb)) +- Removed trailing spaces from some Argentinian (es\_AR) female first names [\#674](https://github.com/fzaninotto/Faker/pull/674) ([ivanmirson](https://github.com/ivanmirson)) +- Added Lithuanian (lt\_LT) locale [\#673](https://github.com/fzaninotto/Faker/pull/673) ([ekateiva](https://github.com/ekateiva)) +- Added mention of Alice to readme [\#665](https://github.com/fzaninotto/Faker/pull/665) ([Seldaek](https://github.com/Seldaek)) +- Fixed namespace in tests [\#663](https://github.com/fzaninotto/Faker/pull/663) ([localheinz](https://github.com/localheinz)) +- Fixed trailing spaces in `Color` provider [\#662](https://github.com/fzaninotto/Faker/pull/662) ([apsylone](https://github.com/apsylone)) +- Removed duplicate country names in Russian (ru\_RU) `Address` provider [\#659](https://github.com/fzaninotto/Faker/pull/659) ([nurolopher](https://github.com/nurolopher)) +- Added `rgba` formatter to `Color` provider [\#653](https://github.com/fzaninotto/Faker/pull/653) ([apsylone](https://github.com/apsylone)) +- Fixed bad randomization in CakePHP populator [\#648](https://github.com/fzaninotto/Faker/pull/648) ([jadb](https://github.com/jadb)) +- Updated phpunit configuration to better use colors [\#643](https://github.com/fzaninotto/Faker/pull/643) ([localheinz](https://github.com/localheinz)) +- Updated `makefile` to install dev dependencies by default [\#642](https://github.com/fzaninotto/Faker/pull/642) ([localheinz](https://github.com/localheinz)) +- Updated Travis configuration to cache dependencies between builds [\#641](https://github.com/fzaninotto/Faker/pull/641) ([localheinz](https://github.com/localheinz)) +- Added SVG badge to readme for displaying Travis build status [\#640](https://github.com/fzaninotto/Faker/pull/640) ([localheinz](https://github.com/localheinz)) +- Added Croatian (hr\_HR) locale [\#638](https://github.com/fzaninotto/Faker/pull/638) ([toniperic](https://github.com/toniperic)) +- Updated `dateTimeBetween` PHPDoc [\#635](https://github.com/fzaninotto/Faker/pull/635) ([theofidry](https://github.com/theofidry)) +- Add mention of Symfony2 bundles in readme [\#634](https://github.com/fzaninotto/Faker/pull/634) ([theofidry](https://github.com/theofidry)) +- Added Hebrew (he\_IL) locale [\#633](https://github.com/fzaninotto/Faker/pull/633) ([yonirom](https://github.com/yonirom)) +- Updated `seed` to accept non-integer seeds [\#632](https://github.com/fzaninotto/Faker/pull/632) ([theofidry](https://github.com/theofidry)) +- Added DocBlock to `Factory::create()` [\#631](https://github.com/fzaninotto/Faker/pull/631) ([tonynelson19](https://github.com/tonynelson19)) +- Added `jobTitle` generator [\#630](https://github.com/fzaninotto/Faker/pull/630) ([gregoryduckworth](https://github.com/gregoryduckworth)) +- Updated Chinese (zh\_CN) `Person` provider to generate more correct names [\#628](https://github.com/fzaninotto/Faker/pull/628) ([phoenixgao](https://github.com/phoenixgao)) +- Updated Brazilian (pt\_BR) `cellphone` formatter to make it more flexible [\#623](https://github.com/fzaninotto/Faker/pull/623) ([igorsantos07](https://github.com/igorsantos07)) +- Add Arabic for Saudi Arabia (ar\_SA) locale [\#618](https://github.com/fzaninotto/Faker/pull/618) ([ibrasho](https://github.com/ibrasho)) +- Updated en\_US phone numbers [\#615](https://github.com/fzaninotto/Faker/pull/615) ([okj579](https://github.com/okj579)) +- Fixed typos in variable names and exceptions [\#614](https://github.com/fzaninotto/Faker/pull/614) ([pborreli](https://github.com/pborreli)) +- Added a table of contents to the readme file. [\#613](https://github.com/fzaninotto/Faker/pull/613) ([camilopayan](https://github.com/camilopayan)) +- Added Brazilian (es_BR) credit card formatters [\#608](https://github.com/fzaninotto/Faker/pull/608) ([igorsantos07](https://github.com/igorsantos07)) +- Updated `iban` formatter to be cross-locale [\#607](https://github.com/fzaninotto/Faker/pull/607) ([okj579](https://github.com/okj579)) +- Improved ORM name guesser logic [\#606](https://github.com/fzaninotto/Faker/pull/606) ([watermanio](https://github.com/watermanio)) +- Fixed doc typo [\#605](https://github.com/fzaninotto/Faker/pull/605) ([igorsantos07](https://github.com/igorsantos07)) +- Removed executable bits [\#593](https://github.com/fzaninotto/Faker/pull/593) ([siwinski](https://github.com/siwinski)) +- Fixed `iban` generator [\#590](https://github.com/fzaninotto/Faker/pull/590) ([okj579](https://github.com/okj579)) +- Added Philippines (en\_PH) `mobileNumber` formatter [\#589](https://github.com/fzaninotto/Faker/pull/589) ([lozadaOmr](https://github.com/lozadaOmr)) +- Added support for min / max params in `latitude` and `longitude` formatters [\#570](https://github.com/fzaninotto/Faker/pull/570) ([actuallymab](https://github.com/actuallymab)) +- Added Czech (cs_CZ) `birthNumber` formatter [\#535](https://github.com/fzaninotto/Faker/pull/535) ([tomasbedrich](https://github.com/tomasbedrich)) +- Added `dateTimeInInterval` formatter [\#526](https://github.com/fzaninotto/Faker/pull/526) ([nicodmf](https://github.com/nicodmf)) +- Updated `optional` and `boolean` apis to be more consistent [\#513](https://github.com/fzaninotto/Faker/pull/513) ([EmanueleMinotto](https://github.com/EmanueleMinotto)) +- Added Greek (el\_GR) `Address` provider [\#504](https://github.com/fzaninotto/Faker/pull/504) ([drakakisgeo](https://github.com/drakakisgeo)) + +## 2015-05-29, v1.5.0 * Added ability to print custom text on the images fetched by the Image provider [\#583](https://github.com/fzaninotto/Faker/pull/583) ([fzaninotto](https://github.com/fzaninotto)) -* Fixed typos in Preuvian (es\_PE) Person provider [\#581](https://github.com/fzaninotto/Faker/pull/581) [\#580](https://github.com/fzaninotto/Faker/pull/580) ([ysramirez](https://github.com/ysramirez)) +* Fixed typos in Peruvian (es\_PE) Person provider [\#581](https://github.com/fzaninotto/Faker/pull/581) [\#580](https://github.com/fzaninotto/Faker/pull/580) ([ysramirez](https://github.com/ysramirez)) * Added instructions for installing with composer to readme.md [\#572](https://github.com/fzaninotto/Faker/pull/572) ([totophe](https://github.com/totophe)) * Added Kazakh (kk\_KZ) locale [\#569](https://github.com/fzaninotto/Faker/pull/569) ([YerlenZhubangaliyev](https://github.com/YerlenZhubangaliyev)) * Added Korean (ko\_KR) locale [\#566](https://github.com/fzaninotto/Faker/pull/566) ([pearlc](https://github.com/pearlc)) @@ -112,8 +567,7 @@ To be released, v1.5.0 * Added English for New Zealand (en\_NZ) locale [\#283](https://github.com/fzaninotto/Faker/pull/283) ([JasonMortonNZ](https://github.com/JasonMortonNZ)) * Added mention of external Provider for cron expressions to readme[\#498](https://github.com/fzaninotto/Faker/pull/498) ([swekaj](https://github.com/swekaj)) -2014-06-04, v1.4.0 ------------------- +## 2014-06-04, v1.4.0 * Fixed typo in Slovak person names (cinan) * Added tests for uk_UA providers (serge-kuharev) @@ -176,8 +630,7 @@ To be released, v1.5.0 * Added 'kana' (ja_JP) name formatters (kzykhys) * Added allow_failure for hhvm to travis-ci and test against php 5.5 (toin0u) -2013-12-16, v1.3.0 ------------------- +## 2013-12-16, v1.3.0 * Fixed state generator in Australian (en_AU) provider (sebklaus) * Fixed IDE insights for locale specific providers (ulrikjohansson) @@ -224,9 +677,7 @@ To be released, v1.5.0 * Added Color provider with hexColor, rgbColor, rgbColorAsArray, rgbCssColor, safeColorName, and colorName formatters (lsv) * Added support for associative arrays in `randomElement` (aRn0D) - -2013-06-09, v1.2.0 ------------------- +## 2013-06-09, v1.2.0 * Added new provider for fr_BE locale (jflefebvre) * Updated locale provider to use a static locale list (spawn-guy) @@ -271,8 +722,7 @@ To be released, v1.5.0 * Fixed bug in Doctrine EntityPopulator (beberlei) * Added Finnish (fi_FI) provider (drodil) -2012-10-29, v1.1.0 ------------------- +## 2012-10-29, v1.1.0 * Updated text provider to return paragraphs as a string instead of array. Great for populating markdown textarea fields (Seldaek) * Updated dateTimeBetween to accept DateTime instances (Seldaek) @@ -289,7 +739,6 @@ To be released, v1.5.0 * Added latitude and longitude formatters to Address provider (fixe) * Added Serbian provider (umpirsky) -2012-07-10, v1.0.0 ------------------ +## 2012-07-10, v1.0.0 * Initial Version diff --git a/vendor/fzaninotto/faker/CONTRIBUTING.md b/vendor/fzaninotto/faker/CONTRIBUTING.md deleted file mode 100644 index b8cc8c3d..00000000 --- a/vendor/fzaninotto/faker/CONTRIBUTING.md +++ /dev/null @@ -1,21 +0,0 @@ -Contributing -============ - -If you've written a new formatter, adapted Faker to a new locale, or fixed a bug, your contribution is welcome! - -Before proposing a pull request, check the following: - -* Your code should follow the [PSR-2 coding standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) (and use [php-cs-fixer](https://github.com/fabpot/PHP-CS-Fixer) to fix inconsistencies). -* Unit tests should still pass after your patch -* As much as possible, add unit tests for your code -* If you add new providers (or new locales) and that they embed a lot of data for random generation (e.g. first names in a new language), please add a link to the reference you used for this list (example [in the ru_RU locale](https://github.com/fzaninotto/Faker/blob/master/src/Faker/Provider/ru_RU/Person.php#L13)). This will ease future updates of the list and debates about the most relevant data for this provider. -* If you add long list of random data, please split the list into several lines. This makes diffs easier to read, and facilitates core review. -* If you add new formatters, please include documentation for it in the README. Don't forget to add a line about new formatters in the `@property` or `@method` phpDoc entries in [Generator.php](https://github.com/fzaninotto/Faker/blob/master/src/Faker/Generator.php#L6-L118) to help IDEs auto-complete your formatters. -* If your new formatters are specific to a certain locale, document them in the [Language-specific formatters](https://github.com/fzaninotto/Faker#language-specific-formatters) list instead. -* Avoid changing existing sets of data. Some developers use Faker with seeding for unit tests ; changing the data makes their tests fail. -* Speed is important in all Faker usages. Make sure your code is optimized to generate thousands of fake items in no time, without consuming too much memory or CPU. -* If you commit a new feature, be prepared to help maintaining it. Watch the project on GitHub, and please comment on issues or PRs regarding the feature you contributed. - -Once your code is merged, it is available for free to everybody under the MIT License. Publishing your Pull Request on the Faker GitHub repository means that you agree with this license for your contribution. - -Thank you for your contribution! Faker wouldn't be so great without you. diff --git a/vendor/fzaninotto/faker/Makefile b/vendor/fzaninotto/faker/Makefile deleted file mode 100644 index 55e11d08..00000000 --- a/vendor/fzaninotto/faker/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -vendor/autoload.php: - composer install --no-interaction --prefer-source --dev - -.PHONY: sniff -sniff: vendor/autoload.php - vendor/bin/phpcs --standard=PSR2 src -n - -.PHONY: test -test: vendor/autoload.php - vendor/bin/phpunit --verbose diff --git a/vendor/fzaninotto/faker/composer.json b/vendor/fzaninotto/faker/composer.json index a4150312..acf673ec 100644 --- a/vendor/fzaninotto/faker/composer.json +++ b/vendor/fzaninotto/faker/composer.json @@ -2,7 +2,11 @@ "name": "fzaninotto/faker", "type": "library", "description": "Faker is a PHP library that generates fake data for you.", - "keywords": ["faker", "fixtures", "data"], + "keywords": [ + "faker", + "fixtures", + "data" + ], "license": "MIT", "authors": [ { @@ -10,15 +14,13 @@ } ], "require": { - "php": ">=5.3.3" + "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.5" + "ext-intl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7", + "squizlabs/php_codesniffer": "^2.9.2" }, - "suggest": { - "ext-intl": "*" - }, "autoload": { "psr-4": { "Faker\\": "src/Faker/" @@ -26,12 +28,15 @@ }, "autoload-dev": { "psr-4": { - "Faker\\PHPUnit\\": "test/Faker/" + "Faker\\Test\\": "test/Faker/" } }, "extra": { "branch-alias": { - "dev-master": "1.5.x-dev" + "dev-master": "1.9-dev" } + }, + "config": { + "sort-packages": true } } diff --git a/vendor/fzaninotto/faker/phpunit.xml.dist b/vendor/fzaninotto/faker/phpunit.xml.dist deleted file mode 100644 index fcd85faa..00000000 --- a/vendor/fzaninotto/faker/phpunit.xml.dist +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - ./test/Faker/ - - - diff --git a/vendor/fzaninotto/faker/readme.md b/vendor/fzaninotto/faker/readme.md index bc9f8317..1c0659ce 100644 --- a/vendor/fzaninotto/faker/readme.md +++ b/vendor/fzaninotto/faker/readme.md @@ -1,12 +1,49 @@ # Faker +[![Code Coverage](https://codecov.io/gh/fzaninotto/Faker/branch/master/graph/badge.svg)](https://codecov.io/gh/fzaninotto/Faker) + Faker is a PHP library that generates fake data for you. Whether you need to bootstrap your database, create good-looking XML documents, fill-in your persistence to stress test it, or anonymize data taken from a production service, Faker is for you. Faker is heavily inspired by Perl's [Data::Faker](http://search.cpan.org/~jasonk/Data-Faker-0.07/), and by ruby's [Faker](https://rubygems.org/gems/faker). Faker requires PHP >= 5.3.3. -[![Monthly Downloads](https://poser.pugx.org/fzaninotto/faker/d/monthly.png)](https://packagist.org/packages/fzaninotto/faker) [![Build Status](https://secure.travis-ci.org/fzaninotto/Faker.png)](http://travis-ci.org/fzaninotto/Faker) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/eceb78a9-38d4-4ad5-8b6b-b52f323e3549/mini.png)](https://insight.sensiolabs.com/projects/eceb78a9-38d4-4ad5-8b6b-b52f323e3549) +[![Monthly Downloads](https://poser.pugx.org/fzaninotto/faker/d/monthly.png)](https://packagist.org/packages/fzaninotto/faker) [![Build Status](https://travis-ci.org/fzaninotto/Faker.svg?branch=master)](https://travis-ci.org/fzaninotto/Faker) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/eceb78a9-38d4-4ad5-8b6b-b52f323e3549/mini.png)](https://insight.sensiolabs.com/projects/eceb78a9-38d4-4ad5-8b6b-b52f323e3549) + +# Table of Contents + +- [Installation](#installation) +- [Basic Usage](#basic-usage) +- [Formatters](#formatters) + - [Base](#fakerproviderbase) + - [Lorem Ipsum Text](#fakerproviderlorem) + - [Person](#fakerprovideren_usperson) + - [Address](#fakerprovideren_usaddress) + - [Phone Number](#fakerprovideren_usphonenumber) + - [Company](#fakerprovideren_uscompany) + - [Real Text](#fakerprovideren_ustext) + - [Date and Time](#fakerproviderdatetime) + - [Internet](#fakerproviderinternet) + - [User Agent](#fakerprovideruseragent) + - [Payment](#fakerproviderpayment) + - [Color](#fakerprovidercolor) + - [File](#fakerproviderfile) + - [Image](#fakerproviderimage) + - [Uuid](#fakerprovideruuid) + - [Barcode](#fakerproviderbarcode) + - [Miscellaneous](#fakerprovidermiscellaneous) + - [Biased](#fakerproviderbiased) + - [Html Lorem](#fakerproviderhtmllorem) +- [Modifiers](#modifiers) +- [Localization](#localization) +- [Populating Entities Using an ORM or an ODM](#populating-entities-using-an-orm-or-an-odm) +- [Seeding the Generator](#seeding-the-generator) +- [Faker Internals: Understanding Providers](#faker-internals-understanding-providers) +- [Real Life Usage](#real-life-usage) +- [Language specific formatters](#language-specific-formatters) +- [Third-Party Libraries Extending/Based On Faker](#third-party-libraries-extendingbased-on-faker) +- [License](#license) + ## Installation @@ -16,14 +53,29 @@ composer require fzaninotto/faker ## Basic Usage +### Autoloading + +Faker supports both `PSR-0` as `PSR-4` autoloaders. +```php +address; // "426 Jordy Lodge // Cartwrightshire, SC 88120-6700" echo $faker->text; - // Sint velit eveniet. Rerum atque repellat voluptatem quia rerum. Numquam excepturi - // beatae sint laudantium consequatur. Magni occaecati itaque sint et sit tempore. Nesciunt - // amet quidem. Iusto deleniti cum autem ad quia aperiam. - // A consectetur quos aliquam. In iste aliquid et aut similique suscipit. Consequatur qui - // quaerat iste minus hic expedita. Consequuntur error magni et laboriosam. Aut aspernatur - // voluptatem sit aliquam. Dolores voluptatum est. - // Aut molestias et maxime. Fugit autem facilis quos vero. Eius quibusdam possimus est. - // Ea quaerat et quisquam. Deleniti sunt quam. Adipisci consequatur id in occaecati. - // Et sint et. Ut ducimus quod nemo ab voluptatum. + // Dolores sit sint laboriosam dolorem culpa et autem. Beatae nam sunt fugit + // et sit et mollitia sed. + // Fuga deserunt tempora facere magni omnis. Omnis quia temporibus laudantium + // sit minima sint. ``` Even if this example shows a property access, each call to `$faker->name` yields a different (random) result. This is because Faker uses `__get()` magic, and forwards `Faker\Generator->$property` calls to `Faker\Generator->format($property)`. ```php name, "\n"; } // Adaline Reichel @@ -73,11 +120,13 @@ Each of the generator properties (like `name`, `address`, and `lorem`) are calle ### `Faker\Provider\Base` randomDigit // 7 + randomDigitNot(5) // 0, 1, 2, 3, 4, 6, 7, 8, or 9 randomDigitNotNull // 5 - randomNumber($nbDigits = NULL) // 79907610 + randomNumber($nbDigits = NULL, $strict = false) // 79907610 randomFloat($nbMaxDecimals = NULL, $min = 0, $max = NULL) // 48.8932 numberBetween($min = 1000, $max = 9000) // 8567 randomLetter // 'b' + // returns randomly ordered subsequence of a provided array randomElements($array = array ('a','b','c'), $count = 1) // array('c') randomElement($array = array ('a','b','c')) // 'b' shuffle('hello, world') // 'rlo,h eoldlw' @@ -90,13 +139,13 @@ Each of the generator properties (like `name`, `address`, and `lorem`) are calle ### `Faker\Provider\Lorem` - word // 'aut' - words($nb = 3) // array('porro', 'sed', 'magni') - sentence($nbWords = 6) // 'Sit vitae voluptas sint non voluptates.' - sentences($nb = 3) // array('Optio quos qui illo error.', 'Laborum vero a officia id corporis.', 'Saepe provident esse hic eligendi.') - paragraph($nbSentences = 3) // 'Ut ab voluptas sed a nam. Sint autem inventore aut officia aut aut blanditiis. Ducimus eos odit amet et est ut eum.' - paragraphs($nb = 3) // array('Quidem ut sunt et quidem est accusamus aut. Fuga est placeat rerum ut. Enim ex eveniet facere sunt.', 'Aut nam et eum architecto fugit repellendus illo. Qui ex esse veritatis.', 'Possimus omnis aut incidunt sunt. Asperiores incidunt iure sequi cum culpa rem. Rerum exercitationem est rem.') - text($maxNbChars = 200) // 'Fuga totam reiciendis qui architecto fugiat nemo. Consequatur recusandae qui cupiditate eos quod.' + word // 'aut' + words($nb = 3, $asText = false) // array('porro', 'sed', 'magni') + sentence($nbWords = 6, $variableNbWords = true) // 'Sit vitae voluptas sint non voluptates.' + sentences($nb = 3, $asText = false) // array('Optio quos qui illo error.', 'Laborum vero a officia id corporis.', 'Saepe provident esse hic eligendi.') + paragraph($nbSentences = 3, $variableNbSentences = true) // 'Ut ab voluptas sed a nam. Sint autem inventore aut officia aut aut blanditiis. Ducimus eos odit amet et est ut eum.' + paragraphs($nb = 3, $asText = false) // array('Quidem ut sunt et quidem est accusamus aut. Fuga est placeat rerum ut. Enim ex eveniet facere sunt.', 'Aut nam et eum architecto fugit repellendus illo. Qui ex esse veritatis.', 'Possimus omnis aut incidunt sunt. Asperiores incidunt iure sequi cum culpa rem. Rerum exercitationem est rem.') + text($maxNbChars = 200) // 'Fuga totam reiciendis qui architecto fugiat nemo. Consequatur recusandae qui cupiditate eos quod.' ### `Faker\Provider\en_US\Person` @@ -112,25 +161,27 @@ Each of the generator properties (like `name`, `address`, and `lorem`) are calle ### `Faker\Provider\en_US\Address` - cityPrefix // 'Lake' - secondaryAddress // 'Suite 961' - state // 'NewMexico' - stateAbbr // 'OH' - citySuffix // 'borough' - streetSuffix // 'Keys' - buildingNumber // '484' - city // 'West Judge' - streetName // 'Keegan Trail' - streetAddress // '439 Karley Loaf Suite 897' - postcode // '17916' - address // '8888 Cummings Vista Apt. 101, Susanbury, NY 95473' - country // 'Falkland Islands (Malvinas)' - latitude // 77.147489 - longitude // 86.211205 + cityPrefix // 'Lake' + secondaryAddress // 'Suite 961' + state // 'NewMexico' + stateAbbr // 'OH' + citySuffix // 'borough' + streetSuffix // 'Keys' + buildingNumber // '484' + city // 'West Judge' + streetName // 'Keegan Trail' + streetAddress // '439 Karley Loaf Suite 897' + postcode // '17916' + address // '8888 Cummings Vista Apt. 101, Susanbury, NY 95473' + country // 'Falkland Islands (Malvinas)' + latitude($min = -90, $max = 90) // 77.147489 + longitude($min = -180, $max = 180) // 86.211205 ### `Faker\Provider\en_US\PhoneNumber` - phoneNumber // '132-149-0269x3767' + phoneNumber // '201-886-0269 x3767' + tollFreePhoneNumber // '(888) 937-7238' + e164PhoneNumber // '+27113456789' ### `Faker\Provider\en_US\Company` @@ -138,6 +189,7 @@ Each of the generator properties (like `name`, `address`, and `lorem`) are calle bs // 'e-enable robust architectures' company // 'Bogan-Treutel' companySuffix // 'and Sons' + jobTitle // 'Cashier' ### `Faker\Provider\en_US\Text` @@ -146,16 +198,17 @@ Each of the generator properties (like `name`, `address`, and `lorem`) are calle ### `Faker\Provider\DateTime` unixTime($max = 'now') // 58781813 - dateTime($max = 'now') // DateTime('2008-04-25 08:37:17') - dateTimeAD($max = 'now') // DateTime('1800-04-29 20:38:49') + dateTime($max = 'now', $timezone = null) // DateTime('2008-04-25 08:37:17', 'UTC') + dateTimeAD($max = 'now', $timezone = null) // DateTime('1800-04-29 20:38:49', 'Europe/Paris') iso8601($max = 'now') // '1978-12-09T10:10:29+0000' date($format = 'Y-m-d', $max = 'now') // '1979-06-09' time($format = 'H:i:s', $max = 'now') // '20:49:42' - dateTimeBetween($startDate = '-30 years', $endDate = 'now') // DateTime('2003-03-15 02:00:49') - dateTimeThisCentury($max = 'now') // DateTime('1915-05-30 19:28:21') - dateTimeThisDecade($max = 'now') // DateTime('2007-05-29 22:30:48') - dateTimeThisYear($max = 'now') // DateTime('2011-02-27 20:52:14') - dateTimeThisMonth($max = 'now') // DateTime('2011-10-23 13:46:23') + dateTimeBetween($startDate = '-30 years', $endDate = 'now', $timezone = null) // DateTime('2003-03-15 02:00:49', 'Africa/Lagos') + dateTimeInInterval($startDate = '-30 years', $interval = '+ 5 days', $timezone = null) // DateTime('2003-03-15 02:00:49', 'Antartica/Vostok') + dateTimeThisCentury($max = 'now', $timezone = null) // DateTime('1915-05-30 19:28:21', 'UTC') + dateTimeThisDecade($max = 'now', $timezone = null) // DateTime('2007-05-29 22:30:48', 'Europe/Paris') + dateTimeThisYear($max = 'now', $timezone = null) // DateTime('2011-02-27 20:52:14', 'Africa/Lagos') + dateTimeThisMonth($max = 'now', $timezone = null) // DateTime('2011-10-23 13:46:23', 'Antarctica/Vostok') amPm($max = 'now') // 'pm' dayOfMonth($max = 'now') // '04' dayOfWeek($max = 'now') // 'Friday' @@ -165,6 +218,8 @@ Each of the generator properties (like `name`, `address`, and `lorem`) are calle century // 'VI' timezone // 'Europe/Paris' +Methods accepting a `$timezone` argument default to `date_default_timezone_get()`. You can pass a custom timezone string to each method, or define a custom timezone for all time methods at once using `$faker::setDefaultTimezone($timezone)`. + ### `Faker\Provider\Internet` email // 'tkshlerin@collins.com' @@ -201,7 +256,9 @@ Each of the generator properties (like `name`, `address`, and `lorem`) are calle creditCardExpirationDate // 04/13 creditCardExpirationDateString // '04/13' creditCardDetails // array('MasterCard', '4485480221084675', 'Aleksander Nowak', '04/13') - swiftBicNumber // RZTIAT22263 + // Generates a random IBAN. Set $countryCode to null for a random country + iban($countryCode) // 'IT31A8497112740YZ575DJ28BP4' + swiftBicNumber // 'RZTIAT22263' ### `Faker\Provider\Color` @@ -211,6 +268,8 @@ Each of the generator properties (like `name`, `address`, and `lorem`) are calle rgbCssColor // 'rgb(0,255,122)' safeColorName // 'fuchsia' colorName // 'Gainsbor' + hslColor // '340,50,20' + hslColorAsArray // array(340,50,20) ### `Faker\Provider\File` @@ -226,9 +285,12 @@ Each of the generator properties (like `name`, `address`, and `lorem`) are calle imageUrl($width = 640, $height = 480) // 'http://lorempixel.com/640/480/' imageUrl($width, $height, 'cats') // 'http://lorempixel.com/800/600/cats/' imageUrl($width, $height, 'cats', true, 'Faker') // 'http://lorempixel.com/800/400/cats/Faker' + imageUrl($width, $height, 'cats', true, 'Faker', true) // 'http://lorempixel.com/gray/800/400/cats/Faker/' Monochrome image image($dir = '/tmp', $width = 640, $height = 480) // '/tmp/13b73edae8443990be1aa8f1a483bc27.jpg' image($dir, $width, $height, 'cats') // 'tmp/13b73edae8443990be1aa8f1a483bc27.jpg' it's a cat! - image($dir, $width, $height, 'cats', true, 'Faker') // 'tmp/13b73edae8443990be1aa8f1a483bc27.jpg' it's a cat with Faker text + image($dir, $width, $height, 'cats', false) // '13b73edae8443990be1aa8f1a483bc27.jpg' it's a filename without path + image($dir, $width, $height, 'cats', true, false) // it's a no randomize images (default: `true`) + image($dir, $width, $height, 'cats', true, true, 'Faker') // 'tmp/13b73edae8443990be1aa8f1a483bc27.jpg' it's a cat with 'Faker' text. Default, `null`. ### `Faker\Provider\Uuid` @@ -243,6 +305,7 @@ Each of the generator properties (like `name`, `address`, and `lorem`) are calle ### `Faker\Provider\Miscellaneous` + boolean // false boolean($chanceOfGettingTrue = 50) // true md5 // 'de99a620c50f2990e87144735cd357e7' sha1 // 'f08e7f04ca1a413807ebc47551a40a20a0b4de5c' @@ -251,6 +314,7 @@ Each of the generator properties (like `name`, `address`, and `lorem`) are calle countryCode // UK languageCode // en currencyCode // EUR + emoji // 😠### `Faker\Provider\Biased` @@ -258,14 +322,19 @@ Each of the generator properties (like `name`, `address`, and `lorem`) are calle // with more chances to be close to 20 biasedNumberBetween($min = 10, $max = 20, $function = 'sqrt') -## Unique and Optional modifiers +### `Faker\Provider\HtmlLorem` -Faker provides two special providers, `unique()` and `optional()`, to be called before any provider. `optional()` can be useful for seeding non-required fields, like a mobile telephone number; `unique()` is required to populate fields that cannot accept twice the same value, like primary identifiers. + //Generate HTML document which is no more than 2 levels deep, and no more than 3 elements wide at any level. + randomHtml(2,3) // Aut illo dolorem et accusantium eum.
Id aut saepe non mollitia voluptas voluptas.Non consequatur.Incidunt est.Aut voluptatem.Officia voluptas rerum quo.Asperiores similique.
Sapiente dolorum dolorem sint laboriosam commodi qui.Commodi nihil nesciunt eveniet quo repudiandae.Voluptates explicabo numquam distinctio necessitatibus repellat.Provident ut doloremque nam eum modi aspernatur.Iusto inventore.
Animi nihil ratione id mollitia libero ipsa quia tempore.Velit est officia et aut tenetur dolorem sed mollitia expedita.Modi modi repudiandae pariatur voluptas rerum ea incidunt non molestiae eligendi eos deleniti.Exercitationem voluptatibus dolor est iste quod molestiae.Quia reiciendis.
Inventore impedit exercitationem voluptatibus rerum cupiditate.Qui.Aliquam.Autem nihil aut et.Dolor ut quia error.
Enim facilis iusto earum et minus rerum assumenda quis quia.Reprehenderit ut sapiente occaecati voluptatum dolor voluptatem vitae qui velit.Quod fugiat non.Sunt nobis totam mollitia sed nesciunt est deleniti cumque.Repudiandae quo.
Modi dicta libero quisquam doloremque qui autem.Voluptatem aliquid saepe laudantium facere eos sunt dolor.Est eos quis laboriosam officia expedita repellendus quia natus.Et neque delectus quod fugit enim repudiandae qui.Fugit soluta sit facilis facere repellat culpa magni voluptatem maiores tempora.
Enim dolores doloremque.Assumenda voluptatem eum perferendis exercitationem.Quasi in fugit deserunt ea perferendis sunt nemo consequatur dolorum soluta.Maxime repellat qui numquam voluptatem est modi.Alias rerum rerum hic hic eveniet.
Tempore voluptatem.Eaque.Et sit quas fugit iusto.Nemo nihil rerum dignissimos et esse.Repudiandae ipsum numquam.
Nemo sunt quia.Sint tempore est neque ducimus harum sed.Dicta placeat atque libero nihil.Et qui aperiam temporibus facilis eum.Ut dolores qui enim et maiores nesciunt.
Dolorum totam sint debitis saepe laborum.Quidem corrupti ea.Cum voluptas quod.Possimus consequatur quasi dolorem ut et.Et velit non hic labore repudiandae quis.
+ +## Modifiers + +Faker provides three special providers, `unique()`, `optional()`, and `valid()`, to be called before any provider. ```php // unique() forces providers to return unique values $values = array(); -for ($i=0; $i < 10; $i++) { +for ($i = 0; $i < 10; $i++) { // get a random digit, but always a new one, to avoid duplicates $values []= $faker->unique()->randomDigit; } @@ -274,7 +343,7 @@ print_r($values); // [4, 1, 8, 5, 0, 2, 6, 9, 7, 3] // providers with a limited range will throw an exception when no new unique value can be generated $values = array(); try { - for ($i=0; $i < 10; $i++) { + for ($i = 0; $i < 10; $i++) { $values []= $faker->unique()->randomDigitNotNull; } } catch (\OverflowException $e) { @@ -287,14 +356,14 @@ $faker->unique($reset = true)->randomDigitNotNull; // will not throw OverflowExc // optional() sometimes bypasses the provider to return a default value instead (which defaults to NULL) $values = array(); -for ($i=0; $i < 10; $i++) { +for ($i = 0; $i < 10; $i++) { // get a random digit, but also null sometimes $values []= $faker->optional()->randomDigit; } print_r($values); // [1, 4, null, 9, 5, null, null, 4, 6, null] // optional() accepts a weight argument to specify the probability of receiving the default value. -// 0 will always return the default value; 1 will always return the provider. Default weight is 0.5. +// 0 will always return the default value; 1 will always return the provider. Default weight is 0.5 (50% chance). $faker->optional($weight = 0.1)->randomDigit; // 90% chance of NULL $faker->optional($weight = 0.9)->randomDigit; // 10% chance of NULL @@ -302,16 +371,40 @@ $faker->optional($weight = 0.9)->randomDigit; // 10% chance of NULL // Defaults to NULL. $faker->optional($weight = 0.5, $default = false)->randomDigit; // 50% chance of FALSE $faker->optional($weight = 0.9, $default = 'abc')->word; // 10% chance of 'abc' + +// valid() only accepts valid values according to the passed validator functions +$values = array(); +$evenValidator = function($digit) { + return $digit % 2 === 0; +}; +for ($i = 0; $i < 10; $i++) { + $values []= $faker->valid($evenValidator)->randomDigit; +} +print_r($values); // [0, 4, 8, 4, 2, 6, 0, 8, 8, 6] + +// just like unique(), valid() throws an overflow exception when it can't generate a valid value +$values = array(); +try { + $faker->valid($evenValidator)->randomElement(1, 3, 5, 7, 9); +} catch (\OverflowException $e) { + echo "Can't pick an even number in that set!"; +} +``` + +If you would like to use a modifier with a value not generated by Faker, use the `passthrough()` method. `passthrough()` simply returns whatever value it was given. + +```php +$faker->optional()->passthrough(mt_rand(5, 15)); ``` ## Localization -`Faker\Factory` can take a locale as an argument, to return localized data. If no localized provider is found, the factory fallbacks to the default locale (en_EN). +`Faker\Factory` can take a locale as an argument, to return localized data. If no localized provider is found, the factory fallbacks to the default locale (en_US). ```php name, "\n"; } // Luce du Coulon @@ -330,16 +423,19 @@ You can check available Faker locales in the source code, [under the `Provider` ## Populating Entities Using an ORM or an ODM -Faker provides adapters for Object-Relational and Object-Document Mappers (currently, [Propel](http://www.propelorm.org), [Doctrine2](http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/), [CakePHP](http://cakephp.org) and [Mandango](https://github.com/mandango/mandango) are supported). These adapters ease the population of databases through the Entity classes provided by an ORM library (or the population of document stores using Document classes provided by an ODM library). +Faker provides adapters for Object-Relational and Object-Document Mappers (currently, [Propel](http://www.propelorm.org), [Doctrine2](http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/), [CakePHP](http://cakephp.org), [Spot2](https://github.com/vlucas/spot2), [Mandango](https://github.com/mandango/mandango) and [Eloquent](https://laravel.com/docs/master/eloquent) are supported). These adapters ease the population of databases through the Entity classes provided by an ORM library (or the population of document stores using Document classes provided by an ODM library). To populate entities, create a new populator class (using a generator instance as parameter), then list the class and number of all the entities that must be generated. To launch the actual data population, call the `execute()` method. +Note that some of the `populators` could require additional parameters. As example the `doctrine` populator has an option to specify +its batchSize on how often it will flush the UnitOfWork to the database. + Here is an example showing how to populate 5 `Author` and 10 `Book` objects: ```php addEntity('Author', 5); $populator->addEntity('Book', 10); $insertedPKs = $populator->execute(); @@ -377,6 +473,8 @@ print_r($insertedPKs); // ) ``` +**Note:** Due to the fact that `Faker` returns all the primary keys inserted, the memory consumption will go up drastically when you do batch inserts due to the big list of data. + In the previous example, the `Book` and `Author` models share a relationship. Since `Author` entities are populated first, Faker is smart enough to relate the populated `Book` entities to one of the populated `Author` entities. Lastly, if you want to execute an arbitrary function on an entity before insertion, use the fourth argument of the `addEntity()` method: @@ -494,8 +592,8 @@ $faker = Faker\Factory::create(); ?> - - + + boolean(25)): ?> @@ -531,7 +629,7 @@ Running this script produces a document looking like: ```xml - +
182 Harrison Cove @@ -549,7 +647,7 @@ Illum commodi molestiae aut repellat id. Et sit consequuntur aut et ullam asperi ]]> - +
90111 Hegmann Inlet @@ -560,7 +658,7 @@ Illum commodi molestiae aut repellat id. Et sit consequuntur aut et ullam asperi - +
9791 Nona Corner @@ -571,7 +669,7 @@ Illum commodi molestiae aut repellat id. Et sit consequuntur aut et ullam asperi - +
11161 Schultz Via @@ -590,7 +688,7 @@ Aut asperiores nihil eius repellendus. Vero nihil corporis voluptatem explicabo ]]> - +
6106 Nader Village Suite 753 @@ -603,7 +701,7 @@ Aut asperiores nihil eius repellendus. Vero nihil corporis voluptatem explicabo - +
7546 Kuvalis Plaza @@ -614,7 +712,7 @@ Aut asperiores nihil eius repellendus. Vero nihil corporis voluptatem explicabo - +
@@ -635,7 +733,7 @@ Et similique qui non expedita quia dolorum. Ex rem incidunt ea accusantium tempo ]]> - +
1251 Koelpin Mission @@ -646,7 +744,7 @@ Et similique qui non expedita quia dolorum. Ex rem incidunt ea accusantium tempo - +
6396 Langworth Hills Apt. 446 @@ -658,7 +756,7 @@ Et similique qui non expedita quia dolorum. Ex rem incidunt ea accusantium tempo - +
@@ -682,57 +780,75 @@ Fugiat non in itaque sunt nobis totam. Sed nesciunt est deleniti cumque alias. R ## Language specific formatters +### `Faker\Provider\ar_SA\Person` + +```php +idNumber; // ID number +echo $faker->nationalIdNumber // Citizen ID number +echo $faker->foreignerIdNumber // Foreigner ID number +echo $faker->companyIdNumber // Company ID number +``` + +### `Faker\Provider\ar_SA\Payment` + +```php +bankAccountNumber // "SA0218IBYZVZJSEC8536V4XC" +``` + ### `Faker\Provider\at_AT\Payment` + ```php vat; // "AT U12345678" - Austrian Value Added Tax number echo $faker->vat(false); // "ATU12345678" - unspaced Austrian Value Added Tax number - -``` - -### `Faker\Provider\be_BE\Payment` -```php -vat; // "BE 0123456789" - Belgian Value Added Tax number -echo $faker->vat(false); // "BE0123456789" - unspaced Belgian Value Added Tax number - ``` ### `Faker\Provider\bg_BG\Payment` + ```php vat; // "BG 0123456789" - Bulgarian Value Added Tax number echo $faker->vat(false); // "BG0123456789" - unspaced Bulgarian Value Added Tax number - ``` ### `Faker\Provider\cs_CZ\Address` + ```php region; // "Liberecký kraj" - ``` ### `Faker\Provider\cs_CZ\Company` + ```php ico; // "69663963" - ``` ### `Faker\Provider\cs_CZ\DateTime` + ```php monthNameGenitive; // "prosince" echo $faker->formattedDate; // "12. listopadu 2015" +``` +### `Faker\Provider\cs_CZ\Person` + +```php +birthNumber; // "7304243452" ``` ### `Faker\Provider\da_DK\Person` @@ -742,7 +858,6 @@ echo $faker->formattedDate; // "12. listopadu 2015" // Generates a random CPR number echo $faker->cpr; // "051280-2387" - ``` ### `Faker\Provider\da_DK\Address` @@ -755,7 +870,6 @@ echo $faker->kommune; // "Frederiksberg" // Generates a random region name echo $faker->region; // "Region Sjælland" - ``` ### `Faker\Provider\da_DK\Company` @@ -768,19 +882,277 @@ echo $faker->cvr; // "32458723" // Generates a random P number echo $faker->p; // "5398237590" - ``` -### `Faker\Provider\fr_FR\Company` +### `Faker\Provider\de_CH\Person` +```php +avs13; // "756.1234.5678.97" OR +echo $faker->ahv13; // "756.1234.5678.97" +``` + +### `Faker\Provider\de_DE\Payment` ```php siren; // 082 250 104 +echo $faker->bankAccountNumber; // "DE41849025553661169313" +echo $faker->bank; // "Volksbank Stuttgart" -// Generates a random SIRET number -echo $faker->siret; // 347 355 708 00224 +``` + +### `Faker\Provider\en_HK\Address` + +```php +town; // "Yuen Long" + +// Generates a fake village name based on the words commonly found in Hong Kong +echo $faker->village; // "O Tau" + +// Generates a fake estate name based on the words commonly found in Hong Kong +echo $faker->estate; // "Ching Lai Court" + +``` + +### `Faker\Provider\en_HK\Phone` + +```php +mobileNumber; // "92150087" + +// Generates a Hong Kong landline number (starting with 2 or 3) +echo $faker->landlineNumber; // "32750132" + +// Generates a Hong Kong fax number (starting with 7) +echo $faker->faxNumber; // "71937729" + +``` + +### `Faker\Provider\en_NG\Address` + +```php +region; // 'Katsina' +``` + +### `Faker\Provider\en_NG\Person` + +```php +name; // 'Oluwunmi Mayowa' +``` + +### `Faker\Provider\en_NZ\Phone` + +```php +mobileNumber; // "021 123 4567" + +// Generates a toll free number +echo $faker->tollFreeNumber; // "0800 123 456" + +// Area Code +echo $faker->areaCode; // "03" +``` + +### `Faker\Provider\en_US\Company` + +```php +ein; // '12-3456789' +``` + +### `Faker\Provider\en_US\Payment` + +```php +bankAccountNumber; // '51915734310' +echo $faker->bankRoutingNumber; // '212240302' +``` + +### `Faker\Provider\en_US\Person` + +```php +ssn; // '123-45-6789' +``` + +### `Faker\Provider\en_ZA\Company` + +```php +companyNumber; // 1999/789634/01 +``` + +### `Faker\Provider\en_ZA\Person` + +```php +idNumber; // 6606192211041 + +// Generates a random valid licence code +echo $faker->licenceCode; // EB +``` + +### `Faker\Provider\en_ZA\PhoneNumber` + +```php +tollFreeNumber; // 0800 555 5555 + +// Generates a mobile phone number +echo $faker->mobileNumber; // 082 123 5555 +``` + +### `Faker\Provider\es_ES\Person` + +```php +dni; // '77446565E' + +// Generates a random valid licence code +echo $faker->licenceCode; // B +``` + +### `Faker\Provider\es_ES\Payment` + +```php +vat; // "A35864370" +``` + +### `Faker\Provider\es_ES\PhoneNumber` + +```php +tollFreeNumber; // 900 123 456 + +// Generates a mobile phone number +echo $faker->mobileNumber; // +34 612 12 24 +``` + +### `Faker\Provider\es_PE\Person` + +```php +dni; // '83367512' +``` + +### `Faker\Provider\fa_IR\Person` + +```php +nationalCode; // "0078475759" +``` + +### `Faker\Provider\fa_IR\Address` + +```php +building; // "ساختمان Ø¢ÙØªØ§Ø¨" + +// Returns a random city name +echo $faker->city // "استان زنجان" +``` + +### `Faker\Provider\fa_IR\Company` + +```php +contract; // "رسمی" +``` + +### `Faker\Provider\fi_FI\Payment` + +```php +bankAccountNumber; // "FI8350799879879616" +``` + +### `Faker\Provider\fi_FI\Person` + +```php +personalIdentityNumber() // '170974-007J' + +//Since the numbers are different for male and female persons, optionally you can specify gender. +echo $faker->personalIdentityNumber(\DateTime::createFromFormat('Y-m-d', '2015-12-14'), 'female') // '141215A520B' +``` + +### `Faker\Provider\fr_BE\Payment` + +```php +vat; // "BE 0123456789" - Belgian Value Added Tax number +echo $faker->vat(false); // "BE0123456789" - unspaced Belgian Value Added Tax number +``` + +### `Faker\Provider\es_VE\Person` + +```php +nationalId; // 'V11223344' +``` + +### `Faker\Provider\es_VE\Company` + +```php +taxpayerIdentificationNumber; // 'J1234567891' +``` + +### `Faker\Provider\fr_CH\Person` +```php +avs13; // "756.1234.5678.97" ``` ### `Faker\Provider\fr_FR\Address` @@ -800,6 +1172,113 @@ $faker->department; // array('18' => 'Cher'); // Generates a random region echo $faker->region; // "Saint-Pierre-et-Miquelon" +// Generates a random appartement,stair +echo $faker->secondaryAddress; // "Bat. 961" +``` + +### `Faker\Provider\fr_FR\Company` + +```php +siren; // 082 250 104 + +// Generates a random SIRET number +echo $faker->siret; // 347 355 708 00224 +``` + +### `Faker\Provider\fr_FR\Payment` + +```php +vat; // FR 12 123 456 789 +``` + +### `Faker\Provider\fr_FR\Person` + +```php +nir; // 1 88 07 35 127 571 - 19 +``` + +### `Faker\Provider\fr_FR\PhoneNumber` + +```php +phoneNumber; // +33 (0)1 67 97 01 31 +echo $faker->mobileNumber; // +33 6 21 12 72 84 +echo $faker->serviceNumber // 08 98 04 84 46 +``` + + +### `Faker\Provider\he_IL\Payment` + +```php +bankAccountNumber // "IL392237392219429527697" +``` + +### `Faker\Provider\hr_HR\Payment` + +```php +bankAccountNumber // "HR3789114847226078672" +``` + +### `Faker\Provider\hu_HU\Payment` + +```php +bankAccountNumber; // "HU09904437680048220079300783" +``` + +### `Faker\Provider\id_ID\Person` + +```php +nik(); // "8522246001570940" +``` + +### `Faker\Provider\it_CH\Person` +```php +avs13; // "756.1234.5678.97" +``` + +### `Faker\Provider\it_IT\Company` + +```php +vatId(); // "IT98746784967" +``` + +### `Faker\Provider\it_IT\Person` + +```php +taxId(); // "DIXDPZ44E08F367A" ``` ### `Faker\Provider\ja_JP\Person` @@ -808,15 +1287,30 @@ echo $faker->region; // "Saint-Pierre-et-Miquelon" kanaName; // "アオタ ミノル" +echo $faker->kanaName($gender = null|'male'|'female') // "アオタ ミノル" // Generates a 'kana' first name -echo $faker->firstKanaName; // "ãƒãƒ«ã‚«" +echo $faker->firstKanaName($gender = null|'male'|'female') // "ヒデキ" + +// Generates a 'kana' first name on the male +echo $faker->firstKanaNameMale // "ヒデキ" + +// Generates a 'kana' first name on the female +echo $faker->firstKanaNameFemale // "マアヤ" // Generates a 'kana' last name echo $faker->lastKanaName; // "ナカジマ" ``` +### `Faker\Provider\ka_GE\Payment` + +```php +bankAccountNumber; // "GE33ZV9773853617253389" +``` + ### `Faker\Provider\kk_KZ\Company` ```php @@ -824,7 +1318,18 @@ echo $faker->lastKanaName; // "ナカジマ" // Generates an business identification number echo $faker->businessIdentificationNumber; // "150140000019" +``` +### `Faker\Provider\kk_KZ\Payment` + +```php +bank; // "Қазкоммерцбанк" + +// Generates a random bank account number +echo $faker->bankAccountNumber; // "KZ1076321LO4H6X41I37" ``` ### `Faker\Provider\kk_KZ\Person` @@ -835,6 +1340,8 @@ echo $faker->businessIdentificationNumber; // "150140000019" // Generates an individual identification number echo $faker->individualIdentificationNumber; // "780322300455" +// Generates an individual identification number based on his/her birth date +echo $faker->individualIdentificationNumber(new \DateTime('1999-03-01')); // "990301300455" ``` ### `Faker\Provider\ko_KR\Address` @@ -847,9 +1354,27 @@ echo $faker->metropolitanCity; // "서울특별시" // Generates a borough echo $faker->borough; // "강남구" - ``` +### `Faker\Provider\ko_KR\PhoneNumber` + +```php +localAreaPhoneNumber; // "02-1234-4567" + +// Generates a cell phone number +echo $faker->cellPhoneNumber; // "010-9876-5432" +``` + +### `Faker\Provider\lt_LT\Payment` + +```php +bankAccountNumber // "LT300848876740317118" +``` ### `Faker\Provider\lv_LV\Person` @@ -858,7 +1383,137 @@ echo $faker->borough; // "강남구" // Generates a random personal identity card number echo $faker->personalIdentityNumber; // "140190-12301" +``` +### `Faker\Provider\ms_MY\Address` + +```php +township; // "Taman Bahagia" + +// Generates a random Malaysian town address with matching postcode and state +echo $faker->townState; // "55100 Bukit Bintang, Kuala Lumpur" +``` + +### `Faker\Provider\ms_MY\Miscellaneous` + +```php +jpjNumberPlate; // "WPL 5169" +``` + +### `Faker\Provider\ms_MY\Payment` + +```php +bank; // "Maybank" + +// Generates a random Malaysian bank account number (10-16 digits) +echo $faker->bankAccountNumber; // "1234567890123456" + +// Generates a random Malaysian insurance company +echo $faker->insurance; // "AIA Malaysia" + +// Generates a random Malaysian bank SWIFT Code +echo $faker->swiftCode; // "MBBEMYKLXXX" +``` + +### `Faker\Provider\ms_MY\Person` + +```php +myKadNumber($gender = null|'male'|'female', $hyphen = null|true|false); // "710703471796" +``` + +### `Faker\Provider\ms_MY\PhoneNumber` + +```php +mobileNumber($countryCodePrefix = null|true|false, $formatting = null|true|false); // "+6012-705 3767" + +// Generates a random Malaysian landline number +echo $faker->fixedLineNumber($countryCodePrefix = null|true|false, $formatting = null|true|false); // "03-7112 0455" + +// Generates a random Malaysian voip number +echo $faker->voipNumber($countryCodePrefix = null|true|false, $formatting = null|true|false); // "015-458 7099" +``` + +### `Faker\Provider\ne_NP\Address` + +```php +district; + +//Generates a Nepali city name +echo $faker->cityName; +``` + +### `Faker\Provider\nl_BE\Payment` + +```php +vat; // "BE 0123456789" - Belgian Value Added Tax number +echo $faker->vat(false); // "BE0123456789" - unspaced Belgian Value Added Tax number +``` + +### `Faker\Provider\nl_BE\Person` + +```php +rrn(); // "83051711784" - Belgian Rijksregisternummer +echo $faker->rrn('female'); // "50032089858" - Belgian Rijksregisternummer for a female +``` + +### `Faker\Provider\nl_NL\Company` + +```php +jobTitle; // "Houtbewerker" +echo $faker->vat; // "NL123456789B01" - Dutch Value Added Tax number +echo $faker->btw; // "NL123456789B01" - Dutch Value Added Tax number (alias) +``` + +### `Faker\Provider\nl_NL\Person` + +```php +idNumber; // "111222333" - Dutch Personal identification number (BSN) +``` + +### `Faker\Provider\nb_NO\MobileNumber` + +```php +mobileNumber; // "+4799988777" +echo $faker->mobileNumber; // "999 88 777" +echo $faker->mobileNumber; // "99988777" +``` + +### `Faker\Provider\nb_NO\Payment` + +```php +bankAccountNumber; // "NO3246764709816" ``` ### `Faker\Provider\pl_PL\Person` @@ -872,7 +1527,6 @@ echo $faker->pesel; // "40061451555" echo $faker->personalIdentityNumber; // "AKX383360" // Generates a random taxpayer identification number (NIP) echo $faker->taxpayerIdentificationNumber; // '8211575109' - ``` ### `Faker\Provider\pl_PL\Company` @@ -884,7 +1538,6 @@ echo $faker->taxpayerIdentificationNumber; // '8211575109' echo $faker->regon; // "714676680" // Generates a random local REGON number echo $faker->regonLocal; // "15346111382836" - ``` ### `Faker\Provider\pl_PL\Payment` @@ -896,7 +1549,6 @@ echo $faker->regonLocal; // "15346111382836" echo $faker->bank; // "Narodowy Bank Polski" // Generates a random bank account number echo $faker->bankAccountNumber; // "PL14968907563953822118075816" - ``` ### `Faker\Provider\pt_PT\Person` @@ -906,7 +1558,18 @@ echo $faker->bankAccountNumber; // "PL14968907563953822118075816" // Generates a random taxpayer identification number (in portuguese - Número de Identificação Fiscal NIF) echo $faker->taxpayerIdentificationNumber; // '165249277' +``` +### `Faker\Provider\pt_BR\Address` + +```php +region; // 'Nordeste' + +// Generates a random region abbreviation +echo $faker->regionAbbr; // 'NE' ``` ### `Faker\Provider\pt_BR\PhoneNumber` @@ -928,8 +1591,8 @@ echo $faker->cellphone(true, true); // 98983-3945 or 7343-1290 // Using the "Number" suffix adds area code to the phone echo $faker->cellphoneNumber; // (11) 98309-2935 echo $faker->landlineNumber(false); // 3522835934 -echo $faker->phoneNumber; // formatted, random landline or cellphone (obbeying the 9th digit rule) -echo $faker->phoneNumberCleared; // not formatted, random landline or cellphone (obbeying the 9th digit rule) +echo $faker->phoneNumber; // formatted, random landline or cellphone (obeying the 9th digit rule) +echo $faker->phoneNumberCleared; // not formatted, random landline or cellphone (obeying the 9th digit rule) ``` ### `Faker\Provider\pt_BR\Person` @@ -944,7 +1607,35 @@ echo $faker->name; // 'Sr. Luis Adriano Sepúlveda Filho' echo $faker->cpf; // '145.343.345-76' echo $faker->cpf(false); // '45623467866' echo $faker->rg; // '84.405.736-3' -echo $faker->cnpj; // '23.663.478/0001-24' +echo $faker->rg(false); // '844057363' +``` + +### `Faker\Provider\pt_BR\Company` + +```php +cnpj; // '23.663.478/0001-24' +echo $faker->cnpj(false); // '23663478000124' +``` + +### `Faker\Provider\ro_MD\Payment` + +```php +bankAccountNumber; // "MD83BQW1CKMUW34HBESDP3A8" +``` + +### `Faker\Provider\ro_RO\Payment` + +```php +bankAccountNumber; // "RO55WRJE3OE8X3YQI7J26U1E" ``` ### `Faker\Provider\ro_RO\Person` @@ -956,19 +1647,22 @@ echo $faker->cnpj; // '23.663.478/0001-24' echo $faker->prefixMale; // "ing." // Generates a random female name prefix/title echo $faker->prefixFemale; // "d-na." -// Generates a random male fist name +// Generates a random male first name echo $faker->firstNameMale; // "Adrian" -// Generates a random female fist name +// Generates a random female first name echo $faker->firstNameFemale; // "Miruna" + // Generates a random Personal Numerical Code (CNP) echo $faker->cnp; // "2800523081231" -echo $faker->cnp($gender = NULL, $century = NULL, $county = NULL); - // Valid option values: -// $gender: m, f, 1, 2 -// $century: 1800, 1900, 2000, 1, 2, 3, 4, 5, 6 -// $county: 2 letter ISO 3166-2:RO county codes and B1-B6 for Bucharest's 6 sectors +// $gender: null (random), male, female +// $dateOfBirth (1800+): null (random), Y-m-d, Y-m (random day), Y (random month and day) +// i.e. '1981-06-16', '2015-03', '1900' +// $county: 2 letter ISO 3166-2:RO county codes and B1, B2, B3, B4, B5, B6 for Bucharest's 6 sectors +// $isResident true/false flag if the person resides in Romania +echo $faker->cnp($gender = null, $dateOfBirth = null, $county = null, $isResident = true); + ``` ### `Faker\Provider\ro_RO\PhoneNumber` @@ -989,24 +1683,25 @@ echo $faker->premiumRatePhoneNumber; // "0900123456" // Generates a Russian bank name (based on list of real russian banks) echo $faker->bank; // "ОТП Банк" + +//Generate a Russian Tax Payment Number for Company +echo $faker->inn; // 7813540735 + +//Generate a Russian Tax Code for Company +echo $faker->kpp; // 781301001 ``` -### `Faker\Provider\en_NZ\Phone` +### `Faker\Provider\sv_SE\Payment` ```php cellNumber; // "021 123 4567" - -// Generates a toll free number -echo $faker->tollFreeNumber; // "0800 123 456" - -// Area Code -echo $faker->areaCode; // "03" +// Generates a random bank account number +echo $faker->bankAccountNumber; // "SE5018548608468284909192" ``` ### `Faker\Provider\sv_SE\Person` + ```php personalIdentityNumber() // '950910-0799' //Since the numbers are different for male and female persons, optionally you can specify gender. echo $faker->personalIdentityNumber('female') // '950910-0781' - ``` +### `Faker\Provider\tr_TR\Person` -### `Faker\Provider\ne_NP\Address` ```php district; +//Generates a valid Turkish identity number (in Turkish - T.C. Kimlik No) +echo $faker->tcNo // '55300634882' -//Generates a Nepali city name -echo $faker->cityName; ``` + +### `Faker\Provider\zh_CN\Payment` + +```php +bank; // '中国建设银行' +``` + +### `Faker\Provider\uk_UA\Payment` + +```php +bank; // "Ощадбанк" +``` + +### `Faker\Provider\zh_TW\Person` + +```php +personalIdentityNumber; // A223456789 +``` + +### `Faker\Provider\zh_TW\Company` + +```php +VAT; //23456789 +``` + + ## Third-Party Libraries Extending/Based On Faker -* [BazingaFakerBundle](https://github.com/willdurand/BazingaFakerBundle): Put the awesome Faker library into the Symfony2 DIC and populate your database with fake data. -* [FakerServiceProvider](https://github.com/EmanueleMinotto/FakerServiceProvider): Faker Service Provider for Silex -* [faker-cli](https://github.com/bit3/faker-cli): Command Line Tool for the Faker PHP library -* [AliceFixturesBundle](https://github.com/h4cc/AliceFixturesBundle): A Symfony2 bundle for using Alice and Faker with data fixtures. Abled to use Doctrine ORM as well as Doctrine MongoDB ODM. -* [Factory Muffin](https://github.com/thephpleague/factory-muffin): enable the rapid creation of objects (PHP port of factory-girl) -* [CompanyNameGenerator](https://github.com/fzaninotto/CompanyNameGenerator): Generate names for English tech companies with class -* [datalea](https://github.com/spyrit/datalea) A highly customizable random test data generator web app -* [newage-ipsum](https://github.com/frequenc1/newage-ipsum): A new aged ipsum provider for the faker library inspired by http://sebpearce.com/bullshit/ -* [xml-faker](https://github.com/prewk/xml-faker): Create fake XML with Faker -* [faker-context](https://github.com/denheck/faker-context): Behat context using Faker to generate testdata -* [CronExpressionGenerator](https://github.com/swekaj/CronExpressionGenerator): Faker provider for generating random, valid cron expressions. +* Symfony bundles: + * [`willdurand/faker-bundle`](https://github.com/willdurand/BazingaFakerBundle): Put the awesome Faker library into the Symfony2 DIC and populate your database with fake data. + * [`hautelook/alice-bundle`](https://github.com/hautelook/AliceBundle), [`h4cc/alice-fixtures-bundle`](https://github.com/h4cc/AliceFixturesBundle): Bundles for using [`nelmio/alice`](https://packagist.org/packages/nelmio/alice) and Faker with data fixtures. Able to use Doctrine ORM as well as Doctrine MongoDB ODM. +* [`emanueleminotto/faker-service-provider`](https://github.com/EmanueleMinotto/FakerServiceProvider): Faker Service Provider for Silex +* [`bit3/faker-cli`](https://github.com/bit3/faker-cli): Command Line Tool for the Faker PHP library +* [`league/factory-muffin`](https://github.com/thephpleague/factory-muffin): enable the rapid creation of objects (PHP port of factory-girl) +* [`fzaninotto/company-name-generator`](https://github.com/fzaninotto/CompanyNameGenerator): Generate names for English tech companies with class +* [`emanueleminotto/faker-placehold-it-provider`](https://github.com/EmanueleMinotto/PlaceholdItProvider): Generate images using placehold.it +* [`spyrit/datalea`](https://github.com/spyrit/datalea) A highly customizable random test data generator web app +* [`frequenc1/newage-ipsum`](https://github.com/frequenc1/newage-ipsum): A new aged ipsum provider for the faker library inspired by http://sebpearce.com/bullshit/ +* [`prewk/xml-faker`](https://github.com/prewk/xml-faker): Create fake XML with Faker +* [`denheck/faker-context`](https://github.com/denheck/faker-context): Behat context using Faker to generate testdata +* [`swekaj/cron-expression-generator`](https://github.com/swekaj/CronExpressionGenerator): Faker provider for generating random, valid cron expressions. +* [`pragmafabrik/pomm-faker`](https://github.com/pragmafabrik/Pomm2Faker): Faker client for Pomm database framework (PostgreSQL) +* [`nelmio/alice`](https://github.com/nelmio/alice): Fixtures/object generator with a yaml DSL that can use Faker as data generator. +* [`ravage84/cakephp-fake-seeder`](https://github.com/ravage84/cakephp-fake-seeder) A CakePHP 2.x shell to seed your database with fake and/or fixed data. +* [`bheller/images-generator`](https://github.com/bruceheller/images-generator): An image generator provider using GD for placeholder type pictures +* [`pattern-lab/plugin-faker`](https://github.com/pattern-lab/plugin-php-faker): Pattern Lab is a Styleguide, Component Library, and Prototyping tool. This creates unique content each time Pattern Lab is generated. +* [`guidocella/eloquent-populator`](https://github.com/guidocella/eloquent-populator): Adapter for Laravel's Eloquent ORM. +* [`tamperdata/exiges`](https://github.com/tamperdata/exiges): Faker provider for generating random temperatures +* [`jzonta/faker-restaurant`](https://github.com/jzonta/FakerRestaurant): Faker for Food and Beverage names generate +* [`aalaap/faker-youtube`](https://github.com/aalaap/faker-youtube): Faker for YouTube URLs in various formats +* [`pelmered/fake-car`](https://github.com/pelmered/fake-car): Faker for cars and car data +* [`bluemmb/faker-picsum-photos-provider`](https://github.com/bluemmb/Faker-PicsumPhotos): Generate images using [picsum.photos](http://picsum.photos/) +* [`er1z/fakemock`](https://github.com/er1z/fakemock): Generate mocks using class-configuration and detection via Faker's guesser and Symfony asserts +* [`xvladqt/faker-lorem-flickr`](https://github.com/xvladxtremal/Faker-LoremFlickr): Generate images using [loremflickr.com](http://loremflickr.com/) +* [`metrakit/faker-eddy-malou`](https://github.com/Metrakit/faker-eddy-malou): Generate French Eddy Malou sentences & paragraphs +* [`drupol/belgian-national-number-faker`](https://github.com/drupol/belgian-national-number-faker): Generate fake Belgian national numbers +* [`elgentos/masquerade`](https://github.com/elgentos/masquerade): Configuration-based, platform-agnostic, locale-compatible data faker tool (out-of-the-box support for Magento 2) +* [`ottaviano/faker-gravatar`](https://github.com/ottaviano/faker-gravatar): Generate avatars using [Gravatar](https://en.gravatar.com/site/implement/images/) +* [`finwe/phpstan-faker`](https://github.com/finwe/phpstan-faker): PHPStan extension for Faker methods ## License -Faker is released under the MIT Licence. See the bundled LICENSE file for details. +Faker is released under the MIT License. See the bundled LICENSE file for details. diff --git a/vendor/fzaninotto/faker/src/Faker/Calculator/Ean.php b/vendor/fzaninotto/faker/src/Faker/Calculator/Ean.php new file mode 100644 index 00000000..a1e0c076 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Calculator/Ean.php @@ -0,0 +1,55 @@ += 0; $i -= 2) { + $even += $digits[$i]; + } + + $odd = 0; + for ($i = $length - 2; $i >= 0; $i -= 2) { + $odd += $digits[$i]; + } + + return (10 - ((3 * $even + $odd) % 10)) % 10; + } + + /** + * Checks whether the provided number is an EAN compliant number and that + * the checksum is correct. + * + * @param string $ean An EAN number + * @return boolean + */ + public static function isValid($ean) + { + if (!preg_match(self::PATTERN, $ean)) { + return false; + } + + return self::checksum(substr($ean, 0, -1)) === intval(substr($ean, -1)); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Calculator/Iban.php b/vendor/fzaninotto/faker/src/Faker/Calculator/Iban.php new file mode 100644 index 00000000..8a582312 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Calculator/Iban.php @@ -0,0 +1,73 @@ + 2, 2 => 4, 3 => 10, 4 => 3, 5 => 5, 6 => 9, 7 => 4, 8 => 6, 9 => 8); + $sum = 0; + for ($i = 1; $i <= 9; $i++) { + $sum += intval(substr($inn, $i-1, 1)) * $multipliers[$i]; + } + return strval(($sum % 11) % 10); + } + + /** + * Checks whether an INN has a valid checksum + * + * @param string $inn + * @return boolean + */ + public static function isValid($inn) + { + return self::checksum(substr($inn, 0, -1)) === substr($inn, -1, 1); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Calculator/Luhn.php b/vendor/fzaninotto/faker/src/Faker/Calculator/Luhn.php index 4caad29f..1cb71a16 100644 --- a/vendor/fzaninotto/faker/src/Faker/Calculator/Luhn.php +++ b/vendor/fzaninotto/faker/src/Faker/Calculator/Luhn.php @@ -2,8 +2,10 @@ namespace Faker\Calculator; +use InvalidArgumentException; + /** - * Utility class for generating Luhn checksum and validating a number + * Utility class for generating and validating Luhn numbers. * * Luhn algorithm is used to validate credit card numbers, IMEI numbers, and * National Provider Identifier numbers. @@ -13,6 +15,7 @@ namespace Faker\Calculator; class Luhn { /** + * @param string $number * @return int */ private static function checksum($number) @@ -21,16 +24,17 @@ class Luhn $length = strlen($number); $sum = 0; for ($i = $length - 1; $i >= 0; $i -= 2) { - $sum += $number{$i}; + $sum += $number[$i]; } for ($i = $length - 2; $i >= 0; $i -= 2) { - $sum += array_sum(str_split($number{$i} * 2)); + $sum += array_sum(str_split($number[$i] * 2)); } return $sum % 10; } /** + * @param $partialNumber * @return string */ public static function computeCheckDigit($partialNumber) @@ -46,10 +50,26 @@ class Luhn /** * Checks whether a number (partial number + check digit) is Luhn compliant * - * @return boolean + * @param string $number + * @return bool */ public static function isValid($number) { return self::checksum($number) === 0; } + + /** + * Generate a Luhn compliant number. + * + * @param string $partialValue + * + * @return string + */ + public static function generateLuhnNumber($partialValue) + { + if (!preg_match('/^\d+$/', $partialValue)) { + throw new InvalidArgumentException('Argument should be an integer.'); + } + return $partialValue . Luhn::computeCheckDigit($partialValue); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Calculator/TCNo.php b/vendor/fzaninotto/faker/src/Faker/Calculator/TCNo.php new file mode 100644 index 00000000..392d4552 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Calculator/TCNo.php @@ -0,0 +1,52 @@ + $digit) { + if ($index % 2 == 0) { + $evenSum += $digit; + } else { + $oddSum += $digit; + } + } + + $tenthDigit = (7 * $evenSum - $oddSum) % 10; + $eleventhDigit = ($evenSum + $oddSum + $tenthDigit) % 10; + + return $tenthDigit . $eleventhDigit; + } + + /** + * Checks whether an TCNo has a valid checksum + * + * @param string $tcNo + * @return boolean + */ + public static function isValid($tcNo) + { + return self::checksum(substr($tcNo, 0, -2)) === substr($tcNo, -2, 2); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/DefaultGenerator.php b/vendor/fzaninotto/faker/src/Faker/DefaultGenerator.php index ad75ccdb..eafd2eca 100644 --- a/vendor/fzaninotto/faker/src/Faker/DefaultGenerator.php +++ b/vendor/fzaninotto/faker/src/Faker/DefaultGenerator.php @@ -8,18 +8,29 @@ namespace Faker; */ class DefaultGenerator { - protected $default = null; + protected $default; public function __construct($default = null) { $this->default = $default; } + /** + * @param string $attribute + * + * @return mixed + */ public function __get($attribute) { return $this->default; } + /** + * @param string $method + * @param array $attributes + * + * @return mixed + */ public function __call($method, $attributes) { return $this->default; diff --git a/vendor/fzaninotto/faker/src/Faker/Documentor.php b/vendor/fzaninotto/faker/src/Faker/Documentor.php index f13df1f0..e42bdf40 100644 --- a/vendor/fzaninotto/faker/src/Faker/Documentor.php +++ b/vendor/fzaninotto/faker/src/Faker/Documentor.php @@ -6,16 +6,22 @@ class Documentor { protected $generator; + /** + * @param Generator $generator + */ public function __construct(Generator $generator) { $this->generator = $generator; } + /** + * @return array + */ public function getFormatters() { $formatters = array(); $providers = array_reverse($this->generator->getProviders()); - $providers[]= new \Faker\Provider\Base($this->generator); + $providers[]= new Provider\Base($this->generator); foreach ($providers as $provider) { $providerClass = get_class($provider); $formatters[$providerClass] = array(); diff --git a/vendor/fzaninotto/faker/src/Faker/Factory.php b/vendor/fzaninotto/faker/src/Faker/Factory.php index 430a9519..1d687817 100644 --- a/vendor/fzaninotto/faker/src/Faker/Factory.php +++ b/vendor/fzaninotto/faker/src/Faker/Factory.php @@ -6,8 +6,14 @@ class Factory { const DEFAULT_LOCALE = 'en_US'; - protected static $defaultProviders = array('Address', 'Barcode', 'Biased', 'Color', 'Company', 'DateTime', 'File', 'Image', 'Internet', 'Lorem', 'Miscellaneous', 'Payment', 'Person', 'PhoneNumber', 'Text', 'UserAgent', 'Uuid'); + protected static $defaultProviders = array('Address', 'Barcode', 'Biased', 'Color', 'Company', 'DateTime', 'File', 'HtmlLorem', 'Image', 'Internet', 'Lorem', 'Miscellaneous', 'Payment', 'Person', 'PhoneNumber', 'Text', 'UserAgent', 'Uuid'); + /** + * Create a new generator + * + * @param string $locale + * @return Generator + */ public static function create($locale = self::DEFAULT_LOCALE) { $generator = new Generator(); @@ -19,6 +25,11 @@ class Factory return $generator; } + /** + * @param string $provider + * @param string $locale + * @return string + */ protected static function getProviderClassname($provider, $locale = '') { if ($providerClass = self::findProviderClassname($provider, $locale)) { @@ -29,13 +40,17 @@ class Factory return $providerClass; } // fallback to no locale - $providerClass = self::findProviderClassname($provider); - if (class_exists($providerClass)) { + if ($providerClass = self::findProviderClassname($provider)) { return $providerClass; } throw new \InvalidArgumentException(sprintf('Unable to find provider "%s" with locale "%s"', $provider, $locale)); } + /** + * @param string $provider + * @param string $locale + * @return string + */ protected static function findProviderClassname($provider, $locale = '') { $providerClass = 'Faker\\' . ($locale ? sprintf('Provider\%s\%s', $locale, $provider) : sprintf('Provider\%s', $provider)); diff --git a/vendor/fzaninotto/faker/src/Faker/Generator.php b/vendor/fzaninotto/faker/src/Faker/Generator.php index a169997c..1db2608e 100644 --- a/vendor/fzaninotto/faker/src/Faker/Generator.php +++ b/vendor/fzaninotto/faker/src/Faker/Generator.php @@ -4,11 +4,14 @@ namespace Faker; /** * @property string $name + * @method string name(string $gender = null) * @property string $firstName + * @method string firstName(string $gender = null) * @property string $firstNameMale * @property string $firstNameFemale * @property string $lastName * @property string $title + * @method string title(string $gender = null) * @property string $titleMale * @property string $titleFemale * @@ -18,8 +21,10 @@ namespace Faker; * @property string $city * @property string $streetName * @property string $streetAddress + * @property string $secondaryAddress * @property string $postcode * @property string $address + * @property string $state * @property string $country * @property float $latitude * @property float $longitude @@ -30,23 +35,27 @@ namespace Faker; * @property string $isbn10 * * @property string $phoneNumber + * @property string $e164PhoneNumber * * @property string $company * @property string $companySuffix + * @property string $jobTitle * * @property string $creditCardType * @property string $creditCardNumber * @method string creditCardNumber($type = null, $formatted = false, $separator = '-') * @property \DateTime $creditCardExpirationDate * @property string $creditCardExpirationDateString - * @property string $creditCardDetails + * @property array $creditCardDetails * @property string $bankAccountNumber + * @method string iban($countryCode = null, $prefix = '', $length = null) * @property string $swiftBicNumber * @property string $vat * * @property string $word * @property string|array $words * @method string|array words($nb = 3, $asText = false) + * @method string word() * @property string $sentence * @method string sentence($nbWords = 6, $variableNbWords = true) * @property string|array $sentences @@ -89,16 +98,31 @@ namespace Faker; * @property \DateTime $dateTimeThisYear * @property \DateTime $dateTimeThisMonth * @property string $amPm - * @property int $dayOfMonth - * @property int $dayOfWeek - * @property int $month + * @property string $dayOfMonth + * @property string $dayOfWeek + * @property string $month * @property string $monthName - * @property int $year - * @property int $century + * @property string $year + * @property string $century * @property string $timezone + * @method string amPm($max = 'now') * @method string date($format = 'Y-m-d', $max = 'now') + * @method string dayOfMonth($max = 'now') + * @method string dayOfWeek($max = 'now') + * @method string iso8601($max = 'now') + * @method string month($max = 'now') + * @method string monthName($max = 'now') * @method string time($format = 'H:i:s', $max = 'now') - * @method \DateTime dateTimeBetween($startDate = '-30 years', $endDate = 'now') + * @method int unixTime($max = 'now') + * @method string year($max = 'now') + * @method \DateTime dateTime($max = 'now', $timezone = null) + * @method \DateTime dateTimeAd($max = 'now', $timezone = null) + * @method \DateTime dateTimeBetween($startDate = '-30 years', $endDate = 'now', $timezone = null) + * @method \DateTime dateTimeInInterval($date = '-30 years', $interval = '+5 days', $timezone = null) + * @method \DateTime dateTimeThisCentury($max = 'now', $timezone = null) + * @method \DateTime dateTimeThisDecade($max = 'now', $timezone = null) + * @method \DateTime dateTimeThisYear($max = 'now', $timezone = null) + * @method \DateTime dateTimeThisMonth($max = 'now', $timezone = null) * * @property string $md5 * @property string $sha1 @@ -108,9 +132,11 @@ namespace Faker; * @property string $countryISOAlpha3 * @property string $languageCode * @property string $currencyCode + * @property boolean $boolean * @method boolean boolean($chanceOfGettingTrue = 50) * * @property int $randomDigit + * @property int $randomDigitNot * @property int $randomDigitNotNull * @property string $randomLetter * @property string $randomAscii @@ -119,7 +145,7 @@ namespace Faker; * @method int numberBetween($min = 0, $max = 2147483647) * @method float randomFloat($nbMaxDecimals = null, $min = 0, $max = null) * @method mixed randomElement(array $array = array('a', 'b', 'c')) - * @method array randomElements(array $array = array('a', 'b', 'c'), $count = 1) + * @method array randomElements(array $array = array('a', 'b', 'c'), $count = 1, $allowDuplicates = false) * @method array|string shuffle($arg = '') * @method array shuffleArray(array $array = array()) * @method string shuffleString($string = '', $encoding = 'UTF-8') @@ -132,6 +158,8 @@ namespace Faker; * @method string toUpper($string = '') * @method Generator optional($weight = 0.5, $default = null) * @method Generator unique($reset = false, $maxRetries = 10000) + * @method Generator valid($validator = null, $maxRetries = 10000) + * @method mixed passthrough($passthrough) * * @method integer biasedNumberBetween($min = 0, $max = 100, $function = 'sqrt') * @@ -153,8 +181,8 @@ namespace Faker; * @property string $fileExtension * @method string file($sourceDirectory = '/tmp', $targetDirectory = '/tmp', $fullPath = true) * - * @method string imageUrl($width = 640, $height = 480, $category = null, $randomize = true) - * @method string image($dir = null, $width = 640, $height = 480, $category = null, $fullPath = true) + * @method string imageUrl($width = 640, $height = 480, $category = null, $randomize = true, $word = null, $gray = false) + * @method string image($dir = null, $width = 640, $height = 480, $category = null, $fullPath = true, $randomize = true, $word = null) * * @property string $hexColor * @property string $safeHexColor @@ -163,6 +191,9 @@ namespace Faker; * @property string $rgbCssColor * @property string $safeColorName * @property string $colorName + * + * @method string randomHtml($maxDepth = 4, $maxWidth = 4) + * */ class Generator { @@ -184,7 +215,11 @@ class Generator if ($seed === null) { mt_srand(); } else { - mt_srand($seed); + if (PHP_VERSION_ID < 70100) { + mt_srand((int) $seed); + } else { + mt_srand((int) $seed, MT_RAND_PHP); + } } } @@ -194,6 +229,8 @@ class Generator } /** + * @param string $formatter + * * @return Callable */ public function getFormatter($formatter) @@ -227,13 +264,34 @@ class Generator return $this->format($matches[1]); } + /** + * @param string $attribute + * + * @return mixed + */ public function __get($attribute) { return $this->format($attribute); } + /** + * @param string $method + * @param array $attributes + * + * @return mixed + */ public function __call($method, $attributes) { return $this->format($method, $attributes); } + + public function __destruct() + { + $this->seed(); + } + + public function __wakeup() + { + $this->formatters = []; + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Guesser/Name.php b/vendor/fzaninotto/faker/src/Faker/Guesser/Name.php index 604cce18..0b303db1 100644 --- a/vendor/fzaninotto/faker/src/Faker/Guesser/Name.php +++ b/vendor/fzaninotto/faker/src/Faker/Guesser/Name.php @@ -8,12 +8,20 @@ class Name { protected $generator; + /** + * @param \Faker\Generator $generator + */ public function __construct(\Faker\Generator $generator) { $this->generator = $generator; } - public function guessFormat($name) + /** + * @param string $name + * @param int|null $size Length of field, if known + * @return callable + */ + public function guessFormat($name, $size = null) { $name = Base::toLower($name); $generator = $this->generator; @@ -27,13 +35,11 @@ class Name return $generator->dateTime; }; } - switch ($name) { - case 'first_name': + switch (str_replace('_', '', $name)) { case 'firstname': return function () use ($generator) { return $generator->firstName; }; - case 'last_name': case 'lastname': return function () use ($generator) { return $generator->lastName; @@ -44,12 +50,14 @@ class Name return $generator->userName; }; case 'email': + case 'emailaddress': return function () use ($generator) { return $generator->email; }; - case 'phone_number': case 'phonenumber': case 'phone': + case 'telephone': + case 'telnumber': return function () use ($generator) { return $generator->phoneNumber; }; @@ -58,6 +66,7 @@ class Name return $generator->address; }; case 'city': + case 'town': return function () use ($generator) { return $generator->city; }; @@ -74,16 +83,71 @@ class Name return function () use ($generator) { return $generator->state; }; - case 'country': + case 'county': + if ($this->generator->locale == 'en_US') { + return function () use ($generator) { + return sprintf('%s County', $generator->city); + }; + } + return function () use ($generator) { - return $generator->country; + return $generator->state; + }; + case 'country': + switch ($size) { + case 2: + return function () use ($generator) { + return $generator->countryCode; + }; + case 3: + return function () use ($generator) { + return $generator->countryISOAlpha3; + }; + case 5: + case 6: + return function () use ($generator) { + return $generator->locale; + }; + default: + return function () use ($generator) { + return $generator->country; + }; + } + break; + case 'locale': + return function () use ($generator) { + return $generator->locale; + }; + case 'currency': + case 'currencycode': + return function () use ($generator) { + return $generator->currencyCode; + }; + case 'url': + case 'website': + return function () use ($generator) { + return $generator->url; + }; + case 'company': + case 'companyname': + case 'employer': + return function () use ($generator) { + return $generator->company; }; case 'title': + if ($size !== null && $size <= 10) { + return function () use ($generator) { + return $generator->title; + }; + } + return function () use ($generator) { return $generator->sentence; }; case 'body': case 'summary': + case 'article': + case 'description': return function () use ($generator) { return $generator->text; }; diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/CakePHP/ColumnTypeGuesser.php b/vendor/fzaninotto/faker/src/Faker/ORM/CakePHP/ColumnTypeGuesser.php index 0f36f607..0aa34130 100644 --- a/vendor/fzaninotto/faker/src/Faker/ORM/CakePHP/ColumnTypeGuesser.php +++ b/vendor/fzaninotto/faker/src/Faker/ORM/CakePHP/ColumnTypeGuesser.php @@ -11,6 +11,9 @@ class ColumnTypeGuesser $this->generator = $generator; } + /** + * @return \Closure|null + */ public function guessFormat($column, $table) { $generator = $this->generator; @@ -22,12 +25,12 @@ class ColumnTypeGuesser return $generator->boolean; }; case 'integer': - return function () use ($generator) { - return $generator->randomNumber(10); + return function () { + return mt_rand(0, intval('2147483647')); }; case 'biginteger': - return function () use ($generator) { - return $generator->randomNumber(20); + return function () { + return mt_rand(0, intval('9223372036854775807')); }; case 'decimal': case 'float': @@ -39,7 +42,11 @@ class ColumnTypeGuesser return $generator->uuid(); }; case 'string': - $columnData = $schema->column($column); + if (method_exists($schema, 'getColumn')) { + $columnData = $schema->getColumn($column); + } else { + $columnData = $schema->column($column); + } $length = $columnData['length']; return function () use ($generator, $length) { return $generator->text($length); diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/CakePHP/EntityPopulator.php b/vendor/fzaninotto/faker/src/Faker/ORM/CakePHP/EntityPopulator.php index 2eb1194a..2ec312aa 100644 --- a/vendor/fzaninotto/faker/src/Faker/ORM/CakePHP/EntityPopulator.php +++ b/vendor/fzaninotto/faker/src/Faker/ORM/CakePHP/EntityPopulator.php @@ -3,7 +3,6 @@ namespace Faker\ORM\CakePHP; use Cake\ORM\TableRegistry; -use Faker\Guesser\Name as NameGuesser; class EntityPopulator { @@ -17,11 +16,17 @@ class EntityPopulator $this->class = $class; } + /** + * @param string $name + */ public function __get($name) { return $this->{$name}; } + /** + * @param string $name + */ public function __set($name, $value) { $this->{$name} = $value; @@ -37,6 +42,9 @@ class EntityPopulator $this->modifiers = array_merge($this->modifiers, $modifiers); } + /** + * @return array + */ public function guessColumnFormatters($populator) { $formatters = []; @@ -71,7 +79,10 @@ class EntityPopulator return $formatters; } - public function guessModifiers($populator) + /** + * @return array + */ + public function guessModifiers() { $modifiers = []; $table = $this->getTable($this->class); @@ -99,7 +110,6 @@ class EntityPopulator } $foreignKey = $foreignKeys[array_rand($foreignKeys)]; - $primaryKey = $table->primaryKey(); $data[$assoc->foreignKey()] = $foreignKey; return $data; }; @@ -110,6 +120,9 @@ class EntityPopulator return $modifiers; } + /** + * @param array $options + */ public function execute($class, $insertedEntities, $options = []) { $table = $this->getTable($class); @@ -130,7 +143,11 @@ class EntityPopulator } $pk = $table->primaryKey(); - return $entity->{$pk}; + if (is_string($pk)) { + return $entity->{$pk}; + } + + return $entity->{$pk[0]}; } public function setConnection($name) diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/CakePHP/Populator.php b/vendor/fzaninotto/faker/src/Faker/ORM/CakePHP/Populator.php index cd5aa475..eda30a8e 100644 --- a/vendor/fzaninotto/faker/src/Faker/ORM/CakePHP/Populator.php +++ b/vendor/fzaninotto/faker/src/Faker/ORM/CakePHP/Populator.php @@ -10,21 +10,33 @@ class Populator protected $quantities = []; protected $guessers = []; + /** + * @param \Faker\Generator $generator + */ public function __construct(\Faker\Generator $generator) { $this->generator = $generator; } + /** + * @return \Faker\Generator + */ public function getGenerator() { return $this->generator; } + /** + * @return array + */ public function getGuessers() { return $this->guessers; } + /** + * @return $this + */ public function removeGuesser($name) { if ($this->guessers[$name]) { @@ -33,6 +45,10 @@ class Populator return $this; } + /** + * @return $this + * @throws \Exception + */ public function addGuesser($class) { if (!is_object($class)) { @@ -47,6 +63,11 @@ class Populator return $this; } + /** + * @param array $customColumnFormatters + * @param array $customModifiers + * @return $this + */ public function addEntity($entity, $number, $customColumnFormatters = [], $customModifiers = []) { if (!$entity instanceof EntityPopulator) { @@ -60,7 +81,7 @@ class Populator $entity->modifiers = $entity->guessModifiers($this); if ($customModifiers) { - $entity->mergeModifiers($customModifiers); + $entity->mergeModifiersWith($customModifiers); } $class = $entity->class; @@ -69,6 +90,10 @@ class Populator return $this; } + /** + * @param array $options + * @return array + */ public function execute($options = []) { $insertedEntities = []; diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/Doctrine/ColumnTypeGuesser.php b/vendor/fzaninotto/faker/src/Faker/ORM/Doctrine/ColumnTypeGuesser.php index 899dc95b..bd608f96 100644 --- a/vendor/fzaninotto/faker/src/Faker/ORM/Doctrine/ColumnTypeGuesser.php +++ b/vendor/fzaninotto/faker/src/Faker/ORM/Doctrine/ColumnTypeGuesser.php @@ -8,11 +8,18 @@ class ColumnTypeGuesser { protected $generator; + /** + * @param \Faker\Generator $generator + */ public function __construct(\Faker\Generator $generator) { $this->generator = $generator; } + /** + * @param ClassMetadata $class + * @return \Closure|null + */ public function guessFormat($fieldName, ClassMetadata $class) { $generator = $this->generator; @@ -60,6 +67,12 @@ class ColumnTypeGuesser return function () use ($generator) { return $generator->datetime; }; + case 'datetime_immutable': + case 'date_immutable': + case 'time_immutable': + return function () use ($generator) { + return \DateTimeImmutable::createFromMutable($generator->datetime); + }; default: // no smart way to guess what the user expects here return null; diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/Doctrine/EntityPopulator.php b/vendor/fzaninotto/faker/src/Faker/ORM/Doctrine/EntityPopulator.php index 5ed8acbb..bc703e54 100644 --- a/vendor/fzaninotto/faker/src/Faker/ORM/Doctrine/EntityPopulator.php +++ b/vendor/fzaninotto/faker/src/Faker/ORM/Doctrine/EntityPopulator.php @@ -3,8 +3,7 @@ namespace Faker\ORM\Doctrine; use Doctrine\Common\Persistence\ObjectManager; -use Doctrine\ORM\EntityManagerInterface; -use Doctrine\ORM\Mapping\ClassMetadata; +use Doctrine\Common\Persistence\Mapping\ClassMetadata; /** * Service class for populating a table through a Doctrine Entity class. @@ -42,11 +41,17 @@ class EntityPopulator return $this->class->getName(); } + /** + * @param $columnFormatters + */ public function setColumnFormatters($columnFormatters) { $this->columnFormatters = $columnFormatters; } + /** + * @return array + */ public function getColumnFormatters() { return $this->columnFormatters; @@ -57,21 +62,34 @@ class EntityPopulator $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters); } + /** + * @param array $modifiers + */ public function setModifiers(array $modifiers) { $this->modifiers = $modifiers; } + /** + * @return array + */ public function getModifiers() { return $this->modifiers; } + /** + * @param array $modifiers + */ public function mergeModifiersWith(array $modifiers) { $this->modifiers = array_merge($this->modifiers, $modifiers); } + /** + * @param \Faker\Generator $generator + * @return array + */ public function guessColumnFormatters(\Faker\Generator $generator) { $formatters = array(); @@ -82,7 +100,8 @@ class EntityPopulator continue; } - if ($formatter = $nameGuesser->guessFormat($fieldName)) { + $size = isset($this->class->fieldMappings[$fieldName]['length']) ? $this->class->fieldMappings[$fieldName]['length'] : null; + if ($formatter = $nameGuesser->guessFormat($fieldName, $size)) { $formatters[$fieldName] = $formatter; continue; } @@ -100,29 +119,45 @@ class EntityPopulator $relatedClass = $this->class->getAssociationTargetClass($assocName); $unique = $optional = false; - $mappings = $this->class->getAssociationMappings(); - foreach ($mappings as $mapping) { - if ($mapping['targetEntity'] == $relatedClass) { - if ($mapping['type'] == ClassMetadata::ONE_TO_ONE) { - $unique = true; - $optional = isset($mapping['joinColumns'][0]['nullable']) ? $mapping['joinColumns'][0]['nullable'] : false; - break; + if ($this->class instanceof \Doctrine\ORM\Mapping\ClassMetadata) { + $mappings = $this->class->getAssociationMappings(); + foreach ($mappings as $mapping) { + if ($mapping['targetEntity'] == $relatedClass) { + if ($mapping['type'] == \Doctrine\ORM\Mapping\ClassMetadata::ONE_TO_ONE) { + $unique = true; + $optional = isset($mapping['joinColumns'][0]['nullable']) ? $mapping['joinColumns'][0]['nullable'] : false; + break; + } + } + } + } elseif ($this->class instanceof \Doctrine\ODM\MongoDB\Mapping\ClassMetadata) { + $mappings = $this->class->associationMappings; + foreach ($mappings as $mapping) { + if ($mapping['targetDocument'] == $relatedClass) { + if ($mapping['type'] == \Doctrine\ODM\MongoDB\Mapping\ClassMetadata::ONE && $mapping['association'] == \Doctrine\ODM\MongoDB\Mapping\ClassMetadata::REFERENCE_ONE) { + $unique = true; + $optional = isset($mapping['nullable']) ? $mapping['nullable'] : false; + break; + } } } } $index = 0; $formatters[$assocName] = function ($inserted) use ($relatedClass, &$index, $unique, $optional) { - if ($unique && isset($inserted[$relatedClass])) { - $related = null; - if (isset($inserted[$relatedClass][$index]) || !$optional) { - $related = $inserted[$relatedClass][$index]; + + if (isset($inserted[$relatedClass])) { + if ($unique) { + $related = null; + if (isset($inserted[$relatedClass][$index]) || !$optional) { + $related = $inserted[$relatedClass][$index]; + } + + $index++; + + return $related; } - $index++; - - return $related; - } elseif (isset($inserted[$relatedClass])) { return $inserted[$relatedClass][mt_rand(0, count($inserted[$relatedClass]) - 1)]; } @@ -135,6 +170,9 @@ class EntityPopulator /** * Insert one new record using the Entity class. + * @param ObjectManager $manager + * @param bool $generateId + * @return EntityPopulator */ public function execute(ObjectManager $manager, $insertedEntities, $generateId = false) { @@ -160,8 +198,24 @@ class EntityPopulator { foreach ($this->columnFormatters as $field => $format) { if (null !== $format) { - $value = is_callable($format) ? $format($insertedEntities, $obj) : $format; - $this->class->reflFields[$field]->setValue($obj, $value); + // Add some extended debugging information to any errors thrown by the formatter + try { + $value = is_callable($format) ? $format($insertedEntities, $obj) : $format; + } catch (\InvalidArgumentException $ex) { + throw new \InvalidArgumentException(sprintf( + "Failed to generate a value for %s::%s: %s", + get_class($obj), + $field, + $ex->getMessage() + )); + } + // Try a standard setter if it's available, otherwise fall back on reflection + $setter = sprintf("set%s", ucfirst($field)); + if (is_callable(array($obj, $setter))) { + $obj->$setter($value); + } else { + $this->class->reflFields[$field]->setValue($obj, $value); + } } } } @@ -173,19 +227,23 @@ class EntityPopulator } } - private function generateId($obj, $column, EntityManagerInterface $manager) + /** + * @param ObjectManager $manager + * @return int|null + */ + private function generateId($obj, $column, ObjectManager $manager) { - /* @var $repository \Doctrine\ORM\EntityRepository */ + /* @var $repository \Doctrine\Common\Persistence\ObjectRepository */ $repository = $manager->getRepository(get_class($obj)); $result = $repository->createQueryBuilder('e') ->select(sprintf('e.%s', $column)) ->getQuery() - ->getResult(); - $ids = array_map('current', $result); + ->execute(); + $ids = array_map('current', $result->toArray()); $id = null; do { - $id = rand(); + $id = mt_rand(); } while (in_array($id, $ids)); return $id; diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/Doctrine/Populator.php b/vendor/fzaninotto/faker/src/Faker/ORM/Doctrine/Populator.php index 27114c03..d4c5dfb8 100644 --- a/vendor/fzaninotto/faker/src/Faker/ORM/Doctrine/Populator.php +++ b/vendor/fzaninotto/faker/src/Faker/ORM/Doctrine/Populator.php @@ -3,6 +3,7 @@ namespace Faker\ORM\Doctrine; use Doctrine\Common\Persistence\ObjectManager; +use Faker\Generator; /** * Service class for populating a database using the Doctrine ORM or ODM. @@ -10,16 +11,35 @@ use Doctrine\Common\Persistence\ObjectManager; */ class Populator { + /** @var int */ + protected $batchSize; + + /** @var Generator */ protected $generator; + + /** @var ObjectManager|null */ protected $manager; + + /** @var array */ protected $entities = array(); + + /** @var array */ protected $quantities = array(); + + /** @var array */ protected $generateId = array(); - public function __construct(\Faker\Generator $generator, ObjectManager $manager = null) + /** + * Populator constructor. + * @param Generator $generator + * @param ObjectManager|null $manager + * @param int $batchSize + */ + public function __construct(Generator $generator, ObjectManager $manager = null, $batchSize = 1000) { $this->generator = $generator; $this->manager = $manager; + $this->batchSize = $batchSize; } /** @@ -51,7 +71,10 @@ class Populator /** * Populate the database using all the Entity classes previously added. * - * @param EntityManager $entityManager A Doctrine connection object + * Please note that large amounts of data will result in more memory usage since the the Populator will return + * all newly created primary keys after executing. + * + * @param null|EntityManager $entityManager A Doctrine connection object * * @return array A list of the inserted PKs */ @@ -68,9 +91,18 @@ class Populator foreach ($this->quantities as $class => $number) { $generateId = $this->generateId[$class]; for ($i=0; $i < $number; $i++) { - $insertedEntities[$class][]= $this->entities[$class]->execute($entityManager, $insertedEntities, $generateId); + $insertedEntities[$class][]= $this->entities[$class]->execute( + $entityManager, + $insertedEntities, + $generateId + ); + if (count($insertedEntities) % $this->batchSize === 0) { + $entityManager->flush(); + $entityManager->clear($class); + } } $entityManager->flush(); + $entityManager->clear($class); } return $insertedEntities; diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/Mandango/ColumnTypeGuesser.php b/vendor/fzaninotto/faker/src/Faker/ORM/Mandango/ColumnTypeGuesser.php index e64dc758..d318b0aa 100644 --- a/vendor/fzaninotto/faker/src/Faker/ORM/Mandango/ColumnTypeGuesser.php +++ b/vendor/fzaninotto/faker/src/Faker/ORM/Mandango/ColumnTypeGuesser.php @@ -6,11 +6,17 @@ class ColumnTypeGuesser { protected $generator; + /** + * @param \Faker\Generator $generator + */ public function __construct(\Faker\Generator $generator) { $this->generator = $generator; } + /** + * @return \Closure|null + */ public function guessFormat($field) { $generator = $this->generator; diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/Mandango/EntityPopulator.php b/vendor/fzaninotto/faker/src/Faker/ORM/Mandango/EntityPopulator.php index 061df77f..667f5bec 100644 --- a/vendor/fzaninotto/faker/src/Faker/ORM/Mandango/EntityPopulator.php +++ b/vendor/fzaninotto/faker/src/Faker/ORM/Mandango/EntityPopulator.php @@ -23,6 +23,9 @@ class EntityPopulator $this->class = $class; } + /** + * @return string + */ public function getClass() { return $this->class; @@ -33,6 +36,9 @@ class EntityPopulator $this->columnFormatters = $columnFormatters; } + /** + * @return array + */ public function getColumnFormatters() { return $this->columnFormatters; @@ -43,6 +49,11 @@ class EntityPopulator $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters); } + /** + * @param \Faker\Generator $generator + * @param Mandango $mandango + * @return array + */ public function guessColumnFormatters(\Faker\Generator $generator, Mandango $mandango) { $formatters = array(); @@ -82,6 +93,7 @@ class EntityPopulator /** * Insert one new record using the Entity class. + * @param Mandango $mandango */ public function execute(Mandango $mandango, $insertedEntities) { diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/Mandango/Populator.php b/vendor/fzaninotto/faker/src/Faker/ORM/Mandango/Populator.php index 57a06a54..26736dc4 100644 --- a/vendor/fzaninotto/faker/src/Faker/ORM/Mandango/Populator.php +++ b/vendor/fzaninotto/faker/src/Faker/ORM/Mandango/Populator.php @@ -15,6 +15,10 @@ class Populator protected $entities = array(); protected $quantities = array(); + /** + * @param \Faker\Generator $generator + * @param Mandango $mandango + */ public function __construct(\Faker\Generator $generator, Mandango $mandango) { $this->generator = $generator; diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php b/vendor/fzaninotto/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php index cb3e4462..1df70494 100644 --- a/vendor/fzaninotto/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php +++ b/vendor/fzaninotto/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php @@ -9,11 +9,18 @@ class ColumnTypeGuesser { protected $generator; + /** + * @param \Faker\Generator $generator + */ public function __construct(\Faker\Generator $generator) { $this->generator = $generator; } + /** + * @param ColumnMap $column + * @return \Closure|null + */ public function guessFormat(ColumnMap $column) { $generator = $this->generator; @@ -22,11 +29,11 @@ class ColumnTypeGuesser return function () use ($generator) { return $generator->dateTime; }; - } else { - return function () use ($generator) { - return $generator->dateTimeAD; - }; } + + return function () use ($generator) { + return $generator->dateTimeAD; + }; } $type = $column->getType(); switch ($type) { @@ -92,7 +99,8 @@ class ColumnTypeGuesser }; case PropelColumnTypes::OBJECT: case PropelColumnTypes::PHP_ARRAY: - // no smart way to guess what the user expects here + default: + // no smart way to guess what the user expects here return null; } } diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/Propel/EntityPopulator.php b/vendor/fzaninotto/faker/src/Faker/ORM/Propel/EntityPopulator.php index a83d8726..1976a403 100644 --- a/vendor/fzaninotto/faker/src/Faker/ORM/Propel/EntityPopulator.php +++ b/vendor/fzaninotto/faker/src/Faker/ORM/Propel/EntityPopulator.php @@ -24,6 +24,9 @@ class EntityPopulator $this->class = $class; } + /** + * @return string + */ public function getClass() { return $this->class; @@ -34,6 +37,9 @@ class EntityPopulator $this->columnFormatters = $columnFormatters; } + /** + * @return array + */ public function getColumnFormatters() { return $this->columnFormatters; @@ -44,6 +50,10 @@ class EntityPopulator $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters); } + /** + * @param \Faker\Generator $generator + * @return array + */ public function guessColumnFormatters(\Faker\Generator $generator) { $formatters = array(); @@ -67,7 +77,7 @@ class EntityPopulator if ($columnMap->isPrimaryKey()) { continue; } - if ($formatter = $nameGuesser->guessFormat($columnMap->getPhpName())) { + if ($formatter = $nameGuesser->guessFormat($columnMap->getPhpName(), $columnMap->getSize())) { $formatters[$columnMap->getPhpName()] = $formatter; continue; } @@ -80,6 +90,10 @@ class EntityPopulator return $formatters; } + /** + * @param ColumnMap $columnMap + * @return bool + */ protected function isColumnBehavior(ColumnMap $columnMap) { foreach ($columnMap->getTable()->getBehaviors() as $name => $params) { @@ -108,6 +122,9 @@ class EntityPopulator $this->modifiers = $modifiers; } + /** + * @return array + */ public function getModifiers() { return $this->modifiers; @@ -118,6 +135,10 @@ class EntityPopulator $this->modifiers = array_merge($this->modifiers, $modifiers); } + /** + * @param \Faker\Generator $generator + * @return array + */ public function guessModifiers(\Faker\Generator $generator) { $modifiers = array(); @@ -138,7 +159,7 @@ class EntityPopulator }; break; case 'sortable': - $modifiers['sortable'] = function ($obj, $inserted) use ($class, $generator) { + $modifiers['sortable'] = function ($obj, $inserted) use ($class) { $maxRank = isset($inserted[$class]) ? count($inserted[$class]) : 0; $obj->insertAtRank(mt_rand(1, $maxRank + 1)); }; diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/Propel/Populator.php b/vendor/fzaninotto/faker/src/Faker/ORM/Propel/Populator.php index 067229bc..42857278 100644 --- a/vendor/fzaninotto/faker/src/Faker/ORM/Propel/Populator.php +++ b/vendor/fzaninotto/faker/src/Faker/ORM/Propel/Populator.php @@ -12,6 +12,9 @@ class Populator protected $entities = array(); protected $quantities = array(); + /** + * @param \Faker\Generator $generator + */ public function __construct(\Faker\Generator $generator) { $this->generator = $generator; diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/Propel2/ColumnTypeGuesser.php b/vendor/fzaninotto/faker/src/Faker/ORM/Propel2/ColumnTypeGuesser.php new file mode 100644 index 00000000..024965a7 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/ORM/Propel2/ColumnTypeGuesser.php @@ -0,0 +1,107 @@ +generator = $generator; + } + + /** + * @param ColumnMap $column + * @return \Closure|null + */ + public function guessFormat(ColumnMap $column) + { + $generator = $this->generator; + if ($column->isTemporal()) { + if ($column->getType() == PropelTypes::BU_DATE || $column->getType() == PropelTypes::BU_TIMESTAMP) { + return function () use ($generator) { + return $generator->dateTime; + }; + } + + return function () use ($generator) { + return $generator->dateTimeAD; + }; + } + $type = $column->getType(); + switch ($type) { + case PropelTypes::BOOLEAN: + case PropelTypes::BOOLEAN_EMU: + return function () use ($generator) { + return $generator->boolean; + }; + case PropelTypes::NUMERIC: + case PropelTypes::DECIMAL: + $size = $column->getSize(); + + return function () use ($generator, $size) { + return $generator->randomNumber($size + 2) / 100; + }; + case PropelTypes::TINYINT: + return function () { + return mt_rand(0, 127); + }; + case PropelTypes::SMALLINT: + return function () { + return mt_rand(0, 32767); + }; + case PropelTypes::INTEGER: + return function () { + return mt_rand(0, intval('2147483647')); + }; + case PropelTypes::BIGINT: + return function () { + return mt_rand(0, intval('9223372036854775807')); + }; + case PropelTypes::FLOAT: + return function () { + return mt_rand(0, intval('2147483647'))/mt_rand(1, intval('2147483647')); + }; + case PropelTypes::DOUBLE: + case PropelTypes::REAL: + return function () { + return mt_rand(0, intval('9223372036854775807'))/mt_rand(1, intval('9223372036854775807')); + }; + case PropelTypes::CHAR: + case PropelTypes::VARCHAR: + case PropelTypes::BINARY: + case PropelTypes::VARBINARY: + $size = $column->getSize(); + + return function () use ($generator, $size) { + return $generator->text($size); + }; + case PropelTypes::LONGVARCHAR: + case PropelTypes::LONGVARBINARY: + case PropelTypes::CLOB: + case PropelTypes::CLOB_EMU: + case PropelTypes::BLOB: + return function () use ($generator) { + return $generator->text; + }; + case PropelTypes::ENUM: + $valueSet = $column->getValueSet(); + + return function () use ($generator, $valueSet) { + return $generator->randomElement($valueSet); + }; + case PropelTypes::OBJECT: + case PropelTypes::PHP_ARRAY: + default: + // no smart way to guess what the user expects here + return null; + } + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/Propel2/EntityPopulator.php b/vendor/fzaninotto/faker/src/Faker/ORM/Propel2/EntityPopulator.php new file mode 100644 index 00000000..df5b6710 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/ORM/Propel2/EntityPopulator.php @@ -0,0 +1,192 @@ +class = $class; + } + + /** + * @return string + */ + public function getClass() + { + return $this->class; + } + + public function setColumnFormatters($columnFormatters) + { + $this->columnFormatters = $columnFormatters; + } + + /** + * @return array + */ + public function getColumnFormatters() + { + return $this->columnFormatters; + } + + public function mergeColumnFormattersWith($columnFormatters) + { + $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters); + } + + /** + * @param \Faker\Generator $generator + * @return array + */ + public function guessColumnFormatters(\Faker\Generator $generator) + { + $formatters = array(); + $class = $this->class; + $peerClass = $class::TABLE_MAP; + $tableMap = $peerClass::getTableMap(); + $nameGuesser = new \Faker\Guesser\Name($generator); + $columnTypeGuesser = new \Faker\ORM\Propel2\ColumnTypeGuesser($generator); + foreach ($tableMap->getColumns() as $columnMap) { + // skip behavior columns, handled by modifiers + if ($this->isColumnBehavior($columnMap)) { + continue; + } + if ($columnMap->isForeignKey()) { + $relatedClass = $columnMap->getRelation()->getForeignTable()->getClassname(); + $formatters[$columnMap->getPhpName()] = function ($inserted) use ($relatedClass) { + $relatedClass = trim($relatedClass, "\\"); + return isset($inserted[$relatedClass]) ? $inserted[$relatedClass][mt_rand(0, count($inserted[$relatedClass]) - 1)] : null; + }; + continue; + } + if ($columnMap->isPrimaryKey()) { + continue; + } + if ($formatter = $nameGuesser->guessFormat($columnMap->getPhpName(), $columnMap->getSize())) { + $formatters[$columnMap->getPhpName()] = $formatter; + continue; + } + if ($formatter = $columnTypeGuesser->guessFormat($columnMap)) { + $formatters[$columnMap->getPhpName()] = $formatter; + continue; + } + } + + return $formatters; + } + + /** + * @param ColumnMap $columnMap + * @return bool + */ + protected function isColumnBehavior(ColumnMap $columnMap) + { + foreach ($columnMap->getTable()->getBehaviors() as $name => $params) { + $columnName = Base::toLower($columnMap->getName()); + switch ($name) { + case 'nested_set': + $columnNames = array($params['left_column'], $params['right_column'], $params['level_column']); + if (in_array($columnName, $columnNames)) { + return true; + } + break; + case 'timestampable': + $columnNames = array($params['create_column'], $params['update_column']); + if (in_array($columnName, $columnNames)) { + return true; + } + break; + } + } + + return false; + } + + public function setModifiers($modifiers) + { + $this->modifiers = $modifiers; + } + + /** + * @return array + */ + public function getModifiers() + { + return $this->modifiers; + } + + public function mergeModifiersWith($modifiers) + { + $this->modifiers = array_merge($this->modifiers, $modifiers); + } + + /** + * @param \Faker\Generator $generator + * @return array + */ + public function guessModifiers(\Faker\Generator $generator) + { + $modifiers = array(); + $class = $this->class; + $peerClass = $class::TABLE_MAP; + $tableMap = $peerClass::getTableMap(); + foreach ($tableMap->getBehaviors() as $name => $params) { + switch ($name) { + case 'nested_set': + $modifiers['nested_set'] = function ($obj, $inserted) use ($class, $generator) { + if (isset($inserted[$class])) { + $queryClass = $class . 'Query'; + $parent = $queryClass::create()->findPk($generator->randomElement($inserted[$class])); + $obj->insertAsLastChildOf($parent); + } else { + $obj->makeRoot(); + } + }; + break; + case 'sortable': + $modifiers['sortable'] = function ($obj, $inserted) use ($class) { + $maxRank = isset($inserted[$class]) ? count($inserted[$class]) : 0; + $obj->insertAtRank(mt_rand(1, $maxRank + 1)); + }; + break; + } + } + + return $modifiers; + } + + /** + * Insert one new record using the Entity class. + */ + public function execute($con, $insertedEntities) + { + $obj = new $this->class(); + foreach ($this->getColumnFormatters() as $column => $format) { + if (null !== $format) { + $obj->setByName($column, is_callable($format) ? $format($insertedEntities, $obj) : $format); + } + } + foreach ($this->getModifiers() as $modifier) { + $modifier($obj, $insertedEntities); + } + $obj->save($con); + + return $obj->getPrimaryKey(); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/Propel2/Populator.php b/vendor/fzaninotto/faker/src/Faker/ORM/Propel2/Populator.php new file mode 100644 index 00000000..c0efe3b8 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/ORM/Propel2/Populator.php @@ -0,0 +1,92 @@ +generator = $generator; + } + + /** + * Add an order for the generation of $number records for $entity. + * + * @param mixed $entity A Propel ActiveRecord classname, or a \Faker\ORM\Propel2\EntityPopulator instance + * @param int $number The number of entities to populate + */ + public function addEntity($entity, $number, $customColumnFormatters = array(), $customModifiers = array()) + { + if (!$entity instanceof \Faker\ORM\Propel2\EntityPopulator) { + $entity = new \Faker\ORM\Propel2\EntityPopulator($entity); + } + $entity->setColumnFormatters($entity->guessColumnFormatters($this->generator)); + if ($customColumnFormatters) { + $entity->mergeColumnFormattersWith($customColumnFormatters); + } + $entity->setModifiers($entity->guessModifiers($this->generator)); + if ($customModifiers) { + $entity->mergeModifiersWith($customModifiers); + } + $class = $entity->getClass(); + $this->entities[$class] = $entity; + $this->quantities[$class] = $number; + } + + /** + * Populate the database using all the Entity classes previously added. + * + * @param PropelPDO $con A Propel connection object + * + * @return array A list of the inserted PKs + */ + public function execute($con = null) + { + if (null === $con) { + $con = $this->getConnection(); + } + $isInstancePoolingEnabled = Propel::isInstancePoolingEnabled(); + Propel::disableInstancePooling(); + $insertedEntities = array(); + $con->beginTransaction(); + foreach ($this->quantities as $class => $number) { + for ($i=0; $i < $number; $i++) { + $insertedEntities[$class][]= $this->entities[$class]->execute($con, $insertedEntities); + } + } + $con->commit(); + if ($isInstancePoolingEnabled) { + Propel::enableInstancePooling(); + } + + return $insertedEntities; + } + + protected function getConnection() + { + // use the first connection available + $class = key($this->entities); + + if (!$class) { + throw new \RuntimeException('No class found from entities. Did you add entities to the Populator ?'); + } + + $peer = $class::TABLE_MAP; + + return Propel::getConnection($peer::DATABASE_NAME, ServiceContainerInterface::CONNECTION_WRITE); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/Spot/ColumnTypeGuesser.php b/vendor/fzaninotto/faker/src/Faker/ORM/Spot/ColumnTypeGuesser.php new file mode 100644 index 00000000..716a9f28 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/ORM/Spot/ColumnTypeGuesser.php @@ -0,0 +1,77 @@ +generator = $generator; + } + + /** + * @param array $field + * @return \Closure|null + */ + public function guessFormat(array $field) + { + $generator = $this->generator; + $type = $field['type']; + switch ($type) { + case 'boolean': + return function () use ($generator) { + return $generator->boolean; + }; + case 'decimal': + $size = isset($field['precision']) ? $field['precision'] : 2; + + return function () use ($generator, $size) { + return $generator->randomNumber($size + 2) / 100; + }; + case 'smallint': + return function () use ($generator) { + return $generator->numberBetween(0, 65535); + }; + case 'integer': + return function () use ($generator) { + return $generator->numberBetween(0, intval('2147483647')); + }; + case 'bigint': + return function () use ($generator) { + return $generator->numberBetween(0, intval('18446744073709551615')); + }; + case 'float': + return function () use ($generator) { + return $generator->randomFloat(null, 0, intval('4294967295')); + }; + case 'string': + $size = isset($field['length']) ? $field['length'] : 255; + + return function () use ($generator, $size) { + return $generator->text($size); + }; + case 'text': + return function () use ($generator) { + return $generator->text; + }; + case 'datetime': + case 'date': + case 'time': + return function () use ($generator) { + return $generator->datetime; + }; + default: + // no smart way to guess what the user expects here + return null; + } + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/Spot/EntityPopulator.php b/vendor/fzaninotto/faker/src/Faker/ORM/Spot/EntityPopulator.php new file mode 100644 index 00000000..bc27e7b0 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/ORM/Spot/EntityPopulator.php @@ -0,0 +1,219 @@ +mapper = $mapper; + $this->locator = $locator; + $this->useExistingData = $useExistingData; + } + + /** + * @return string + */ + public function getMapper() + { + return $this->mapper; + } + + /** + * @param $columnFormatters + */ + public function setColumnFormatters($columnFormatters) + { + $this->columnFormatters = $columnFormatters; + } + + /** + * @return array + */ + public function getColumnFormatters() + { + return $this->columnFormatters; + } + + /** + * @param $columnFormatters + */ + public function mergeColumnFormattersWith($columnFormatters) + { + $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters); + } + + /** + * @param array $modifiers + */ + public function setModifiers(array $modifiers) + { + $this->modifiers = $modifiers; + } + + /** + * @return array + */ + public function getModifiers() + { + return $this->modifiers; + } + + /** + * @param array $modifiers + */ + public function mergeModifiersWith(array $modifiers) + { + $this->modifiers = array_merge($this->modifiers, $modifiers); + } + + /** + * @param Generator $generator + * @return array + */ + public function guessColumnFormatters(Generator $generator) + { + $formatters = array(); + $nameGuesser = new Name($generator); + $columnTypeGuesser = new ColumnTypeGuesser($generator); + $fields = $this->mapper->fields(); + foreach ($fields as $fieldName => $field) { + if ($field['primary'] === true) { + continue; + } + if ($formatter = $nameGuesser->guessFormat($fieldName)) { + $formatters[$fieldName] = $formatter; + continue; + } + if ($formatter = $columnTypeGuesser->guessFormat($field)) { + $formatters[$fieldName] = $formatter; + continue; + } + } + $entityName = $this->mapper->entity(); + $entity = $this->mapper->build([]); + $relations = $entityName::relations($this->mapper, $entity); + foreach ($relations as $relation) { + // We don't need any other relation here. + if ($relation instanceof BelongsTo) { + $fieldName = $relation->localKey(); + $entityName = $relation->entityName(); + $field = $fields[$fieldName]; + $required = $field['required']; + + $locator = $this->locator; + + $formatters[$fieldName] = function ($inserted) use ($required, $entityName, $locator) { + if (!empty($inserted[$entityName])) { + return $inserted[$entityName][mt_rand(0, count($inserted[$entityName]) - 1)]->get('id'); + } + + if ($required && $this->useExistingData) { + // We did not add anything like this, but it's required, + // So let's find something existing in DB. + $mapper = $locator->mapper($entityName); + $records = $mapper->all()->limit(self::RELATED_FETCH_COUNT)->toArray(); + if (empty($records)) { + return null; + } + + return $records[mt_rand(0, count($records) - 1)]['id']; + } + + return null; + }; + } + } + + return $formatters; + } + + /** + * Insert one new record using the Entity class. + * + * @param $insertedEntities + * @return string + */ + public function execute($insertedEntities) + { + $obj = $this->mapper->build([]); + + $this->fillColumns($obj, $insertedEntities); + $this->callMethods($obj, $insertedEntities); + + $this->mapper->insert($obj); + + + return $obj; + } + + /** + * @param $obj + * @param $insertedEntities + */ + private function fillColumns($obj, $insertedEntities) + { + foreach ($this->columnFormatters as $field => $format) { + if (null !== $format) { + $value = is_callable($format) ? $format($insertedEntities, $obj) : $format; + $obj->set($field, $value); + } + } + } + + /** + * @param $obj + * @param $insertedEntities + */ + private function callMethods($obj, $insertedEntities) + { + foreach ($this->getModifiers() as $modifier) { + $modifier($obj, $insertedEntities); + } + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/ORM/Spot/Populator.php b/vendor/fzaninotto/faker/src/Faker/ORM/Spot/Populator.php new file mode 100644 index 00000000..c834b04c --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/ORM/Spot/Populator.php @@ -0,0 +1,88 @@ +generator = $generator; + $this->locator = $locator; + } + + /** + * Add an order for the generation of $number records for $entity. + * + * @param $entityName string Name of Entity object to generate + * @param $number int The number of entities to populate + * @param $customColumnFormatters array + * @param $customModifiers array + * @param $useExistingData bool Should we use existing rows (e.g. roles) to populate relations? + */ + public function addEntity( + $entityName, + $number, + $customColumnFormatters = array(), + $customModifiers = array(), + $useExistingData = false + ) { + $mapper = $this->locator->mapper($entityName); + if (null === $mapper) { + throw new \InvalidArgumentException("No mapper can be found for entity " . $entityName); + } + $entity = new EntityPopulator($mapper, $this->locator, $useExistingData); + + $entity->setColumnFormatters($entity->guessColumnFormatters($this->generator)); + if ($customColumnFormatters) { + $entity->mergeColumnFormattersWith($customColumnFormatters); + } + $entity->mergeModifiersWith($customModifiers); + + $this->entities[$entityName] = $entity; + $this->quantities[$entityName] = $number; + } + + /** + * Populate the database using all the Entity classes previously added. + * + * @param Locator $locator A Spot locator + * + * @return array A list of the inserted PKs + */ + public function execute($locator = null) + { + if (null === $locator) { + $locator = $this->locator; + } + if (null === $locator) { + throw new \InvalidArgumentException("No entity manager passed to Spot Populator."); + } + + $insertedEntities = array(); + foreach ($this->quantities as $entityName => $number) { + for ($i = 0; $i < $number; $i++) { + $insertedEntities[$entityName][] = $this->entities[$entityName]->execute( + $insertedEntities + ); + } + } + + return $insertedEntities; + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/Address.php index c11b5b1e..24f538af 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/Address.php @@ -2,7 +2,7 @@ namespace Faker\Provider; -class Address extends \Faker\Provider\Base +class Address extends Base { protected static $citySuffix = array('Ville'); protected static $streetSuffix = array('Street'); @@ -19,7 +19,7 @@ class Address extends \Faker\Provider\Base '{{streetAddress}} {{postcode}} {{city}}', ); - protected static $buildingNumber = array('##'); + protected static $buildingNumber = array('%#'); protected static $postcode = array('#####'); protected static $country = array(); @@ -104,20 +104,36 @@ class Address extends \Faker\Provider\Base } /** - * @example 77.147489 + * @example '77.147489' + * @param float|int $min + * @param float|int $max * @return float Uses signed degrees format (returns a float number between -90 and 90) */ - public static function latitude() + public static function latitude($min = -90, $max = 90) { - return static::randomFloat(6, 0, 180) - 90; + return static::randomFloat(6, $min, $max); } /** - * @example 86.211205 + * @example '86.211205' + * @param float|int $min + * @param float|int $max * @return float Uses signed degrees format (returns a float number between -180 and 180) */ - public static function longitude() + public static function longitude($min = -180, $max = 180) { - return static::randomFloat(6, 0, 360) - 180; + return static::randomFloat(6, $min, $max); + } + + /** + * @example array('77.147489', '86.211205') + * @return array | latitude, longitude + */ + public static function localCoordinates() + { + return array( + 'latitude' => static::latitude(), + 'longitude' => static::longitude() + ); } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Barcode.php b/vendor/fzaninotto/faker/src/Faker/Provider/Barcode.php index 5281e371..05759a34 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/Barcode.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/Barcode.php @@ -6,21 +6,25 @@ namespace Faker\Provider; * @see http://en.wikipedia.org/wiki/EAN-13 * @see http://en.wikipedia.org/wiki/ISBN */ -class Barcode extends \Faker\Provider\Base +class Barcode extends Base { private function ean($length = 13) { - $code = $this->numerify(str_repeat('#', $length - 1)); + $code = static::numerify(str_repeat('#', $length - 1)); return $code . static::eanChecksum($code); } /** * Utility function for computing EAN checksums + * + * @param string $input + * + * @return integer */ protected static function eanChecksum($input) { - $sequence = (strlen($input) - 1) == 8 ? array(3, 1) : array(1, 3); + $sequence = (strlen($input) + 1) === 8 ? array(3, 1) : array(1, 3); $sums = 0; foreach (str_split($input) as $n => $digit) { $sums += $digit * $sequence[$n % 2]; @@ -43,7 +47,7 @@ class Barcode extends \Faker\Provider\Base // so, the length of the input should be 9 $length = 9; - if (strlen($input) != $length) { + if (strlen($input) !== $length) { throw new \LengthException(sprintf('Input length should be equal to %d', $length)); } @@ -89,7 +93,7 @@ class Barcode extends \Faker\Provider\Base */ public function isbn10() { - $code = $this->numerify(str_repeat('#', 9)); + $code = static::numerify(str_repeat('#', 9)); return $code . static::isbnChecksum($code); } @@ -103,7 +107,7 @@ class Barcode extends \Faker\Provider\Base */ public function isbn13() { - $code = '97' . static::numberBetween(8, 9) . $this->numerify(str_repeat('#', 9)); + $code = '97' . static::numberBetween(8, 9) . static::numerify(str_repeat('#', 9)); return $code . static::eanChecksum($code); } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Base.php b/vendor/fzaninotto/faker/src/Faker/Provider/Base.php index 9cfda63a..6765c805 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/Base.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/Base.php @@ -5,6 +5,7 @@ namespace Faker\Provider; use Faker\Generator; use Faker\DefaultGenerator; use Faker\UniqueGenerator; +use Faker\ValidGenerator; class Base { @@ -46,6 +47,21 @@ class Base return mt_rand(1, 9); } + /** + * Generates a random digit, which cannot be $except + * + * @param int $except + * @return int + */ + public static function randomDigitNot($except) + { + $result = self::numberBetween(0, 8); + if ($result >= $except) { + $result++; + } + return $result; + } + /** * Returns a random integer with 0 to $nbDigits digits. * @@ -94,6 +110,9 @@ class Base if (null === $max) { $max = static::randomNumber(); + if ($min > $max) { + $max = $min; + } } if ($min > $max) { @@ -106,18 +125,32 @@ class Base } /** - * Returns a random number between $min and $max + * Returns a random number between $int1 and $int2 (any order) * - * @param integer $min default to 0 - * @param integer $max defaults to 32 bit max integer, ie 2147483647 + * @param integer $int1 default to 0 + * @param integer $int2 defaults to 32 bit max integer, ie 2147483647 * @example 79907610 * * @return integer */ - public static function numberBetween($min = 0, $max = 2147483647) + public static function numberBetween($int1 = 0, $int2 = 2147483647) { + $min = $int1 < $int2 ? $int1 : $int2; + $max = $int1 < $int2 ? $int2 : $int1; return mt_rand($min, $max); } + + /** + * Returns the passed value + * + * @param mixed $value + * + * @return mixed + */ + public static function passthrough($value) + { + return $value; + } /** * Returns a random letter from a to z @@ -138,20 +171,31 @@ class Base } /** - * Returns random elements from a provided array + * Returns randomly ordered subsequence of $count elements from a provided array * - * @param array $array Array to take elements from. Defaults to a-f - * @param integer $count Number of elements to take. + * @param array $array Array to take elements from. Defaults to a-c + * @param integer $count Number of elements to take. + * @param boolean $allowDuplicates Allow elements to be picked several times. Defaults to false * @throws \LengthException When requesting more elements than provided * * @return array New array with $count elements from $array */ - public static function randomElements(array $array = array('a', 'b', 'c'), $count = 1) + public static function randomElements($array = array('a', 'b', 'c'), $count = 1, $allowDuplicates = false) { - $allKeys = array_keys($array); + $traversables = array(); + + if ($array instanceof \Traversable) { + foreach ($array as $element) { + $traversables[] = $element; + } + } + + $arr = count($traversables) ? $traversables : $array; + + $allKeys = array_keys($arr); $numKeys = count($allKeys); - if ($numKeys < $count) { + if (!$allowDuplicates && $numKeys < $count) { throw new \LengthException(sprintf('Cannot get %d elements, only %d in array', $count, $numKeys)); } @@ -161,12 +205,15 @@ class Base while ($numElements < $count) { $num = mt_rand(0, $highKey); - if (isset($keys[$num])) { - continue; + + if (!$allowDuplicates) { + if (isset($keys[$num])) { + continue; + } + $keys[$num] = true; } - $keys[$num] = true; - $elements[] = $array[$allKeys[$num]]; + $elements[] = $arr[$allKeys[$num]]; $numElements++; } @@ -181,7 +228,7 @@ class Base */ public static function randomElement($array = array('a', 'b', 'c')) { - if (!$array) { + if (!$array || ($array instanceof \Traversable && !count($array))) { return null; } $elements = static::randomElements($array, 1); @@ -235,7 +282,7 @@ class Base * Returns a shuffled version of the array. * * This function does not mutate the original array. It uses the - * Fisher–Yates algorithm, which is unbiaised, together with a Mersenne + * Fisher–Yates algorithm, which is unbiased, together with a Mersenne * twister random generator. This function is therefore more random than * PHP's shuffle() function, and it is seedable. * @@ -251,7 +298,7 @@ class Base $shuffledArray = array(); $i = 0; reset($array); - while (list($key, $value) = each($array)) { + foreach ($array as $key => $value) { if ($i == 0) { $j = 0; } else { @@ -272,7 +319,7 @@ class Base * Returns a shuffled version of the string. * * This function does not mutate the original string. It uses the - * Fisher–Yates algorithm, which is unbiaised, together with a Mersenne + * Fisher–Yates algorithm, which is unbiased, together with a Mersenne * twister random generator. This function is therefore more random than * PHP's shuffle() function, and it is seedable. Additionally, it is * UTF8 safe if the mb extension is available. @@ -297,7 +344,20 @@ class Base } else { $array = str_split($string, 1); } - return join('', static::shuffleArray($array)); + return implode('', static::shuffleArray($array)); + } + + private static function replaceWildcard($string, $wildcard = '#', $callback = 'static::randomDigit') + { + if (($pos = strpos($string, $wildcard)) === false) { + return $string; + } + for ($i = $pos, $last = strrpos($string, $wildcard, $pos) + 1; $i < $last; $i++) { + if ($string[$i] === $wildcard) { + $string[$i] = call_user_func($callback); + } + } + return $string; } /** @@ -312,9 +372,11 @@ class Base // instead of using randomDigit() several times, which is slow, // count the number of hashes and generate once a large number $toReplace = array(); - for ($i = 0, $count = strlen($string); $i < $count; $i++) { - if ($string[$i] === '#') { - $toReplace []= $i; + if (($pos = strpos($string, '#')) !== false) { + for ($i = $pos, $last = strrpos($string, '#', $pos) + 1; $i < $last; $i++) { + if ($string[$i] === '#') { + $toReplace[] = $i; + } } } if ($nbReplacements = count($toReplace)) { @@ -330,7 +392,7 @@ class Base $string[$toReplace[$i]] = $numbers[$i]; } } - $string = preg_replace_callback('/\%/u', 'static::randomDigitNotNull', $string); + $string = self::replaceWildcard($string, '%', 'static::randomDigitNotNull'); return $string; } @@ -343,17 +405,21 @@ class Base */ public static function lexify($string = '????') { - return preg_replace_callback('/\?/u', 'static::randomLetter', $string); + return self::replaceWildcard($string, '?', 'static::randomLetter'); } /** - * Replaces hash signs and question marks with random numbers and letters + * Replaces hash signs ('#') and question marks ('?') with random numbers and letters + * An asterisk ('*') is replaced with either a random number or a random letter * * @param string $string String that needs to bet parsed * @return string */ public static function bothify($string = '## ??') { + $string = self::replaceWildcard($string, '*', function () { + return mt_rand(0, 1) ? '#' : '?'; + }); return static::lexify(static::numerify($string)); } @@ -378,7 +444,7 @@ class Base * Regex delimiters '/.../' and begin/end markers '^...$' are ignored. * * Only supports a small subset of the regex syntax. For instance, - * unicode, negated classes, unbouned ranges, subpatterns, back references, + * unicode, negated classes, unbounded ranges, subpatterns, back references, * assertions, recursive patterns, and comments are not supported. Escaping * support is extremely fragile. * @@ -426,7 +492,7 @@ class Base // All A-F inside of [] become ABCDEF $regex = preg_replace_callback('/\[([^\]]+)\]/', function ($matches) { return '[' . preg_replace_callback('/(\w|\d)\-(\w|\d)/', function ($range) { - return join(range($range[1], $range[2]), ''); + return implode('', range($range[1], $range[2])); }, $matches[1]) . ']'; }, $regex); // All [ABC] become B (or A or C) @@ -470,13 +536,22 @@ class Base /** * Chainable method for making any formatter optional. * - * @param float $weight Set the probability of receiving a null value. - * "0" will always return null, "1" will always return the generator. - * @return Generator|DefaultGenerator + * @param float|integer $weight Set the probability of receiving a null value. + * "0" will always return null, "1" will always return the generator. + * If $weight is an integer value, then the same system works + * between 0 (always get false) and 100 (always get true). + * @return mixed|null */ public function optional($weight = 0.5, $default = null) { - if (mt_rand() / mt_getrandmax() <= $weight) { + // old system based on 0.1 <= $weight <= 0.9 + // TODO: remove in v2 + if ($weight > 0 && $weight < 1 && mt_rand() / mt_getrandmax() <= $weight) { + return $this->generator; + } + + // new system with percentage + if (is_int($weight) && mt_rand(1, 100) <= $weight) { return $this->generator; } @@ -506,4 +581,32 @@ class Base return $this->unique; } + + /** + * Chainable method for forcing any formatter to return only valid values. + * + * The value validity is determined by a function passed as first argument. + * + * + * $values = array(); + * $evenValidator = function ($digit) { + * return $digit % 2 === 0; + * }; + * for ($i=0; $i < 10; $i++) { + * $values []= $faker->valid($evenValidator)->randomDigit; + * } + * print_r($values); // [0, 4, 8, 4, 2, 6, 0, 8, 8, 6] + * + * + * @param Closure $validator A function returning true for valid values + * @param integer $maxRetries Maximum number of retries to find a unique value, + * After which an OverflowException is thrown. + * @throws \OverflowException When no valid value can be found by iterating $maxRetries times + * + * @return ValidGenerator A proxy class returning only valid values + */ + public function valid($validator = null, $maxRetries = 10000) + { + return new ValidGenerator($this->generator, $validator, $maxRetries); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Biased.php b/vendor/fzaninotto/faker/src/Faker/Provider/Biased.php index c9ebb41e..d37dceff 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/Biased.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/Biased.php @@ -2,7 +2,7 @@ namespace Faker\Provider; -class Biased extends \Faker\Provider\Base +class Biased extends Base { /** * Returns a biased integer between $min and $max (both inclusive). @@ -25,8 +25,8 @@ class Biased extends \Faker\Provider\Base $x = mt_rand() / mt_getrandmax(); $y = mt_rand() / (mt_getrandmax() + 1); } while (call_user_func($function, $x) < $y); - - return floor($x * ($max - $min + 1) + $min); + + return (int) floor($x * ($max - $min + 1) + $min); } /** @@ -35,7 +35,7 @@ class Biased extends \Faker\Provider\Base * * @return integer */ - protected static function unbiased($x) + protected static function unbiased() { return 1; } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Color.php b/vendor/fzaninotto/faker/src/Faker/Provider/Color.php index 16aa9934..209d7228 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/Color.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/Color.php @@ -26,7 +26,7 @@ class Color extends Base 'DeepSkyBlue', 'DimGray', 'DimGrey', 'DodgerBlue', 'FireBrick', 'FloralWhite', 'ForestGreen', 'Fuchsia', 'Gainsboro', 'GhostWhite', 'Gold', 'GoldenRod', 'Gray', 'Green', 'GreenYellow', 'HoneyDew', - 'HotPink', 'IndianRed ', 'Indigo ', 'Ivory', 'Khaki', 'Lavender', + 'HotPink', 'IndianRed', 'Indigo', 'Ivory', 'Khaki', 'Lavender', 'LavenderBlush', 'LawnGreen', 'LemonChiffon', 'LightBlue', 'LightCoral', 'LightCyan', 'LightGoldenRodYellow', 'LightGray', 'LightGreen', 'LightPink', 'LightSalmon', 'LightSeaGreen', 'LightSkyBlue', 'LightSlateGray', 'LightSteelBlue', @@ -90,6 +90,14 @@ class Color extends Base return 'rgb(' . static::rgbColor() . ')'; } + /** + * @example 'rgba(0,255,122,0.8)' + */ + public static function rgbaCssColor() + { + return 'rgba(' . static::rgbColor() . ',' . static::randomFloat(1, 0, 1) . ')'; + } + /** * @example 'blue' */ @@ -105,4 +113,31 @@ class Color extends Base { return static::randomElement(static::$allColorNames); } + + /** + * @example '340,50,20' + * @return string + */ + public static function hslColor() + { + return sprintf( + '%s,%s,%s', + static::numberBetween(0, 360), + static::numberBetween(0, 100), + static::numberBetween(0, 100) + ); + } + + /** + * @example array(340, 50, 20) + * @return array + */ + public static function hslColorAsArray() + { + return array( + static::numberBetween(0, 360), + static::numberBetween(0, 100), + static::numberBetween(0, 100) + ); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/Company.php index 208d9ce5..d536d48e 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/Company.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/Company.php @@ -2,7 +2,7 @@ namespace Faker\Provider; -class Company extends \Faker\Provider\Base +class Company extends Base { protected static $formats = array( '{{lastName}} {{companySuffix}}', @@ -10,8 +10,14 @@ class Company extends \Faker\Provider\Base protected static $companySuffix = array('Ltd'); + protected static $jobTitleFormat = array( + '{{word}}', + ); + /** * @example 'Acme Ltd' + * + * @return string */ public function company() { @@ -22,9 +28,23 @@ class Company extends \Faker\Provider\Base /** * @example 'Ltd' + * + * @return string */ public static function companySuffix() { return static::randomElement(static::$companySuffix); } + + /** + * @example 'Job' + * + * @return string + */ + public function jobTitle() + { + $format = static::randomElement(static::$jobTitleFormat); + + return $this->generator->parse($format); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/DateTime.php b/vendor/fzaninotto/faker/src/Faker/Provider/DateTime.php index 776a8411..bde7f251 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/DateTime.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/DateTime.php @@ -2,10 +2,16 @@ namespace Faker\Provider; -class DateTime extends \Faker\Provider\Base +class DateTime extends Base { protected static $century = array('I','II','III','IV','V','VI','VII','VIII','IX','X','XI','XII','XIII','XIV','XV','XVI','XVII','XVIII','XIX','XX','XXI'); + protected static $defaultTimezone = null; + + /** + * @param \DateTime|string|float|int $max + * @return int|false + */ protected static function getMaxTimestamp($max = 'now') { if (is_numeric($max)) { @@ -36,24 +42,37 @@ class DateTime extends \Faker\Provider\Base * Get a datetime object for a date between January 1, 1970 and now * * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now" + * @param string $timezone time zone in which the date time should be set, default to DateTime::$defaultTimezone, if set, otherwise the result of `date_default_timezone_get` * @example DateTime('2005-08-16 20:39:21') * @return \DateTime + * @see http://php.net/manual/en/timezones.php + * @see http://php.net/manual/en/function.date-default-timezone-get.php */ - public static function dateTime($max = 'now') + public static function dateTime($max = 'now', $timezone = null) { - return new \DateTime('@' . static::unixTime($max)); + return static::setTimezone( + new \DateTime('@' . static::unixTime($max)), + $timezone + ); } /** * Get a datetime object for a date between January 1, 001 and now * * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now" + * @param string|null $timezone time zone in which the date time should be set, default to DateTime::$defaultTimezone, if set, otherwise the result of `date_default_timezone_get` * @example DateTime('1265-03-22 21:15:52') * @return \DateTime + * @see http://php.net/manual/en/timezones.php + * @see http://php.net/manual/en/function.date-default-timezone-get.php */ - public static function dateTimeAD($max = 'now') + public static function dateTimeAD($max = 'now', $timezone = null) { - return new \DateTime('@' . mt_rand(-62135597361, static::getMaxTimestamp($max))); + $min = (PHP_INT_SIZE>4 ? -62135597361 : -PHP_INT_MAX); + return static::setTimezone( + new \DateTime('@' . mt_rand($min, static::getMaxTimestamp($max))), + $timezone + ); } /** @@ -98,12 +117,15 @@ class DateTime extends \Faker\Provider\Base * Get a DateTime object based on a random date between two given dates. * Accepts date strings that can be recognized by strtotime(). * - * @param string $startDate Defaults to 30 years ago - * @param string $endDate Defaults to "now" + * @param \DateTime|string $startDate Defaults to 30 years ago + * @param \DateTime|string $endDate Defaults to "now" + * @param string|null $timezone time zone in which the date time should be set, default to DateTime::$defaultTimezone, if set, otherwise the result of `date_default_timezone_get` * @example DateTime('1999-02-02 11:42:52') * @return \DateTime + * @see http://php.net/manual/en/timezones.php + * @see http://php.net/manual/en/function.date-default-timezone-get.php */ - public static function dateTimeBetween($startDate = '-30 years', $endDate = 'now') + public static function dateTimeBetween($startDate = '-30 years', $endDate = 'now', $timezone = null) { $startTimestamp = $startDate instanceof \DateTime ? $startDate->getTimestamp() : strtotime($startDate); $endTimestamp = static::getMaxTimestamp($endDate); @@ -114,50 +136,84 @@ class DateTime extends \Faker\Provider\Base $timestamp = mt_rand($startTimestamp, $endTimestamp); - $ts = new \DateTime('@' . $timestamp); - $ts->setTimezone(new \DateTimeZone(date_default_timezone_get())); + return static::setTimezone( + new \DateTime('@' . $timestamp), + $timezone + ); + } - return $ts; + /** + * Get a DateTime object based on a random date between one given date and + * an interval + * Accepts date string that can be recognized by strtotime(). + * + * @param \DateTime|string $date Defaults to 30 years ago + * @param string $interval Defaults to 5 days after + * @param string|null $timezone time zone in which the date time should be set, default to DateTime::$defaultTimezone, if set, otherwise the result of `date_default_timezone_get` + * @example dateTimeInInterval('1999-02-02 11:42:52', '+ 5 days') + * @return \DateTime + * @see http://php.net/manual/en/timezones.php + * @see http://php.net/manual/en/function.date-default-timezone-get.php + */ + public static function dateTimeInInterval($date = '-30 years', $interval = '+5 days', $timezone = null) + { + $intervalObject = \DateInterval::createFromDateString($interval); + $datetime = $date instanceof \DateTime ? $date : new \DateTime($date); + $otherDatetime = clone $datetime; + $otherDatetime->add($intervalObject); + + $begin = $datetime > $otherDatetime ? $otherDatetime : $datetime; + $end = $datetime===$begin ? $otherDatetime : $datetime; + + return static::dateTimeBetween( + $begin, + $end, + $timezone + ); } /** * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now" + * @param string|null $timezone time zone in which the date time should be set, default to DateTime::$defaultTimezone, if set, otherwise the result of `date_default_timezone_get` * @example DateTime('1964-04-04 11:02:02') * @return \DateTime */ - public static function dateTimeThisCentury($max = 'now') + public static function dateTimeThisCentury($max = 'now', $timezone = null) { - return static::dateTimeBetween('-100 year', $max); + return static::dateTimeBetween('-100 year', $max, $timezone); } /** * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now" + * @param string|null $timezone time zone in which the date time should be set, default to DateTime::$defaultTimezone, if set, otherwise the result of `date_default_timezone_get` * @example DateTime('2010-03-10 05:18:58') * @return \DateTime */ - public static function dateTimeThisDecade($max = 'now') + public static function dateTimeThisDecade($max = 'now', $timezone = null) { - return static::dateTimeBetween('-10 year', $max); + return static::dateTimeBetween('-10 year', $max, $timezone); } /** * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now" + * @param string|null $timezone time zone in which the date time should be set, default to DateTime::$defaultTimezone, if set, otherwise the result of `date_default_timezone_get` * @example DateTime('2011-09-19 09:24:37') * @return \DateTime */ - public static function dateTimeThisYear($max = 'now') + public static function dateTimeThisYear($max = 'now', $timezone = null) { - return static::dateTimeBetween('-1 year', $max); + return static::dateTimeBetween('-1 year', $max, $timezone); } /** * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now" + * @param string|null $timezone time zone in which the date time should be set, default to DateTime::$defaultTimezone, if set, otherwise the result of `date_default_timezone_get` * @example DateTime('2011-10-05 12:51:46') * @return \DateTime */ - public static function dateTimeThisMonth($max = 'now') + public static function dateTimeThisMonth($max = 'now', $timezone = null) { - return static::dateTimeBetween('-1 month', $max); + return static::dateTimeBetween('-1 month', $max, $timezone); } /** @@ -212,8 +268,8 @@ class DateTime extends \Faker\Provider\Base /** * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now" - * @return int - * @example 1673 + * @return string + * @example '1673' */ public static function year($max = 'now') { @@ -237,4 +293,48 @@ class DateTime extends \Faker\Provider\Base { return static::randomElement(\DateTimeZone::listIdentifiers()); } + + /** + * Internal method to set the time zone on a DateTime. + * + * @param \DateTime $dt + * @param string|null $timezone + * + * @return \DateTime + */ + private static function setTimezone(\DateTime $dt, $timezone) + { + return $dt->setTimezone(new \DateTimeZone(static::resolveTimezone($timezone))); + } + + /** + * Sets default time zone. + * + * @param string $timezone + * + * @return void + */ + public static function setDefaultTimezone($timezone = null) + { + static::$defaultTimezone = $timezone; + } + + /** + * Gets default time zone. + * + * @return string|null + */ + public static function getDefaultTimezone() + { + return static::$defaultTimezone; + } + + /** + * @param string|null $timezone + * @return null|string + */ + private static function resolveTimezone($timezone) + { + return ((null === $timezone) ? ((null === static::$defaultTimezone) ? date_default_timezone_get() : static::$defaultTimezone) : $timezone); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/File.php b/vendor/fzaninotto/faker/src/Faker/Provider/File.php index 3897c272..ba015946 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/File.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/File.php @@ -1,7 +1,7 @@ addProvider(new Lorem($generator)); + $generator->addProvider(new Internet($generator)); + } + + /** + * @param integer $maxDepth + * @param integer $maxWidth + * + * @return string + */ + public function randomHtml($maxDepth = 4, $maxWidth = 4) + { + $document = new \DOMDocument(); + $this->idGenerator = new UniqueGenerator($this->generator); + + $head = $document->createElement("head"); + $this->addRandomTitle($head); + + $body = $document->createElement("body"); + $this->addLoginForm($body); + $this->addRandomSubTree($body, $maxDepth, $maxWidth); + + $html = $document->createElement("html"); + $html->appendChild($head); + $html->appendChild($body); + + $document->appendChild($html); + return $document->saveHTML(); + } + + private function addRandomSubTree(\DOMElement $root, $maxDepth, $maxWidth) + { + $maxDepth--; + if ($maxDepth <= 0) { + return $root; + } + + $siblings = mt_rand(1, $maxWidth); + for ($i = 0; $i < $siblings; $i++) { + if ($maxDepth == 1) { + $this->addRandomLeaf($root); + } else { + $sibling = $root->ownerDocument->createElement("div"); + $root->appendChild($sibling); + $this->addRandomAttribute($sibling); + $this->addRandomSubTree($sibling, mt_rand(0, $maxDepth), $maxWidth); + } + } + return $root; + } + + private function addRandomLeaf(\DOMElement $node) + { + $rand = mt_rand(1, 10); + switch ($rand) { + case 1: + $this->addRandomP($node); + break; + case 2: + $this->addRandomA($node); + break; + case 3: + $this->addRandomSpan($node); + break; + case 4: + $this->addRandomUL($node); + break; + case 5: + $this->addRandomH($node); + break; + case 6: + $this->addRandomB($node); + break; + case 7: + $this->addRandomI($node); + break; + case 8: + $this->addRandomTable($node); + break; + default: + $this->addRandomText($node); + break; + } + } + + private function addRandomAttribute(\DOMElement $node) + { + $rand = mt_rand(1, 2); + switch ($rand) { + case 1: + $node->setAttribute("class", $this->generator->word); + break; + case 2: + $node->setAttribute("id", (string)$this->idGenerator->randomNumber(5)); + break; + } + } + + private function addRandomP(\DOMElement $element, $maxLength = 10) + { + + $node = $element->ownerDocument->createElement(static::P_TAG); + $node->textContent = $this->generator->sentence(mt_rand(1, $maxLength)); + $element->appendChild($node); + } + + private function addRandomText(\DOMElement $element, $maxLength = 10) + { + $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength))); + $element->appendChild($text); + } + + private function addRandomA(\DOMElement $element, $maxLength = 10) + { + $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength))); + $node = $element->ownerDocument->createElement(static::A_TAG); + $node->setAttribute("href", $this->generator->safeEmailDomain); + $node->appendChild($text); + $element->appendChild($node); + } + + private function addRandomTitle(\DOMElement $element, $maxLength = 10) + { + $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength))); + $node = $element->ownerDocument->createElement(static::TITLE_TAG); + $node->appendChild($text); + $element->appendChild($node); + } + + private function addRandomH(\DOMElement $element, $maxLength = 10) + { + $h = static::H_TAG . (string)mt_rand(1, 3); + $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength))); + $node = $element->ownerDocument->createElement($h); + $node->appendChild($text); + $element->appendChild($node); + } + + private function addRandomB(\DOMElement $element, $maxLength = 10) + { + $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength))); + $node = $element->ownerDocument->createElement(static::B_TAG); + $node->appendChild($text); + $element->appendChild($node); + } + + private function addRandomI(\DOMElement $element, $maxLength = 10) + { + $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength))); + $node = $element->ownerDocument->createElement(static::I_TAG); + $node->appendChild($text); + $element->appendChild($node); + } + + private function addRandomSpan(\DOMElement $element, $maxLength = 10) + { + $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength))); + $node = $element->ownerDocument->createElement(static::SPAN_TAG); + $node->appendChild($text); + $element->appendChild($node); + } + + private function addLoginForm(\DOMElement $element) + { + + $textInput = $element->ownerDocument->createElement(static::INPUT_TAG); + $textInput->setAttribute("type", "text"); + $textInput->setAttribute("id", "username"); + + $textLabel = $element->ownerDocument->createElement(static::LABEL_TAG); + $textLabel->setAttribute("for", "username"); + $textLabel->textContent = $this->generator->word; + + $passwordInput = $element->ownerDocument->createElement(static::INPUT_TAG); + $passwordInput->setAttribute("type", "password"); + $passwordInput->setAttribute("id", "password"); + + $passwordLabel = $element->ownerDocument->createElement(static::LABEL_TAG); + $passwordLabel->setAttribute("for", "password"); + $passwordLabel->textContent = $this->generator->word; + + $submit = $element->ownerDocument->createElement(static::INPUT_TAG); + $submit->setAttribute("type", "submit"); + $submit->setAttribute("value", $this->generator->word); + + $submit = $element->ownerDocument->createElement(static::FORM_TAG); + $submit->setAttribute("action", $this->generator->safeEmailDomain); + $submit->setAttribute("method", "POST"); + $submit->appendChild($textLabel); + $submit->appendChild($textInput); + $submit->appendChild($passwordLabel); + $submit->appendChild($passwordInput); + $element->appendChild($submit); + } + + private function addRandomTable(\DOMElement $element, $maxRows = 10, $maxCols = 6, $maxTitle = 4, $maxLength = 10) + { + $rows = mt_rand(1, $maxRows); + $cols = mt_rand(1, $maxCols); + + $table = $element->ownerDocument->createElement(static::TABLE_TAG); + $thead = $element->ownerDocument->createElement(static::THEAD_TAG); + $tbody = $element->ownerDocument->createElement(static::TBODY_TAG); + + $table->appendChild($thead); + $table->appendChild($tbody); + + $tr = $element->ownerDocument->createElement(static::TR_TAG); + $thead->appendChild($tr); + for ($i = 0; $i < $cols; $i++) { + $th = $element->ownerDocument->createElement(static::TH_TAG); + $th->textContent = $this->generator->sentence(mt_rand(1, $maxTitle)); + $tr->appendChild($th); + } + for ($i = 0; $i < $rows; $i++) { + $tr = $element->ownerDocument->createElement(static::TR_TAG); + $tbody->appendChild($tr); + for ($j = 0; $j < $cols; $j++) { + $th = $element->ownerDocument->createElement(static::TD_TAG); + $th->textContent = $this->generator->sentence(mt_rand(1, $maxLength)); + $tr->appendChild($th); + } + } + $element->appendChild($table); + } + + private function addRandomUL(\DOMElement $element, $maxItems = 11, $maxLength = 4) + { + $num = mt_rand(1, $maxItems); + $ul = $element->ownerDocument->createElement(static::UL_TAG); + for ($i = 0; $i < $num; $i++) { + $li = $element->ownerDocument->createElement(static::LI_TAG); + $li->textContent = $this->generator->sentence(mt_rand(1, $maxLength)); + $ul->appendChild($li); + } + $element->appendChild($ul); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Image.php b/vendor/fzaninotto/faker/src/Faker/Provider/Image.php index 40aeac53..14f1b397 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/Image.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/Image.php @@ -18,13 +18,28 @@ class Image extends Base * Set randomize to false to remove the random GET parameter at the end of the url. * * @example 'http://lorempixel.com/640/480/?12345' + * + * @param integer $width + * @param integer $height + * @param string|null $category + * @param bool $randomize + * @param string|null $word + * @param bool $gray + * + * @return string */ - public static function imageUrl($width = 640, $height = 480, $category = null, $randomize = true, $word = null) + public static function imageUrl($width = 640, $height = 480, $category = null, $randomize = true, $word = null, $gray = false) { - $url = "http://lorempixel.com/{$width}/{$height}/"; + $baseUrl = "https://lorempixel.com/"; + $url = "{$width}/{$height}/"; + + if ($gray) { + $url = "gray/" . $url; + } + if ($category) { if (!in_array($category, static::$categories)) { - throw new \InvalidArgumentException(sprintf('Unkown image category "%s"', $category)); + throw new \InvalidArgumentException(sprintf('Unknown image category "%s"', $category)); } $url .= "{$category}/"; if ($word) { @@ -36,7 +51,7 @@ class Image extends Base $url .= '?' . static::randomNumber(5, true); } - return $url; + return $baseUrl . $url; } /** @@ -46,7 +61,7 @@ class Image extends Base * * @example '/path/to/dir/13b73edae8443990be1aa8f1a483bc27.jpg' */ - public static function image($dir = null, $width = 640, $height = 480, $category = null, $fullPath = true, $randomize = true, $word = null) + public static function image($dir = null, $width = 640, $height = 480, $category = null, $fullPath = true, $randomize = true, $word = null, $gray = false) { $dir = is_null($dir) ? sys_get_temp_dir() : $dir; // GNU/Linux / OS X / Windows compatible // Validate directory path @@ -60,7 +75,7 @@ class Image extends Base $filename = $name .'.jpg'; $filepath = $dir . DIRECTORY_SEPARATOR . $filename; - $url = static::imageUrl($width, $height, $category, $randomize, $word); + $url = static::imageUrl($width, $height, $category, $randomize, $word, $gray); // save file if (function_exists('curl_exec')) { @@ -68,9 +83,16 @@ class Image extends Base $fp = fopen($filepath, 'w'); $ch = curl_init($url); curl_setopt($ch, CURLOPT_FILE, $fp); - $success = curl_exec($ch); - curl_close($ch); + $success = curl_exec($ch) && curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200; fclose($fp); + curl_close($ch); + + if (!$success) { + unlink($filepath); + + // could not contact the distant URL or HTTP error - fail silently. + return false; + } } elseif (ini_get('allow_url_fopen')) { // use remote fopen() via copy() $success = copy($url, $filepath); @@ -78,11 +100,6 @@ class Image extends Base return new \RuntimeException('The image formatter downloads an image from a remote HTTP server. Therefore, it requires that PHP can request remote hosts, either via cURL or fopen()'); } - if (!$success) { - // could not contact the distant URL or HTTP error - fail silently. - return false; - } - return $fullPath ? $filepath : $filename; } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Internet.php b/vendor/fzaninotto/faker/src/Faker/Provider/Internet.php index 9e92f146..2eaa2f6a 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/Internet.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/Internet.php @@ -2,7 +2,7 @@ namespace Faker\Provider; -class Internet extends \Faker\Provider\Base +class Internet extends Base { protected static $freeEmailDomain = array('gmail.com', 'yahoo.com', 'hotmail.com'); protected static $tld = array('com', 'com', 'com', 'com', 'com', 'com', 'biz', 'info', 'net', 'org'); @@ -29,140 +29,14 @@ class Internet extends \Faker\Provider\Base 'http://{{domainName}}/{{slug}}.html', 'https://{{domainName}}/{{slug}}.html', ); - - public static function toAscii($string) - { - $transliterationTable = array( - 'IJ' => 'I','Ö' => 'O','Å’' => 'O','Ü' => 'U','ä' => 'a','æ' => 'a', - 'ij' => 'i','ö' => 'o','Å“' => 'o','ü' => 'u','ß' => 's','Å¿' => 's', - 'À' => 'A','Ã' => 'A','Â' => 'A','Ã' => 'A','Ä' => 'A','Ã…' => 'A', - 'Æ' => 'A','Ä€' => 'A','Ä„' => 'A','Ä‚' => 'A','Ç' => 'C','Ć' => 'C', - 'ÄŒ' => 'C','Ĉ' => 'C','ÄŠ' => 'C','ÄŽ' => 'D','Ä' => 'D','È' => 'E', - 'É' => 'E','Ê' => 'E','Ë' => 'E','Ä’' => 'E','Ę' => 'E','Äš' => 'E', - 'Ä”' => 'E','Ä–' => 'E','Äœ' => 'G','Äž' => 'G','Ä ' => 'G','Ä¢' => 'G', - 'Ĥ' => 'H','Ħ' => 'H','ÃŒ' => 'I','Ã' => 'I','ÃŽ' => 'I','Ã' => 'I', - 'Ī' => 'I','Ĩ' => 'I','Ĭ' => 'I','Ä®' => 'I','İ' => 'I','Ä´' => 'J', - 'Ķ' => 'K','Ľ' => 'K','Ĺ' => 'K','Ä»' => 'K','Ä¿' => 'K','Å' => 'L', - 'Ñ' => 'N','Ń' => 'N','Ň' => 'N','Å…' => 'N','ÅŠ' => 'N','Ã’' => 'O', - 'Ó' => 'O','Ô' => 'O','Õ' => 'O','Ø' => 'O','ÅŒ' => 'O','Å' => 'O', - 'ÅŽ' => 'O','Å”' => 'R','Ř' => 'R','Å–' => 'R','Åš' => 'S','Åž' => 'S', - 'Åœ' => 'S','Ș' => 'S','Å ' => 'S','Ť' => 'T','Å¢' => 'T','Ŧ' => 'T', - 'Èš' => 'T','Ù' => 'U','Ú' => 'U','Û' => 'U','Ū' => 'U','Å®' => 'U', - 'Ű' => 'U','Ŭ' => 'U','Ũ' => 'U','Ų' => 'U','Å´' => 'W','Ŷ' => 'Y', - 'Ÿ' => 'Y','Ã' => 'Y','Ź' => 'Z','Å»' => 'Z','Ž' => 'Z','à' => 'a', - 'á' => 'a','â' => 'a','ã' => 'a','Ä' => 'a','Ä…' => 'a','ă' => 'a', - 'Ã¥' => 'a','ç' => 'c','ć' => 'c','Ä' => 'c','ĉ' => 'c','Ä‹' => 'c', - 'Ä' => 'd','Ä‘' => 'd','è' => 'e','é' => 'e','ê' => 'e','ë' => 'e', - 'Ä“' => 'e','Ä™' => 'e','Ä›' => 'e','Ä•' => 'e','Ä—' => 'e','Æ’' => 'f', - 'Ä' => 'g','ÄŸ' => 'g','Ä¡' => 'g','Ä£' => 'g','Ä¥' => 'h','ħ' => 'h', - 'ì' => 'i','í' => 'i','î' => 'i','ï' => 'i','Ä«' => 'i','Ä©' => 'i', - 'Ä­' => 'i','į' => 'i','ı' => 'i','ĵ' => 'j','Ä·' => 'k','ĸ' => 'k', - 'Å‚' => 'l','ľ' => 'l','ĺ' => 'l','ļ' => 'l','Å€' => 'l','ñ' => 'n', - 'Å„' => 'n','ň' => 'n','ņ' => 'n','ʼn' => 'n','Å‹' => 'n','ò' => 'o', - 'ó' => 'o','ô' => 'o','õ' => 'o','ø' => 'o','Å' => 'o','Å‘' => 'o', - 'Å' => 'o','Å•' => 'r','Å™' => 'r','Å—' => 'r','Å›' => 's','Å¡' => 's', - 'Å¥' => 't','ù' => 'u','ú' => 'u','û' => 'u','Å«' => 'u','ů' => 'u', - 'ű' => 'u','Å­' => 'u','Å©' => 'u','ų' => 'u','ŵ' => 'w','ÿ' => 'y', - 'ý' => 'y','Å·' => 'y','ż' => 'z','ź' => 'z','ž' => 'z','Α' => 'A', - 'Ά' => 'A','Ἀ' => 'A','Ἁ' => 'A','Ἂ' => 'A','Ἃ' => 'A','Ἄ' => 'A', - 'á¼' => 'A','Ἆ' => 'A','á¼' => 'A','ᾈ' => 'A','ᾉ' => 'A','ᾊ' => 'A', - 'ᾋ' => 'A','ᾌ' => 'A','á¾' => 'A','ᾎ' => 'A','á¾' => 'A','Ᾰ' => 'A', - 'á¾¹' => 'A','Ὰ' => 'A','á¾¼' => 'A','Î’' => 'B','Γ' => 'G','Δ' => 'D', - 'Ε' => 'E','Έ' => 'E','Ἐ' => 'E','á¼™' => 'E','Ἒ' => 'E','á¼›' => 'E', - 'Ἔ' => 'E','á¼' => 'E','Ὲ' => 'E','Ζ' => 'Z','Η' => 'I','Ή' => 'I', - 'Ἠ' => 'I','Ἡ' => 'I','Ἢ' => 'I','Ἣ' => 'I','Ἤ' => 'I','á¼­' => 'I', - 'á¼®' => 'I','Ἧ' => 'I','ᾘ' => 'I','á¾™' => 'I','ᾚ' => 'I','á¾›' => 'I', - 'ᾜ' => 'I','á¾' => 'I','ᾞ' => 'I','ᾟ' => 'I','Ὴ' => 'I','ῌ' => 'I', - 'Θ' => 'T','Ι' => 'I','Ί' => 'I','Ϊ' => 'I','Ἰ' => 'I','á¼¹' => 'I', - 'Ἲ' => 'I','á¼»' => 'I','á¼¼' => 'I','á¼½' => 'I','á¼¾' => 'I','Ἷ' => 'I', - 'Ῐ' => 'I','á¿™' => 'I','Ὶ' => 'I','Κ' => 'K','Λ' => 'L','Μ' => 'M', - 'Î' => 'N','Ξ' => 'K','Ο' => 'O','ÎŒ' => 'O','Ὀ' => 'O','Ὁ' => 'O', - 'Ὂ' => 'O','Ὃ' => 'O','Ὄ' => 'O','á½' => 'O','Ὸ' => 'O','Π' => 'P', - 'Ρ' => 'R','Ῥ' => 'R','Σ' => 'S','Τ' => 'T','Î¥' => 'Y','ÎŽ' => 'Y', - 'Ϋ' => 'Y','á½™' => 'Y','á½›' => 'Y','á½' => 'Y','Ὗ' => 'Y','Ῠ' => 'Y', - 'á¿©' => 'Y','Ὺ' => 'Y','Φ' => 'F','Χ' => 'X','Ψ' => 'P','Ω' => 'O', - 'Î' => 'O','Ὠ' => 'O','Ὡ' => 'O','Ὢ' => 'O','Ὣ' => 'O','Ὤ' => 'O', - 'á½­' => 'O','á½®' => 'O','Ὧ' => 'O','ᾨ' => 'O','ᾩ' => 'O','ᾪ' => 'O', - 'ᾫ' => 'O','ᾬ' => 'O','á¾­' => 'O','á¾®' => 'O','ᾯ' => 'O','Ὼ' => 'O', - 'ῼ' => 'O','α' => 'a','ά' => 'a','á¼€' => 'a','á¼' => 'a','ἂ' => 'a', - 'ἃ' => 'a','ἄ' => 'a','á¼…' => 'a','ἆ' => 'a','ἇ' => 'a','á¾€' => 'a', - 'á¾' => 'a','ᾂ' => 'a','ᾃ' => 'a','ᾄ' => 'a','á¾…' => 'a','ᾆ' => 'a', - 'ᾇ' => 'a','á½°' => 'a','á¾°' => 'a','á¾±' => 'a','á¾²' => 'a','á¾³' => 'a', - 'á¾´' => 'a','á¾¶' => 'a','á¾·' => 'a','β' => 'b','γ' => 'g','δ' => 'd', - 'ε' => 'e','έ' => 'e','á¼' => 'e','ἑ' => 'e','á¼’' => 'e','ἓ' => 'e', - 'á¼”' => 'e','ἕ' => 'e','á½²' => 'e','ζ' => 'z','η' => 'i','ή' => 'i', - 'á¼ ' => 'i','ἡ' => 'i','á¼¢' => 'i','á¼£' => 'i','ἤ' => 'i','á¼¥' => 'i', - 'ἦ' => 'i','á¼§' => 'i','á¾' => 'i','ᾑ' => 'i','á¾’' => 'i','ᾓ' => 'i', - 'á¾”' => 'i','ᾕ' => 'i','á¾–' => 'i','á¾—' => 'i','á½´' => 'i','á¿‚' => 'i', - 'ῃ' => 'i','á¿„' => 'i','ῆ' => 'i','ῇ' => 'i','θ' => 't','ι' => 'i', - 'ί' => 'i','ÏŠ' => 'i','Î' => 'i','á¼°' => 'i','á¼±' => 'i','á¼²' => 'i', - 'á¼³' => 'i','á¼´' => 'i','á¼µ' => 'i','á¼¶' => 'i','á¼·' => 'i','á½¶' => 'i', - 'á¿' => 'i','á¿‘' => 'i','á¿’' => 'i','á¿–' => 'i','á¿—' => 'i','κ' => 'k', - 'λ' => 'l','μ' => 'm','ν' => 'n','ξ' => 'k','ο' => 'o','ÏŒ' => 'o', - 'á½€' => 'o','á½' => 'o','ὂ' => 'o','ὃ' => 'o','ὄ' => 'o','á½…' => 'o', - 'ὸ' => 'o','Ï€' => 'p','Ï' => 'r','ῤ' => 'r','á¿¥' => 'r','σ' => 's', - 'Ï‚' => 's','Ï„' => 't','Ï…' => 'y','Ï' => 'y','Ï‹' => 'y','ΰ' => 'y', - 'á½' => 'y','ὑ' => 'y','á½’' => 'y','ὓ' => 'y','á½”' => 'y','ὕ' => 'y', - 'á½–' => 'y','á½—' => 'y','ὺ' => 'y','á¿ ' => 'y','á¿¡' => 'y','á¿¢' => 'y', - 'ῦ' => 'y','á¿§' => 'y','φ' => 'f','χ' => 'x','ψ' => 'p','ω' => 'o', - 'ÏŽ' => 'o','á½ ' => 'o','ὡ' => 'o','á½¢' => 'o','á½£' => 'o','ὤ' => 'o', - 'á½¥' => 'o','ὦ' => 'o','á½§' => 'o','á¾ ' => 'o','ᾡ' => 'o','á¾¢' => 'o', - 'á¾£' => 'o','ᾤ' => 'o','á¾¥' => 'o','ᾦ' => 'o','á¾§' => 'o','á½¼' => 'o', - 'ῲ' => 'o','ῳ' => 'o','á¿´' => 'o','á¿¶' => 'o','á¿·' => 'o','Ð' => 'A', - 'Б' => 'B','Ð’' => 'V','Г' => 'G','Д' => 'D','Е' => 'E','Ð' => 'E', - 'Ж' => 'Z','З' => 'Z','И' => 'I','Й' => 'I','К' => 'K','Л' => 'L', - 'М' => 'M','Ð' => 'N','О' => 'O','П' => 'P','Р' => 'R','С' => 'S', - 'Т' => 'T','У' => 'U','Ф' => 'F','Ð¥' => 'K','Ц' => 'T','Ч' => 'C', - 'Ш' => 'S','Щ' => 'S','Ы' => 'Y','Э' => 'E','Ю' => 'Y','Я' => 'Y', - 'а' => 'A','б' => 'B','в' => 'V','г' => 'G','д' => 'D','е' => 'E', - 'Ñ‘' => 'E','ж' => 'Z','з' => 'Z','и' => 'I','й' => 'I','к' => 'K', - 'л' => 'L','м' => 'M','н' => 'N','о' => 'O','п' => 'P','Ñ€' => 'R', - 'Ñ' => 'S','Ñ‚' => 'T','у' => 'U','Ñ„' => 'F','Ñ…' => 'K','ц' => 'T', - 'ч' => 'C','ш' => 'S','щ' => 'S','Ñ‹' => 'Y','Ñ' => 'E','ÑŽ' => 'Y', - 'Ñ' => 'Y','ð' => 'd','Ã' => 'D','þ' => 't','Þ' => 'T','áƒ' => 'a', - 'ბ' => 'b','გ' => 'g','დ' => 'd','ე' => 'e','ვ' => 'v','ზ' => 'z', - 'თ' => 't','ი' => 'i','კ' => 'k','ლ' => 'l','მ' => 'm','ნ' => 'n', - 'áƒ' => 'o','პ' => 'p','ჟ' => 'z','რ' => 'r','ს' => 's','ტ' => 't', - 'უ' => 'u','ფ' => 'p','ქ' => 'k','ღ' => 'g','ყ' => 'q','შ' => 's', - 'ჩ' => 'c','ც' => 't','ძ' => 'd','წ' => 't','ჭ' => 'c','ხ' => 'k', - 'ჯ' => 'j','ჰ' => 'h','Ä' => 'a','Å£' => 't','ʼ' => "'", '̧' => '', - 'ḩ' => 'h','ʼ' => "'",'‘' => "'",'’' => "'",'ừ' => 'u','/' => '', - 'ế' => 'e','ả' => 'a','ị' => 'i','ậ' => 'a','ệ' => 'e','ỉ' => 'i', - 'ồ' => 'o','á»' => 'e','Æ¡' => 'o','ạ' => 'a','ẵ' => 'a','ư' => 'u', - 'ằ' => 'a','ầ' => 'a','ḑ' => 'd','Ḩ' => 'H','á¸' => 'D','ḑ' => 'd', - 'Ä¢' => 'G','Å ' => 'S','ļ' => 'l','ž' => 'z','Ä’' => 'E','ņ' => 'n', - 'ÄŒ' => 'C','È™' => 's','È›' => 't', 'á»™' => 'o','ắ' => 'a','ÅŸ' => 's', - "'" => '', 'Õ¸Ö‚' => 'u','Õ¡' => 'a','Õ¢' => 'b','Õ£' => 'g','Õ¤' => 'd', - 'Õ¥' => 'e','Õ¦' => 'z','Õ§' => 'e','Õ¨' => 'y','Õ©' => 't','Õª' => 'zh', - 'Õ«' => 'i','Õ¬' => 'l','Õ­' => 'kh','Õ®' => 'ts','Õ¯' => 'k','Õ°' => 'h', - 'Õ±' => 'dz','Õ²' => 'gh','Õ³' => 'ch','Õ´' => 'm','Õµ' => 'y','Õ¶' => 'n', - 'Õ·' => 'sh','Õ¸' => 'o','Õ¹' => 'ch','Õº' => 'p','Õ»' => 'j','Õ¼' => 'r', - 'Õ½' => 's','Õ¾' => 'v','Õ¿' => 't','Ö€' => 'r','Ö' => 'ts','Öƒ' => 'p', - 'Ö„' => 'q','Ö‡' => 'ev','Ö…' => 'o','Ö†' => 'f', - ); - return str_replace(array_keys($transliterationTable), array_values($transliterationTable), $string); - } - - private static function transliterate($string) - { - $transId = 'Any-Latin; Latin-ASCII; NFD; [:Nonspacing Mark:] Remove; NFC; Lower();'; - if (function_exists('transliterator_transliterate') && $transliterator = \Transliterator::create($transId)) { - $transString = $transliterator->transliterate($string); - } else { - $transString = static::toAscii($string); - } - - return preg_replace('/[^A-Za-z0-9_.]/u', '', $transString); - } - /** * @example 'jdoe@acme.biz' */ public function email() { $format = static::randomElement(static::$emailFormats); - + return $this->generator->parse($format); } @@ -219,7 +93,18 @@ class Internet extends \Faker\Provider\Base $format = static::randomElement(static::$userNameFormats); $username = static::bothify($this->generator->parse($format)); - return static::transliterate($username); + $username = strtolower(static::transliterate($username)); + + // check if transliterate() didn't support the language and removed all letters + if (trim($username, '._') === '') { + throw new \Exception('userName failed with the selected locale. Try a different locale or activate the "intl" PHP extension.'); + } + + // clean possible trailing dots from first/last names + $username = str_replace('..', '.', $username); + $username = rtrim($username, '.'); + + return $username; } /** * @example 'fY4èHdZv68' @@ -246,7 +131,17 @@ class Internet extends \Faker\Provider\Base { $lastName = $this->generator->format('lastName'); - return static::transliterate($lastName); + $lastName = strtolower(static::transliterate($lastName)); + + // check if transliterate() didn't support the language and removed all letters + if (trim($lastName, '._') === '') { + throw new \Exception('domainWord failed with the selected locale. Try a different locale or activate the "intl" PHP extension.'); + } + + // clean possible trailing dot from last name + $lastName = rtrim($lastName, '.'); + + return $lastName; } /** @@ -280,7 +175,7 @@ class Internet extends \Faker\Provider\Base } $words = $this->generator->words($nbWords); - return join($words, '-'); + return join('-', $words); } /** @@ -288,7 +183,7 @@ class Internet extends \Faker\Provider\Base */ public function ipv4() { - return long2ip(mt_rand(0, 1) == 0 ? mt_rand(-2147483648, 0) : mt_rand(1, 2147483647)); + return long2ip(mt_rand(0, 1) == 0 ? mt_rand(-2147483648, -2) : mt_rand(16777216, 2147483647)); } /** @@ -311,13 +206,11 @@ class Internet extends \Faker\Provider\Base { if (static::numberBetween(0, 1) === 0) { // 10.x.x.x range - $ip = long2ip(static::numberBetween(167772160, 184549375)); - } else { - // 192.168.x.x range - $ip = long2ip(static::numberBetween(3232235520, 3232301055)); + return long2ip(static::numberBetween(ip2long("10.0.0.0"), ip2long("10.255.255.255"))); } - return $ip; + // 192.168.x.x range + return long2ip(static::numberBetween(ip2long("192.168.0.0"), ip2long("192.168.255.255"))); } /** @@ -332,4 +225,138 @@ class Internet extends \Faker\Provider\Base return $mac; } + + protected static function transliterate($string) + { + if (0 === preg_match('/[^A-Za-z0-9_.]/', $string)) { + return $string; + } + + $transId = 'Any-Latin; Latin-ASCII; NFD; [:Nonspacing Mark:] Remove; NFC;'; + if (class_exists('Transliterator', false) && $transliterator = \Transliterator::create($transId)) { + $transString = $transliterator->transliterate($string); + } else { + $transString = static::toAscii($string); + } + + return preg_replace('/[^A-Za-z0-9_.]/u', '', $transString); + } + + protected static function toAscii($string) + { + static $arrayFrom, $arrayTo; + + if (empty($arrayFrom)) { + $transliterationTable = array( + 'IJ'=>'I', 'Ö'=>'O', 'Å’'=>'O', 'Ü'=>'U', 'ä'=>'a', 'æ'=>'a', + 'ij'=>'i', 'ö'=>'o', 'Å“'=>'o', 'ü'=>'u', 'ß'=>'s', 'Å¿'=>'s', + 'À'=>'A', 'Ã'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Ã…'=>'A', + 'Æ'=>'A', 'Ä€'=>'A', 'Ä„'=>'A', 'Ä‚'=>'A', 'Ç'=>'C', 'Ć'=>'C', + 'ÄŒ'=>'C', 'Ĉ'=>'C', 'ÄŠ'=>'C', 'ÄŽ'=>'D', 'Ä'=>'D', 'È'=>'E', + 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E', 'Ä’'=>'E', 'Ę'=>'E', 'Äš'=>'E', + 'Ä”'=>'E', 'Ä–'=>'E', 'Äœ'=>'G', 'Äž'=>'G', 'Ä '=>'G', 'Ä¢'=>'G', + 'Ĥ'=>'H', 'Ħ'=>'H', 'ÃŒ'=>'I', 'Ã'=>'I', 'ÃŽ'=>'I', 'Ã'=>'I', + 'Ī'=>'I', 'Ĩ'=>'I', 'Ĭ'=>'I', 'Ä®'=>'I', 'İ'=>'I', 'Ä´'=>'J', + 'Ķ'=>'K', 'Ľ'=>'K', 'Ĺ'=>'K', 'Ä»'=>'K', 'Ä¿'=>'K', 'Å'=>'L', + 'Ñ'=>'N', 'Ń'=>'N', 'Ň'=>'N', 'Å…'=>'N', 'ÅŠ'=>'N', 'Ã’'=>'O', + 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ø'=>'O', 'ÅŒ'=>'O', 'Å'=>'O', + 'ÅŽ'=>'O', 'Å”'=>'R', 'Ř'=>'R', 'Å–'=>'R', 'Åš'=>'S', 'Åž'=>'S', + 'Åœ'=>'S', 'Ș'=>'S', 'Å '=>'S', 'Ť'=>'T', 'Å¢'=>'T', 'Ŧ'=>'T', + 'Èš'=>'T', 'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ū'=>'U', 'Å®'=>'U', + 'Ű'=>'U', 'Ŭ'=>'U', 'Ũ'=>'U', 'Ų'=>'U', 'Å´'=>'W', 'Ŷ'=>'Y', + 'Ÿ'=>'Y', 'Ã'=>'Y', 'Ź'=>'Z', 'Å»'=>'Z', 'Ž'=>'Z', 'à'=>'a', + 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'Ä'=>'a', 'Ä…'=>'a', 'ă'=>'a', + 'Ã¥'=>'a', 'ç'=>'c', 'ć'=>'c', 'Ä'=>'c', 'ĉ'=>'c', 'Ä‹'=>'c', + 'Ä'=>'d', 'Ä‘'=>'d', 'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', + 'Ä“'=>'e', 'Ä™'=>'e', 'Ä›'=>'e', 'Ä•'=>'e', 'Ä—'=>'e', 'Æ’'=>'f', + 'Ä'=>'g', 'ÄŸ'=>'g', 'Ä¡'=>'g', 'Ä£'=>'g', 'Ä¥'=>'h', 'ħ'=>'h', + 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'Ä«'=>'i', 'Ä©'=>'i', + 'Ä­'=>'i', 'į'=>'i', 'ı'=>'i', 'ĵ'=>'j', 'Ä·'=>'k', 'ĸ'=>'k', + 'Å‚'=>'l', 'ľ'=>'l', 'ĺ'=>'l', 'ļ'=>'l', 'Å€'=>'l', 'ñ'=>'n', + 'Å„'=>'n', 'ň'=>'n', 'ņ'=>'n', 'ʼn'=>'n', 'Å‹'=>'n', 'ò'=>'o', + 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 'ø'=>'o', 'Å'=>'o', 'Å‘'=>'o', + 'Å'=>'o', 'Å•'=>'r', 'Å™'=>'r', 'Å—'=>'r', 'Å›'=>'s', 'Å¡'=>'s', + 'Å¥'=>'t', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'Å«'=>'u', 'ů'=>'u', + 'ű'=>'u', 'Å­'=>'u', 'Å©'=>'u', 'ų'=>'u', 'ŵ'=>'w', 'ÿ'=>'y', + 'ý'=>'y', 'Å·'=>'y', 'ż'=>'z', 'ź'=>'z', 'ž'=>'z', 'Α'=>'A', + 'Ά'=>'A', 'Ἀ'=>'A', 'Ἁ'=>'A', 'Ἂ'=>'A', 'Ἃ'=>'A', 'Ἄ'=>'A', + 'á¼'=>'A', 'Ἆ'=>'A', 'á¼'=>'A', 'ᾈ'=>'A', 'ᾉ'=>'A', 'ᾊ'=>'A', + 'ᾋ'=>'A', 'ᾌ'=>'A', 'á¾'=>'A', 'ᾎ'=>'A', 'á¾'=>'A', 'Ᾰ'=>'A', + 'á¾¹'=>'A', 'Ὰ'=>'A', 'á¾¼'=>'A', 'Î’'=>'B', 'Γ'=>'G', 'Δ'=>'D', + 'Ε'=>'E', 'Έ'=>'E', 'Ἐ'=>'E', 'á¼™'=>'E', 'Ἒ'=>'E', 'á¼›'=>'E', + 'Ἔ'=>'E', 'á¼'=>'E', 'Ὲ'=>'E', 'Ζ'=>'Z', 'Η'=>'I', 'Ή'=>'I', + 'Ἠ'=>'I', 'Ἡ'=>'I', 'Ἢ'=>'I', 'Ἣ'=>'I', 'Ἤ'=>'I', 'á¼­'=>'I', + 'á¼®'=>'I', 'Ἧ'=>'I', 'ᾘ'=>'I', 'á¾™'=>'I', 'ᾚ'=>'I', 'á¾›'=>'I', + 'ᾜ'=>'I', 'á¾'=>'I', 'ᾞ'=>'I', 'ᾟ'=>'I', 'Ὴ'=>'I', 'ῌ'=>'I', + 'Θ'=>'T', 'Ι'=>'I', 'Ί'=>'I', 'Ϊ'=>'I', 'Ἰ'=>'I', 'á¼¹'=>'I', + 'Ἲ'=>'I', 'á¼»'=>'I', 'á¼¼'=>'I', 'á¼½'=>'I', 'á¼¾'=>'I', 'Ἷ'=>'I', + 'Ῐ'=>'I', 'á¿™'=>'I', 'Ὶ'=>'I', 'Κ'=>'K', 'Λ'=>'L', 'Μ'=>'M', + 'Î'=>'N', 'Ξ'=>'K', 'Ο'=>'O', 'ÎŒ'=>'O', 'Ὀ'=>'O', 'Ὁ'=>'O', + 'Ὂ'=>'O', 'Ὃ'=>'O', 'Ὄ'=>'O', 'á½'=>'O', 'Ὸ'=>'O', 'Π'=>'P', + 'Ρ'=>'R', 'Ῥ'=>'R', 'Σ'=>'S', 'Τ'=>'T', 'Î¥'=>'Y', 'ÎŽ'=>'Y', + 'Ϋ'=>'Y', 'á½™'=>'Y', 'á½›'=>'Y', 'á½'=>'Y', 'Ὗ'=>'Y', 'Ῠ'=>'Y', + 'á¿©'=>'Y', 'Ὺ'=>'Y', 'Φ'=>'F', 'Χ'=>'X', 'Ψ'=>'P', 'Ω'=>'O', + 'Î'=>'O', 'Ὠ'=>'O', 'Ὡ'=>'O', 'Ὢ'=>'O', 'Ὣ'=>'O', 'Ὤ'=>'O', + 'á½­'=>'O', 'á½®'=>'O', 'Ὧ'=>'O', 'ᾨ'=>'O', 'ᾩ'=>'O', 'ᾪ'=>'O', + 'ᾫ'=>'O', 'ᾬ'=>'O', 'á¾­'=>'O', 'á¾®'=>'O', 'ᾯ'=>'O', 'Ὼ'=>'O', + 'ῼ'=>'O', 'α'=>'a', 'ά'=>'a', 'á¼€'=>'a', 'á¼'=>'a', 'ἂ'=>'a', + 'ἃ'=>'a', 'ἄ'=>'a', 'á¼…'=>'a', 'ἆ'=>'a', 'ἇ'=>'a', 'á¾€'=>'a', + 'á¾'=>'a', 'ᾂ'=>'a', 'ᾃ'=>'a', 'ᾄ'=>'a', 'á¾…'=>'a', 'ᾆ'=>'a', + 'ᾇ'=>'a', 'á½°'=>'a', 'á¾°'=>'a', 'á¾±'=>'a', 'á¾²'=>'a', 'á¾³'=>'a', + 'á¾´'=>'a', 'á¾¶'=>'a', 'á¾·'=>'a', 'β'=>'b', 'γ'=>'g', 'δ'=>'d', + 'ε'=>'e', 'έ'=>'e', 'á¼'=>'e', 'ἑ'=>'e', 'á¼’'=>'e', 'ἓ'=>'e', + 'á¼”'=>'e', 'ἕ'=>'e', 'á½²'=>'e', 'ζ'=>'z', 'η'=>'i', 'ή'=>'i', + 'á¼ '=>'i', 'ἡ'=>'i', 'á¼¢'=>'i', 'á¼£'=>'i', 'ἤ'=>'i', 'á¼¥'=>'i', + 'ἦ'=>'i', 'á¼§'=>'i', 'á¾'=>'i', 'ᾑ'=>'i', 'á¾’'=>'i', 'ᾓ'=>'i', + 'á¾”'=>'i', 'ᾕ'=>'i', 'á¾–'=>'i', 'á¾—'=>'i', 'á½´'=>'i', 'á¿‚'=>'i', + 'ῃ'=>'i', 'á¿„'=>'i', 'ῆ'=>'i', 'ῇ'=>'i', 'θ'=>'t', 'ι'=>'i', + 'ί'=>'i', 'ÏŠ'=>'i', 'Î'=>'i', 'á¼°'=>'i', 'á¼±'=>'i', 'á¼²'=>'i', + 'á¼³'=>'i', 'á¼´'=>'i', 'á¼µ'=>'i', 'á¼¶'=>'i', 'á¼·'=>'i', 'á½¶'=>'i', + 'á¿'=>'i', 'á¿‘'=>'i', 'á¿’'=>'i', 'á¿–'=>'i', 'á¿—'=>'i', 'κ'=>'k', + 'λ'=>'l', 'μ'=>'m', 'ν'=>'n', 'ξ'=>'k', 'ο'=>'o', 'ÏŒ'=>'o', + 'á½€'=>'o', 'á½'=>'o', 'ὂ'=>'o', 'ὃ'=>'o', 'ὄ'=>'o', 'á½…'=>'o', + 'ὸ'=>'o', 'Ï€'=>'p', 'Ï'=>'r', 'ῤ'=>'r', 'á¿¥'=>'r', 'σ'=>'s', + 'Ï‚'=>'s', 'Ï„'=>'t', 'Ï…'=>'y', 'Ï'=>'y', 'Ï‹'=>'y', 'ΰ'=>'y', + 'á½'=>'y', 'ὑ'=>'y', 'á½’'=>'y', 'ὓ'=>'y', 'á½”'=>'y', 'ὕ'=>'y', + 'á½–'=>'y', 'á½—'=>'y', 'ὺ'=>'y', 'á¿ '=>'y', 'á¿¡'=>'y', 'á¿¢'=>'y', + 'ῦ'=>'y', 'á¿§'=>'y', 'φ'=>'f', 'χ'=>'x', 'ψ'=>'p', 'ω'=>'o', + 'ÏŽ'=>'o', 'á½ '=>'o', 'ὡ'=>'o', 'á½¢'=>'o', 'á½£'=>'o', 'ὤ'=>'o', + 'á½¥'=>'o', 'ὦ'=>'o', 'á½§'=>'o', 'á¾ '=>'o', 'ᾡ'=>'o', 'á¾¢'=>'o', + 'á¾£'=>'o', 'ᾤ'=>'o', 'á¾¥'=>'o', 'ᾦ'=>'o', 'á¾§'=>'o', 'á½¼'=>'o', + 'ῲ'=>'o', 'ῳ'=>'o', 'á¿´'=>'o', 'á¿¶'=>'o', 'á¿·'=>'o', 'Ð'=>'A', + 'Б'=>'B', 'Ð’'=>'V', 'Г'=>'G', 'Д'=>'D', 'Е'=>'E', 'Ð'=>'E', + 'Ж'=>'Z', 'З'=>'Z', 'И'=>'I', 'Й'=>'I', 'К'=>'K', 'Л'=>'L', + 'М'=>'M', 'Ð'=>'N', 'О'=>'O', 'П'=>'P', 'Р'=>'R', 'С'=>'S', + 'Т'=>'T', 'У'=>'U', 'Ф'=>'F', 'Ð¥'=>'K', 'Ц'=>'T', 'Ч'=>'C', + 'Ш'=>'S', 'Щ'=>'S', 'Ы'=>'Y', 'Э'=>'E', 'Ю'=>'Y', 'Я'=>'Y', + 'а'=>'A', 'б'=>'B', 'в'=>'V', 'г'=>'G', 'д'=>'D', 'е'=>'E', + 'Ñ‘'=>'E', 'ж'=>'Z', 'з'=>'Z', 'и'=>'I', 'й'=>'I', 'к'=>'K', + 'л'=>'L', 'м'=>'M', 'н'=>'N', 'о'=>'O', 'п'=>'P', 'Ñ€'=>'R', + 'Ñ'=>'S', 'Ñ‚'=>'T', 'у'=>'U', 'Ñ„'=>'F', 'Ñ…'=>'K', 'ц'=>'T', + 'ч'=>'C', 'ш'=>'S', 'щ'=>'S', 'Ñ‹'=>'Y', 'Ñ'=>'E', 'ÑŽ'=>'Y', + 'Ñ'=>'Y', 'ð'=>'d', 'Ã'=>'D', 'þ'=>'t', 'Þ'=>'T', 'áƒ'=>'a', + 'ბ'=>'b', 'გ'=>'g', 'დ'=>'d', 'ე'=>'e', 'ვ'=>'v', 'ზ'=>'z', + 'თ'=>'t', 'ი'=>'i', 'კ'=>'k', 'ლ'=>'l', 'მ'=>'m', 'ნ'=>'n', + 'áƒ'=>'o', 'პ'=>'p', 'ჟ'=>'z', 'რ'=>'r', 'ს'=>'s', 'ტ'=>'t', + 'უ'=>'u', 'ფ'=>'p', 'ქ'=>'k', 'ღ'=>'g', 'ყ'=>'q', 'შ'=>'s', + 'ჩ'=>'c', 'ც'=>'t', 'ძ'=>'d', 'წ'=>'t', 'ჭ'=>'c', 'ხ'=>'k', + 'ჯ'=>'j', 'ჰ'=>'h', 'Å£'=>'t', 'ʼ'=>"'", '̧'=>'', 'ḩ'=>'h', + '‘'=>"'", '’'=>"'", 'ừ'=>'u', '/'=>'', 'ế'=>'e', 'ả'=>'a', + 'ị'=>'i', 'ậ'=>'a', 'ệ'=>'e', 'ỉ'=>'i', 'ồ'=>'o', 'á»'=>'e', + 'Æ¡'=>'o', 'ạ'=>'a', 'ẵ'=>'a', 'ư'=>'u', 'ằ'=>'a', 'ầ'=>'a', + 'ḑ'=>'d', 'Ḩ'=>'H', 'á¸'=>'D', 'È™'=>'s', 'È›'=>'t', 'á»™'=>'o', + 'ắ'=>'a', 'ÅŸ'=>'s', "'"=>'', 'Õ¸Ö‚'=>'u', 'Õ¡'=>'a', 'Õ¢'=>'b', + 'Õ£'=>'g', 'Õ¤'=>'d', 'Õ¥'=>'e', 'Õ¦'=>'z', 'Õ§'=>'e', 'Õ¨'=>'y', + 'Õ©'=>'t', 'Õª'=>'zh', 'Õ«'=>'i', 'Õ¬'=>'l', 'Õ­'=>'kh', 'Õ®'=>'ts', + 'Õ¯'=>'k', 'Õ°'=>'h', 'Õ±'=>'dz', 'Õ²'=>'gh', 'Õ³'=>'ch', 'Õ´'=>'m', + 'Õµ'=>'y', 'Õ¶'=>'n', 'Õ·'=>'sh', 'Õ¸'=>'o', 'Õ¹'=>'ch', 'Õº'=>'p', + 'Õ»'=>'j', 'Õ¼'=>'r', 'Õ½'=>'s', 'Õ¾'=>'v', 'Õ¿'=>'t', 'Ö€'=>'r', + 'Ö'=>'ts', 'Öƒ'=>'p', 'Ö„'=>'q', 'Ö‡'=>'ev', 'Ö…'=>'o', 'Ö†'=>'f', + ); + $arrayFrom = array_keys($transliterationTable); + $arrayTo = array_values($transliterationTable); + } + + return str_replace($arrayFrom, $arrayTo, $string); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Lorem.php b/vendor/fzaninotto/faker/src/Faker/Provider/Lorem.php index 7ba0ced5..b8c6dac2 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/Lorem.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/Lorem.php @@ -2,7 +2,7 @@ namespace Faker\Provider; -class Lorem extends \Faker\Provider\Base +class Lorem extends Base { protected static $wordList = array( 'alias', 'consequatur', 'aut', 'perferendis', 'sit', 'voluptatem', @@ -68,7 +68,7 @@ class Lorem extends \Faker\Provider\Base $words []= static::word(); } - return $asText ? join(' ', $words) : $words; + return $asText ? implode(' ', $words) : $words; } /** @@ -92,7 +92,7 @@ class Lorem extends \Faker\Provider\Base $words = static::words($nbWords); $words[0] = ucwords($words[0]); - return join($words, ' ') . '.'; + return implode(' ', $words) . '.'; } /** @@ -110,7 +110,7 @@ class Lorem extends \Faker\Provider\Base $sentences []= static::sentence(); } - return $asText ? join(' ', $sentences) : $sentences; + return $asText ? implode(' ', $sentences) : $sentences; } /** @@ -131,7 +131,7 @@ class Lorem extends \Faker\Provider\Base $nbSentences = self::randomizeNbElements($nbSentences); } - return join(static::sentences($nbSentences), ' '); + return implode(' ', static::sentences($nbSentences)); } /** @@ -149,63 +149,51 @@ class Lorem extends \Faker\Provider\Base $paragraphs []= static::paragraph(); } - return $asText ? join("\n\n", $paragraphs) : $paragraphs; + return $asText ? implode("\n\n", $paragraphs) : $paragraphs; } /** * Generate a text string. * Depending on the $maxNbChars, returns a string made of words, sentences, or paragraphs. * - * @example 'Sapiente sunt omnis. Ut pariatur ad autem ducimus et. Voluptas rem voluptas sint modi dolorem amet.' + * @example 'Sapiente sunt omnis. Ut pariatur ad autem ducimus et. Voluptas rem voluptas sint modi dolorem amet.' + * * @param integer $maxNbChars Maximum number of characters the text should contain (minimum 5) + * * @return string */ public static function text($maxNbChars = 200) { - $text = array(); if ($maxNbChars < 5) { throw new \InvalidArgumentException('text() can only generate text of at least 5 characters'); - } elseif ($maxNbChars < 25) { - // join words - while (empty($text)) { - $size = 0; - // determine how many words are needed to reach the $maxNbChars once; - while ($size < $maxNbChars) { - $word = ($size ? ' ' : '') . static::word(); - $text []= $word; - $size += strlen($word); - } - array_pop($text); - } - $text[0][0] = static::toUpper($text[0][0]); - $text[count($text) - 1] .= '.'; - } elseif ($maxNbChars < 100) { - // join sentences - while (empty($text)) { - $size = 0; - // determine how many sentences are needed to reach the $maxNbChars once; - while ($size < $maxNbChars) { - $sentence = ($size ? ' ' : '') . static::sentence(); - $text []= $sentence; - $size += strlen($sentence); - } - array_pop($text); - } - } else { - // join paragraphs - while (empty($text)) { - $size = 0; - // determine how many paragraphs are needed to reach the $maxNbChars once; - while ($size < $maxNbChars) { - $paragraph = ($size ? "\n" : '') . static::paragraph(); - $text []= $paragraph; - $size += strlen($paragraph); - } - array_pop($text); - } } - return join($text, ''); + $type = ($maxNbChars < 25) ? 'word' : (($maxNbChars < 100) ? 'sentence' : 'paragraph'); + + $text = array(); + while (empty($text)) { + $size = 0; + + // until $maxNbChars is reached + while ($size < $maxNbChars) { + $word = ($size ? ' ' : '') . static::$type(); + $text[] = $word; + + $size += strlen($word); + } + + array_pop($text); + } + + if ($type === 'word') { + // capitalize first letter + $text[0] = ucwords($text[0]); + + // end sentence with full stop + $text[count($text) - 1] .= '.'; + } + + return implode('', $text); } protected static function randomizeNbElements($nbElements) diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Miscellaneous.php b/vendor/fzaninotto/faker/src/Faker/Provider/Miscellaneous.php index 4557a58e..4f669c92 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/Miscellaneous.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/Miscellaneous.php @@ -2,9 +2,56 @@ namespace Faker\Provider; -class Miscellaneous extends \Faker\Provider\Base +class Miscellaneous extends Base { - protected static $languageCode = array('cn', 'de', 'en', 'es', 'fr', 'it', 'pt', 'ru'); + /** + * @link https://en.wikipedia.org/wiki/Emoji#Unicode_blocks + * On date of 2017-03-26 + * + * U+1F600 - U+1F637 as their UTF-8 Pairings + */ + protected static $emoji = array( + '\uD83D\uDE00', '\uD83D\uDE01', '\uD83D\uDE02', '\uD83D\uDE03', + '\uD83D\uDE04', '\uD83D\uDE05', '\uD83D\uDE06', '\uD83D\uDE07', + '\uD83D\uDE08', '\uD83D\uDE09', '\uD83D\uDE0A', '\uD83D\uDE0B', + '\uD83D\uDE0C', '\uD83D\uDE0D', '\uD83D\uDE0E', '\uD83D\uDE0F', + '\uD83D\uDE10', '\uD83D\uDE11', '\uD83D\uDE12', '\uD83D\uDE13', + '\uD83D\uDE14', '\uD83D\uDE15', '\uD83D\uDE16', '\uD83D\uDE17', + '\uD83D\uDE18', '\uD83D\uDE19', '\uD83D\uDE1A', '\uD83D\uDE1B', + '\uD83D\uDE1C', '\uD83D\uDE1D', '\uD83D\uDE1E', '\uD83D\uDE1F', + '\uD83D\uDE20', '\uD83D\uDE21', '\uD83D\uDE22', '\uD83D\uDE23', + '\uD83D\uDE24', '\uD83D\uDE25', '\uD83D\uDE26', '\uD83D\uDE27', + '\uD83D\uDE28', '\uD83D\uDE29', '\uD83D\uDE2A', '\uD83D\uDE2B', + '\uD83D\uDE2C', '\uD83D\uDE2D', '\uD83D\uDE2E', '\uD83D\uDE2F', + '\uD83D\uDE30', '\uD83D\uDE31', '\uD83D\uDE32', '\uD83D\uDE33', + '\uD83D\uDE34', '\uD83D\uDE35', '\uD83D\uDE36', '\uD83D\uDE37', + ); + + /** + * @link https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes + * On date of 2016-04-22 + */ + protected static $languageCode = array( + 'aa', 'ab', 'ae', 'af', 'ak', 'am', 'an', 'ar', 'as', 'av', + 'ay', 'az', 'ba', 'be', 'bg', 'bh', 'bi', 'bm', 'bn', 'bo', + 'br', 'bs', 'ca', 'ce', 'ch', 'co', 'cr', 'cs', 'cu', 'cv', + 'cy', 'da', 'de', 'dv', 'dz', 'ee', 'el', 'en', 'eo', 'es', + 'et', 'eu', 'fa', 'ff', 'fi', 'fj', 'fo', 'fr', 'fy', 'ga', + 'gd', 'gl', 'gn', 'gu', 'gv', 'ha', 'he', 'hi', 'ho', 'hr', + 'ht', 'hu', 'hy', 'hz', 'ia', 'id', 'ie', 'ig', 'ii', 'ik', + 'io', 'is', 'it', 'iu', 'ja', 'jv', 'ka', 'kg', 'ki', 'kj', + 'kk', 'kl', 'km', 'kn', 'ko', 'kr', 'ks', 'ku', 'kv', 'kw', + 'ky', 'la', 'lb', 'lg', 'li', 'ln', 'lo', 'lt', 'lu', 'lv', + 'mg', 'mh', 'mi', 'mk', 'ml', 'mn', 'mr', 'ms', 'mt', 'my', + 'na', 'nb', 'nd', 'ne', 'ng', 'nl', 'nn', 'no', 'nr', 'nv', + 'ny', 'oc', 'oj', 'om', 'or', 'os', 'pa', 'pi', 'pl', 'ps', + 'pt', 'qu', 'rm', 'rn', 'ro', 'ru', 'rw', 'sa', 'sc', 'sd', + 'se', 'sg', 'si', 'sk', 'sl', 'sm', 'sn', 'so', 'sq', 'sr', + 'ss', 'st', 'su', 'sv', 'sw', 'ta', 'te', 'tg', 'th', 'ti', + 'tk', 'tl', 'tn', 'to', 'tr', 'ts', 'tt', 'tw', 'ty', 'ug', + 'uk', 'ur', 'uz', 've', 'vi', 'vo', 'wa', 'wo', 'xh', 'yi', + 'yo', 'za', 'zh', 'zu', + ); /** * @link https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 @@ -14,28 +61,28 @@ class Miscellaneous extends \Faker\Provider\Base 'AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', - 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', - 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', - 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', - 'DO', 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', - 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', - 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', - 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', - 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', - 'JE', 'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', - 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', - 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', - 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', - 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', - 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', - 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', - 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', - 'RU', 'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', - 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', - 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', - 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', - 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', - 'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW', + 'BR', 'BS', 'BT', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', + 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU', + 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO', + 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', + 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG', + 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', + 'GU', 'GW', 'GY', 'HK', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE', + 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM', + 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', + 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', + 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', + 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', + 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE', + 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', + 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', + 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW', + 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', + 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', + 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', + 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', + 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', + 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW', ); /** @@ -154,39 +201,44 @@ class Miscellaneous extends \Faker\Provider\Base ); /** - * @link http://en.wikipedia.org/wiki/ISO_4217 - * On date of 2015-01-10 + * @link https://en.wikipedia.org/wiki/ISO_4217 + * On date of 2019-09-27 + * + * With the following exceptions: + * SVC has been replaced by the USD in 2001: https://en.wikipedia.org/wiki/Salvadoran_col%C3%B3n + * ZWL has been suspended since 2009: https://en.wikipedia.org/wiki/Zimbabwean_dollar */ protected static $currencyCode = array( 'AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AWG', 'AZN', 'BAM', 'BBD', 'BDT', 'BGN', 'BHD', 'BIF', 'BMD', 'BND', 'BOB', 'BRL', - 'BSD', 'BTC', 'BTN', 'BWP', 'BYR', 'BZD', 'CAD', 'CDF', 'CHF', 'CLF', - 'CLP', 'CNY', 'COP', 'CRC', 'CUP', 'CVE', 'CZK', 'DJF', 'DKK', 'DOP', - 'DZD', 'EEK', 'EGP', 'ERN', 'ETB', 'EUR', 'FJD', 'FKP', 'GBP', 'GEL', - 'GGP', 'GHS', 'GIP', 'GMD', 'GNF', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK', - 'HTG', 'HUF', 'IDR', 'ILS', 'IMP', 'INR', 'IQD', 'IRR', 'ISK', 'JEP', - 'JMD', 'JOD', 'JPY', 'KES', 'KGS', 'KHR', 'KMF', 'KPW', 'KRW', 'KWD', - 'KYD', 'KZT', 'LAK', 'LBP', 'LKR', 'LRD', 'LSL', 'LTL', 'LVL', 'LYD', - 'MAD', 'MDL', 'MGA', 'MKD', 'MMK', 'MNT', 'MOP', 'MRO', 'MTL', 'MUR', - 'MVR', 'MWK', 'MXN', 'MYR', 'MZN', 'NAD', 'NGN', 'NIO', 'NOK', 'NPR', - 'NZD', 'OMR', 'PAB', 'PEN', 'PGK', 'PHP', 'PKR', 'PLN', 'PYG', 'QAR', - 'RON', 'RSD', 'RUB', 'RWF', 'SAR', 'SBD', 'SCR', 'SDG', 'SEK', 'SGD', - 'SHP', 'SLL', 'SOS', 'SRD', 'STD', 'SVC', 'SYP', 'SZL', 'THB', 'TJS', - 'TMT', 'TND', 'TOP', 'TRY', 'TTD', 'TWD', 'TZS', 'UAH', 'UGX', 'USD', - 'UYU', 'UZS', 'VEF', 'VND', 'VUV', 'WST', 'XAF', 'XAG', 'XAU', 'XCD', - 'XDR', 'XOF', 'XPF', 'YER', 'ZAR', 'ZMK', 'ZMW', 'ZWL' + 'BSD', 'BTN', 'BWP', 'BYN', 'BZD', 'CAD', 'CDF', 'CHF', 'CLP', 'CNY', + 'COP', 'CRC', 'CUC', 'CUP', 'CVE', 'CZK', 'DJF', 'DKK', 'DOP', 'DZD', + 'EGP', 'ERN', 'ETB', 'EUR', 'FJD', 'FKP', 'GBP', 'GEL', 'GHS', 'GIP', + 'GMD', 'GNF', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK', 'HTG', 'HUF', 'IDR', + 'ILS', 'INR', 'IQD', 'IRR', 'ISK', 'JMD', 'JOD', 'JPY', 'KES', 'KGS', + 'KHR', 'KMF', 'KPW', 'KRW', 'KWD', 'KYD', 'KZT', 'LAK', 'LBP', 'LKR', + 'LRD', 'LSL', 'LYD', 'MAD', 'MDL', 'MGA', 'MKD', 'MMK', 'MNT', 'MOP', + 'MRU', 'MUR', 'MVR', 'MWK', 'MXN', 'MYR', 'MZN', 'NAD', 'NGN', 'NIO', + 'NOK', 'NPR', 'NZD', 'OMR', 'PAB', 'PEN', 'PGK', 'PHP', 'PKR', 'PLN', + 'PYG', 'QAR', 'RON', 'RSD', 'RUB', 'RWF', 'SAR', 'SBD', 'SCR', 'SDG', + 'SEK', 'SGD', 'SHP', 'SLL', 'SOS', 'SRD', 'SSP', 'STN', 'SYP', 'SZL', + 'THB', 'TJS', 'TMT', 'TND', 'TOP', 'TRY', 'TTD', 'TWD', 'TZS', 'UAH', + 'UGX', 'USD', 'UYU', 'UZS', 'VES', 'VND', 'VUV', 'WST', 'XAF', 'XCD', + 'XOF', 'XPF', 'YER', 'ZAR', 'ZMW', ); /** - * Return a boolean, true or false + * Return a boolean, true or false. + * + * @param int $chanceOfGettingTrue Between 0 (always get false) and 100 (always get true) * - * @param integer $chanceOfGettingTrue Between 0 (always get false) and 100 (always get true). * @return bool + * * @example true */ public static function boolean($chanceOfGettingTrue = 50) { - return mt_rand(1, 100) <= $chanceOfGettingTrue ? true : false; + return mt_rand(1, 100) <= $chanceOfGettingTrue; } /** @@ -223,6 +275,7 @@ class Miscellaneous extends \Faker\Provider\Base /** * @example 'FR' + * * @link https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 */ public static function countryCode() @@ -232,6 +285,7 @@ class Miscellaneous extends \Faker\Provider\Base /** * @example 'FRA' + * * @link https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3 */ public static function countryISOAlpha3() @@ -249,10 +303,21 @@ class Miscellaneous extends \Faker\Provider\Base /** * @example 'EUR' + * * @link https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 */ public static function currencyCode() { return static::randomElement(static::$currencyCode); } + + /** + * Returns an encoded Unicode Character between U+1F600 and U+1F637. + * + * @link https://en.wikipedia.org/wiki/Emoji#Unicode_blocks + */ + public static function emoji() + { + return json_decode('"' . static::randomElement(static::$emoji) . '"'); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/Payment.php index cadbc48d..c4c08581 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/Payment.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/Payment.php @@ -2,6 +2,7 @@ namespace Faker\Provider; +use Faker\Calculator\Iban; use Faker\Calculator\Luhn; class Payment extends Base @@ -11,32 +12,44 @@ class Payment extends Base protected static $cardVendors = array( 'Visa', 'Visa', 'Visa', 'Visa', 'Visa', 'MasterCard', 'MasterCard', 'MasterCard', 'MasterCard', 'MasterCard', - 'American Express', 'Discover Card' + 'American Express', 'Discover Card', 'Visa Retired' ); - // see http://en.wikipedia.org/wiki/Bank_card_number for a reference of existing prefixes + /** + * @var array List of card brand masks for generating valid credit card numbers + * @see https://en.wikipedia.org/wiki/Payment_card_number Reference for existing prefixes + * @see https://www.mastercard.us/en-us/issuers/get-support/2-series-bin-expansion.html MasterCard 2017 2-Series BIN Expansion + */ protected static $cardParams = array( 'Visa' => array( - "4539########", "4539###########", - "4556########", "4556###########", - "4916########", "4916###########", - "4532########", "4532###########", - "4929########", "4929###########", - "40240071####", "40240071#######", - "4485########", "4485###########", - "4716########", "4716###########", - "4###########", "4##############" ), + 'Visa Retired' => array( + "4539########", + "4556########", + "4916########", + "4532########", + "4929########", + "40240071####", + "4485########", + "4716########", + "4###########", + ), 'MasterCard' => array( + "2221###########", + "23#############", + "24#############", + "25#############", + "26#############", + "2720###########", "51#############", "52#############", "53#############", @@ -53,7 +66,7 @@ class Payment extends Base ); /** - * @var array list of IBAN formats, source: @link http://www.swift.com/dsp/resources/documents/IBAN_Registry.txt + * @var array list of IBAN formats, source: @link https://www.swift.com/standards/data-standards/iban */ protected static $ibanFormats = array( 'AD' => array(array('n', 4), array('n', 4), array('c', 12)), @@ -75,6 +88,7 @@ class Payment extends Base 'DO' => array(array('c', 4), array('n', 20)), 'EE' => array(array('n', 2), array('n', 2), array('n', 11), array('n', 1)), 'ES' => array(array('n', 4), array('n', 4), array('n', 1), array('n', 1), array('n', 10)), + 'FI' => array(array('n', 6), array('n', 7), array('n', 1)), 'FR' => array(array('n', 5), array('n', 5), array('c', 11), array('n', 2)), 'GB' => array(array('a', 4), array('n', 6), array('n', 8)), 'GE' => array(array('a', 2), array('n', 16)), @@ -87,7 +101,7 @@ class Payment extends Base 'IL' => array(array('n', 3), array('n', 3), array('n', 13)), 'IS' => array(array('n', 4), array('n', 2), array('n', 6), array('n', 10)), 'IT' => array(array('a', 1), array('n', 5), array('n', 5), array('c', 12)), - 'KW' => array(array('a', 4), array('c', 22)), + 'KW' => array(array('a', 4), array('n', 22)), 'KZ' => array(array('n', 3), array('c', 13)), 'LB' => array(array('n', 4), array('c', 20)), 'LI' => array(array('n', 5), array('c', 12)), @@ -115,7 +129,7 @@ class Payment extends Base 'SK' => array(array('n', 4), array('n', 6), array('n', 10)), 'SM' => array(array('a', 1), array('n', 5), array('n', 5), array('c', 12)), 'TN' => array(array('n', 2), array('n', 3), array('n', 13), array('n', 2)), - 'TR' => array(array('n', 5), array('c', 1), array('c', 16)), + 'TR' => array(array('n', 5), array('n', 1), array('c', 16)), 'VG' => array(array('a', 4), array('n', 16)), ); @@ -132,7 +146,7 @@ class Payment extends Base /** * Returns the String of a credit card number. * - * @param string $type Supporting any of 'Visa', 'MasterCard', 'Amercian Express', and 'Discover' + * @param string $type Supporting any of 'Visa', 'MasterCard', 'American Express', and 'Discover' * @param boolean $formatted Set to true if the output string should contain one separator every 4 digits * @param string $separator Separator string for formatting card number. Defaults to dash (-). * @return string @@ -210,10 +224,11 @@ class Payment extends Base * @param integer $length total length without country code and 2 check digits * @return string */ - protected static function iban($countryCode, $prefix = '', $length = null) + public static function iban($countryCode = null, $prefix = '', $length = null) { - $countryCode = strtoupper($countryCode); - $format = !isset(static::$ibanFormats[$countryCode]) ? array() : static::$ibanFormats[$countryCode]; + $countryCode = is_null($countryCode) ? self::randomKey(self::$ibanFormats) : strtoupper($countryCode); + + $format = !isset(static::$ibanFormats[$countryCode]) ? null : static::$ibanFormats[$countryCode]; if ($length === null) { if ($format === null) { $length = 24; @@ -225,22 +240,19 @@ class Payment extends Base } } } + if ($format === null) { + $format = array(array('n', $length)); + } + + $expandedFormat = ''; + foreach ($format as $item) { + list($class, $length) = $item; + $expandedFormat .= str_repeat($class, $length); + } $result = $prefix; - $length -= strlen($prefix); - $nextPart = array_shift($format); - if ($nextPart !== false) { - list($class, $groupCount) = $nextPart; - } else { - $class = 'n'; - $groupCount = 0; - } - $groupCount = $nextPart === false ? 0 : $nextPart[1]; - for ($i = 0; $i < $length; $i++) { - if ($nextPart !== false && $groupCount-- < 1) { - $nextPart = array_shift($format); - list($class, $groupCount) = $nextPart; - } + $expandedFormat = substr($expandedFormat, strlen($result)); + foreach (str_split($expandedFormat) as $class) { switch ($class) { default: case 'c': @@ -255,35 +267,11 @@ class Payment extends Base } } - $result = static::addBankCodeChecksum($result, $countryCode); - - $countryNumber = 100 * (ord($countryCode[0])-55) + (ord($countryCode[1])-55); - $tempResult = $result . $countryNumber . '00'; - // perform MOD97-10 checksum calculation - $checksum = (int) $tempResult[0]; - for ($i = 1, $size = strlen($tempResult); $i < $size; $i++) { - $checksum = (10 * $checksum + (int) $tempResult[$i]) % 97; - } - $checksum = 98 - $checksum; - if ($checksum < 10) { - $checksum = '0'.$checksum; - } + $checksum = Iban::checksum($countryCode . '00' . $result); return $countryCode . $checksum . $result; } - /** - * Calculates a checksum for the national bank and branch code part in the IBAN. - * - * @param string $iban randomly generated $iban - * @param string $countryCode ISO 3166-1 alpha-2 country code - * @return string IBAN with one character altered to a proper checksum - */ - protected static function addBankCodeChecksum($iban, $countryCode = '') - { - return $iban; - } - /** * Return the String of a SWIFT/BIC number * diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/Person.php index bd7cd45a..9d875b66 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/Person.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/Person.php @@ -2,7 +2,7 @@ namespace Faker\Provider; -class Person extends \Faker\Provider\Base +class Person extends Base { const GENDER_MALE = 'male'; const GENDER_FEMALE = 'female'; diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/PhoneNumber.php index 65b24fc2..d9d1f6bb 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/PhoneNumber.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/PhoneNumber.php @@ -2,15 +2,42 @@ namespace Faker\Provider; -class PhoneNumber extends \Faker\Provider\Base +use Faker\Calculator\Luhn; + +class PhoneNumber extends Base { protected static $formats = array('###-###-###'); /** * @example '555-123-546' */ - public static function phoneNumber() + public function phoneNumber() { - return static::numerify(static::randomElement(static::$formats)); + return static::numerify($this->generator->parse(static::randomElement(static::$formats))); + } + + /** + * @example +27113456789 + * @return string + */ + public function e164PhoneNumber() + { + $formats = array('+%############'); + return static::numerify($this->generator->parse(static::randomElement($formats))); + } + + /** + * International Mobile Equipment Identity (IMEI) + * + * @link http://en.wikipedia.org/wiki/International_Mobile_Station_Equipment_Identity + * @link http://imei-number.com/imei-validation-check/ + * @example '720084494799532' + * @return int $imei + */ + public function imei() + { + $imei = (string) static::numerify('##############'); + $imei .= Luhn::computeCheckDigit($imei); + return $imei; } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/Text.php index 675ad851..80aa02fc 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/Text.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/Text.php @@ -2,13 +2,14 @@ namespace Faker\Provider; -abstract class Text extends \Faker\Provider\Base +abstract class Text extends Base { protected static $baseText = ''; protected static $separator = ' '; protected static $separatorLen = 1; - protected $explodedText = null; + protected $explodedText; protected $consecutiveWords = array(); + protected static $textStartsWithUppercase = true; /** * Generate a text string by the Markov chain algorithm. @@ -20,7 +21,7 @@ abstract class Text extends \Faker\Provider\Base * @example 'Alice, swallowing down her flamingo, and began by taking the little golden key' * @param integer $maxNbChars Maximum number of characters the text should contain (minimum: 10) * @param integer $indexSize Determines how many words are considered for the generation of the next word. - * The minimum is 1, and it produces the higher level of randomness, although the + * The minimum is 1, and it produces a higher level of randomness, although the * generated text usually doesn't make sense. Higher index sizes (up to 5) * produce more correct text, at the price of less randomness. * @return string @@ -39,7 +40,6 @@ abstract class Text extends \Faker\Provider\Base throw new \InvalidArgumentException('indexSize must be at most 5'); } - $words = $this->getConsecutiveWords($indexSize); $result = array(); $resultLength = 0; @@ -127,11 +127,15 @@ abstract class Text extends \Faker\Provider\Base protected static function validStart($word) { - return preg_match('/^\p{Lu}/u', $word); + $isValid = true; + if (static::$textStartsWithUppercase) { + $isValid = preg_match('/^\p{Lu}/u', $word); + } + return $isValid; } protected static function appendEnd($text) { - return $text.'.'; + return preg_replace("/([ ,-:;\x{2013}\x{2014}]+$)/us", '', $text).'.'; } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/UserAgent.php b/vendor/fzaninotto/faker/src/Faker/Provider/UserAgent.php index 132b480f..d659f4bb 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/UserAgent.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/UserAgent.php @@ -2,11 +2,15 @@ namespace Faker\Provider; -class UserAgent extends \Faker\Provider\Base +class UserAgent extends Base { protected static $userAgents = array('firefox', 'chrome', 'internetExplorer', 'opera', 'safari'); - protected static $windowsPlatformTokens = array('Windows NT 6.2', 'Windows NT 6.1', 'Windows NT 6.0', 'Windows NT 5.2', 'Windows NT 5.1', 'Windows NT 5.01', 'Windows NT 5.0', 'Windows NT 4.0', 'Windows 98; Win 9x 4.90', 'Windows 98', 'Windows 95', 'Windows CE'); + protected static $windowsPlatformTokens = array( + 'Windows NT 6.2', 'Windows NT 6.1', 'Windows NT 6.0', 'Windows NT 5.2', 'Windows NT 5.1', + 'Windows NT 5.01', 'Windows NT 5.0', 'Windows NT 4.0', 'Windows 98; Win 9x 4.90', 'Windows 98', + 'Windows 95', 'Windows CE' + ); /** * Possible processors on Linux @@ -104,7 +108,7 @@ class UserAgent extends \Faker\Provider\Base } else { $ver = mt_rand(4, 5) . '.0.' . mt_rand(1, 5); } - + $mobileDevices = array( 'iPhone; CPU iPhone OS', 'iPad; CPU OS' @@ -118,7 +122,6 @@ class UserAgent extends \Faker\Provider\Base return "Mozilla/5.0 " . static::randomElement($platforms); } - /** * Generate Opera user agent diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Uuid.php b/vendor/fzaninotto/faker/src/Faker/Provider/Uuid.php index 7240dfc5..ae5fc86d 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/Uuid.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/Uuid.php @@ -2,7 +2,7 @@ namespace Faker\Provider; -class Uuid extends \Faker\Provider\Base +class Uuid extends Base { /** * Generate name based md5 UUID (version 3). @@ -10,7 +10,8 @@ class Uuid extends \Faker\Provider\Base */ public static function uuid() { - // fix for compatibility with 32bit architecture; seed range restricted to 62bit + // fix for compatibility with 32bit architecture; each mt_rand call is restricted to 32bit + // two such calls will cause 64bits of randomness regardless of architecture $seed = mt_rand(0, 2147483647) . '#' . mt_rand(0, 2147483647); // Hash the seed and convert to a byte array diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Company.php index fc10726a..34a1e17b 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Company.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Company.php @@ -45,7 +45,7 @@ class Company extends \Faker\Provider\Company $result[] = static::randomElement($word); } - return join($result, ' '); + return join(' ', $result); } /** @@ -58,6 +58,6 @@ class Company extends \Faker\Provider\Company $result[] = static::randomElement($word); } - return join($result, ' '); + return join(' ', $result); } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Text.php index dbdbdddc..1d161387 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Text.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Text.php @@ -4,61 +4,9 @@ namespace Faker\Provider\ar_JO; class Text extends \Faker\Provider\Text { - - /** - * generates text string in arabic - * - * @example ' ولا النوم ولا القرار وكان يقال: لا يجد المريض لذة الطعام والشراب' - * @param integer $maxNbChars - * @param integer $indexSize - * @return string - * @throws \InvalidArgumentException - */ - public function realText($maxNbChars = 200, $indexSize = 2) + protected static function validStart($word) { - if ($maxNbChars < 10) { - throw new \InvalidArgumentException('maxNbChars must be at least 10'); - } - - if ($indexSize < 1) { - throw new \InvalidArgumentException('indexSize must be at least 1'); - } - - if ($indexSize > 5) { - throw new \InvalidArgumentException('indexSize must be at most 5'); - } - - $words = $this->getConsecutiveWords($indexSize); - $result = array(); - $resultLength = 0; - // take a random starting point - $next = static::randomKey($words); - while ($resultLength < $maxNbChars && isset($words[$next])) { - // fetch a random word to append - $word = static::randomElement($words[$next]); - - // calculate next index - $currentWords = explode(' ', $next); - - $currentWords[] = $word; - array_shift($currentWords); - $next = implode(' ', $currentWords); - - if ($resultLength == 0 && !preg_match('/^\p{Arabic}/u', $word)) { - continue; - } - // append the element - $result[] = $word; - $resultLength += strlen($word) + 1; - } - - // remove the element that caused the text to overflow - array_pop($result); - - // build result - $result = implode(' ', $result); - - return $result.'.'; + return preg_match('/^\p{Arabic}/u', $word); } /** diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Address.php new file mode 100644 index 00000000..408ab901 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Address.php @@ -0,0 +1,146 @@ +generator->parse($format)); + } + + /** + * @example 'wewebit.jo' + */ + public function domainName() + { + return static::randomElement(static::$lastNameAscii) . '.' . $this->tld(); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Payment.php new file mode 100644 index 00000000..d69b5d62 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Payment.php @@ -0,0 +1,19 @@ +generator->boolean() ? static::GENDER_MALE : static::GENDER_FEMALE; + } + + $startTimestamp = strtotime("-${maxAge} year"); + $endTimestamp = strtotime("-${minAge} year"); + $randTimestamp = static::numberBetween($startTimestamp, $endTimestamp); + + $year = intval(date('Y', $randTimestamp)); + $month = intval(date('n', $randTimestamp)); + $day = intval(date('j', $randTimestamp)); + $suffix = static::numberBetween(0, 999); + + // women has +50 to month + if ($gender == static::GENDER_FEMALE) { + $month += 50; + } + // from year 2004 everyone has +20 to month when birth numbers in one day are exhausted + if ($year >= 2004 && $this->generator->boolean(10)) { + $month += 20; + } + + $birthNumber = sprintf('%02d%02d%02d%03d', $year % 100, $month, $day, $suffix); + + // from year 1954 birth number includes CRC + if ($year >= 1954) { + $crc = intval($birthNumber, 10) % 11; + if ($crc == 10) { + $crc = 0; + } + $birthNumber .= sprintf('%d', $crc); + } + + // add slash + if ($this->generator->boolean($slashProbability)) { + $birthNumber = substr($birthNumber, 0, 6) . '/' . substr($birthNumber, 6); + } + + return $birthNumber; + } + + public static function birthNumberMale() + { + return static::birthNumber(static::GENDER_MALE); + } + + public static function birthNumberFemale() + { + return static::birthNumber(static::GENDER_FEMALE); + } + public function title($gender = null) { return static::titleMale(); diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/cs_CZ/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/cs_CZ/PhoneNumber.php index 90495df9..49ab429e 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/cs_CZ/PhoneNumber.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/cs_CZ/PhoneNumber.php @@ -5,10 +5,10 @@ namespace Faker\Provider\cs_CZ; class PhoneNumber extends \Faker\Provider\PhoneNumber { protected static $formats = array( - '+420 ### ### ###', - '### ### ###', - '00420#########', - '+420#########', - '#########', + '+420 %## ### ###', + '%## ### ###', + '00420%########', + '+420%########', + '%########', ); } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Address.php index 22bcf125..4a2272ca 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Address.php @@ -4,7 +4,7 @@ namespace Faker\Provider\de_AT; class Address extends \Faker\Provider\Address { - protected static $buildingNumber = array('###', '##', '#'); + protected static $buildingNumber = array('###', '##', '#', '##[abc]', '#[abc]'); protected static $streetSuffixLong = array( 'Gasse', 'Platz', 'Ring', 'Straße', 'Weg', @@ -13,7 +13,18 @@ class Address extends \Faker\Provider\Address 'gasse', 'platz', 'ring', 'straße', 'weg', ); - protected static $postcode = array('####'); + // As per https://en.wikipedia.org/wiki/List_of_postal_codes_in_Austria (@todo implement more strict postal code values according to wikipedia) + protected static $postcode = array( + '1###', + '2###', + '3###', + '4###', + '5###', + '6###', + '7###', + '8###', + '9###', + ); protected static $cityNames = array( 'Allentsteig', 'Altheim', 'Althofen', 'Amstetten', 'Ansfelden', 'Attnang-Puchheim', @@ -40,6 +51,10 @@ class Address extends \Faker\Provider\Address 'Zell am See', 'Zeltweg', 'Zistersdorf', 'Zwettl', ); + protected static $state = array( + 'Burgenland', 'Kärnten', 'Niederösterreich', 'Oberösterreich', 'Salzburg', 'Steiermark', 'Tirol', 'Vorarlberg', 'Wien' + ); + protected static $country = array( 'Afghanistan', 'Alandinseln', 'Albanien', 'Algerien', 'Amerikanisch-Ozeanien', 'Amerikanisch-Samoa', 'Amerikanische Jungferninseln', 'Andorra', 'Angola', 'Anguilla', 'Antarktis', 'Antigua und Barbuda', 'Argentinien', 'Armenien', 'Aruba', 'Aserbaidschan', 'Australien', 'Ägypten', 'Äquatorialguinea', 'Äthiopien', 'Äußeres Ozeanien', 'Bahamas', 'Bahrain', 'Bangladesch', 'Barbados', 'Belarus', 'Belgien', 'Belize', 'Benin', 'Bermuda', 'Bhutan', 'Bolivien', 'Bosnien und Herzegowina', 'Botsuana', 'Bouvetinsel', 'Brasilien', 'Britische Jungferninseln', 'Britisches Territorium im Indischen Ozean', 'Brunei Darussalam', 'Bulgarien', 'Burkina Faso', 'Burundi', @@ -96,4 +111,17 @@ class Address extends \Faker\Provider\Address { return static::randomElement(static::$streetSuffixLong); } + + /** + * @example 'Wien' + */ + public static function state() + { + return static::randomElement(static::$state); + } + + public static function buildingNumber() + { + return static::regexify(self::numerify(static::randomElement(static::$buildingNumber))); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Person.php index be26cedf..6901e538 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Person.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Person.php @@ -24,81 +24,85 @@ class Person extends \Faker\Provider\Person '{{titleFemale}} {{firstNameFemale}} {{lastName}} {{suffix}}', ); + /** + * 60 most popular names in 1985, 1995, 2005 and 2015 + * {@link} http://www.statistik.at/wcm/idc/idcplg?IdcService=GET_PDF_FILE&RevisionSelectionMethod=LatestReleased&dDocName=021130 + **/ protected static $firstNameMale = array( - 'Abel', 'Abraham', 'Adalbero', 'Adam', 'Adamo', 'Adolfo', 'Adrian', 'Adriano', 'Adrianus', 'Adrien', 'Alain', 'Alajos', 'Alan', 'Albain', 'Alban', 'Albano', 'Alberto', 'Albin', 'Alec', 'Alejandro', 'Alessandro', 'Alessio', 'Alex', 'Alexander', 'Alexandre', 'Alexandros', 'Alexej', 'Alexis', 'Alfons', 'Alfonso', 'Aljoscha', 'Allan', 'Allen', 'Alois', 'Alon', 'Alonzo', 'Alphonse', 'Alwin', 'Amadeo', 'Amadeus', 'Amandus', 'Amos', 'Anatol', 'Anatole', 'Anatolij', 'Anders', 'Andi', 'Andor', 'Andre', 'Andreas', 'Andrej', 'Andrew', 'Andrijan', 'Andy', 'Angelus', 'Ansgar', 'Anthony', 'Antoine', 'Anton', 'Antonio', 'Araldo', 'Aram', 'Argus', 'Arjan', 'Armin', 'Arminio', 'Arnaldo', 'Arnault', 'Arndt', 'Arne', 'Arno', 'Arnold', 'Arrigo', 'Art', 'Arthur', 'Artur', 'Arturo', 'August', 'Auguste', 'Augustin', 'Aurelius', 'Axel', - 'Balduin', 'Balthasar', 'Bardo', 'Barnabas', 'Barnard', 'Barney', 'Baruch', 'Basil', 'Basilius', 'Bastian', 'Bastien', 'Battista', 'Beatus', 'Beltrame', 'Beltran', 'Ben', 'Benedetto', 'Benedict', 'Benedikt', 'Bengt', 'Beniamino', 'Benignus', 'Benito', 'Benjamin', 'Benjy', 'Bennett', 'Benno', 'Benny', 'Benoit', 'Beppe', 'Bernard', 'Bernardo', 'Bernd', 'Bernhard', 'Bernie', 'Bert', 'Berthold', 'Bertoldo', 'Bertram', 'Bertrame', 'Bill', 'Billy', 'Birger', 'Bjarne', 'Björn', 'Bob', 'Bobby', 'Bodo', 'Bonifatius', 'Boris', 'Bosco', 'Brendan', 'Brian', 'Bruno', 'Bryan', 'Burkhard', - 'Camillo', 'Camilo', 'Carl', 'Carlo', 'Carlos', 'Carol', 'Carsten', 'Cäsar', 'Casimir', 'Caspar', 'Cecil', 'Ceddric', 'Cedric', 'Celestino', 'Charles', 'Charlie', 'Chico', 'Chip', 'Chris', 'Christian', 'Christoph', 'Christophe', 'Christopher', 'Christy', 'Chuck', 'Cian', 'Cillian', 'Clarence', 'Clark', 'Clas', 'Claude', 'Claudio', 'Claudius', 'Claus', 'Clayton', 'Clemens', 'Cliff', 'Clifford', 'Clint', 'Clinton', 'Cody', 'Colin', 'Collin', 'Conan', 'Connor', 'Conny', 'Conor', 'Conrad', 'Constantine', 'Cooper', 'Cordell', 'Cornelius', 'Corvinus', 'Cristobal', 'Curd', 'Curt', 'Curtis', 'Curtiz', 'Cyril', 'Cyrill', - 'Damian', 'Damon', 'Dan', 'Daniel', 'Daniele', 'Danilo', 'Danny', 'Dario', 'Darius', 'Dave', 'David', 'Davide', 'Dawson', 'Dean', 'Demetrius', 'Denis', 'Deniz', 'Dennis', 'Derek', 'Desiderius', 'Detlef', 'Detlev', 'Dick', 'Diego', 'Dieter', 'Dimitrij', 'Dirk', 'Dolf', 'Domenico', 'Domingo', 'Dominic', 'Dominik', 'Dominikus', 'Dominique', 'Donald', 'Donatello', 'Donato', 'Donatus', 'Dorian', 'Douglas', 'Dragan', 'Duarte', 'Duncan', 'Dylan', - 'Earnest', 'Earvin', 'Eike', 'Eleasar', 'Elia', 'Elian', 'Elias', 'Elijah', 'Ellison', 'Elmar', 'Elroy', 'Emanuel', 'Emanuele', 'Emil', 'Emile', 'Emilian', 'Emiliano', 'Emilio', 'Emmanuel', 'Endrik', 'Enrico', 'Enrique', 'Enzo', 'Ephraim', 'Erasmus', 'Eric', 'Erik', 'Ermanno', 'Ernest', 'Ernestin', 'Ernesto', 'Eros', 'Errol', 'Etienne', 'Eugen', 'Eugene', 'Eugenio', 'Eusebius', 'Everett', 'Ezra', - 'Fabiano', 'Fabien', 'Fabio', 'Fabius', 'Fabrice', 'Fabricius', 'Fabrizio', 'Falco', 'Falk', 'Falko', 'Faruk', 'Faustus', 'Favian', 'Federico', 'Federigo', 'Fedor', 'Felice', 'Feliciano', 'Felicien', 'Felipe', 'Felix', 'Felton', 'Feodor', 'Ferdinand', 'Fergus', 'Fernand', 'Fernando', 'Ferrante', 'Ferris', 'Fidel', 'Fidelio', 'Fidelis', 'Fidelius', 'Filippo', 'Finan', 'Finn', 'Fiore', 'Fjodor', 'Flavian', 'Flemming', 'Fletcher', 'Flint', 'Florens', 'Florentin', 'Florian', 'Florin', 'Florus', 'Floyd', 'Forrest', 'Forrester', 'Forster', 'Foster', 'Fox', 'Francesco', 'Francis', 'Francisco', 'Franco', 'Francois', 'Franek', 'Frank', 'Frankie', 'Franklin', 'Franziskus', 'Frasier', 'Frayne', 'Fred', 'Freddy', 'Frederic', 'Frederick', 'Frederik', 'Freeman', 'Fremont', 'Fridericus', 'Fridolin', 'Friedel', 'Frye', - 'Gabriel', 'Gaetan', 'Gaetano', 'Gallus', 'Garcia', 'Garfield', 'Garin', 'Garnier', 'Garrick', 'Garrison', 'Garron', 'Garry', 'Garson', 'Gaspar', 'Gaspard', 'Gaspare', 'Gaston', 'Gastonne', 'Gates', 'Gauthier', 'Gavin', 'Gene', 'Geoffrey', 'Geoffroy', 'Geordi', 'Georg', 'George', 'Georges', 'Gerald', 'Geraldo', 'Gerard', 'Geraud', 'Gerd', 'Gereon', 'Germain', 'German', 'Germano', 'Gernot', 'Gerold', 'Geronimo', 'Gerrit', 'Gerry', 'Gert', 'Gerulf', 'Gerwin', 'Giacomo', 'Gian', 'Giancarlo', 'Gianni', 'Gibson', 'Gideon', 'Gil', 'Gilbert', 'Gilberto', 'Gilles', 'Gillian', 'Gino', 'Gioacchino', 'Giorgio', 'Giovanni', 'Giraldo', 'Gisbert', 'Gitano', 'Giuliano', 'Giulio', 'Giuseppe', 'Giusto', 'Glen', 'Glenn', 'Goliath', 'Goran', 'Gordon', 'Gordy', 'Goswin', 'Götz', 'Graciano', 'Graham', 'Grayson', 'Greg', 'Gregg', 'Gregoire', 'Gregor', 'Gregory', 'Griffin', 'Grover', 'Gualtier', 'Gualtiero', 'Guglielmo', 'Guido', 'Guillaume', 'Guillermo', 'Gunnar', 'Gunter', 'Günter', 'Gunther', 'Günther', 'Gus', 'Gustavo', 'Gustl', 'Gutierre', 'Guy', - 'Hajo', 'Hamilton', 'Hamlet', 'Hampton', 'Hanley', 'Hannes', 'Hans', 'Harald', 'Hardy', 'Harley', 'Harlow', 'Harold', 'Haroun', 'Harrison', 'Harry', 'Harvey', 'Hasso', 'Hauke', 'Havel', 'Hector', 'Heiko', 'Heiner', 'Heino', 'Hektor', 'Helge', 'Helmut', 'Helmuth', 'Hendrick', 'Hendrik', 'Hennes', 'Henning', 'Henri', 'Henrick', 'Henrik', 'Henry', 'Herald', 'Herbie', 'Hercules', 'Herold', 'Herwig', 'Hieronymus', 'Hilarius', 'Holger', 'Holm', 'Homer', 'Horace', 'Horatio', 'Horaz', 'Howard', 'Howie', 'Hugh', 'Hugo', 'Humphrey', 'Hunter', - 'Ignatius', 'Ignaz', 'Ignazio', 'Igor', 'Ilian', 'Ilja', 'Immanuel', 'Ingo', 'Ingolf', 'Ingvar', 'Irenäus', 'Irvin', 'Irving', 'Irwin', 'Isaac', 'Isaak', 'Isai', 'Isaiah', 'Isidor', 'Istvan', 'Ivan', 'Ivo', - 'Jackson', 'Jacky', 'Jacob', 'Jacques', 'Jacquin', 'Jadon', 'Jago', 'Jaime', 'Jake', 'Jakob', 'Jamal', 'James', 'Jan', 'Janis', 'Jannes', 'Jannik', 'Janning', 'Janos', 'Janosch', 'Jaques', 'Jared', 'Jarik', 'Jarl', 'Jarno', 'Jaro', 'Jaromir', 'Jarrett', 'Jascha', 'Jason', 'Jasper', 'Jay', 'Jean', 'Jeff', 'Jefferson', 'Jeffrey', 'Jendrick', 'Jens', 'Jered', 'Jeremiah', 'Jeremias', 'Jeremie', 'Jeremy', 'Jerold', 'Jerom', 'Jerome', 'Jerrick', 'Jerry', 'Jesaja', 'Jesko', 'Jesse', 'Jim', 'Jimmy', 'Jirko', 'Jo', 'Joakim', 'Joao', 'Joaquin', 'Joe', 'Joel', 'Joey', 'John', 'Johnny', 'Jokim', 'Jonah', 'Jonas', 'Jonathan', 'Jonny', 'Jordan', 'Jordano', 'Jörg', 'Jorge', 'Jose', 'Josef', 'Joseph', 'Josh', 'Joshua', 'Josias', 'Jost', 'Josua', 'Josue', 'Jourdain', 'Juan', 'Juanito', 'Jud', 'Jules', 'Julien', 'Julio', 'Julius', 'Jürgen', 'Jurij', 'Justin', 'Justinian', 'Justus', - 'Kain', 'Kaj', 'Kajetan', 'Kallistus', 'Karsten', 'Kasimir', 'Kaspar', 'Keamon', 'Keith', 'Ken', 'Kenan', 'Kenneth', 'Keno', 'Kersten', 'Kerwin', 'Kevin', 'Kian', 'Kilian', 'Kim', 'Kiran', 'Klaas', 'Klaus', 'Klemens', 'Kleopas', 'Knud', 'Knut', 'Kolja', 'Konrad', 'Konstantin', 'Korbin', 'Korbinian', 'Kordt', 'Kristian', 'Kristof', 'Kristoffer', 'Kuno', 'Kurt', 'Kyros', 'Lajos', - 'Lambert', 'Lamberto', 'Larry', 'Lars', 'Laslo', 'Lasse', 'Laurent', 'Laurente', 'Laurentius', 'Laurenz', 'Laurenzo', 'Lawrence', 'Lazarus', 'Lazlo', 'Leander', 'Lee', 'Leif', 'Leigh', 'Lennart', 'Lenny', 'Lenz', 'Leo', 'Leon', 'Leonard', 'Leonardo', 'Leonce', 'Leone', 'Leonello', 'Leonhard', 'Leopold', 'Leopoldo', 'Leroy', 'Lesley', 'Lester', 'Leverett', 'Levi', 'Lew', 'Lewis', 'Lex', 'Liborius', 'Lienhard', 'Linus', 'Lion', 'Lionel', 'LLoyd', 'Lobo', 'Loic', 'Lorenz', 'Lorenzo', 'Loris', 'Lothaire', 'Lou', 'Louie', 'Louis', 'Lovis', 'Luc', 'Luca', 'Lucan', 'Lucas', 'Luciano', 'Lucien', 'Lucius', 'Ludovico', 'Ludwig', 'Luigi', 'Luis', 'Lukas', 'Luke', 'Lutger', 'Luther', 'Lutz', 'Lyonel', - 'Maik', 'Malte', 'Malwin', 'Manolito', 'Manolo', 'Manuel', 'Marc', 'Marcel', 'Marcello', 'Marcellus', 'Marco', 'Marcus', 'Marek', 'Marian', 'Marin', 'Marino', 'Marinus', 'Mario', 'Marius', 'Mark', 'Markus', 'Marlon', 'Maro', 'Marten', 'Martin', 'Marvin', 'Massimo', 'Mathias', 'Mathieu', 'Mathis', 'Matt', 'Matteo', 'Matthäus', 'Matthes', 'Matthew', 'Matthias', 'Matthieu', 'Maurice', 'Mauritius', 'Mauritz', 'Maurizio', 'Mauro', 'Maurus', 'Max', 'Maxence', 'Maxi', 'Maxime', 'Maximilian', 'Maximilien', 'Melchior', 'Merlin', 'Michael', 'Michail', 'Michel', 'Michele', 'Mick', 'Mickey', 'Miguel', 'Mika', 'Mikael', 'Mike', 'Mikel', 'Miklos', 'Milan', 'Milo', 'Mirko', 'Miro', 'Miroslav', 'Mischa', 'Mitja', 'Morgan', 'Moritz', 'Morris', 'Morten', - 'Nat', 'Nathan', 'Nathanael', 'Nathaniel', 'Nepomuk', 'Nero', 'Neron', 'Newton', 'Niccolo', 'Nicholas', 'Nick', 'Nicki', 'Nico', 'Nicola', 'Nicolai', 'Nicolaj', 'Nicolas', 'Niels', 'Nigel', 'Nikita', 'Niklas', 'Niklaus', 'Niko', 'Nikodemus', 'Nikolai', 'Nikolaus', 'Nils', 'Noah', 'Noel', 'Norbert', 'Norberto', 'Norman', - 'Odin', 'Odo', 'Odysseus', 'Olaf', 'Oleg', 'Oliver', 'Olivier', 'Oliviero', 'Olof', 'Oluf', 'Omar', 'Omer', 'Orlando', 'Orson', 'Oskar', 'Osvaldo', 'Oswin', 'Otello', 'Othello', 'Otto', 'Ove', 'Owain', 'Owen', - 'Paco', 'Paddy', 'Palmiro', 'Pancho', 'Paolo', 'Pascal', 'Pat', 'Patrice', 'Patricio', 'Patricius', 'Patrick', 'Patrizio', 'Patrizius', 'Paul', 'Paulin', 'Paulus', 'Pawel', 'Pedro', 'Peer', 'Pepe', 'Pepito', 'Peppone', 'Per', 'Percy', 'Perez', 'Pete', 'Peter', 'Phil', 'Philip', 'Philipp', 'Philippe', 'Philo', 'Piedro', 'Pier', 'Piero', 'Pierre', 'Piet', 'Pieter', 'Pietro', 'Pinkus', 'Pippin', 'Pitt', 'Pius', 'Placide', 'Placido', 'Placidus', 'Poldi', - 'Quint', 'Quintin', 'Quintinus', 'Quintus', 'Quirin', 'Quirino', - 'Raffaele', 'Raffaello', 'Raffaelo', 'Raimondo', 'Raimund', 'Raimundo', 'Rainer', 'Rainier', 'Ralf', 'Ralph', 'Ramon', 'Randolf', 'Randolph', 'Randy', 'Raoul', 'Raphael', 'Rasmus', 'Rasul', 'Raul', 'Ray', 'Raymond', 'Regnier', 'Reik', 'Reiner', 'Remo', 'Renato', 'Renatus', 'Renaud', 'Rene', 'Renja', 'Reto', 'Reynold', 'Ricardo', 'Riccardo', 'Rick', 'Ricky', 'Rico', 'Rinaldo', 'Robby', 'Robert', 'Roberto', 'Robin', 'Rocco', 'Rock', 'Rocky', 'Rod', 'Rodolfo', 'Rodolphe', 'Rodrigo', 'Rodrigue', 'Rodrique', 'Roger', 'Roland', 'Rolando', 'Rolf', 'Romain', 'Roman', 'Romano', 'Romeo', 'Romero', 'Ronald', 'Ronan', 'Ronny', 'Rory', 'Ross', 'Rowan', 'Rowland', 'Roy', 'Ruben', 'Rudolf', 'Rudolph', 'Ruggero', 'Rupert', 'Ryan', - 'Salomon', 'Salomone', 'Salvador', 'Salvator', 'Salvatore', 'Sam', 'Sammy', 'Samuel', 'Samuele', 'Sander', 'Sandor', 'Sandro', 'Sandy', 'Sascha', 'Sauveur', 'Schorsch', 'Scipio', 'Scott', 'Sean', 'Sebastian', 'Sebastiano', 'Sebastien', 'Selim', 'Semjon', 'Sepp', 'Serenus', 'Serge', 'Sergej', 'Sergio', 'Sergius', 'Servatius', 'Severiano', 'Severin', 'Severo', 'Sidney', 'Sidonius', 'Silas', 'Silvain', 'Silvan', 'Silvano', 'Silvanus', 'Silverio', 'Silverius', 'Silvester', 'Silvestro', 'Silvio', 'Silvius', 'Simjon', 'Simon', 'Simone', 'Sinclair', 'Sixt', 'Sixtus', 'Slade', 'Solomon', 'Söncke', 'Sören', 'Spencer', 'Stan', 'Stanislaus', 'Stanislaw', 'Stanley', 'Stefan', 'Stefano', 'Steffen', 'Sten', 'Stephan', 'Stephen', 'Steve', 'Steven', 'Stewart', 'Stig', 'Stuart', 'Sven', 'Sylvain', 'Sylvester', - 'Tam', 'Tarek', 'Tassilo', 'Tasso', 'Ted', 'Teddy', 'Teobaldo', 'Thaddäus', 'Theo', 'Theodor', 'Theodore', 'Thierry', 'Thimotheus', 'Thomas', 'Thommy', 'Thoralf', 'Thorben', 'Thore', 'Thorsten', 'Tiberio', 'Tiberius', 'Tibor', 'Till', 'Tim', 'Timmy', 'Timo', 'Timofej', 'Timon', 'Timoteo', 'Timothee', 'Timotheus', 'Timothy', 'Tin', 'Tito', 'Titus', 'Tizian', 'Tiziano', 'Tjade', 'Tjark', 'Tobi', 'Tobia', 'Tobiah', 'Tobias', 'Tobie', 'Tobis', 'Toby', 'Tom', 'Tommaso', 'Tommy', 'Toni', 'Tonio', 'Tony', 'Torben', 'Torin', 'Torsten', 'Tristan', 'Tycho', 'Tyler', 'Tyson', - 'Udo', 'Ugo', 'Ugolino', 'Ulf', 'Uli', 'Ulli', 'Ulric', 'Ulrich', 'Ulrico', 'Umberto', 'Urbain', 'Urban', 'Urbano', 'Urias', 'Uriel', 'Ursus', 'Uwe', - 'Valentiano', 'Valentin', 'Valentino', 'Valerian', 'Valerio', 'Valerius', 'Valery', 'Vasco', 'Veit', 'Veltin', 'Vernon', 'Vicente', 'Vico', 'Victor', 'Viktor', 'Vincent', 'Vincenzo', 'Vinzenez', 'Vinzenz', 'Virgil', 'Vitalis', 'Vito', 'Vittore', 'Vittoriano', 'Vittorio', 'Volker', - 'Wallace', 'Walt', 'Warner', 'Warren', 'Wido', 'Wigand', 'Wilbur', 'Willi', 'William', 'Wilpert', 'Winston', 'Wolf', 'Wolfgang', 'Woodrow', 'Woody', - 'Xaver', + 'Adrian', 'Alexander', 'Andreas', 'Anton', + 'Ben', 'Benedikt', 'Benjamin', 'Bernd', 'Bernhard', + 'Christian', 'Christoph', 'Christopher', 'Clemens', + 'Daniel', 'David', 'Dominik', + 'Elias', 'Emil', 'Erik', + 'Fabian', 'Fabio', 'Felix', 'Finn', 'Florian', 'Franz', + 'Gabriel', 'Georg', 'Gerald', 'Gerhard', 'Gernot', 'Gregor', 'Günther', + 'Hannes', 'Harald', 'Helmut', 'Herbert', + 'Jakob', 'Jan', 'Johann', 'Johannes', 'Jonas', 'Jonathan', 'Josef', 'Joseph', 'Julian', 'Justin', 'Jürgen', + 'Karl', 'Kevin', 'Kilian', 'Klaus', 'Konstantin', + 'Leo', 'Leon', 'Lorenz', 'Luca', 'Luis', 'Lukas', + 'Manfred', 'Manuel', 'Marc', 'Marcel', 'Marco', 'Mario', 'Markus', 'Martin', 'Marvin', 'Matteo', 'Matthias', 'Max', 'Maximilian', 'Michael', 'Moritz', + 'Nico', 'Nicolas', 'Niklas', 'Noah', + 'Oliver', 'Oskar', + 'Pascal', 'Patrick', 'Patrik', 'Paul', 'Peter', 'Philipp', + 'Ralph', 'Raphael', 'Reinhard', 'René', 'Richard', 'Robert', 'Roland', 'Roman', + 'Samuel', 'Sandro', 'Sascha', 'Sebastian', 'Simon', 'Stefan', + 'Theo', 'Theodor', 'Thomas', 'Tim', 'Tobias', + 'Valentin', 'Vincent', + 'Werner', 'Wolfgang', ); + /** + * 60 most popular names in 1985, 1995, 2005 and 2015 + * {@link} http://www.statistik.at/wcm/idc/idcplg?IdcService=GET_PDF_FILE&RevisionSelectionMethod=LatestReleased&dDocName=021130 + **/ protected static $firstNameFemale = array( - 'Abby', 'Abelina', 'Abigail', 'Adelaide', 'Adeline', 'Adina', 'Adriana', 'Adrienne', 'Afra', 'Agatha', 'Agnes', 'Aida', 'Aimee', 'Aischa', 'Albertine', 'Alea', 'Aleksandra', 'Alena', 'Alessa', 'Alessandra', 'Alessia', 'Alexa', 'Alexandra', 'Alexia', 'Alexis', 'Alice', 'Alicia', 'Alida', 'Alina', 'Aline', 'Alisa', 'Alissa', 'Alisson', 'Amabella', 'Amadea', 'Amanda', 'Amelia', 'Amelie', 'Amina', 'Amy', 'Ana', 'Anastasia', 'Andrea', 'Andrina', 'Anette', 'Angela', 'Angelika', 'Angelina', 'Angelique', 'Anina', 'Anine', 'Anita', 'Anja', 'Anjalie', 'Anke', 'Ann', 'Anna', 'Annabel', 'Annabell', 'Annabella', 'Annabelle', 'Anne', 'Annett', 'Annette', 'Annika', 'Annina', 'Antje', 'Antoinette', 'Antonella', 'Antonia', 'Arabella', 'Ariadne', 'Ariana', 'Ariane', 'Arianna', 'Ariella', 'Arielle', 'Arlene', 'Arlette', 'Arwenna', 'Ashley', 'Asta', 'Astrid', 'Audrey', 'Aurelia', - 'Barbara', 'Bärbel', 'Bastiane', 'Bea', 'Beata', 'Beatrice', 'Beatrix', 'Becky', 'Belinda', 'Bella', 'Bellana', 'Belle', 'Benedikta', 'Benita', 'Bente', 'Beppina', 'Berenike', 'Berit', 'Bernadett', 'Bernadette', 'Bernadine', 'Betina', 'Betsy', 'Bettina', 'Betty', 'Bianca', 'Bianka', 'Bibiana', 'Bibiane', 'Birgit', 'Birgitt', 'Bodil', 'Bridget', 'Brigitta', 'Brigitte', 'Britta', - 'Caitlin', 'Cameron', 'Camilla', 'Camille', 'Cammy', 'Cara', 'Carin', 'Carina', 'Carinna', 'Carla', 'Carmela', 'Carmelia', 'Carmen', 'Carol', 'Carola', 'Carole', 'Carolin', 'Carolina', 'Caroline', 'Carolyn', 'Carolyne', 'Cassandra', 'Cassie', 'Catalin', 'Caterina', 'Catharina', 'Catherine', 'Cathrin', 'Cathrine', 'Cathy', 'Catina', 'Catrin', 'Catriona', 'Cecile', 'Cecilia', 'Cecilie', 'Celeste', 'Celestine', 'Celina', 'Celine', 'Chantal', 'Charleen', 'Charlotte', 'Chatrina', 'Chelsea', 'Chiara', 'Chloe', 'Chrissy', 'Christa', 'Christiana', 'Christiane', 'Christin', 'Christina', 'Christine', 'Chyna', 'Ciara', 'Cinderella', 'Cindy', 'Cinja', 'Cira', 'Claire', 'Clara', 'Clarissa', 'Claudette', 'Claudia', 'Claudine', 'Clea', 'Cleannis', 'Clementia', 'Clementine', 'Cleo', 'Clio', 'Cliona', 'Clodia', 'Cloris', 'Coletta', 'Colette', 'Connie', 'Conny', 'Constance', 'Constanze', 'Cora', 'Coral', 'Coralie', 'Cordelia', 'Cordula', 'Corin', 'Corina', 'Corinna', 'Corinne', 'Cornelia', 'Cosette', 'Cosima', 'Cynthia', - 'Daisy', 'Dajana', 'Daliah', 'Damaris', 'Damia', 'Damiana', 'Dana', 'Dania', 'Danica', 'Daniela', 'Daniele', 'Daniella', 'Danielle', 'Danja', 'Daphne', 'Darcie', 'Daria', 'Darina', 'Dawn', 'Dayna', 'Debbie', 'Debby', 'Debora', 'Deborah', 'Deetya', 'Delia', 'Delphine', 'Dena', 'Denise', 'Desdemona', 'Desideria', 'Desiree', 'Diana', 'Diane', 'Didina', 'Dina', 'Dinah', 'Dolly', 'Dolores', 'Domenica', 'Dominika', 'Dominique', 'Donna', 'Dora', 'Doreen', 'Dorina', 'Doris', 'Dorit', 'Doro', 'Dorothea', 'Dorothee', 'Dorothy', 'Dunja', - 'Ebony', 'Edda', 'Edita', 'Edvige', 'Edwina', 'Eike', 'Eila', 'Eileen', 'Ela', 'Elaine', 'Eleanor', 'Elektra', 'Elena', 'Eleonora', 'Eleonore', 'Eliane', 'Elisa', 'Elisabeth', 'Elise', 'Elizabeth', 'Elke', 'Ella', 'Ellen', 'Elly', 'Eloise', 'Elsa', 'Elsbeth', 'Elvira', 'Elvire', 'Emanuela', 'Emanuelle', 'Emilia', 'Emilie', 'Emily', 'Emma', 'Enrica', 'Enya', 'Erika', 'Erin', 'Ernesta', 'Ernestina', 'Ernestine', 'Esmerelda', 'Esra', 'Estella', 'Estelle', 'Ester', 'Esther', 'Etiennette', 'Eudoxia', 'Eugenia', 'Eunike', 'Euphemia', 'Euphrasia', 'Eusebia', 'Eva', 'Evangelina', 'Evania', 'Eve', 'Evelien', 'Evelin', 'Eveline', 'Evelyn', 'Evelyne', 'Evette', 'Evi', 'Evita', - 'Fabiane', 'Fabienne', 'Fabiola', 'Faith', 'Fanny', 'Farrah', 'Fatima', 'Faustina', 'Faustine', 'Fay', 'Faye', 'Faylinn', 'Federica', 'Fedora', 'Fee', 'Feli', 'Felice', 'Felicia', 'Felicitas', 'Felicity', 'Felizitas', 'Feodora', 'Fergie', 'Fidelia', 'Filia', 'Filiz', 'Finetta', 'Finja', 'Fiona', 'Fjodora', 'Flavia', 'Fleur', 'Fleur', 'Flo', 'Flora', 'Florence', 'Florentina', 'Florentine', 'Floria', 'Floriane', 'Florida', 'Florinda', 'Floris', 'Fortuna', 'Frances', 'Francesca', 'Francisca', 'Franka', 'Franzi', 'Franziska', 'Frauke', 'Freya', 'Friederike', - 'Gabriela', 'Gabriele', 'Gabriella', 'Gabrielle', 'Gaby', 'Gail', 'Galatea', 'Galina', 'Gazelle', 'Gela', 'Geneva', 'Genoveva', 'Georgette', 'Georgia', 'Georgina', 'Geraldene', 'Geraldine', 'Germain', 'Germaine', 'Germana', 'Ghita', 'Gianna', 'Gigi', 'Gill', 'Gillian', 'Gina', 'Ginevra', 'Ginger', 'Ginny', 'Giovanna', 'Gisela', 'Gisele', 'Gisella', 'Giselle', 'Gitta', 'Giulia', 'Giuliana', 'Giulietta', 'Giuseppa', 'Giuseppina', 'Giustina', 'Gladys', 'Gloria', 'Glory', 'Goldie', 'Goldy', 'Grace', 'Gratia', 'Gratiana', 'Grazia', 'Greta', 'Gretel', 'Gunda', 'Gwen', 'Gwenda', 'Gwendolin', 'Gwendolyn', 'Gypsy', - 'Hannah', 'Hanne', 'Harmony', 'Harriet', 'Hazel', 'Hedi', 'Hedy', 'Heide', 'Heidi', 'Heike', 'Helen', 'Helena', 'Helene', 'Helin', 'Hella', 'Hemma', 'Henrietta', 'Henriette', 'Henrike', 'Hera', 'Hetty', 'Hilary', 'Hilda', 'Hilde', 'Holiday', 'Holli', 'Holly', 'Hope', - 'Ilana', 'Ilaria', 'Iliana', 'Iljana', 'Ilka', 'Ilona', 'Ilse', 'Ilyssa', 'Imke', 'Ina', 'India', 'Indira', 'Indra', 'Ines', 'Inga', 'Inge', 'Ingrid', 'Inka', 'Inken', 'Innozentia', 'Iona', 'Ira', 'Irena', 'Irene', 'Irina', 'Iris', 'Irisa', 'Irma', 'Isabel', 'Isabell', 'Isabella', 'Isabelle', 'Isis', 'Iva', 'Ivana', 'Ivona', 'Ivonne', - 'Jaclyn', 'Jacqueline', 'Jacqui', 'Jael', 'Jamari', 'Jan', 'Jana', 'Jane', 'Janet', 'Janette', 'Janin', 'Janina', 'Janine', 'Janique', 'Janna', 'Jannine', 'Jarla', 'Jasmin', 'Jasmina', 'Jasmine', 'Jeanette', 'Jeanine', 'Jeanne', 'Jeannette', 'Jeannine', 'Jekaterina', 'Jelena', 'Jenifer', 'Jenna', 'Jennelle', 'Jennessa', 'Jennie', 'Jennifer', 'Jenny', 'Jennyfer', 'Jess', 'Jessica', 'Jessie', 'Jessika', 'Jill', 'Joan', 'Joana', 'Joann', 'Joanna', 'Joelle', 'Johanna', 'Jolanda', 'Jona', 'Jordana', 'Jördis', 'Josee', 'Josefa', 'Josefina', 'Josefine', 'Josepha', 'Josephine', 'Josiane', 'Josie', 'Jovita', 'Joy', 'Joyce', 'Juana', 'Juanita', 'Judith', 'Judy', 'Julia', 'Juliana', 'Juliane', 'Julianne', 'Julie', 'Juliet', 'Juliette', 'July', 'June', 'Justina', 'Justine', 'Justise', 'Jutta', - 'Kamilia', 'Kamilla', 'Karen', 'Karima', 'Karin', 'Karina', 'Karla', 'Karola', 'Karolin', 'Karolina', 'Karoline', 'Kassandra', 'Katalin', 'Katarina', 'Kate', 'Katharina', 'Katharine', 'Käthe', 'Katherina', 'Katherine', 'Kathleen', 'Kathrin', 'Kathrina', 'Kathryn', 'Kathy', 'Katinka', 'Katja', 'Katjana', 'Katrin', 'Katrina', 'Katrine', 'Kayla', 'Keala', 'Keelin', 'Kendra', 'Kerstin', 'Kiana', 'Kiara', 'Kim', 'Kira', 'Kirsten', 'Kirstin', 'Kita', 'Klara', 'Klarissa', 'Klaudia', 'Kleopatra', 'Kolina', 'Konstanze', 'Kora', 'Kordula', 'Kori', 'Kornelia', 'Krista', 'Kristiane', 'Kristin', 'Kristina', 'Kristine', 'Kyra', - 'Laila', 'Lana', 'Lara', 'Laria', 'Larissa', 'Lätizia', 'Laurel', 'Lauren', 'Laurence', 'Laurentia', 'Lauretta', 'Lavina', 'Laya', 'Lea', 'Leah', 'Leandra', 'Lee', 'Leigh', 'Leila', 'Lena', 'Leona', 'Leonie', 'Leontine', 'Leopoldine', 'Lesley', 'Leslie', 'Levana', 'Levia', 'Lia', 'Liane', 'Libusa', 'Licia', 'Lidia', 'Liesa', 'Liesbeth', 'Liese', 'Liesel', 'Lilian', 'Liliane', 'Lilith', 'Lilli', 'Lillian', 'Lilo', 'Lily', 'Lina', 'Linda', 'Lioba', 'Lisa', 'Lisbeth', 'Lise', 'Lisette', 'Liv', 'Livana', 'Livia', 'Liz', 'Liza', 'Lizzie', 'Lola', 'Lora', 'Lorena', 'Loretta', 'Lori', 'Lorraine', 'Lotte', 'Lotus', 'Louise', 'Luana', 'Luca', 'Lucia', 'Luciana', 'Lucie', 'Lucy', 'Luigia', 'Luisa', 'Luise', 'Luna', 'Luzia', 'Lydia', 'Lydie', 'Lynette', 'Lynn', - 'Maddalena', 'Madelaine', 'Madeleine', 'Madeline', 'Madison', 'Madita', 'Madleine', 'Madlen', 'Madlene', 'Mae', 'Magda', 'Magdalena', 'Maggy', 'Magret', 'Maia', 'Maike', 'Maiken', 'Mailin', 'Maja', 'Malea', 'Malee', 'Malin', 'Malina', 'Mandy', 'Manja', 'Manon', 'Manuela', 'Mara', 'Maraike', 'Marcella', 'Marcelle', 'Marcia', 'Mareike', 'Maren', 'Margaret', 'Margareta', 'Margarete', 'Margaretha', 'Margarita', 'Margaritha', 'Margherita', 'Margit', 'Margitta', 'Margot', 'Margret', 'Margreth', 'Marguerite', 'Maria', 'Mariam', 'Marian', 'Mariana', 'Marianna', 'Marianne', 'Marie', 'Marieke', 'Mariella', 'Marielle', 'Marietta', 'Marija', 'Marika', 'Marilies', 'Marilyn', 'Marina', 'Marion', 'Marisa', 'Marissa', 'Marita', 'Maritta', 'Marjorie', 'Marla', 'Marleen', 'Marlen', 'Marlena', 'Marlene', 'Marlies', 'Marlis', 'Marsha', 'Martha', 'Marthe', 'Martina', 'Mary', 'Maryse', 'Mascha', 'Mathilda', 'Mathilde', 'Matilde', 'Mattea', 'Maude', 'Maura', 'Maureen', 'Maximiliane', 'May', 'Maya', 'Meg', 'Megan', 'Meike', 'Melanie', 'Melia', 'Melina', 'Melinda', 'Melissa', 'Melitta', 'Melodie', 'Meloney', 'Mercedes', 'Meret', 'Meri', 'Merle', 'Merline', 'Meryem', 'Mia', 'Micaela', 'Michaela', 'Michele', 'Michelle', 'Milena', 'Milla', 'Milva', 'Mimi', 'Minerva', 'Minna', 'Mira', 'Mirabella', 'Mireille', 'Mirella', 'Mireya', 'Miriam', 'Mirijam', 'Mirjam', 'Moesha', 'Moira', 'Mona', 'Moni', 'Monica', 'Monika', 'Monique', 'Monja', 'Morgane', 'Muriel', 'Myriam', - 'Nadin', 'Nadine', 'Nadja', 'Nadjana', 'Naemi', 'Nancy', 'Nanette', 'Nani', 'Naomi', 'Nastasja', 'Natalia', 'Natalie', 'Natanja', 'Natascha', 'Nathalie', 'Neeja', 'Nena', 'Neria', 'Nerine', 'Nicol', 'Nicola', 'Nicole', 'Nicoletta', 'Nicolette', 'Nike', 'Nikola', 'Nina', 'Ninja', 'Ninon', 'Noa', 'Noelle', 'Noemi', 'Noemie', 'Nora', 'Norma', 'Nuala', - 'Olga', 'Olivia', 'Ophelia', 'Orania', 'Orla', 'Ornella', 'Orsola', 'Ottilie', - 'Paloma', 'Pam', 'Pamela', 'Pandora', 'Paola', 'Paolina', 'Pascale', 'Pat', 'Patrice', 'Patricia', 'Patrizia', 'Patsy', 'Patty', 'Paula', 'Paulette', 'Paulina', 'Pauline', 'Penelope', 'Pepita', 'Petra', 'Philine', 'Philippa', 'Philomele', 'Philomena', 'Phoebe', 'Phyllis', 'Pia', 'Pier', 'Prica', 'Prisca', 'Priscilla', 'Priscille', 'Priska', - 'Rachel', 'Rachel', 'Rachelle', 'Radomila', 'Rafaela', 'Raffaela', 'Raffaella', 'Ragna', 'Rahel', 'Raja', 'Ramona', 'Raphaela', 'Raquel', 'Rebecca', 'Rebekka', 'Regina', 'Regine', 'Reisha', 'Renata', 'Renate', 'Renee', 'Resi', 'Rhea', 'Rhoda', 'Rhonda', 'Ricarda', 'Riccarda', 'Rike', 'Rita', 'Roberta', 'Romana', 'Romina', 'Romy', 'Ronja', 'Rosa', 'Rosalia', 'Rosalie', 'Rosalinda', 'Rosalinde', 'Rosaline', 'Rose', 'Roseline', 'Rosetta', 'Rosette', 'Rosi', 'Rosina', 'Rosine', 'Rossana', 'Roswitha', 'Roxana', 'Roxane', 'Roxanne', 'Roxy', 'Rubina', 'Ruth', - 'Sabine', 'Sabrina', 'Sahra', 'Sally', 'Salome', 'Salvina', 'Samanta', 'Samantha', 'Samira', 'Sandra', 'Sandrina', 'Sandrine', 'Sandy', 'Sanne', 'Sanya', 'Saphira', 'Sara', 'Sarah', 'Sarina', 'Sascha', 'Saskia', 'Scarlet', 'Scarlett', 'Schirin', 'Selina', 'Selma', 'Serafina', 'Seraina', 'Seraphin', 'Seraphina', 'Seraphine', 'Serena', 'Severina', 'Severine', 'Shana', 'Shanaya', 'Shantala', 'Shari', 'Sharlene', 'Sharon', 'Sheena', 'Sheila', 'Sheryl', 'Shirin', 'Shirley', 'Shirlyn', 'Sibilla', 'Sibyl', 'Sibylle', 'Siegrid', 'Sigrid', 'Sigrun', 'Silja', 'Silke', 'Silvana', 'Silvia', 'Silviane', 'Simona', 'Simone', 'Simonette', 'Simonne', 'Sina', 'Sindy', 'Sinja', 'Sissy', 'Skyla', 'Smarula', 'Smilla', 'Sofia', 'Sofie', 'Sonia', 'Sonja', 'Sonnele', 'Sonya', 'Sophia', 'Sophie', 'Soraya', 'Stefanie', 'Steffi', 'Stella', 'Stephanie', 'Sumehra', 'Summer', 'Susan', 'Susanna', 'Susanne', 'Susi', 'Suzan', 'Suzanne', 'Suzette', 'Svea', 'Svenja', 'Swane', 'Sybilla', 'Sybille', 'Sydney', 'Sylvana', 'Sylvia', 'Sylvie', - 'Tabitha', 'Taissa', 'Tamara', 'Tamina', 'Tania', 'Tanita', 'Tanja', 'Tara', 'Tatiana', 'Tatjana', 'Taya', 'Tecla', 'Telka', 'Teodora', 'Teona', 'Teresa', 'Terry', 'Tess', 'Tessa', 'Tessie', 'Thea', 'Thekla', 'Theodora', 'Theres', 'Theresa', 'Therese', 'Theresia', 'Tiana', 'Tiffany', 'Tilly', 'Timna', 'Tina', 'Tiziana', 'Tonja', 'Toril', 'Tosca', 'Tracey', 'Traudl', 'Trixi', 'Tycho', 'Tyra', - 'Ulla', 'Ulli', 'Ulrica', 'Ulrike', 'Undine', 'Urania', 'Ursel', 'Ursina', 'Ursula', 'Ursule', 'Uschi', 'Uta', 'Ute', - 'Valentina', 'Valentine', 'Valeria', 'Valerie', 'Valeska', 'Vanadis', 'Vanessa', 'Vanja', 'Varinka', 'Venetia', 'Vera', 'Verena', 'Verona', 'Veronica', 'Veronika', 'Veronique', 'Vesla', 'Vicky', 'Victoire', 'Victoria', 'Viki', 'Viktoria', 'Vilja', 'Viola', 'Violet', 'Violetta', 'Violette', 'Virginia', 'Virginie', 'Vittoria', 'Viviana', 'Viviane', 'Vivien', 'Vivienne', 'Vreneli', 'Vreni', 'Vroni', - 'Wencke', 'Weneke', 'Wibke', 'Wilja', 'Willow', 'Wilma', + 'Alexandra', 'Alexandrea', 'Algelika', 'Alina', 'Amelie', 'Andrea', 'Angelina', 'Anita', 'Anja', 'Anna', 'Anna-Lena', 'Annika', 'Astrid', + 'Barbara', 'Bettina', 'Bianca', 'Birgit', + 'Carina', 'Caroline', 'Celina', 'Chiara', 'Christina', 'Christine', 'Clara', 'Claudia', 'Cornelia', + 'Daniela', 'Denise', 'Doris', + 'Elena', 'Elisa', 'Elisabeth', 'Ella', 'Emely', 'Emilia', 'Emily', 'Emma', 'Eva', 'Eva-Maria', + 'Franziska', + 'Hanna', 'Hannah', 'Helena', + 'Ines', 'Iris', 'Isabel', 'Isabella', + 'Jacqueline', 'Jacquline', 'Jana', 'Janine', 'Jasmin', 'Jennifer', 'Jessica', 'Johanna', 'Julia', + 'Karin', 'Katharina', 'Katrin', 'Kerstin', + 'Lara', 'Larissa', 'Laura', 'Lea', 'Lena', 'Leonie', 'Lilly', 'Lina', 'Lisa', 'Livia', 'Luisa', + 'Magdalena', 'Maja', 'Manuela', 'Maria', 'Marie', 'Marion', 'Marlene', 'Martina', 'Melanie', 'Melina', 'Mia', 'Michaela', 'Michelle', 'Miriam', 'Mona', 'Monika', + 'Nadine', 'Natalie', 'Nicole', 'Nina', 'Nora', + 'Patricia', 'Paula', 'Petra', 'Pia', + 'Rebecca', 'Rosa', + 'Sabine', 'Sabrina', 'Sandra', 'Sarah', 'Selina', 'Silvia', 'Simone', 'Sonja', 'Sophia', 'Sophie', 'Stefanie', 'Susanne', + 'Tamara', 'Tanja', 'Theresa', + 'Valentina', 'Valerie', 'Vanessa', 'Verena', 'Viktoria', + 'Yvonne', ); + /** + * Top 500 Names from a phone directory (February 2004) + * {@link} https://de.wiktionary.org/wiki/Verzeichnis:Deutsch/Liste_der_h%C3%A4ufigsten_Nachnamen_Deutschlands + **/ protected static $lastName = array( - 'Ackermann', 'Adler', 'Adolph', 'Albers', 'Anders', 'Atzler', 'Aumann', 'Austermühle', - 'Bachmann', 'Bähr', 'Bärer', 'Barkholz', 'Barth', 'Bauer', 'Baum', 'Becker', 'Beckmann', 'Beer', 'Beier', 'Bender', 'Benthin', 'Berger', 'Beyer', 'Bien', 'Biggen', 'Binner', 'Birnbaum', 'Bloch', 'Blümel', 'Bohlander', 'Bonbach', 'Bolander', 'Bolnbach', 'Bolzmann', 'Börner', 'Bohnbach', 'Boucsein', 'Briemer', 'Bruder', 'Buchholz', 'Budig', 'Butte', - 'Carsten', 'Caspar', 'Christoph', 'Cichorius', 'Conradi', - 'Davids', 'Dehmel', 'Dickhard', 'Dietz', 'Dippel', 'Ditschlerin', 'Dobes', 'Döhn', 'Döring', 'Dörr', 'Dörschner', 'Dowerg', 'Drewes', 'Drub', 'Drubin', 'Dussen van', - 'Eberhardt', 'Ebert', 'Eberth', 'Eckbauer', 'Ehlert', 'Eigenwillig', 'Eimer', 'Ernst', 'Etzler', 'Etzold', - 'Faust', 'Fechner', 'Fiebig', 'Finke', 'Fischer', 'Flantz', 'Fliegner', 'Förster', 'Franke', 'Freudenberger', 'Fritsch', 'Fröhlich', - 'Gehringer', 'Geisel', 'Geisler', 'Geißler', 'Gerlach', 'Gertz', 'Gierschner', 'Gieß', 'Girschner', 'Gnatz', 'Gorlitz', 'Gotthard', 'Graf', 'Grein Groth', 'Gröttner', 'Gude', 'Gunpf', 'Gumprich', 'Gute', 'Gutknecht', - 'Haase', 'Haering', 'Hänel', 'Häring', 'Hahn', 'Hamann', 'Hande', 'Harloff', 'Hartmann', 'Hartung', 'Hauffer', 'Hecker', 'Heidrich', 'Hein', 'Heinrich', 'Heintze', 'Heinz', 'Hellwig', 'Henck', 'Hendriks', 'Henk', 'Henschel', 'Hentschel', 'Hering', 'Hermann', 'Herrmann', 'Hermighausen', 'Hertrampf', 'Heser', 'Heß', 'Hesse', 'Hettner', 'Hethur', 'Heuser', 'Hiller', 'Heydrich', 'Höfig', 'Hofmann', 'Holsten', 'Holt', 'Holzapfel', 'Hölzenbecher', 'Hörle', 'Hövel', 'Hoffmann', 'Hornich', 'Hornig', 'Hübel', 'Huhn', - 'Jacob', 'Jacobi Jäckel', 'Jähn', 'Jäkel', 'Jäntsch', 'Jessel', 'Jockel', 'Johann', 'Jopich', 'Junck', 'Juncken', 'Jungfer', 'Junitz', 'Junk', 'Junken', 'Jüttner', - 'Kabus', 'Kade', 'Käster', 'Kallert', 'Kambs', 'Karge', 'Karz', 'Kaul', 'Kensy', 'Keudel', 'Killer', 'Kitzmann', 'Klapp', 'Klemm', 'Klemt', 'Klingelhöfer', 'Klotz', 'Knappe', 'Kobelt', 'Koch', 'Koch II', 'Köhler', 'Köster', 'Kohl', 'Kostolzin', 'Kramer', 'Kranz', 'Krause', 'Kraushaar', 'Krebs', 'Krein', 'Kreusel', 'Kroker', 'Kruschwitz', 'Kuhl', 'Kühnert', 'Kusch', - 'Lachmann', 'Ladeck', 'Lange', 'Langern', 'Lehmann', 'Liebelt', 'Lindau', 'Lindner', 'Linke', 'Löchel', 'Löffler', 'Loos', 'Lorch', 'Losekann', 'Löwer', 'Lübs', - 'Mälzer', 'Mangold', 'Mans', 'Margraf', 'Martin', 'Matthäi', 'Meister', 'Mende', 'Mentzel', 'Metz', 'Meyer', 'Mielcarek', 'Mies', 'Misicher', 'Mitschke', 'Mohaupt', 'Mosemann', 'Möchlichen', 'Mude', 'Mühle', 'Mülichen', 'Müller', - 'Naser', 'Nerger', 'Nette', 'Neureuther', 'Neuschäfer', 'Niemeier', 'Noack', 'Nohlmans', - 'Oderwald', 'Oestrovsky', 'Ortmann', 'Otto', - 'Paffrath', 'Pärtzelt', 'Patberg', 'Pechel', 'Pergande', 'Peukert', 'Pieper', 'Plath', 'Pohl', 'Pölitz', 'Preiß', 'Pruschke', 'Putz', - 'Rädel', 'Radisch', 'Reichmann', 'Reinhardt', 'Reising', 'Renner', 'Reuter', 'Riehl', 'Ring', 'Ritter', 'Rogge', 'Rogner', 'Rohleder', 'Röhrdanz', 'Röhricht', 'Roht', 'Römer', 'Rörricht', 'Rose', 'Rosemann', 'Rosenow', 'Roskoth', 'Rudolph', 'Ruppersberger', 'Ruppert', 'Rust', - 'Sager', 'Salz', 'Säuberlich', 'Sauer', 'Schaaf', 'Schacht', 'Schäfer', 'Scheel', 'Scheibe', 'Schenk', 'Scheuermann', 'Schinke', 'Schleich', 'Schleich', 'auch Schlauchin', 'Schlosser', 'Schmidt', 'Schmidtke', 'Schmiedecke', 'Schmiedt', 'Schönland', 'Scholl', 'Scholtz', 'Scholz', 'Schomber', 'Schottin', 'Schuchhardt', 'Schüler', 'Schulz', 'Schuster', 'Schweitzer', 'Schwital', 'Segebahn', 'Seifert', 'Seidel', 'Seifert', 'Seip', 'Siering', 'Söding', 'Sölzer', 'Sontag', 'Sorgatz', 'Speer', 'Spieß', 'Stadelmann', 'Stahr', 'Staude', 'Steckel', 'Steinberg', 'Stey', 'Stiebitz', 'Stiffel', 'Stoll', 'Stolze', 'Striebitz', 'Stroh', 'Stumpf', 'Sucker', 'Süßebier', - 'Täsche', 'Textor', 'Thanel', 'Thies', 'Tintzmann', 'Tlustek', 'Trapp', 'Trommler', 'Tröst', 'Trub', 'Trüb', 'Trubin', 'Trupp', 'Tschentscher', - 'Ullmann', 'Ullrich', - 'van der Dussen', 'Vogt', 'Vollbrecht', - 'Wagenknecht', 'Wagner', 'Wähner', 'Walter', 'Warmer', 'Weihmann', 'Weimer', 'Weinhage', 'Weinhold', 'Weiß', 'Weitzel', 'Weller', 'Wende', 'Wernecke', 'Werner', 'Wesack', 'Wiek', 'Wieloch', 'Wilms', 'Wilmsen', 'Winkler', 'Wirth', 'Wohlgemut', 'Wulf', 'Wulff', - 'Zahn', 'Zänker', 'Ziegert', 'Zimmer', 'Zirme', 'Zobel', 'Zorbach', + 'Abraham', 'Achleitner', 'Adam', 'Aichinger', 'Aigner', 'Albrecht', 'Altmann', 'Amann', 'Amon', 'Angerer', 'Arnold', 'Artner', 'Aschauer', 'Auer', 'Augustin', 'Auinger', + 'Bacher', 'Bachler', 'Bachmann', 'Bader', 'Baier', 'Barth', 'Bartl', 'Bauer', 'Baumann', 'Baumgartner', 'Bayer', 'Beck', 'Beer', 'Berger', 'Bergmann', 'Bernhard', 'Bichler', 'Binder', 'Bischof', 'Bock', 'Bogner', 'Brandl', 'Brandner', 'Brandstetter', 'Brandstätter', 'Braun', 'Brenner', 'Bruckner', 'Brugger', 'Brunner', 'Buchberger', 'Buchegger', 'Bucher', 'Buchinger', 'Buchner', 'Burger', 'Burgstaller', 'Burtscher', 'Böck', 'Böhm', 'Bösch', + 'Danner', 'Denk', 'Deutsch', 'Dietrich', 'Dobler', 'Doppler', 'Dorner', 'Draxler', + 'Eberharter', 'Eberl', 'Ebner', 'Ecker', 'Eder', 'Edlinger', 'Egger', 'Eibl', 'Eichberger', 'Eichinger', 'Eigner', 'Erhart', 'Ernst', 'Ertl', + 'Falkner', 'Fasching', 'Feichtinger', 'Fellner', 'Fiala', 'Fichtinger', 'Fiedler', 'Fink', 'Fischer', 'Fleischhacker', 'Forster', 'Forstner', 'Frank', 'Franz', 'Friedl', 'Friedrich', 'Fritsch', 'Fritz', 'Fröhlich', 'Frühwirth', 'Fuchs', 'Führer', 'Fürst', + 'Gabriel', 'Gangl', 'Gartner', 'Gasser', 'Gassner', 'Geiger', 'Geisler', 'Geyer', 'Glaser', 'Glatz', 'Gmeiner', 'Grabner', 'Graf', 'Gratzer', 'Greiner', 'Grill', 'Gritsch', 'Gross', 'Groß', 'Gruber', 'Grünwald', 'Gschwandtner', 'Gutmann', + 'Haas', 'Haberl', 'Hackl', 'Hafner', 'Hagen', 'Hager', 'Hahn', 'Haider', 'Haidinger', 'Haller', 'Hammer', 'Hammerl', 'Handl', 'Handler', 'Harrer', 'Hartl', 'Hartmann', 'Haslinger', 'Hauer', 'Hauser', 'Heindl', 'Heinrich', 'Hemetsberger', 'Herbst', 'Hermann', 'Herzog', 'Hinterberger', 'Hinteregger', 'Hinterleitner', 'Hirsch', 'Hochreiter', 'Hofbauer', 'Hofer', 'Hoffmann', 'Hofmann', 'Hofstätter', 'Holzer', 'Holzinger', 'Holzmann', 'Horvath', 'Huber', 'Huemer', 'Hufnagl', 'Humer', 'Hummer', 'Hutter', 'Hämmerle', 'Hödl', 'Höfler', 'Höller', 'Hölzl', 'Hörmann', 'Hütter', + 'Jahn', 'Jandl', 'Janisch', 'Jovanovic', 'Jung', 'Jungwirth', 'Jäger', + 'Kainz', 'Kaiser', 'Kaltenbrunner', 'Kapeller', 'Kargl', 'Karl', 'Karner', 'Kastner', 'Kaufmann', 'Kellner', 'Kern', 'Kerschbaumer', 'Kirchmair', 'Kirchner', 'Klammer', 'Klein', 'Klinger', 'Klug', 'Knapp', 'Knoll', 'Koch', 'Kofler', 'Kogler', 'Kohl', 'Koller', 'Kollmann', 'Konrad', 'Kopp', 'Kovacs', 'Kraft', 'Krainer', 'Kramer', 'Krammer', 'Kraus', 'Kremser', 'Krenn', 'Kreuzer', 'Kronberger', 'Kröll', 'Kugler', 'Kummer', 'Kurz', 'Köberl', 'Köck', 'Köhler', 'König', + 'Lackner', 'Lamprecht', 'Lang', 'Langer', 'Lechner', 'Lederer', 'Leeb', 'Lehner', 'Leitgeb', 'Leitner', 'Lengauer', 'Lenz', 'Lettner', 'Lindner', 'List', 'Loidl', 'Lorenz', 'Ludwig', 'Luger', 'Lukas', 'Lutz', 'Löffler', + 'Mader', 'Maier', 'Maierhofer', 'Mair', 'Mairhofer', 'Mandl', 'Markovic', 'Martin', 'Maurer', 'Mayer', 'Mayerhofer', 'Mayr', 'Mayrhofer', 'Meier', 'Meixner', 'Messner', 'Meyer', 'Mitterer', 'Moosbrugger', 'Moser', 'Muhr', 'Mühlbacher', 'Müller', 'Müllner', + 'Nagl', 'Nemeth', 'Neubauer', 'Neuhauser', 'Neuhold', 'Neumann', 'Neumayer', 'Neuner', 'Neuwirth', 'Nikolic', 'Novak', 'Nowak', 'Nussbaumer', 'Nußbaumer', + 'Ofner', 'Ortner', 'Oswald', 'Ott', + 'Paar', 'Pacher', 'Pammer', 'Paul', 'Payer', 'Peer', 'Penz', 'Peter', 'Petrovic', 'Petz', 'Pfeffer', 'Pfeifer', 'Pfeiffer', 'Pfister', 'Pfleger', 'Pichler', 'Pilz', 'Pinter', 'Pirker', 'Plank', 'Plattner', 'Platzer', 'Pointner', 'Pokorny', 'Pollak', 'Posch', 'Prem', 'Prinz', 'Probst', 'Pucher', 'Putz', 'Pöll', 'Pölzl', 'Pöschl', 'Pühringer', + 'Raab', 'Rabl', 'Rainer', 'Rath', 'Rauch', 'Rausch', 'Rauscher', 'Rauter', 'Rechberger', 'Redl', 'Reich', 'Reichl', 'Reindl', 'Reiner', 'Reinisch', 'Reischl', 'Reisinger', 'Reiter', 'Reiterer', 'Renner', 'Resch', 'Richter', 'Rieder', 'Riedl', 'Riedler', 'Rieger', 'Riegler', 'Rieser', 'Ritter', 'Rosenberger', 'Roth', 'Rupp', + 'Sailer', 'Sattler', 'Sauer', 'Schachinger', 'Schachner', 'Schaffer', 'Schaller', 'Scharf', 'Schatz', 'Schauer', 'Scheiber', 'Schenk', 'Scheucher', 'Schiefer', 'Schiller', 'Schindler', 'Schlager', 'Schlögl', 'Schmid', 'Schmidt', 'Schmied', 'Schnabl', 'Schneeberger', 'Schneider', 'Schober', 'Scholz', 'Schranz', 'Schreiber', 'Schreiner', 'Schubert', 'Schuh', 'Schuller', 'Schulz', 'Schuster', 'Schwab', 'Schwaiger', 'Schwaighofer', 'Schwarz', 'Schweiger', 'Schweighofer', 'Schön', 'Schöpf', 'Schütz', 'Seebacher', 'Seidl', 'Siegl', 'Simon', 'Singer', 'Sommer', 'Sonnleitner', 'Spitzer', 'Springer', 'Stadler', 'Stangl', 'Stark', 'Staudinger', 'Steger', 'Steinbauer', 'Steinberger', 'Steindl', 'Steiner', 'Steininger', 'Steinkellner', 'Steinlechner', 'Steinwender', 'Stelzer', 'Stern', 'Steurer', 'Stocker', 'Stockinger', 'Strasser', 'Strauss', 'Strauß', 'Strobl', 'Stummer', 'Sturm', 'Stöckl', 'Stöger', 'Suppan', 'Swoboda', 'Szabo', + 'Thaler', 'Thaller', 'Thurner', 'Tischler', 'Toth', 'Traxler', 'Trimmel', 'Trummer', + 'Ulrich', 'Unger', 'Unterberger', 'Unterweger', 'Urban', + 'Varga', 'Vogel', 'Vogl', + 'Wachter', 'Wagner', 'Walch', 'Walcher', 'Wallner', 'Walter', 'Weber', 'Wechselberger', 'Wegscheider', 'Weidinger', 'Weigl', 'Weinberger', 'Weiss', 'Weiß', 'Weninger', 'Werner', 'Wieland', 'Wieser', 'Wiesinger', 'Wild', 'Wilhelm', 'Wimmer', 'Windisch', 'Winkler', 'Winter', 'Wirth', 'Wittmann', 'Wolf', 'Wurm', 'Wurzer', + 'Zach', 'Zangerl', 'Zauner', 'Zechner', 'Zehetner', 'Zeilinger', 'Zeller', 'Zenz', 'Ziegler', 'Zimmermann', 'Zöhrer', ); protected static $titleMale = array('Herr', 'Dr.', 'Mag.', 'Ing.', 'Dipl.-Ing.', 'Prof.', 'Univ.Prof.'); diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Text.php new file mode 100644 index 00000000..2efd43f3 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Text.php @@ -0,0 +1,7 @@ + 'Aargau'), + array('AI' => 'Appenzell Innerrhoden'), + array('AR' => 'Appenzell Ausserrhoden'), + array('BE' => 'Bern'), + array('BL' => 'Basel-Landschaft'), + array('BS' => 'Basel-Stadt'), + array('FR' => 'Freiburg'), + array('GE' => 'Genf'), + array('GL' => 'Glarus'), + array('GR' => 'Graubünden'), + array('JU' => 'Jura',), + array('LU' => 'Luzern'), + array('NE' => 'Neuenburg'), + array('NW' => 'Nidwalden'), + array('OW' => 'Obwalden'), + array('SG' => 'St. Gallen'), + array('SH' => 'Schaffhausen'), + array('SO' => 'Solothurn'), + array('SZ' => 'Schwyz'), + array('TG' => 'Thurgau'), + array('TI' => 'Tessin'), + array('UR' => 'Uri'), + array('VD' => 'Waadt'), + array('VS' => 'Wallis'), + array('ZG' => 'Zug'), + array('ZH' => 'Zürich') + ); + + protected static $country = array( + 'Afghanistan', 'Alandinseln', 'Albanien', 'Algerien', 'Amerikanisch-Ozeanien', 'Amerikanisch-Samoa', 'Amerikanische Jungferninseln', 'Andorra', 'Angola', 'Anguilla', 'Antarktis', 'Antigua und Barbuda', 'Argentinien', 'Armenien', 'Aruba', 'Aserbaidschan', 'Australien', 'Ägypten', 'Äquatorialguinea', 'Äthiopien', 'Äusseres Ozeanien', + 'Bahamas', 'Bahrain', 'Bangladesch', 'Barbados', 'Belarus', 'Belgien', 'Belize', 'Benin', 'Bermuda', 'Bhutan', 'Bolivien', 'Bosnien und Herzegowina', 'Botsuana', 'Bouvetinsel', 'Brasilien', 'Britische Jungferninseln', 'Britisches Territorium im Indischen Ozean', 'Brunei Darussalam', 'Bulgarien', 'Burkina Faso', 'Burundi', + 'Chile', 'China', 'Cookinseln', 'Costa Rica', 'Côte d’Ivoire', + 'Demokratische Republik Kongo', 'Demokratische Volksrepublik Korea', 'Deutschland', 'Dominica', 'Dominikanische Republik', 'Dschibuti', 'Dänemark', + 'Ecuador', 'El Salvador', 'Eritrea', 'Estland', 'Europäische Union', + 'Falklandinseln', 'Fidschi', 'Finnland', 'Frankreich', 'Französisch-Guayana', 'Französisch-Polynesien', 'Französische Süd- und Antarktisgebiete', 'Färöer', + 'Gabun', 'Gambia', 'Georgien', 'Ghana', 'Gibraltar', 'Grenada', 'Griechenland', 'Grönland', 'Guadeloupe', 'Guam', 'Guatemala', 'Guernsey', 'Guinea', 'Guinea-Bissau', 'Guyana', + 'Haiti', 'Heard- und McDonald-Inseln', 'Honduras', + 'Indien', 'Indonesien', 'Irak', 'Iran', 'Irland', 'Island', 'Isle of Man', 'Israel', 'Italien', + 'Jamaika', 'Japan', 'Jemen', 'Jersey', 'Jordanien', + 'Kaimaninseln', 'Kambodscha', 'Kamerun', 'Kanada', 'Kap Verde', 'Kasachstan', 'Katar', 'Kenia', 'Kirgisistan', 'Kiribati', 'Kokosinseln', 'Kolumbien', 'Komoren', 'Kongo', 'Kroatien', 'Kuba', 'Kuwait', + 'Laos', 'Lesotho', 'Lettland', 'Libanon', 'Liberia', 'Libyen', 'Liechtenstein', 'Litauen', 'Luxemburg', + 'Madagaskar', 'Malawi', 'Malaysia', 'Malediven', 'Mali', 'Malta', 'Marokko', 'Marshallinseln', 'Martinique', 'Mauretanien', 'Mauritius', 'Mayotte', 'Mazedonien', 'Mexiko', 'Mikronesien', 'Monaco', 'Mongolei', 'Montenegro', 'Montserrat', 'Mosambik', 'Myanmar', + 'Namibia', 'Nauru', 'Nepal', 'Neukaledonien', 'Neuseeland', 'Nicaragua', 'Niederlande', 'Niederländische Antillen', 'Niger', 'Nigeria', 'Niue', 'Norfolkinsel', 'Norwegen', 'Nördliche Marianen', + 'Oman', 'Osttimor', 'Österreich', + 'Pakistan', 'Palau', 'Palästinensische Gebiete', 'Panama', 'Papua-Neuguinea', 'Paraguay', 'Peru', 'Philippinen', 'Pitcairn', 'Polen', 'Portugal', 'Puerto Rico', + 'Republik Korea', 'Republik Moldau', 'Ruanda', 'Rumänien', 'Russische Föderation', 'Réunion', + 'Salomonen', 'Sambia', 'Samoa', 'San Marino', 'Saudi-Arabien', 'Schweden', 'Schweiz', 'Senegal', 'Serbien', 'Serbien und Montenegro', 'Seychellen', 'Sierra Leone', 'Simbabwe', 'Singapur', 'Slowakei', 'Slowenien', 'Somalia', 'Sonderverwaltungszone Hongkong', 'Sonderverwaltungszone Macao', 'Spanien', 'Sri Lanka', 'St. Barthélemy', 'St. Helena', 'St. Kitts und Nevis', 'St. Lucia', 'St. Martin', 'St. Pierre und Miquelon', 'St. Vincent und die Grenadinen', 'Sudan', 'Suriname', 'Svalbard und Jan Mayen', 'Swasiland', 'Syrien', 'São Tomé und Príncipe', 'Südafrika', 'Südgeorgien und die Südlichen Sandwichinseln', + 'Tadschikistan', 'Taiwan', 'Tansania', 'Thailand', 'Togo', 'Tokelau', 'Tonga', 'Trinidad und Tobago', 'Tschad', 'Tschechische Republik', 'Tunesien', 'Turkmenistan', 'Turks- und Caicosinseln', 'Tuvalu', 'Türkei', + 'Uganda', 'Ukraine', 'Unbekannte oder ungültige Region', 'Ungarn', 'Uruguay', 'Usbekistan', + 'Vanuatu', 'Vatikanstadt', 'Venezuela', 'Vereinigte Arabische Emirate', 'Vereinigte Staaten', 'Vereinigtes Königreich', 'Vietnam', + 'Wallis und Futuna', 'Weihnachtsinsel', 'Westsahara', + 'Zentralafrikanische Republik', 'Zypern', + ); + + protected static $cityFormats = array( + '{{cityName}}', + ); + + protected static $streetNameFormats = array( + '{{lastName}}{{streetSuffixShort}}', + '{{cityName}}{{streetSuffixShort}}', + '{{firstName}}-{{lastName}}-{{streetSuffixLong}}' + ); + + protected static $streetAddressFormats = array( + '{{streetName}} {{buildingNumber}}', + ); + protected static $addressFormats = array( + "{{streetAddress}}\n{{postcode}} {{city}}", + ); + + /** + * Returns a random city name. + * @example Luzern + * @return string + */ + public function cityName() + { + return static::randomElement(static::$cityNames); + } + + /** + * Returns a random street suffix. + * @example str. + * @return string + */ + public function streetSuffixShort() + { + return static::randomElement(static::$streetSuffixShort); + } + + /** + * Returns a random street suffix. + * @example Strasse + * @return string + */ + public function streetSuffixLong() + { + return static::randomElement(static::$streetSuffixLong); + } + + /** + * Returns a canton + * @example array('BE' => 'Bern') + * @return array + */ + public static function canton() + { + return static::randomElement(static::$canton); + } + + /** + * Returns the abbreviation of a canton. + * @return string + */ + public static function cantonShort() + { + $canton = static::canton(); + return key($canton); + } + + /** + * Returns the name of canton. + * @return string + */ + public static function cantonName() + { + $canton = static::canton(); + return current($canton); + } + + public static function buildingNumber() + { + return static::regexify(self::numerify(static::randomElement(static::$buildingNumber))); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/de_CH/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/de_CH/Company.php new file mode 100644 index 00000000..604ec5ae --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/de_CH/Company.php @@ -0,0 +1,15 @@ +generator->parse(static::randomElement(static::$towns)); + } + + public function syllable() + { + return static::randomElement(static::$syllables); + } + + public function direction() + { + return static::randomElement(static::$directions); + } + + public function englishStreetName() + { + return static::randomElement(static::$englishStreetNames); + } + + public function villageSuffix() + { + return static::randomElement(static::$villageSuffixes); + } + + public function estateSuffix() + { + return static::randomElement(static::$estateSuffixes); + } + + public function village() + { + return $this->generator->parse(static::randomElement(static::$villageNameFormats)); + } + + public function estate() + { + return $this->generator->parse(static::randomElement(static::$estateNameFormats)); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_HK/Internet.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_HK/Internet.php new file mode 100644 index 00000000..4d82d93a --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_HK/Internet.php @@ -0,0 +1,14 @@ +generator->parse(static::randomElement(static::$societyNameFormat)); + } + /** + * @example Mumbai + */ + public function city() + { + return static::randomElement(static::$city); + } + /** + * @example Vaishali Nagar + */ + public function locality() + { + return $this->generator->parse(static::randomElement(static::$localityFormats)); + } + /* + * @example Kharadi + */ + public function localityName() + { + return $this->generator->parse(static::randomElement(static::$localityName)); + } + /** + * @example Nagar + */ + public function areaSuffix() + { + return static::randomElement(static::$areaSuffix); + } + + /** + * @example 'Delhi' + */ + public static function state() + { + return static::randomElement(static::$state); + } + + /** + * @example 'DL' + */ + public static function stateAbbr() + { + return static::randomElement(static::$stateAbbr); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_IN/Internet.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_IN/Internet.php new file mode 100644 index 00000000..6ec16710 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_IN/Internet.php @@ -0,0 +1,9 @@ +generator->parse($format)); + } + + public function fixedLineNumber() + { + $format = static::randomElement(static::$fixedLineNumberFormats); + + return static::numerify($this->generator->parse($format)); + } + + public function voipNumber() + { + $format = static::randomElement(static::$voipNumber); + + return $this->generator->parse($format); + } + + public function internationalCodePrefix() + { + $format = static::randomElement(static::$internationalCodePrefix); + + return $this->generator->parse($format); + } + + public function zeroToEight() + { + return static::randomElement(static::$zeroToEight); + } + + public function oneToEight() + { + return static::randomElement(static::$oneToEight); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php index 4f876bfc..eb817e3a 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php @@ -2,12 +2,12 @@ namespace Faker\Provider\en_UG; -class Address extends \Faker\Provider\Address +class Address extends \Faker\Provider\en_US\Address { protected static $cityFormats = array( '{{cityName}}' ); - + /** * @link http://en.wikipedia.org/wiki/List_of_cities_and_towns_in_Uganda */ @@ -40,34 +40,6 @@ class Address extends \Faker\Provider\Address 'Yumbe' ); - protected static $country = array( - 'Afghanistan', 'Albania', 'Algeria', 'American Samoa', 'Andorra', 'Angola', 'Anguilla', 'Antarctica (the territory South of 60 deg S)', 'Antigua and Barbuda', 'Argentina', 'Armenia', 'Aruba', 'Australia', 'Austria', 'Azerbaijan', - 'Bahamas', 'Bahrain', 'Bangladesh', 'Barbados', 'Belarus', 'Belgium', 'Belize', 'Benin', 'Bermuda', 'Bhutan', 'Bolivia', 'Bosnia and Herzegovina', 'Botswana', 'Bouvet Island (Bouvetoya)', 'Brazil', 'British Indian Ocean Territory (Chagos Archipelago)', 'British Virgin Islands', 'Brunei Darussalam', 'Bulgaria', 'Burkina Faso', 'Burundi', - 'Cambodia', 'Cameroon', 'Canada', 'Cape Verde', 'Cayman Islands', 'Central African Republic', 'Chad', 'Chile', 'China', 'Christmas Island', 'Cocos (Keeling) Islands', 'Colombia', 'Comoros', 'Congo', 'Cook Islands', 'Costa Rica', 'Cote d\'Ivoire', 'Croatia', 'Cuba', 'Cyprus', 'Czech Republic', - 'Denmark', 'Djibouti', 'Dominica', 'Dominican Republic', - 'Ecuador', 'Egypt', 'El Salvador', 'Equatorial Guinea', 'Eritrea', 'Estonia', 'Ethiopia', - 'Faroe Islands', 'Falkland Islands (Malvinas)', 'Fiji', 'Finland', 'France', 'French Guiana', 'French Polynesia', 'French Southern Territories', - 'Gabon', 'Gambia', 'Georgia', 'Germany', 'Ghana', 'Gibraltar', 'Greece', 'Greenland', 'Grenada', 'Guadeloupe', 'Guam', 'Guatemala', 'Guernsey', 'Guinea', 'Guinea-Bissau', 'Guyana', - 'Haiti', 'Heard Island and McDonald Islands', 'Holy See (Vatican City State)', 'Honduras', 'Hong Kong', 'Hungary', - 'Iceland', 'India', 'Indonesia', 'Iran', 'Iraq', 'Ireland', 'Isle of Man', 'Israel', 'Italy', - 'Jamaica', 'Japan', 'Jersey', 'Jordan', - 'Kazakhstan', 'Kenya', 'Kiribati', 'Korea', 'Korea', 'Kuwait', 'Kyrgyz Republic', - 'Lao People\'s Democratic Republic', 'Latvia', 'Lebanon', 'Lesotho', 'Liberia', 'Libyan Arab Jamahiriya', 'Liechtenstein', 'Lithuania', 'Luxembourg', - 'Macao', 'Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands', 'Martinique', 'Mauritania', 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', 'Moldova', 'Monaco', 'Mongolia', 'Montenegro', 'Montserrat', 'Morocco', 'Mozambique', 'Myanmar', - 'Namibia', 'Nauru', 'Nepal', 'Netherlands Antilles', 'Netherlands', 'New Caledonia', 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Norfolk Island', 'Northern Mariana Islands', 'Norway', - 'Oman', - 'Pakistan', 'Palau', 'Palestinian Territory', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico', - 'Qatar', - 'Reunion', 'Romania', 'Russian Federation', 'Rwanda', - 'Saint Barthelemy', 'Saint Helena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Martin', 'Saint Pierre and Miquelon', 'Saint Vincent and the Grenadines', 'Samoa', 'San Marino', 'Sao Tome and Principe', 'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovakia (Slovak Republic)', 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa', 'South Georgia and the South Sandwich Islands', 'Spain', 'Sri Lanka', 'Sudan', 'Suriname', 'Svalbard & Jan Mayen Islands', 'Swaziland', 'Sweden', 'Switzerland', 'Syrian Arab Republic', - 'Taiwan', 'Tajikistan', 'Tanzania', 'Thailand', 'Timor-Leste', 'Togo', 'Tokelau', 'Tonga', 'Trinidad and Tobago', 'Tunisia', 'Turkey', 'Turkmenistan', 'Turks and Caicos Islands', 'Tuvalu', - 'Uganda', 'Ukraine', 'United Arab Emirates', 'United Kingdom', 'United States of America', 'United States Minor Outlying Islands', 'United States Virgin Islands', 'Uruguay', 'Uzbekistan', - 'Vanuatu', 'Venezuela', 'Vietnam', - 'Wallis and Futuna', 'Western Sahara', - 'Yemen', - 'Zambia', 'Zimbabwe' - ); - /** * @link http://en.wikipedia.org/wiki/Category:Districts_of_Uganda */ diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Address.php index e4c7ce0d..b3c72f40 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Address.php @@ -6,7 +6,7 @@ class Address extends \Faker\Provider\Address { protected static $cityPrefix = array('North', 'East', 'West', 'South', 'New', 'Lake', 'Port'); protected static $citySuffix = array('town', 'ton', 'land', 'ville', 'berg', 'burgh', 'borough', 'bury', 'view', 'port', 'mouth', 'stad', 'furt', 'chester', 'mouth', 'fort', 'haven', 'side', 'shire'); - protected static $buildingNumber = array('#####', '####', '###'); + protected static $buildingNumber = array('%####', '%###', '%##'); protected static $streetSuffix = array( 'Alley', 'Avenue', 'Branch', 'Bridge', 'Brook', 'Brooks', 'Burg', 'Burgs', 'Bypass', 'Camp', 'Canyon', 'Cape', 'Causeway', 'Center', 'Centers', 'Circle', 'Circles', 'Cliff', 'Cliffs', 'Club', 'Common', 'Corner', 'Corners', 'Course', 'Court', 'Courts', 'Cove', 'Coves', 'Creek', 'Crescent', 'Crest', 'Crossing', 'Crossroad', 'Curve', 'Dale', 'Dam', 'Divide', 'Drive', 'Drive', 'Drives', 'Estate', 'Estates', 'Expressway', 'Extension', 'Extensions', 'Fall', 'Falls', 'Ferry', 'Field', 'Fields', 'Flat', 'Flats', 'Ford', 'Fords', 'Forest', 'Forge', 'Forges', 'Fork', 'Forks', 'Fort', 'Freeway', 'Garden', 'Gardens', 'Gateway', 'Glen', 'Glens', 'Green', 'Greens', 'Grove', 'Groves', 'Harbor', 'Harbors', 'Haven', 'Heights', 'Highway', 'Hill', 'Hills', 'Hollow', 'Inlet', 'Inlet', 'Island', 'Island', 'Islands', 'Islands', 'Isle', 'Isle', 'Junction', 'Junctions', 'Key', 'Keys', 'Knoll', 'Knolls', 'Lake', 'Lakes', 'Land', 'Landing', 'Lane', 'Light', 'Lights', 'Loaf', 'Lock', 'Locks', 'Locks', 'Lodge', 'Lodge', 'Loop', 'Mall', 'Manor', 'Manors', 'Meadow', 'Meadows', 'Mews', 'Mill', 'Mills', 'Mission', 'Mission', 'Motorway', 'Mount', 'Mountain', 'Mountain', 'Mountains', 'Mountains', 'Neck', 'Orchard', 'Oval', 'Overpass', 'Park', 'Parks', 'Parkway', 'Parkways', 'Pass', 'Passage', 'Path', 'Pike', 'Pine', 'Pines', 'Place', 'Plain', 'Plains', 'Plains', 'Plaza', 'Plaza', 'Point', 'Points', 'Port', 'Port', 'Ports', 'Ports', 'Prairie', 'Prairie', 'Radial', 'Ramp', 'Ranch', 'Rapid', 'Rapids', 'Rest', 'Ridge', 'Ridges', 'River', 'Road', 'Road', 'Roads', 'Roads', 'Route', 'Row', 'Rue', 'Run', 'Shoal', 'Shoals', 'Shore', 'Shores', 'Skyway', 'Spring', 'Springs', 'Springs', 'Spur', 'Spurs', 'Square', 'Square', 'Squares', 'Squares', 'Station', 'Station', 'Stravenue', 'Stravenue', 'Stream', 'Stream', 'Street', 'Street', 'Streets', 'Summit', 'Summit', 'Terrace', 'Throughway', 'Trace', 'Track', 'Trafficway', 'Trail', 'Trail', 'Tunnel', 'Tunnel', 'Turnpike', 'Turnpike', 'Underpass', 'Union', 'Unions', 'Valley', 'Valleys', 'Via', 'Viaduct', 'View', 'Views', 'Village', 'Village', 'Villages', 'Ville', 'Vista', 'Vista', 'Walk', 'Walks', 'Wall', 'Way', 'Ways', 'Well', 'Wells' ); @@ -33,7 +33,7 @@ class Address extends \Faker\Provider\Address 'Macao', 'Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands', 'Martinique', 'Mauritania', 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', 'Moldova', 'Monaco', 'Mongolia', 'Montenegro', 'Montserrat', 'Morocco', 'Mozambique', 'Myanmar', 'Namibia', 'Nauru', 'Nepal', 'Netherlands Antilles', 'Netherlands', 'New Caledonia', 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Norfolk Island', 'Northern Mariana Islands', 'Norway', 'Oman', - 'Pakistan', 'Palau', 'Palestinian Territory', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico', + 'Pakistan', 'Palau', 'Palestinian Territories', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico', 'Qatar', 'Reunion', 'Romania', 'Russian Federation', 'Rwanda', 'Saint Barthelemy', 'Saint Helena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Martin', 'Saint Pierre and Miquelon', 'Saint Vincent and the Grenadines', 'Samoa', 'San Marino', 'Sao Tome and Principe', 'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovakia (Slovak Republic)', 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa', 'South Georgia and the South Sandwich Islands', 'Spain', 'Sri Lanka', 'Sudan', 'Suriname', 'Svalbard & Jan Mayen Islands', 'Swaziland', 'Sweden', 'Switzerland', 'Syrian Arab Republic', diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Company.php index 464589f7..f46adaaf 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Company.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Company.php @@ -7,35 +7,73 @@ class Company extends \Faker\Provider\Company protected static $formats = array( '{{lastName}} {{companySuffix}}', '{{lastName}}-{{lastName}}', - '{{lastName}}, {{lastName}} and {{lastName}}' + '{{lastName}}, {{lastName}} and {{lastName}}', ); protected static $catchPhraseWords = array( array( - 'Adaptive', 'Advanced', 'Ameliorated', 'Assimilated', 'Automated', 'Balanced', 'Business-focused', 'Centralized', 'Cloned', 'Compatible', 'Configurable', 'Cross-group', 'Cross-platform', 'Customer-focused', 'Customizable', 'Decentralized', 'De-engineered', 'Devolved', 'Digitized', 'Distributed', 'Diverse', 'Down-sized', 'Enhanced', 'Enterprise-wide', 'Ergonomic', 'Exclusive', 'Expanded', 'Extended', 'Facetoface', 'Focused', 'Front-line', 'Fully-configurable', 'Function-based', 'Fundamental', 'Future-proofed', 'Grass-roots', 'Horizontal', 'Implemented', 'Innovative', 'Integrated', 'Intuitive', 'Inverse', 'Managed', 'Mandatory', 'Monitored', 'Multi-channelled', 'Multi-lateral', 'Multi-layered', 'Multi-tiered', 'Networked', 'Object-based', 'Open-architected', 'Open-source', 'Operative', 'Optimized', 'Optional', 'Organic', 'Organized', 'Persevering', 'Persistent', 'Phased', 'Polarised', 'Pre-emptive', 'Proactive', 'Profit-focused', 'Profound', 'Programmable', 'Progressive', 'Public-key', 'Quality-focused', 'Reactive', 'Realigned', 'Re-contextualized', 'Re-engineered', 'Reduced', 'Reverse-engineered', 'Right-sized', 'Robust', 'Seamless', 'Secured', 'Self-enabling', 'Sharable', 'Stand-alone', 'Streamlined', 'Switchable', 'Synchronised', 'Synergistic', 'Synergized', 'Team-oriented', 'Total', 'Triple-buffered', 'Universal', 'Up-sized', 'Upgradable', 'User-centric', 'User-friendly', 'Versatile', 'Virtual', 'Visionary', 'Vision-oriented' + 'Adaptive', 'Advanced', 'Ameliorated', 'Assimilated', 'Automated', 'Balanced', 'Business-focused', 'Centralized', 'Cloned', 'Compatible', 'Configurable', 'Cross-group', 'Cross-platform', 'Customer-focused', 'Customizable', 'Decentralized', 'De-engineered', 'Devolved', 'Digitized', 'Distributed', 'Diverse', 'Down-sized', 'Enhanced', 'Enterprise-wide', 'Ergonomic', 'Exclusive', 'Expanded', 'Extended', 'Facetoface', 'Focused', 'Front-line', 'Fully-configurable', 'Function-based', 'Fundamental', 'Future-proofed', 'Grass-roots', 'Horizontal', 'Implemented', 'Innovative', 'Integrated', 'Intuitive', 'Inverse', 'Managed', 'Mandatory', 'Monitored', 'Multi-channelled', 'Multi-lateral', 'Multi-layered', 'Multi-tiered', 'Networked', 'Object-based', 'Open-architected', 'Open-source', 'Operative', 'Optimized', 'Optional', 'Organic', 'Organized', 'Persevering', 'Persistent', 'Phased', 'Polarised', 'Pre-emptive', 'Proactive', 'Profit-focused', 'Profound', 'Programmable', 'Progressive', 'Public-key', 'Quality-focused', 'Reactive', 'Realigned', 'Re-contextualized', 'Re-engineered', 'Reduced', 'Reverse-engineered', 'Right-sized', 'Robust', 'Seamless', 'Secured', 'Self-enabling', 'Sharable', 'Stand-alone', 'Streamlined', 'Switchable', 'Synchronised', 'Synergistic', 'Synergized', 'Team-oriented', 'Total', 'Triple-buffered', 'Universal', 'Up-sized', 'Upgradable', 'User-centric', 'User-friendly', 'Versatile', 'Virtual', 'Visionary', 'Vision-oriented', ), array( - '24hour', '24/7', '3rdgeneration', '4thgeneration', '5thgeneration', '6thgeneration', 'actuating', 'analyzing', 'assymetric', 'asynchronous', 'attitude-oriented', 'background', 'bandwidth-monitored', 'bi-directional', 'bifurcated', 'bottom-line', 'clear-thinking', 'client-driven', 'client-server', 'coherent', 'cohesive', 'composite', 'context-sensitive', 'contextually-based', 'content-based', 'dedicated', 'demand-driven', 'didactic', 'directional', 'discrete', 'disintermediate', 'dynamic', 'eco-centric', 'empowering', 'encompassing', 'even-keeled', 'executive', 'explicit', 'exuding', 'fault-tolerant', 'foreground', 'fresh-thinking', 'full-range', 'global', 'grid-enabled', 'heuristic', 'high-level', 'holistic', 'homogeneous', 'human-resource', 'hybrid', 'impactful', 'incremental', 'intangible', 'interactive', 'intermediate', 'leadingedge', 'local', 'logistical', 'maximized', 'methodical', 'mission-critical', 'mobile', 'modular', 'motivating', 'multimedia', 'multi-state', 'multi-tasking', 'national', 'needs-based', 'neutral', 'nextgeneration', 'non-volatile', 'object-oriented', 'optimal', 'optimizing', 'radical', 'real-time', 'reciprocal', 'regional', 'responsive', 'scalable', 'secondary', 'solution-oriented', 'stable', 'static', 'systematic', 'systemic', 'system-worthy', 'tangible', 'tertiary', 'transitional', 'uniform', 'upward-trending', 'user-facing', 'value-added', 'web-enabled', 'well-modulated', 'zeroadministration', 'zerodefect', 'zerotolerance' + '24hour', '24/7', '3rdgeneration', '4thgeneration', '5thgeneration', '6thgeneration', 'actuating', 'analyzing', 'assymetric', 'asynchronous', 'attitude-oriented', 'background', 'bandwidth-monitored', 'bi-directional', 'bifurcated', 'bottom-line', 'clear-thinking', 'client-driven', 'client-server', 'coherent', 'cohesive', 'composite', 'context-sensitive', 'contextually-based', 'content-based', 'dedicated', 'demand-driven', 'didactic', 'directional', 'discrete', 'disintermediate', 'dynamic', 'eco-centric', 'empowering', 'encompassing', 'even-keeled', 'executive', 'explicit', 'exuding', 'fault-tolerant', 'foreground', 'fresh-thinking', 'full-range', 'global', 'grid-enabled', 'heuristic', 'high-level', 'holistic', 'homogeneous', 'human-resource', 'hybrid', 'impactful', 'incremental', 'intangible', 'interactive', 'intermediate', 'leadingedge', 'local', 'logistical', 'maximized', 'methodical', 'mission-critical', 'mobile', 'modular', 'motivating', 'multimedia', 'multi-state', 'multi-tasking', 'national', 'needs-based', 'neutral', 'nextgeneration', 'non-volatile', 'object-oriented', 'optimal', 'optimizing', 'radical', 'real-time', 'reciprocal', 'regional', 'responsive', 'scalable', 'secondary', 'solution-oriented', 'stable', 'static', 'systematic', 'systemic', 'system-worthy', 'tangible', 'tertiary', 'transitional', 'uniform', 'upward-trending', 'user-facing', 'value-added', 'web-enabled', 'well-modulated', 'zeroadministration', 'zerodefect', 'zerotolerance', ), array( - 'ability', 'access', 'adapter', 'algorithm', 'alliance', 'analyzer', 'application', 'approach', 'architecture', 'archive', 'artificialintelligence', 'array', 'attitude', 'benchmark', 'budgetarymanagement', 'capability', 'capacity', 'challenge', 'circuit', 'collaboration', 'complexity', 'concept', 'conglomeration', 'contingency', 'core', 'customerloyalty', 'database', 'data-warehouse', 'definition', 'emulation', 'encoding', 'encryption', 'extranet', 'firmware', 'flexibility', 'focusgroup', 'forecast', 'frame', 'framework', 'function', 'functionalities', 'GraphicInterface', 'groupware', 'GraphicalUserInterface', 'hardware', 'help-desk', 'hierarchy', 'hub', 'implementation', 'info-mediaries', 'infrastructure', 'initiative', 'installation', 'instructionset', 'interface', 'internetsolution', 'intranet', 'knowledgeuser', 'knowledgebase', 'localareanetwork', 'leverage', 'matrices', 'matrix', 'methodology', 'middleware', 'migration', 'model', 'moderator', 'monitoring', 'moratorium', 'neural-net', 'openarchitecture', 'opensystem', 'orchestration', 'paradigm', 'parallelism', 'policy', 'portal', 'pricingstructure', 'processimprovement', 'product', 'productivity', 'project', 'projection', 'protocol', 'securedline', 'service-desk', 'software', 'solution', 'standardization', 'strategy', 'structure', 'success', 'superstructure', 'support', 'synergy', 'systemengine', 'task-force', 'throughput', 'time-frame', 'toolset', 'utilisation', 'website', 'workforce' - ) + 'ability', 'access', 'adapter', 'algorithm', 'alliance', 'analyzer', 'application', 'approach', 'architecture', 'archive', 'artificialintelligence', 'array', 'attitude', 'benchmark', 'blockchain', 'budgetarymanagement', 'capability', 'capacity', 'challenge', 'circuit', 'collaboration', 'complexity', 'concept', 'conglomeration', 'contingency', 'core', 'customerloyalty', 'database', 'data-warehouse', 'definition', 'emulation', 'encoding', 'encryption', 'extranet', 'firmware', 'flexibility', 'focusgroup', 'forecast', 'frame', 'framework', 'function', 'functionalities', 'GraphicInterface', 'groupware', 'GraphicalUserInterface', 'hardware', 'help-desk', 'hierarchy', 'hub', 'implementation', 'info-mediaries', 'infrastructure', 'initiative', 'installation', 'instructionset', 'interface', 'internetsolution', 'intranet', 'knowledgeuser', 'knowledgebase', 'localareanetwork', 'leverage', 'matrices', 'matrix', 'methodology', 'middleware', 'migration', 'model', 'moderator', 'monitoring', 'moratorium', 'neural-net', 'openarchitecture', 'opensystem', 'orchestration', 'paradigm', 'parallelism', 'policy', 'portal', 'pricingstructure', 'processimprovement', 'product', 'productivity', 'project', 'projection', 'protocol', 'securedline', 'service-desk', 'software', 'solution', 'standardization', 'strategy', 'structure', 'success', 'superstructure', 'support', 'synergy', 'systemengine', 'task-force', 'throughput', 'time-frame', 'toolset', 'utilisation', 'website', 'workforce', + ), ); protected static $bsWords = array( array( - 'implement', 'utilize', 'integrate', 'streamline', 'optimize', 'evolve', 'transform', 'embrace', 'enable', 'orchestrate', 'leverage', 'reinvent', 'aggregate', 'architect', 'enhance', 'incentivize', 'morph', 'empower', 'envisioneer', 'monetize', 'harness', 'facilitate', 'seize', 'disintermediate', 'synergize', 'strategize', 'deploy', 'brand', 'grow', 'target', 'syndicate', 'synthesize', 'deliver', 'mesh', 'incubate', 'engage', 'maximize', 'benchmark', 'expedite', 'reintermediate', 'whiteboard', 'visualize', 'repurpose', 'innovate', 'scale', 'unleash', 'drive', 'extend', 'engineer', 'revolutionize', 'generate', 'exploit', 'transition', 'e-enable', 'iterate', 'cultivate', 'matrix', 'productize', 'redefine', 'recontextualize' + 'implement', 'utilize', 'integrate', 'streamline', 'optimize', 'evolve', 'transform', 'embrace', 'enable', 'orchestrate', 'leverage', 'reinvent', 'aggregate', 'architect', 'enhance', 'incentivize', 'morph', 'empower', 'envisioneer', 'monetize', 'harness', 'facilitate', 'seize', 'disintermediate', 'synergize', 'strategize', 'deploy', 'brand', 'grow', 'target', 'syndicate', 'synthesize', 'deliver', 'mesh', 'incubate', 'engage', 'maximize', 'benchmark', 'expedite', 'reintermediate', 'whiteboard', 'visualize', 'repurpose', 'innovate', 'scale', 'unleash', 'drive', 'extend', 'engineer', 'revolutionize', 'generate', 'exploit', 'transition', 'e-enable', 'iterate', 'cultivate', 'matrix', 'productize', 'redefine', 'recontextualize', ), array( - 'clicks-and-mortar', 'value-added', 'vertical', 'proactive', 'robust', 'revolutionary', 'scalable', 'leading-edge', 'innovative', 'intuitive', 'strategic', 'e-business', 'mission-critical', 'sticky', 'one-to-one', '24/7', 'end-to-end', 'global', 'B2B', 'B2C', 'granular', 'frictionless', 'virtual', 'viral', 'dynamic', '24/365', 'best-of-breed', 'killer', 'magnetic', 'bleeding-edge', 'web-enabled', 'interactive', 'dot-com', 'sexy', 'back-end', 'real-time', 'efficient', 'front-end', 'distributed', 'seamless', 'extensible', 'turn-key', 'world-class', 'open-source', 'cross-platform', 'cross-media', 'synergistic', 'bricks-and-clicks', 'out-of-the-box', 'enterprise', 'integrated', 'impactful', 'wireless', 'transparent', 'next-generation', 'cutting-edge', 'user-centric', 'visionary', 'customized', 'ubiquitous', 'plug-and-play', 'collaborative', 'compelling', 'holistic', 'rich' + 'clicks-and-mortar', 'value-added', 'vertical', 'proactive', 'robust', 'revolutionary', 'scalable', 'leading-edge', 'innovative', 'intuitive', 'strategic', 'e-business', 'mission-critical', 'sticky', 'one-to-one', '24/7', 'end-to-end', 'global', 'B2B', 'B2C', 'granular', 'frictionless', 'virtual', 'viral', 'dynamic', '24/365', 'best-of-breed', 'killer', 'magnetic', 'bleeding-edge', 'web-enabled', 'interactive', 'dot-com', 'sexy', 'back-end', 'real-time', 'efficient', 'front-end', 'distributed', 'seamless', 'extensible', 'turn-key', 'world-class', 'open-source', 'cross-platform', 'cross-media', 'synergistic', 'bricks-and-clicks', 'out-of-the-box', 'enterprise', 'integrated', 'impactful', 'wireless', 'transparent', 'next-generation', 'cutting-edge', 'user-centric', 'visionary', 'customized', 'ubiquitous', 'plug-and-play', 'collaborative', 'compelling', 'holistic', 'rich', ), array( - 'synergies', 'web-readiness', 'paradigms', 'markets', 'partnerships', 'infrastructures', 'platforms', 'initiatives', 'channels', 'eyeballs', 'communities', 'ROI', 'solutions', 'e-tailers', 'e-services', 'action-items', 'portals', 'niches', 'technologies', 'content', 'vortals', 'supply-chains', 'convergence', 'relationships', 'architectures', 'interfaces', 'e-markets', 'e-commerce', 'systems', 'bandwidth', 'infomediaries', 'models', 'mindshare', 'deliverables', 'users', 'schemas', 'networks', 'applications', 'metrics', 'e-business', 'functionalities', 'experiences', 'webservices', 'methodologies' - ) + 'synergies', 'web-readiness', 'paradigms', 'markets', 'partnerships', 'infrastructures', 'platforms', 'initiatives', 'channels', 'eyeballs', 'communities', 'ROI', 'solutions', 'e-tailers', 'e-services', 'action-items', 'portals', 'niches', 'technologies', 'content', 'vortals', 'supply-chains', 'convergence', 'relationships', 'architectures', 'interfaces', 'e-markets', 'e-commerce', 'systems', 'bandwidth', 'infomediaries', 'models', 'mindshare', 'deliverables', 'users', 'schemas', 'networks', 'applications', 'metrics', 'e-business', 'functionalities', 'experiences', 'webservices', 'methodologies', + ), + ); + + /** + * Source - http://www.careerplanner.com/ListOfJobs.cfm + */ + protected static $jobTitleFormat = array( + 'Able Seamen', 'Account Manager', 'Accountant', 'Actor', 'Actuary', 'Adjustment Clerk', 'Admin', 'Administrative Law Judge', 'Administrative Services Manager', 'Administrative Support Supervisors', 'Advertising Manager OR Promotions Manager', 'Advertising Sales Agent', 'Aerospace Engineer', 'Agricultural Crop Farm Manager', 'Agricultural Crop Worker', 'Agricultural Engineer', 'Agricultural Equipment Operator', 'Agricultural Inspector', 'Agricultural Manager', 'Agricultural Product Grader Sorter', 'Agricultural Sales Representative', 'Agricultural Science Technician', 'Agricultural Sciences Teacher', 'Agricultural Technician', 'Agricultural Worker', 'Air Crew Member', 'Air Crew Officer', 'Air Traffic Controller', 'Aircraft Assembler', 'Aircraft Body Repairer', 'Aircraft Cargo Handling Supervisor', 'Aircraft Engine Specialist', 'Aircraft Launch and Recovery Officer', 'Aircraft Launch Specialist', 'Aircraft Mechanics OR Aircraft Service Technician', 'Aircraft Rigging Assembler', 'Aircraft Structure Assemblers', 'Airfield Operations Specialist', 'Airframe Mechanic', 'Airline Pilot OR Copilot OR Flight Engineer', 'Algorithm Developer', 'Alteration Tailor', 'Ambulance Driver', 'Amusement Attendant', 'Anesthesiologist', 'Animal Breeder', 'Animal Care Workers', 'Animal Control Worker', 'Animal Husbandry Worker', 'Animal Scientist', 'Animal Trainer', 'Annealing Machine Operator', 'Announcer', 'Answering Service', 'Anthropologist', 'Anthropologist OR Archeologist', 'Anthropology Teacher', 'Appliance Repairer', 'Arbitrator', 'Archeologist', 'Architect', 'Architectural Drafter', 'Architectural Drafter OR Civil Drafter', 'Architecture Teacher', 'Archivist', 'Armored Assault Vehicle Crew Member', 'Armored Assault Vehicle Officer', 'Art Director', 'Art Teacher', 'Artillery Officer', 'Artillery Crew Member', 'Artist', 'Assembler', 'Assessor', 'Astronomer', 'Athletes and Sports Competitor', 'Athletic Trainer', 'Atmospheric and Space Scientist', 'Audio and Video Equipment Technician', 'Audiologist', 'Audio-Visual Collections Specialist', 'Auditor', 'Auditor', 'Automatic Teller Machine Servicer', 'Automotive Body Repairer', 'Automotive Glass Installers', 'Automotive Master Mechanic', 'Automotive Mechanic', 'Automotive Specialty Technician', 'Automotive Technician', 'Auxiliary Equipment Operator', 'Aviation Inspector', 'Avionics Technician', + 'Bailiff', 'Baker', 'Barber', 'Bartender', 'Bartender Helper', 'Battery Repairer', 'Bellhop', 'Bench Jeweler', 'Benefits Specialist', 'Bicycle Repairer', 'Bill and Account Collector', 'Bindery Machine Operator', 'Bindery Worker', 'Biochemist', 'Biochemist or Biophysicist', 'Biological Science Teacher', 'Biological Scientist', 'Biological Technician', 'Biologist', 'Biomedical Engineer', 'Biophysicist', 'Board Of Directors', 'Boat Builder and Shipwright', 'Boiler Operator', 'Boilermaker', 'Bookbinder', 'Bookkeeper', 'Brake Machine Setter', 'Brattice Builder', 'Brazer', 'Brazing Machine Operator', 'Brickmason', 'Bridge Tender OR Lock Tender', 'Broadcast News Analyst', 'Broadcast Technician', 'Brokerage Clerk', 'Budget Analyst', 'Buffing and Polishing Operator', 'Building Cleaning Worker', 'Building Inspector', 'Bulldozer Operator', 'Bus Driver', 'Business Development Manager', 'Business Manager', 'Business Operations Specialist', 'Business Teacher', 'Butcher', 'Buyer', + 'Cabinetmaker', 'Cafeteria Cook', 'Calibration Technician OR Instrumentation Technician', 'Camera Operator', 'Camera Repairer', 'Captain', 'Caption Writer', 'Cardiovascular Technologist', 'Career Counselor', 'Carpenter', 'Carpenter Assembler and Repairer', 'Carpet Installer', 'Cartographer', 'Cartoonist', 'Carver', 'Cashier', 'Casting Machine Operator', 'Casting Machine Set-Up Operator', 'ccc', 'Ceiling Tile Installer', 'Cement Mason and Concrete Finisher', 'Central Office', 'Central Office and PBX Installers', 'Central Office Operator', 'CEO', 'CFO', 'Chef', 'Chemical Engineer', 'Chemical Equipment Controller', 'Chemical Equipment Operator', 'Chemical Equipment Tender', 'Chemical Plant Operator', 'Chemical Technician', 'Chemist', 'Chemistry Teacher', 'Child Care', 'Child Care Worker', 'Chiropractor', 'Choreographer', 'City', 'City Planning Aide', 'Civil Drafter', 'Civil Engineer', 'Civil Engineering Technician', 'Claims Adjuster', 'Claims Examiner', 'Claims Taker', 'Cleaners of Vehicles', 'Clergy', 'Clerk', 'Clinical Laboratory Technician', 'Clinical Psychologist', 'Clinical School Psychologist', 'Coaches and Scout', 'Coating Machine Operator', 'Coil Winders', 'Command Control Center Officer', 'Command Control Center Specialist', 'Commercial and Industrial Designer', 'Commercial Diver', 'Commercial Pilot', 'Communication Equipment Repairer', 'Communication Equipment Worker', 'Communications Equipment Operator', 'Communications Teacher', 'Community Service Manager', 'Compacting Machine Operator', 'Compensation and Benefits Manager', 'Compliance Officers', 'Composer', 'Computer', 'Computer Hardware Engineer', 'Computer Operator', 'Computer Programmer', 'Computer Repairer', 'Computer Science Teacher', 'Computer Scientist', 'Computer Security Specialist', 'Computer Software Engineer', 'Computer Specialist', 'Computer Support Specialist', 'Computer Systems Analyst', 'Computer-Controlled Machine Tool Operator', 'Concierge', 'Conservation Scientist', 'Construction', 'Construction Carpenter', 'Construction Driller', 'Construction Equipment Operator', 'Construction Laborer', 'Construction Manager', 'Continuous Mining Machine Operator', 'Control Valve Installer', 'Conveyor Operator', 'Cook', 'Cooling and Freezing Equipment Operator', 'Copy Machine Operator', 'Copy Writer', 'Coremaking Machine Operator', 'Coroner', 'Corporate Trainer', 'Correctional Officer', 'Correspondence Clerk', 'Cost Estimator', 'Costume Attendant', 'Counseling Psychologist', 'Counselor', 'Counsil', 'Courier', 'Court Clerk', 'Court Reporter', 'Craft Artist', 'Crane and Tower Operator', 'Creative Writer', 'Credit Checkers Clerk', 'Credit Analyst', 'Credit Authorizer', 'Credit Checker', 'Criminal Investigator', 'Crossing Guard', 'Crushing Grinding Machine Operator', 'CSI', 'CTO', 'Cultural Studies Teacher', 'Curator', 'Custom Tailor', 'Customer Service Representative', 'Cutting Machine Operator', 'Cutting Machine Operator', + 'Dancer', 'Data Entry Operator', 'Data Processing Equipment Repairer', 'Database Administrator', 'Database Manager', 'Deburring Machine Operator', 'Decorator', 'Dental Assistant', 'Dental Hygienist', 'Dental Laboratory Technician', 'Dentist', 'Designer', 'Desktop Publisher', 'Detective', 'Diagnostic Medical Sonographer', 'Diamond Worker', 'Diesel Engine Specialist', 'Dietetic Technician', 'Director Of Business Development', 'Director Of Marketing', 'Director Of Social Media Marketing', 'Director Of Talent Acquisition', 'Director Religious Activities', 'Directory Assistance Operator', 'Dishwasher', 'Dispatcher', 'Distribution Manager', 'Door To Door Sales', 'Dot Etcher', 'Drafter', 'Dragline Operator', 'Dredge Operator', 'Drilling and Boring Machine Tool Setter', 'Driver-Sales Worker', 'Drycleaning Machine Operator', 'Drywall Ceiling Tile Installer', 'Drywall Installer', + 'Earth Driller', 'Economics Teacher', 'Economist', 'Editor', 'Education Administrator', 'Education Teacher', 'Educational Counselor OR Vocationall Counselor', 'Educational Psychologist', 'Electric Meter Installer', 'Electric Motor Repairer', 'Electrical and Electronic Inspector and Tester', 'Electrical and Electronics Drafter', 'Electrical Drafter', 'Electrical Engineer', 'Electrical Engineering Technician', 'Electrical Parts Reconditioner', 'Electrical Power-Line Installer', 'Electrical Sales Representative', 'Electrician', 'Electrician', 'Electrolytic Plating Machine Operator', 'Electromechanical Equipment Assembler', 'Electro-Mechanical Technician', 'Electronic Drafter', 'Electronic Engineering Technician', 'Electronic Equipment Assembler', 'Electronic Masking System Operator', 'Electronics Engineer', 'Electronics Engineering Technician', 'Electrotyper', 'Elementary and Secondary School Administrators', 'Elementary School Teacher', 'Elevator Installer and Repairer', 'Eligibility Interviewer', 'Embalmer', 'Embossing Machine Operator', 'Emergency Management Specialist', 'Emergency Medical Technician and Paramedic', 'Employment Interviewer', 'Engine Assembler', 'Engineer', 'Engineering', 'Engineering Manager', 'Engineering Teacher', 'Engineering Technician', 'English Language Teacher', 'Engraver', 'Entertainer and Performer', 'Entertainment Attendant', 'Environmental Compliance Inspector', 'Environmental Engineer', 'Environmental Engineering Technician', 'Environmental Science Teacher', 'Environmental Science Technician', 'Environmental Scientist', 'Epidemiologist', 'Equal Opportunity Representative', 'Etcher', 'Etcher and Engraver', 'Event Planner', 'Excavating Machine Operator', 'Executive Secretary', 'Exhibit Designer', 'Explosives Expert', 'Extraction Worker', 'Extruding and Drawing Machine Operator', 'Extruding Machine Operator', + 'Fabric Mender', 'Fabric Pressers', 'Farm and Home Management Advisor', 'Farm Equipment Mechanic', 'Farm Labor Contractor', 'Farmer', 'Farmworker', 'Fashion Designer', 'Fashion Model', 'Fast Food Cook', 'Fence Erector', 'Fiber Product Cutting Machine Operator', 'Fiberglass Laminator and Fabricator', 'File Clerk', 'Film Laboratory Technician', 'Financial Analyst', 'Financial Examiner', 'Financial Manager', 'Financial Services Sales Agent', 'Financial Specialist', 'Fire Fighter', 'Fire Inspector', 'Fire Investigator', 'Fire-Prevention Engineer', 'First-Line Supervisor-Manager of Landscaping, Lawn Service, and Groundskeeping Worker', 'Fish Game Warden', 'Fish Hatchery Manager', 'Fishery Worker', 'Fishing OR Forestry Supervisor', 'Fitness Trainer', 'Fitter', 'Flight Attendant', 'Floor Finisher', 'Floor Layer', 'Floral Designer', 'Food Batchmaker', 'Food Cooking Machine Operators', 'Food Preparation', 'Food Preparation and Serving Worker', 'Food Preparation Worker', 'Food Science Technician', 'Food Scientists and Technologist', 'Food Servers', 'Food Service Manager', 'Food Tobacco Roasting', 'Foreign Language Teacher', 'Forensic Investigator', 'Forensic Science Technician', 'Forest and Conservation Technician', 'Forest and Conservation Worker', 'Forest Fire Fighter', 'Forest Fire Fighting Supervisor', 'Forest Fire Inspector', 'Forester', 'Forestry Conservation Science Teacher', 'Forging Machine Setter', 'Forming Machine Operator', 'Forming Machine Operator', 'Foundry Mold and Coremaker', 'Fraud Investigator', 'Freight Agent', 'Freight and Material Mover', 'Freight Inspector', 'Funeral Attendant', 'Funeral Director', 'Furnace Operator', 'Furniture Finisher', + 'Gaming Cage Worker', 'Gaming Dealer', 'Gaming Manager', 'Gaming Service Worker', 'Gaming Supervisor', 'Gaming Surveillance Officer', 'Garment', 'Gas Appliance Repairer', 'Gas Compressor Operator', 'Gas Distribution Plant Operator', 'Gas Plant Operator', 'Gas Processing Plant Operator', 'Gas Pumping Station Operator', 'Gas Pumping Station Operator', 'Gauger', 'GED Teacher', 'General Farmworker', 'General Manager', 'General Practitioner', 'Geographer', 'Geography Teacher', 'Geological Data Technician', 'Geological Sample Test Technician', 'Geologist', 'Geoscientists', 'Glass Blower', 'Glass Cutting Machine Operator', 'Glazier', 'Gluing Machine Operator', 'Government', 'Government Property Inspector', 'Government Service Executive', 'Graduate Teaching Assistant', 'Graphic Designer', 'Grinder OR Polisher', 'Grinding Machine Operator', 'Grips', 'Grounds Maintenance Worker', + 'Hairdresser OR Cosmetologist', 'Hand Trimmer', 'Hand Presser', 'Hand Sewer', 'Hazardous Materials Removal Worker', 'Head Nurse', 'Health Educator', 'Health Practitioner', 'Health Services Manager', 'Health Specialties Teacher', 'Health Technologist', 'Healthcare', 'Healthcare Practitioner', 'Healthcare Support Worker', 'Heat Treating Equipment Operator', 'Heaters', 'Heating and Air Conditioning Mechanic', 'Heating Equipment Operator', 'Heavy Equipment Mechanic', 'Highway Maintenance Worker', 'Highway Patrol Pilot', 'Historian', 'History Teacher', 'Hoist and Winch Operator', 'Home', 'Home Appliance Installer', 'Home Appliance Repairer', 'Home Economics Teacher', 'Home Entertainment Equipment Installer', 'Home Health Aide', 'Homeland Security', 'Horticultural Worker', 'Host and Hostess', 'Hotel Desk Clerk', 'House Cleaner', 'Housekeeper', 'Housekeeping Supervisor', 'HR Manager', 'HR Specialist', 'Human Resource Director', 'Human Resource Manager', 'Human Resources Assistant', 'Human Resources Manager', 'Human Resources Specialist', 'Hunter and Trapper', 'HVAC Mechanic', 'Hydrologist', + 'Illustrator', 'Immigration Inspector OR Customs Inspector', 'Industrial Engineer', 'Industrial Engineering Technician', 'Industrial Equipment Maintenance', 'Industrial Machinery Mechanic', 'Industrial Production Manager', 'Industrial Safety Engineer', 'Industrial-Organizational Psychologist', 'Infantry', 'Infantry Officer', 'Information Systems Manager', 'Inspector', 'Installation and Repair Technician', 'Instructional Coordinator', 'Instrument Sales Representative', 'Insulation Installer', 'Insulation Worker', 'Insurance Investigator', 'Insurance Appraiser', 'Insurance Claims Clerk', 'Insurance Policy Processing Clerk', 'Insurance Sales Agent', 'Insurance Underwriter', 'Interaction Designer', 'Interior Designer', 'Internist', 'Interpreter OR Translator', 'Interviewer', 'Irradiated-Fuel Handler', + 'Janitor', 'Janitorial Supervisor', 'Jeweler', 'Jewelry Model OR Mold Makers', 'Job Printer', 'Judge', + 'Keyboard Instrument Repairer and Tuner', 'Kindergarten Teacher', + 'Landscape Architect', 'Landscape Artist', 'Landscaper', 'Landscaping', 'Lathe Operator', 'Laundry OR Dry-Cleaning Worker', 'Law Clerk', 'Law Enforcement Teacher', 'Law Teacher', 'Lawn Service Manager', 'Lawyer', 'Lay-Out Worker', 'Legal Secretary', 'Legal Support Worker', 'Legislator', 'Letterpress Setters Operator', 'Librarian', 'Library Assistant', 'Library Science Teacher', 'Library Technician', 'Library Worker', 'License Clerk', 'Licensed Practical Nurse', 'Licensing Examiner and Inspector', 'Life Science Technician', 'Life Scientists', 'Lifeguard', 'Loading Machine Operator', 'Loan Counselor', 'Loan Interviewer', 'Loan Officer', 'Locker Room Attendant', 'Locksmith', 'Locomotive Engineer', 'Locomotive Firer', 'Lodging Manager', 'Log Grader and Scaler', 'Logging Equipment Operator', 'Logging Supervisor', 'Logging Tractor Operator', 'Logging Worker', 'Logistician', + 'Machine Feeder', 'Machine Operator', 'Machine Tool Operator', 'Machinery Maintenance', 'Machinist', 'Maid', 'Mail Clerk', 'Mail Machine Operator', 'Maintenance and Repair Worker', 'Maintenance Equipment Operator', 'Maintenance Supervisor', 'Maintenance Worker', 'Makeup Artists', 'Management Analyst', 'Manager', 'Manager of Air Crew', 'Manager of Food Preparation', 'Manager of Weapons Specialists', 'Manager Tactical Operations', 'Manicurists', 'Manufactured Building Installer', 'Manufacturing Sales Representative', 'Mapping Technician', 'MARCOM Director', 'MARCOM Manager', 'Marine Architect', 'Marine Cargo Inspector', 'Marine Engineer', 'Marine Oiler', 'Market Research Analyst', 'Marketing Manager', 'Marketing VP', 'Marking Clerk', 'Marking Machine Operator', 'Marriage and Family Therapist', 'Massage Therapist', 'Material Movers', 'Material Moving Worker', 'Materials Engineer', 'Materials Inspector', 'Materials Scientist', 'Mathematical Science Teacher', 'Mathematical Scientist', 'Mathematical Technician', 'Mathematician', 'Meat Packer', 'Mechanical Door Repairer', 'Mechanical Drafter', 'Mechanical Engineer', 'Mechanical Engineering Technician', 'Mechanical Equipment Sales Representative', 'Mechanical Inspector', 'Media and Communication Worker', 'Medical Appliance Technician', 'Medical Assistant', 'Medical Equipment Preparer', 'Medical Equipment Repairer', 'Medical Laboratory Technologist', 'Medical Records Technician', 'Medical Sales Representative', 'Medical Scientists', 'Medical Secretary', 'Medical Technician', 'Medical Transcriptionist', 'Mental Health Counselor', 'Merchandise Displayer OR Window Trimmer', 'Metal Fabricator', 'Metal Molding Operator', 'Metal Pourer and Caster', 'Metal Worker', 'Metal-Refining Furnace Operator', 'Meter Mechanic', 'Microbiologist', 'Middle School Teacher', 'Military Officer', 'Milling Machine Operator', 'Millwright', 'Mine Cutting Machine Operator', 'Mining Engineer OR Geological Engineer', 'Mining Machine Operator', 'Mixing and Blending Machine Operator', 'Model Maker', 'Mold Maker', 'Molder', 'Molding and Casting Worker', 'Molding Machine Operator', 'Motion Picture Projectionist', 'Motor Vehicle Inspector', 'Motor Vehicle Operator', 'Motorboat Mechanic', 'Motorboat Operator', 'Motorcycle Mechanic', 'Movers', 'Movie Director oR Theatre Director', 'Multi-Media Artist', 'Multiple Machine Tool Setter', 'Municipal Clerk', 'Municipal Court Clerk', 'Municipal Fire Fighter', 'Municipal Fire Fighting Supervisor', 'Museum Conservator', 'Music Arranger and Orchestrator', 'Music Composer', 'Music Director', 'Musical Instrument Tuner', 'Musician', 'Musician OR Singer', + 'Natural Sciences Manager', 'Naval Architects', 'Network Admin OR Computer Systems Administrator', 'Network Systems Analyst', 'New Accounts Clerk', 'Night Security Guard', 'Night Shift', 'Nonfarm Animal Caretaker', 'Nuclear Engineer', 'Nuclear Equipment Operation Technician', 'Nuclear Medicine Technologist', 'Nuclear Monitoring Technician', 'Nuclear Power Reactor Operator', 'Nuclear Technician', 'Numerical Control Machine Tool Operator', 'Numerical Tool Programmer OR Process Control Programmer', 'Nursery Manager', 'Nursery Worker', 'Nursing Aide', 'Nursing Instructor', 'Nutritionist', + 'Obstetrician', 'Occupational Health Safety Specialist', 'Occupational Health Safety Technician', 'Occupational Therapist', 'Occupational Therapist Aide', 'Occupational Therapist Assistant', 'Office and Administrative Support Worker', 'Office Clerk', 'Office Machine and Cash Register Servicer', 'Office Machine Operator', 'Offset Lithographic Press Operator', 'Oil and gas Operator', 'Oil Service Unit Operator', 'Online Marketing Analyst', 'Operating Engineer', 'Operations Research Analyst', 'Ophthalmic Laboratory Technician', 'Optical Instrument Assembler', 'Opticians', 'Optometrist', 'Oral Surgeon', 'Order Clerk', 'Order Filler', 'Order Filler OR Stock Clerk', 'Organizational Development Manager', 'Orthodontist', 'Orthotist OR Prosthetist', 'Outdoor Power Equipment Mechanic', + 'Packaging Machine Operator', 'Packer and Packager', 'Painter', 'Painter and Illustrator', 'Painting Machine Operator', 'Pantograph Engraver', 'Paper Goods Machine Operator', 'Paperhanger', 'Paralegal', 'Park Naturalist', 'Parking Enforcement Worker', 'Parking Lot Attendant', 'Parts Salesperson', 'Paste-Up Worker', 'Pastry Chef', 'Patrol Officer', 'Patternmaker', 'Paving Equipment Operator', 'Payroll Clerk', 'Pediatricians', 'Percussion Instrument Repairer', 'Personal Care Worker', 'Personal Financial Advisor', 'Personal Home Care Aide', 'Personal Service Worker', 'Personal Trainer', 'Personnel Recruiter', 'Pest Control Worker', 'Pesticide Sprayer', 'Petroleum Engineer', 'Petroleum Pump Operator', 'Petroleum Pump System Operator', 'Petroleum Technician', 'Pewter Caster', 'Pharmaceutical Sales Representative', 'Pharmacist', 'Pharmacy Aide', 'Pharmacy Technician', 'Philosophy and Religion Teacher', 'Photoengraver', 'Photoengraving Machine Operator', 'Photographer', 'Photographic Restorer', 'Photographic Developer', 'Photographic Process Worker', 'Photographic Processing Machine Operator', 'Photographic Reproduction Technician', 'Physical Scientist', 'Physical Therapist', 'Physical Therapist Aide', 'Physical Therapist Assistant', 'Physician', 'Physician Assistant', 'Physicist', 'Physics Teacher', 'Pile-Driver Operator', 'Pipe Fitter', 'Pipefitter', 'Pipelayer', 'Pipelaying Fitter', 'Plant and System Operator', 'Plant Scientist', 'Plasterer OR Stucco Mason', 'Plastic Molding Machine Operator', 'Plate Finisher', 'Platemaker', 'Plating Machine Operator', 'Plating Operator', 'Plating Operator OR Coating Machine Operator', 'Plumber', 'Plumber OR Pipefitter OR Steamfitter', 'Podiatrist', 'Poet OR Lyricist', 'Police and Sheriffs Patrol Officer', 'Police Detective', 'Police Identification OR Records Officer', 'Political Science Teacher', 'Political Scientist', 'Portable Power Tool Repairer', 'Postal Clerk', 'Postal Service Clerk', 'Postal Service Mail Carrier', 'Postal Service Mail Sorter', 'Postmasters', 'Postsecondary Education Administrators', 'Postsecondary Teacher', 'Potter', 'Poultry Cutter', 'Power Distributors OR Dispatcher', 'Power Generating Plant Operator', 'Power Plant Operator', 'PR Manager', 'Precious Stone Worker', 'Precision Aircraft Systems Assemblers', 'Precision Devices Inspector', 'Precision Dyer', 'Precision Etcher and Engraver', 'Precision Instrument Repairer', 'Precision Lens Grinders and Polisher', 'Precision Mold and Pattern Caster', 'Precision Pattern and Die Caster', 'Precision Printing Worker', 'Prepress Technician', 'Preschool Education Administrators', 'Preschool Teacher', 'Press Machine Setter, Operator', 'Pressing Machine Operator', 'Pressure Vessel Inspector', 'Printing Machine Operator', 'Printing Press Machine Operator', 'Private Detective and Investigator', 'Private Household Cook', 'Private Sector Executive', 'Probation Officers and Correctional Treatment Specialist', 'Procurement Clerk', 'Producer', 'Producers and Director', 'Product Management Leader', 'Product Promoter', 'Product Safety Engineer', 'Product Specialist', 'Production Control Manager', 'Production Helper', 'Production Inspector', 'Production Laborer', 'Production Manager', 'Production Planner', 'Production Planning', 'Production Worker', 'Professional Photographer', 'Professor', 'Program Director', 'Project Manager', 'Proofreaders and Copy Marker', 'Prosthodontist', 'Protective Service Worker', 'Protective Service Worker', 'Psychiatric Aide', 'Psychiatric Technician', 'Psychiatrist', 'Psychologist', 'Psychology Teacher', 'Public Health Social Worker', 'Public Relations Manager', 'Public Relations Specialist', 'Public Transportation Inspector', 'Pump Operators', 'Punching Machine Setters', 'Purchasing Agent', 'Purchasing Manager', + 'Radar Technician', 'Radiation Therapist', 'Radio and Television Announcer', 'Radio Mechanic', 'Radio Operator', 'Radiologic Technician', 'Radiologic Technologist', 'Radiologic Technologist and Technician', 'Rail Car Repairer', 'Rail Transportation Worker', 'Rail Yard Engineer', 'Railroad Conductors', 'Railroad Inspector', 'Railroad Switch Operator', 'Railroad Yard Worker', 'Range Manager', 'Real Estate Appraiser', 'Real Estate Association Manager', 'Real Estate Broker', 'Real Estate Sales Agent', 'Receptionist and Information Clerk', 'Record Clerk', 'Recordkeeping Clerk', 'Recreation and Fitness Studies Teacher', 'Recreation Worker', 'Recreational Therapist', 'Recreational Vehicle Service Technician', 'Recruiter', 'Recyclable Material Collector', 'Refinery Operator', 'Refractory Materials Repairer', 'Refrigeration Mechanic', 'Registered Nurse', 'Rehabilitation Counselor', 'Religious Worker', 'Rental Clerk', 'Reporters OR Correspondent', 'Reservation Agent OR Transportation Ticket Agent', 'Residential Advisor', 'Respiratory Therapist', 'Respiratory Therapy Technician', 'Restaurant Cook', 'Retail Sales person', 'Retail Salesperson', 'Rigger', 'RN', 'Rock Splitter', 'Rolling Machine Setter', 'Roof Bolters Mining', 'Roofer', 'Rotary Drill Operator', 'Rough Carpenter', 'Roustabouts', + 'Safety Engineer', 'Sailor', 'Sales and Related Workers', 'Sales Engineer', 'Sales Manager', 'Sales Person', 'Sales Representative', 'Sawing Machine Operator', 'Sawing Machine Setter', 'Sawing Machine Tool Setter', 'Scanner Operator', 'School Bus Driver', 'School Social Worker', 'Scientific Photographer', 'Screen Printing Machine Operator', 'Sculptor', 'Secondary School Teacher', 'Secretary', 'Securities Sales Agent', 'Security Guard', 'Security Systems Installer OR Fire Alarm Systems Installer', 'Segmental Paver', 'Self-Enrichment Education Teacher', 'Semiconductor Processor', 'Separating Machine Operators', 'Septic Tank Servicer', 'Service Station Attendant', 'Set and Exhibit Designer', 'Set Designer', 'Sewing Machine Operator', 'Shampooer', 'Shear Machine Set-Up Operator', 'Sheet Metal Worker', 'Sheriff', 'Ship Captain', 'Ship Carpenter and Joiner', 'Ship Engineer', 'Ship Mates', 'Ship Pilot', 'Shipping and Receiving Clerk', 'Shoe and Leather Repairer', 'Shoe Machine Operators', 'Short Order Cook', 'Shuttle Car Operator', 'Signal Repairer OR Track Switch Repairer', 'Silversmith', 'Singer', 'Sketch Artist', 'Skin Care Specialist', 'Slot Key Person', 'Social and Human Service Assistant', 'Social Media Marketing Manager', 'Social Science Research Assistant', 'Social Sciences Teacher', 'Social Scientists', 'Social Service Specialists', 'Social Work Teacher', 'Social Worker', 'Sociologist', 'Sociology Teacher', 'Software Engineer', 'Soil Conservationist', 'Soil Scientist', 'Soil Scientist OR Plant Scientist', 'Solderer', 'Soldering Machine Setter', 'Sound Engineering Technician', 'Space Sciences Teacher', 'Special Education Teacher', 'Special Force', 'Special Forces Officer', 'Speech-Language Pathologist', 'Sports Book Writer', 'Spotters', 'Spraying Machine Operator', 'Staff Psychologist', 'State', 'Statement Clerk', 'Stationary Engineer', 'Stationary Engineer OR Boiler Operator', 'Statistical Assistant', 'Statistician', 'Steel Worker', 'Stevedore', 'Stock Broker', 'Stock Clerk', 'Stone Cutter', 'Stone Sawyer', 'Stonemason', 'Stonemason', 'Storage Manager OR Distribution Manager', 'Streetcar Operator', 'Stringed Instrument Repairer and Tuner', 'Structural Iron and Steel Worker', 'Structural Metal Fabricator', 'Substance Abuse Counselor', 'Substance Abuse Social Worker', 'Substation Maintenance', 'Supervisor Correctional Officer', 'Supervisor Fire Fighting Worker', 'Supervisor of Customer Service', 'Supervisor of Police', 'Surgeon', 'Surgical Technologist', 'Survey Researcher', 'Surveying and Mapping Technician', 'Surveying Technician', 'Surveyor', 'Sys Admin', 'System Administrator', + 'Tailor', 'Talent Acquisition Manager', 'Talent Director', 'Tank Car', 'Taper', 'Tax Examiner', 'Tax Preparer', 'Taxi Drivers and Chauffeur', 'Teacher', 'Teacher Assistant', 'Team Assembler', 'Technical Director', 'Technical Program Manager', 'Technical Specialist', 'Technical Writer', 'Telecommunications Equipment Installer', 'Telecommunications Facility Examiner', 'Telecommunications Line Installer', 'Telemarketer', 'Telephone Operator', 'Telephone Station Installer and Repairer', 'Teller', 'Terrazzo Workes and Finisher', 'Textile Cutting Machine Operator', 'Textile Dyeing Machine Operator', 'Textile Knitting Machine Operator', 'Textile Machine Operator', 'Textile Worker', 'Therapist', 'Ticket Agent', 'Tile Setter OR Marble Setter', 'Timing Device Assemblers', 'Tire Builder', 'Tire Changer', 'Title Abstractor', 'Title Examiner', 'Title Searcher', 'Tool and Die Maker', 'Tool Set-Up Operator', 'Tool Sharpener', 'Tour Guide', 'Tractor Operator', 'Tractor-Trailer Truck Driver', 'Traffic Technician', 'Train Crew', 'Trainer', 'Training Manager OR Development Manager', 'Transformer Repairer', 'Transit Police OR Railroad Police', 'Transportation and Material-Moving', 'Transportation Attendant', 'Transportation Equipment Maintenance', 'Transportation Equipment Painters', 'Transportation Inspector', 'Transportation Manager', 'Transportation Worker', 'Travel Agent', 'Travel Clerk', 'Travel Guide', 'Tree Trimmer', 'Truck Driver', 'TSA', 'Typesetter', 'Typesetting Machine Operator', + 'Umpire and Referee', 'Underground Mining', 'University', 'Upholsterer', 'Urban Planner', 'User Experience Manager', 'User Experience Researcher', 'Usher', 'Utility Meter Reader', + 'Valve Repairer OR Regulator Repairer', 'Vending Machine Servicer', 'Veterinarian', 'Veterinary Assistant OR Laboratory Animal Caretaker', 'Veterinary Technician', 'Vice President Of Human Resources', 'Vice President Of Marketing', 'Video Editor', 'Visual Designer', 'Vocational Education Teacher', + 'Waiter', 'Waitress', 'Warehouse', 'Washing Equipment Operator', 'Waste Treatment Plant Operator', 'Watch Repairer', 'Weapons Specialists', 'Web Developer', 'Webmaster', 'Welder', 'Welder', 'Welder and Cutter', 'Welder-Fitter', 'Welding Machine Tender', 'Welding Machine Operator', 'Welding Machine Setter', 'Welfare Eligibility Clerk', 'Well and Core Drill Operator', 'Wellhead Pumper', 'Wholesale Buyer', 'Wind Instrument Repairer', 'Woodworker', 'Woodworking Machine Operator', 'Woodworking Machine Setter', 'Word Processors and Typist', 'Writer OR Author', + 'Zoologists OR Wildlife Biologist', ); protected static $companySuffix = array('Inc', 'and Sons', 'LLC', 'Group', 'PLC', 'Ltd'); + /** + * @link https://www.irs.gov/businesses/small-businesses-self-employed/how-eins-are-assigned-and-valid-ein-prefixes + */ + protected static $einPrefixes = array( + 01, 02, 03, 04, 05, 06, 10, 11, 12, 13, 14, 15, 16, 20, 21, 22, 23, 24, 25, 26, 27, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 71, 72, 73, 74, 75, 76, 77, 80, 81, 82, 83, 84, 85, 86, 87, 88, 90, 91, 92, 93, 94, 95, 98, 99 + ); + /** * @example 'Robust full-range hub' */ @@ -46,7 +84,7 @@ class Company extends \Faker\Provider\Company $result[] = static::randomElement($word); } - return join($result, ' '); + return join(' ', $result); } /** @@ -59,6 +97,20 @@ class Company extends \Faker\Provider\Company $result[] = static::randomElement($word); } - return join($result, ' '); + return join(' ', $result); + } + + /** + * Employer Identification Number (EIN) + * + * @link https://en.wikipedia.org/wiki/Employer_Identification_Number + * @example '12-3456789' + */ + public static function ein() + { + $prefix = static::randomElement(static::$einPrefixes); + $suffix = static::numberBetween(0, 9999999); + + return sprintf("%02d-%07d", $prefix, $suffix); } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Payment.php new file mode 100644 index 00000000..a9248ad8 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Payment.php @@ -0,0 +1,37 @@ +generator->parse($format)); + } + + /** + * NPA-format area code + * + * @see https://en.wikipedia.org/wiki/North_American_Numbering_Plan#Numbering_system + * + * @return string + */ + public static function areaCode() + { + $digits[] = self::numberBetween(2, 9); + $digits[] = self::randomDigit(); + $digits[] = self::randomDigitNot($digits[1]); + + return join('', $digits); + } + + /** + * NXX-format central office exchange code + * + * @see https://en.wikipedia.org/wiki/North_American_Numbering_Plan#Numbering_system + * + * @return string + */ + public static function exchangeCode() + { + $digits[] = self::numberBetween(2, 9); + $digits[] = self::randomDigit(); + + if ($digits[1] === 1) { + $digits[] = self::randomDigitNot(1); + } else { + $digits[] = self::randomDigit(); + } + + return join('', $digits); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Address.php index aa73b98e..783bff43 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Address.php @@ -2,47 +2,20 @@ namespace Faker\Provider\en_ZA; -class Address extends \Faker\Provider\Address +class Address extends \Faker\Provider\en_US\Address { protected static $cityPrefix = array('North', 'East', 'West', 'South', 'New', 'Lake', 'Port'); protected static $citySuffix = array('fontein','town', 'ton', 'land', 'ville', 'berg', 'burgh', 'borough', 'bury', 'view', 'port', 'mouth', 'stad', 'furt', 'chester', 'mouth', 'fort', 'haven', 'side', 'shire'); protected static $buildingNumber = array('#####', '####', '###'); protected static $streetSuffix = array( - 'Alley', 'Avenue', 'Branch', 'Bridge', 'Brook', 'Brooks', 'Burg', 'Burgs', 'Bypass', 'Camp', 'Canyon', 'Cape', 'Causeway', 'Center', 'Centers', 'Circle', 'Circles', 'Cliff', 'Cliffs', 'Club', 'Common', 'Corner', 'Corners', 'Course', 'Court', 'Courts', 'Cove', 'Coves', 'Creek', 'Crescent', 'Crest', 'Crossing', 'Crossroad', 'Curve', 'Dale', 'Dam', 'Divide', 'Drive', 'Drive', 'Drives', 'Estate', 'Estates', 'Expressway', 'Extension', 'Extensions', 'Fall', 'Falls', 'Ferry', 'Field', 'Fields', 'Flat', 'Flats', 'Ford', 'Fords', 'Forest', 'Forge', 'Forges', 'Fork', 'Forks', 'Fort', 'Freeway', 'Garden', 'Gardens', 'Gateway', 'Glen', 'Glens', 'Green', 'Greens', 'Grove', 'Groves', 'Harbor', 'Harbors', 'Haven', 'Heights', 'Highway', 'Hill', 'Hills', 'Hollow', 'Inlet', 'Inlet', 'Island', 'Island', 'Islands', 'Islands', 'Isle', 'Isle', 'Junction', 'Junctions', 'Key', 'Keys', 'Knoll', 'Knolls', 'Lake', 'Lakes', 'Land', 'Landing', 'Lane', 'Light', 'Lights', 'Loaf', 'Lock', 'Locks', 'Locks', 'Lodge', 'Lodge', 'Loop', 'Mall', 'Manor', 'Manors', 'Meadow', 'Meadows', 'Mews', 'Mill', 'Mills', 'Mission', 'Mission', 'Motorway', 'Mount', 'Mountain', 'Mountain', 'Mountains', 'Mountains', 'Neck', 'Orchard', 'Oval', 'Overpass', 'Park', 'Parks', 'Parkway', 'Parkways', 'Pass', 'Passage', 'Path', 'Pike', 'Pine', 'Pines', 'Place', 'Plain', 'Plains', 'Plains', 'Plaza', 'Plaza', 'Point', 'Points', 'Port', 'Port', 'Ports', 'Ports', 'Prairie', 'Prairie', 'Radial', 'Ramp', 'Ranch', 'Rapid', 'Rapids', 'Rest', 'Ridge', 'Ridges', 'River', 'Road', 'Road', 'Roads', 'Roads', 'Route', 'Row', 'Rue', 'Run', 'Shoal', 'Shoals', 'Shore', 'Shores', 'Skyway', 'Spring', 'Springs', 'Springs', 'Spur', 'Spurs', 'Square', 'Square', 'Squares', 'Squares', 'Station', 'Station', 'Stravenue', 'Stravenue', 'Stream', 'Stream', 'Street', 'Street', 'Streets', 'Summit', 'Summit', 'Terrace', 'Throughway', 'Trace', 'Track', 'Trafficway', 'Trail', 'Trail', 'Tunnel', 'Tunnel', 'Turnpike', 'Turnpike', 'Underpass', 'Union', 'Unions', 'Valley', 'Valleys', 'Via', 'Viaduct', 'View', 'Views', 'Village', 'Village', 'Villages', 'Ville', 'Vista', 'Vista', 'Walk', 'Walks', 'Wall', 'Way', 'Ways', 'Well', 'Wells' + 'Alley', 'Avenue', 'Branch', 'Bridge', 'Brook', 'Brooks', 'Burg', 'Burgs', 'Bypass', 'Camp', 'Canyon', 'Cape', 'Causeway', 'Center', 'Centers', 'Circle', 'Circles', 'Cliff', 'Cliffs', 'Club', 'Common', 'Corner', 'Corners', 'Course', 'Court', 'Courts', 'Cove', 'Coves', 'Creek', 'Crescent', 'Crest', 'Crossing', 'Crossroad', 'Curve', 'Dale', 'Dam', 'Divide', 'Drive', 'Drive', 'Drives', 'Estate', 'Estates', 'Expressway', 'Extension', 'Extensions', 'Fall', 'Falls', 'Ferry', 'Field', 'Fields', 'Flat', 'Flats', 'Ford', 'Fords', 'Forest', 'Forge', 'Forges', 'Fork', 'Forks', 'Fort', 'Freeway', 'Garden', 'Gardens', 'Gateway', 'Glen', 'Glens', 'Green', 'Greens', 'Grove', 'Groves', 'Harbor', 'Harbors', 'Haven', 'Heights', 'Highway', 'Hill', 'Hills', 'Hollow', 'Inlet', 'Inlet', 'Island', 'Island', 'Islands', 'Islands', 'Isle', 'Isle', 'Junction', 'Junctions', 'Key', 'Keys', 'Knoll', 'Knolls', 'Lake', 'Lakes', 'Land', 'Landing', 'Lane', 'Light', 'Lights', 'Loaf', 'Lock', 'Locks', 'Locks', 'Lodge', 'Lodge', 'Loop', 'Mall', 'Manor', 'Manors', 'Meadow', 'Meadows', 'Mews', 'Mill', 'Mills', 'Mission', 'Mission', 'Motorway', 'Mount', 'Mountain', 'Mountain', 'Mountains', 'Mountains', 'Neck', 'Orchard', 'Oval', 'Overpass', 'Park', 'Parks', 'Parkway', 'Parkways', 'Pass', 'Passage', 'Path', 'Pike', 'Pine', 'Pines', 'Place', 'Plain', 'Plains', 'Plains', 'Plaza', 'Plaza', 'Point', 'Points', 'Port', 'Port', 'Ports', 'Ports', 'Prairie', 'Prairie', 'Radial', 'Ramp', 'Ranch', 'Rapid', 'Rapids', 'Rest', 'Ridge', 'Ridges', 'River', 'Road', 'Road', 'Roads', 'Roads', 'Route', 'Row', 'Rue', 'Run', 'Shoal', 'Shoals', 'Shore', 'Shores', 'Skyway', 'Spring', 'Springs', 'Springs', 'Spur', 'Spurs', 'Square', 'Square', 'Squares', 'Squares', 'Station', 'Station', 'Stravenue', 'Stravenue', 'Stream', 'Stream', 'Street', 'Street', 'Streets', 'Summit', 'Summit', 'Terrace', 'Throughway', 'Trace', 'Track', 'Trafficway', 'Trail', 'Trail', 'Tunnel', 'Tunnel', 'Turnpike', 'Turnpike', 'Underpass', 'Union', 'Unions', 'Valley', 'Valleys', 'Via', 'Viaduct', 'View', 'Views', 'Village', 'Village', 'Villages', 'Ville', 'Vista', 'Vista', 'Walk', 'Walks', 'Wall', 'Way', 'Ways', 'Well', 'Wells', ); protected static $postcode = array('####'); protected static $province = array( - 'Eastern Cape', 'Free State', 'Gauteng', 'KwaZulu-Natal', 'Limpopo', 'Mpumalanga', 'North-West', 'Northern Cape', 'Western Cape' + 'Eastern Cape', 'Free State', 'Gauteng', 'KwaZulu-Natal', 'Limpopo', 'Mpumalanga', 'North-West', 'Northern Cape', 'Western Cape', ); protected static $provinceAbbr = array( - 'EC', 'FS', 'GP', 'KZN', 'LP', 'MP', 'NW', 'NC', 'WC' - ); - protected static $country = array( - 'Afghanistan', 'Albania', 'Algeria', 'American Samoa', 'Andorra', 'Angola', 'Anguilla', 'Antarctica (the territory South of 60 deg S)', 'Antigua and Barbuda', 'Argentina', 'Armenia', 'Aruba', 'Australia', 'Austria', 'Azerbaijan', - 'Bahamas', 'Bahrain', 'Bangladesh', 'Barbados', 'Belarus', 'Belgium', 'Belize', 'Benin', 'Bermuda', 'Bhutan', 'Bolivia', 'Bosnia and Herzegovina', 'Botswana', 'Bouvet Island (Bouvetoya)', 'Brazil', 'British Indian Ocean Territory (Chagos Archipelago)', 'British Virgin Islands', 'Brunei Darussalam', 'Bulgaria', 'Burkina Faso', 'Burundi', - 'Cambodia', 'Cameroon', 'Canada', 'Cape Verde', 'Cayman Islands', 'Central African Republic', 'Chad', 'Chile', 'China', 'Christmas Island', 'Cocos (Keeling) Islands', 'Colombia', 'Comoros', 'Congo', 'Cook Islands', 'Costa Rica', 'Cote d\'Ivoire', 'Croatia', 'Cuba', 'Cyprus', 'Czech Republic', - 'Denmark', 'Djibouti', 'Dominica', 'Dominican Republic', - 'Ecuador', 'Egypt', 'El Salvador', 'Equatorial Guinea', 'Eritrea', 'Estonia', 'Ethiopia', - 'Faroe Islands', 'Falkland Islands (Malvinas)', 'Fiji', 'Finland', 'France', 'French Guiana', 'French Polynesia', 'French Southern Territories', - 'Gabon', 'Gambia', 'Georgia', 'Germany', 'Ghana', 'Gibraltar', 'Greece', 'Greenland', 'Grenada', 'Guadeloupe', 'Guam', 'Guatemala', 'Guernsey', 'Guinea', 'Guinea-Bissau', 'Guyana', - 'Haiti', 'Heard Island and McDonald Islands', 'Holy See (Vatican City State)', 'Honduras', 'Hong Kong', 'Hungary', - 'Iceland', 'India', 'Indonesia', 'Iran', 'Iraq', 'Ireland', 'Isle of Man', 'Israel', 'Italy', - 'Jamaica', 'Japan', 'Jersey', 'Jordan', - 'Kazakhstan', 'Kenya', 'Kiribati', 'Korea', 'Korea', 'Kuwait', 'Kyrgyz Republic', - 'Lao People\'s Democratic Republic', 'Latvia', 'Lebanon', 'Lesotho', 'Liberia', 'Libyan Arab Jamahiriya', 'Liechtenstein', 'Lithuania', 'Luxembourg', - 'Macao', 'Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands', 'Martinique', 'Mauritania', 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', 'Moldova', 'Monaco', 'Mongolia', 'Montenegro', 'Montserrat', 'Morocco', 'Mozambique', 'Myanmar', - 'Namibia', 'Nauru', 'Nepal', 'Netherlands Antilles', 'Netherlands', 'New Caledonia', 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Norfolk Island', 'Northern Mariana Islands', 'Norway', - 'Oman', - 'Pakistan', 'Palau', 'Palestinian Territory', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico', - 'Qatar', - 'Reunion', 'Romania', 'Russian Federation', 'Rwanda', - 'Saint Barthelemy', 'Saint Helena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Martin', 'Saint Pierre and Miquelon', 'Saint Vincent and the Grenadines', 'Samoa', 'San Marino', 'Sao Tome and Principe', 'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovakia (Slovak Republic)', 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa', 'South Georgia and the South Sandwich Islands', 'Spain', 'Sri Lanka', 'Sudan', 'Suriname', 'Svalbard & Jan Mayen Islands', 'Swaziland', 'Sweden', 'Switzerland', 'Syrian Arab Republic', - 'Taiwan', 'Tajikistan', 'Tanzania', 'Thailand', 'Timor-Leste', 'Togo', 'Tokelau', 'Tonga', 'Trinidad and Tobago', 'Tunisia', 'Turkey', 'Turkmenistan', 'Turks and Caicos Islands', 'Tuvalu', - 'Uganda', 'Ukraine', 'United Arab Emirates', 'United Kingdom', 'United States of America', 'United States Minor Outlying Islands', 'United States Virgin Islands', 'Uruguay', 'Uzbekistan', - 'Vanuatu', 'Venezuela', 'Vietnam', - 'Wallis and Futuna', 'Western Sahara', - 'Yemen', - 'Zambia', 'Zimbabwe' + 'EC', 'FS', 'GP', 'KZN', 'LP', 'MP', 'NW', 'NC', 'WC', ); protected static $cityFormats = array( '{{cityPrefix}} {{firstName}}{{citySuffix}}', @@ -52,7 +25,7 @@ class Address extends \Faker\Provider\Address ); protected static $streetNameFormats = array( '{{firstName}} {{streetSuffix}}', - '{{lastName}} {{streetSuffix}}' + '{{lastName}} {{streetSuffix}}', ); protected static $streetAddressFormats = array( '{{buildingNumber}} {{streetName}}', diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Company.php new file mode 100644 index 00000000..ddb987aa --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Company.php @@ -0,0 +1,29 @@ +format('Y'), + static::randomNumber(6, true), + static::randomElement(static::$legalEntities) + ); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Internet.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Internet.php index 83f2a4eb..0c5c5f40 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Internet.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Internet.php @@ -5,5 +5,14 @@ namespace Faker\Provider\en_ZA; class Internet extends \Faker\Provider\Internet { protected static $freeEmailDomain = array('gmail.com', 'yahoo.com', 'hotmail.com', 'webmail.co.za', 'vodamail.co.za'); - protected static $tld = array('co.za', 'co.za', 'co.za', 'co.za', 'com', 'com', 'net'); + + /** + * @see https://en.wikipedia.org/wiki/.za + */ + protected static $tld = array( + 'co.za', 'co.za', 'co.za', 'co.za', 'com', 'com', 'net', 'gov.za', 'ac.za', 'edu.za', 'law.za', 'mil.za', + 'net.za', 'nom.za', 'org.za', 'school.za', 'ecape.school.za', 'fs.school.za', 'gp.school.za', 'kzn.school.za', + 'mpm.za', 'ncape.school.za', 'lp.school.za', 'nw.school.za', 'wcape.school.za', 'web.za', 'agric.za', 'nis.za', + 'grondar.za', + ); } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Person.php index 1750b3b0..d44d4731 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Person.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Person.php @@ -2,6 +2,8 @@ namespace Faker\Provider\en_ZA; +use Faker\Calculator\Luhn; + class Person extends \Faker\Provider\Person { protected static $maleNameFormats = array( @@ -15,10 +17,10 @@ class Person extends \Faker\Provider\Person '{{firstNameFemale}} {{lastName}}', '{{firstNameFemale}} {{lastName}}', '{{firstNameFemale}} {{lastName}}', - '{{titleFemale}} {{$firstNameFemale}} {{lastName}}', + '{{titleFemale}} {{firstNameFemale}} {{lastName}}', ); - protected static $firstNameMale =array( + protected static $firstNameMale = array( 'Abraham', 'Adriaan', 'Adrian', 'Ahmed', 'Alan', 'Albert', 'Alex', 'Alexander', 'Alfred', 'Allan', 'Andile', 'Andre', 'Andrew', 'André', 'Anthony', 'Anton', 'Arnold', 'Arthur', 'Ayanda', 'Barry', 'Ben', 'Benjamin', 'Bernard', 'Bongani', 'Bradley', 'Brandon', 'Brent', 'Brett', 'Brian', 'Bruce', 'Bryan', 'Carel', 'Carl', 'Charl', 'Charles', 'Chris', 'Christiaan', @@ -121,6 +123,56 @@ class Person extends \Faker\Provider\Person 'Mulder', 'Enslin', 'Truter', 'Khuzwayo', 'Makhanya', 'Harmse', 'Loubser', 'Kleynhans', 'Paul', 'Nieuwoudt', 'Horn', 'Vosloo', 'Wentzel', 'Munyai', 'Kelly', 'Walters', 'Nzimande', 'Hoosen', 'Mkhabela', 'Madlala', 'Saunders', 'Palmer', 'Hughes', 'Hanekom', 'Ally', 'Schmidt', 'Butler', 'Mtsweni', 'Maphumulo', 'Manamela', 'Hoffman', 'Wolmarans', 'Duma', - 'Pule', 'Hlophe', 'Miya', 'Moagi' + 'Pule', 'Hlophe', 'Miya', 'Moagi', ); + + protected static $titleMale = array('Mr.', 'Dr.', 'Prof.', 'Rev.', 'Hon.'); + + protected static $titleFemale = array('Mrs.', 'Ms.', 'Miss', 'Dr.', 'Prof.', 'Rev.', 'Hon.'); + + protected static $licenceCodes = array('A', 'A1', 'B', 'C', 'C1', 'C2', 'EB', 'EC', 'EC1', 'I', 'L', 'L1'); + + /** + * @link https://en.wikipedia.org/wiki/National_identification_number#South_Africa + * + * @param \DateTime $birthdate + * @param bool $citizen + * @param string $gender + * + * @return string + */ + public function idNumber(\DateTime $birthdate = null, $citizen = true, $gender = null) + { + if (!$birthdate) { + $birthdate = $this->generator->dateTimeThisCentury(); + } + $birthDateString = $birthdate->format('ymd'); + switch (strtolower($gender)) { + case static::GENDER_FEMALE: + $genderDigit = self::numberBetween(0, 4); + break; + case static::GENDER_MALE: + $genderDigit = self::numberBetween(5, 9); + break; + default: + $genderDigit = self::numberBetween(0, 9); + } + $sequenceDigits = str_pad(self::randomNumber(3), 3, 0, STR_PAD_BOTH); + $citizenDigit = ($citizen === true) ? '0' : '1'; + $raceDigit = self::numberBetween(8, 9); + + $partialIdNumber = $birthDateString . $genderDigit . $sequenceDigits . $citizenDigit . $raceDigit; + + return $partialIdNumber . Luhn::computeCheckDigit($partialIdNumber); + } + + /** + * @see https://en.wikipedia.org/wiki/Driving_licence_in_South_Africa + * + * @return string + */ + public function licenceCode() + { + return static::randomElement(static::$licenceCodes); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/PhoneNumber.php index 9de202d2..02a364d1 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/PhoneNumber.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/PhoneNumber.php @@ -5,13 +5,96 @@ namespace Faker\Provider\en_ZA; class PhoneNumber extends \Faker\Provider\PhoneNumber { protected static $formats = array( - '+27(##)##########', - '+(#)##########', - '08#########', - '07########', - '0##-###-####', - '(0##)###-####', - '0-800-###-####', - '### ####' + '+27({{areaCode}})#######', + '+27{{areaCode}}#######', + '0{{areaCode}}#######', + '0{{areaCode}} ### ####', + '0{{areaCode}}-###-####', ); + + protected static $cellphoneFormats = array( + '+27{{cellphoneCode}}#######', + '0{{cellphoneCode}}#######', + '0{{cellphoneCode}} ### ####', + '0{{cellphoneCode}}-###-####', + ); + + protected static $specialFormats = array( + '{{specialCode}}#######', + '{{specialCode}} ### ####', + '{{specialCode}}-###-####', + '({{specialCode}})###-####', + ); + + protected static $tollFreeAreaCodes = array( + '0800', '0860', '0861', '0862', + ); + + /** + * @see https://en.wikipedia.org/wiki/Telephone_numbers_in_South_Africa + */ + public static function areaCode() + { + $digits[] = self::numberBetween(1, 5); + switch ($digits[0]) { + case 1: + $digits[] = self::numberBetween(1, 8); + break; + case 2: + $number = self::numberBetween(1, 8); + $digits[] = in_array($number, array(5, 6)) ? $number + 2 : $number; + break; + case 3: + $number = self::numberBetween(1, 8); + $digits[] = in_array($number, array(7, 8)) ? $number - 2 : $number; + break; + case 4: + $digits[] = self::numberBetween(1, 9); + break; + case 5: + $number = self::numberBetween(1, 8); + $digits[] = in_array($number, array(2, 5)) ? $number + 2 : $number; + break; + } + + return implode('', $digits); + } + + public static function cellphoneCode() + { + $digits[] = self::numberBetween(6, 8); + switch ($digits[0]) { + case 6: + $digits[] = self::numberBetween(0, 2); + break; + case 7: + $number = self::numberBetween(1, 9); + $digits[] = in_array($number, array(5, 7)) ? $number + 1 : $number; + break; + case 8: + $digits[] = self::numberBetween(1, 9); + break; + } + + return implode('', $digits); + } + + public static function specialCode() + { + return static::randomElement(static::$tollFreeAreaCodes); + } + + public function mobileNumber() + { + $format = static::randomElement(static::$cellphoneFormats); + + return self::numerify($this->generator->parse($format)); + } + + public function tollFreeNumber() + { + $format = static::randomElement(static::$specialFormats); + + return self::numerify($this->generator->parse($format)); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Address.php index 7510a268..70f503f0 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Address.php @@ -2,14 +2,12 @@ namespace Faker\Provider\es_AR; -class Address extends \Faker\Provider\Address +class Address extends \Faker\Provider\es_ES\Address { protected static $cityPrefix = array('San', 'Puerto', 'Villa', 'Gral.', 'Don'); protected static $citySuffix = array('del Mar', 'del Norte', 'del Este', 'del Sur', 'del Oeste', 'del Mirador'); protected static $buildingNumber = array('#####', '####', '###', '##', '#'); - protected static $streetSuffix = array( - '' - ); + protected static $streetSuffix = array(''); protected static $postcode = array('####', '#####'); protected static $state = array( 'Buenos Aires', 'Catamarca', 'Chaco', 'Chubut', 'Córdoba', 'Corrientes', 'Entre Ríos', 'Formosa', 'Jujuy', 'La Pampa', 'La Rioja', 'Mendoza', 'Misiones', 'Neuquén', 'Río Negro', 'Salta', 'San Juan', 'San Luis', 'Santa Cruz', 'Santa Fe', 'Santiago del Estero', 'Tierra del Fuego, Antártida e Islas del Atlántico Sur', 'Tucumán' @@ -17,31 +15,6 @@ class Address extends \Faker\Provider\Address protected static $stateAbbr = array( 'AR-B', 'AR-K', 'AR-H', 'AR-U', 'AR-X', 'AR-W', 'AR-E', 'AR-P', 'AR-Y', 'AR-L', 'AR-F', 'AR-M', 'AR-N', 'AR-Q', 'AR-R', 'AR-A', 'AR-J', 'AR-D', 'AR-Z', 'AR-S', 'AR-G', 'AR-V', 'AR-T' ); - protected static $country = array( - 'Afganistán', 'Albania', 'Alemania', 'Andorra', 'Angola', 'Antigua y Barbuda', 'Arabia Saudí', 'Argelia', 'Argentina', 'Armenia', 'Australia', 'Austria', 'Azerbaiyán', - 'Bahamas', 'Bangladés', 'Barbados', 'Baréin', 'Belice', 'Benín', 'Bielorrusia', 'Birmania', 'Bolivia', 'Bosnia-Herzegovina', 'Botsuana', 'Brasil', 'Brunéi Darusalam', 'Bulgaria', 'Burkina Faso', 'Burundi', 'Bután', 'Bélgica', - 'Cabo Verde', 'Camboya', 'Camerún', 'Canadá', 'Catar', 'Chad', 'Chile', 'China', 'Chipre', 'Ciudad del Vaticano', 'Colombia', 'Comoras', 'Congo', 'Corea del Norte', 'Corea del Sur', 'Costa Rica', 'Costa de Marfil', 'Croacia', 'Cuba', - 'Dinamarca', 'Dominica', - 'Ecuador', 'Egipto', 'El Salvador', 'Emiratos Ãrabes Unidos', 'Eritrea', 'Eslovaquia', 'Eslovenia', 'España', 'Estados Unidos de América', 'Estonia', 'Etiopía', - 'Filipinas', 'Finlandia', 'Fiyi', 'Francia', - 'Gabón', 'Gambia', 'Georgia', 'Ghana', 'Granada', 'Grecia', 'Guatemala', 'Guinea', 'Guinea Ecuatorial', 'Guinea-Bisáu', 'Guyana', - 'Haití', 'Honduras', 'Hungría', - 'India', 'Indonesia', 'Irak', 'Irlanda', 'Irán', 'Islandia', 'Islas Marshall', 'Islas Salomón', 'Israel', 'Italia', - 'Jamaica', 'Japón', 'Jordania', - 'Kazajistán', 'Kenia', 'Kirguistán', 'Kiribati', 'Kuwait', - 'Laos', 'Lesoto', 'Letonia', 'Liberia', 'Libia', 'Liechtenstein', 'Lituania', 'Luxemburgo', 'Líbano', - 'Macedonia', 'Madagascar', 'Malasia', 'Malaui', 'Maldivas', 'Mali', 'Malta', 'Marruecos', 'Mauricio', 'Mauritania', 'Micronesia', 'Moldavia', 'Mongolia', 'Montenegro', 'Mozambique', 'México', 'Mónaco', - 'Namibia', 'Nauru', 'Nepal', 'Nicaragua', 'Nigeria', 'Noruega', 'Nueva Zelanda', 'Níger', - 'Omán', - 'Pakistán', 'Palaos', 'Panamá', 'Papúa Nueva Guinea', 'Paraguay', 'Países Bajos', 'Perú', 'Polonia', 'Portugal', - 'Reino Unido', 'Reino Unido de Gran Bretaña e Irlanda del Norte', 'República Centroafricana', 'República Checa', 'República Democrática del Congo', 'República Dominicana', 'Ruanda', 'Rumanía', 'Rusia', - 'Samoa', 'San Cristóbal y Nieves', 'San Marino', 'San Vicente y las Granadinas', 'Santa Lucía', 'Santo Tomé y Príncipe', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leona', 'Singapur', 'Siria', 'Somalia', 'Sri Lanka', 'Suazilandia', 'Sudáfrica', 'Sudán', 'Suecia', 'Suiza', 'Surinam', - 'Tailandia', 'Tanzania', 'Tayikistán', 'Timor Oriental', 'Togo', 'Tonga', 'Trinidad y Tobago', 'Turkmenistán', 'Turquía', 'Tuvalu', 'Túnez', - 'Ucrania', 'Uganda', 'Uruguay', 'Uzbekistán', - 'Vanuatu', 'Venezuela', 'Vietnam', - 'Yemen', 'Yibuti', - 'Zambia', 'Zimbabue' - ); protected static $cityFormats = array( '{{cityPrefix}} {{firstName}} {{citySuffix}}', '{{cityPrefix}} {{firstName}}', diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Company.php index 8e33f57c..b255ef6c 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Company.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Company.php @@ -48,7 +48,7 @@ class Company extends \Faker\Provider\Company $result[] = static::randomElement($word); } - return join($result, ' '); + return join(' ', $result); } /** @@ -61,6 +61,6 @@ class Company extends \Faker\Provider\Company $result[] = static::randomElement($word); } - return join($result, ' '); + return join(' ', $result); } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Person.php index 4ec70f15..1c16f386 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Person.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Person.php @@ -39,12 +39,12 @@ class Person extends \Faker\Provider\Person protected static $firstNameFemale = array( 'Abigail', 'Abril', 'Adriana', 'Agustina', 'Alejandra', 'Alessandra', 'Alexa', 'Allison', 'Alma', 'Amanda', 'Amelia', 'Ana', 'Ana Paula', 'Ana Sofía', 'Andrea', 'Antonella', 'Antonia', 'Ariadna', 'Ariana', 'Ashley', 'Bianca', 'Camila', 'Carla', 'Carolina', 'Catalina', - 'Clara', 'Constanza', 'Daniela', 'Delfina', 'Elena ', 'Elizabeth', 'Emilia', 'Emily', 'Emma', 'Fabiana', 'Florencia', 'Fátima ', + 'Clara', 'Constanza', 'Daniela', 'Delfina', 'Elena', 'Elizabeth', 'Emilia', 'Emily', 'Emma', 'Fabiana', 'Florencia', 'Fátima', 'Gabriela', 'Guadalupe', 'Irene', 'Isabel', 'Isabella', 'Isidora', 'Ivanna', 'Jazmín', 'Josefa', 'Josefina', 'Juana', 'Julia', 'Juliana', 'Julieta', 'Laura', 'Lola', 'Luana', 'Luciana', 'Lucía', 'Luna', 'Magdalena', 'Maite', 'Malena', 'Manuela', 'Mariana', 'Mariangel', 'Martina', 'María', 'María Alejandra', 'María Camila', 'María Fernanda', 'María José', 'María Paula', 'Micaela', 'Michelle', 'Miranda', 'Montserrat', 'Mía', 'Nadia', 'Natalia', 'Nicole', 'Oliva', 'Olivia', 'Ornela', 'Paula', 'Paulina', 'Rafaela', 'Rebeca', - 'Regina', 'Renata', 'Romina', 'Salomé', 'Samantha', 'Sara', 'Silvana ', 'Sofía', 'Sophie', 'Valentina', 'Valeria', 'Valery ', + 'Regina', 'Renata', 'Romina', 'Salomé', 'Samantha', 'Sara', 'Silvana', 'Sofía', 'Sophie', 'Valentina', 'Valeria', 'Valery', 'Victoria', 'Violeta', 'Zoe', 'Aitana', 'Sara Sofía', 'Ximena' ); diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Address.php index 89f73b11..ee9f1e7a 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Address.php @@ -8,14 +8,14 @@ class Address extends \Faker\Provider\Address protected static $citySuffix = array('del Vallès', 'del Penedès', 'del Bages', 'de Ulla', 'de Lemos', 'del Mirador', 'de Arriba', 'de la Sierra', 'del Barco', 'de San Pedro', 'del Pozo', 'del Puerto', 'de las Torres', 'Alta', 'Baja', 'Medio'); protected static $buildingNumber = array('###', '##', '#'); protected static $streetPrefix = array( - 'Calle', 'Avenida', 'Plaza', 'Paseo', 'Ronda', 'Travesia', 'Camino', 'Carrer', 'Avinguda', 'Plaça', 'Passeig', 'Travessera', 'Rúa', 'Praza', 'Ruela', 'Camiño' + 'Calle', 'Avenida', 'Plaza', 'Paseo', 'Ronda', 'Travesía', 'Camino', 'Carrer', 'Avinguda', 'Plaça', 'Passeig', 'Travessera', 'Rúa', 'Praza', 'Ruela', 'Camiño' ); protected static $postcode = array('#####'); protected static $community = array( 'Andalucía', 'Aragón', 'Principado de Asturias', 'Illes Balears', 'Canarias', 'Cantabria', 'Castilla y León', 'Castilla - La Mancha', 'Cataluña', 'Comunitat Valenciana', 'Extremadura', 'Galicia', 'Comunidad de Madrid', 'Región de Murcia', 'Comunidad Foral de Navarra', 'País Vasco', 'La Rioja', 'Ceuta', 'Melilla' ); protected static $state = array( - 'A Coruña', 'Alava', 'Albacete', 'Alicante', 'Almería', 'Asturias', 'Avila', 'Badajoz', 'Barcelona', 'Burgos', 'Cáceres', 'Cádiz', 'Cantabria', 'Castellón', 'Ceuta', 'Ciudad Real', 'Cuenca', 'Córdoba', 'Girona', 'Granada', 'Guadalajara', 'Guipuzkoa', 'Huelva', 'Huesca', 'Illes Balears', 'Jaén', 'La Rioja', 'Las Palmas', 'León', 'Lleida', 'Lugo', 'Málaga', 'Madrid', 'Melilla', 'Murcia', 'Navarra', 'Ourense', 'Palencia', 'Pontevedra', 'Salamanca', 'Segovia', 'Sevilla', 'Soria', 'Sta Cruz De Tenerife', 'Tarragona', 'Teruel', 'Toledo', 'Valencia', 'Valladolid', 'Vizcaya', 'Zamora', 'Zaragoza' + 'A Coruña', 'Ãlava', 'Albacete', 'Alicante', 'Almería', 'Asturias', 'Ãvila', 'Badajoz', 'Barcelona', 'Burgos', 'Cáceres', 'Cádiz', 'Cantabria', 'Castellón', 'Ceuta', 'Ciudad Real', 'Cuenca', 'Córdoba', 'Girona', 'Granada', 'Guadalajara', 'Guipuzkoa', 'Huelva', 'Huesca', 'Illes Balears', 'Jaén', 'La Rioja', 'Las Palmas', 'León', 'Lleida', 'Lugo', 'Málaga', 'Madrid', 'Melilla', 'Murcia', 'Navarra', 'Ourense', 'Palencia', 'Pontevedra', 'Salamanca', 'Segovia', 'Sevilla', 'Soria', 'Santa Cruz de Tenerife', 'Tarragona', 'Teruel', 'Toledo', 'Valencia', 'Valladolid', 'Vizcaya', 'Zamora', 'Zaragoza' ); protected static $country = array( 'Afganistán','Albania','Alemania','Andorra','Angola','Antigua y Barbuda','Arabia Saudí','Argelia','Argentina','Armenia','Australia','Austria','Azerbaiyán', diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Color.php b/vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Color.php new file mode 100644 index 00000000..99f43324 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Color.php @@ -0,0 +1,24 @@ +numberBetween($min = 10000, $max = 100000000); + $id = static::randomElement(static::$nationalityId); + if ($id == 'V') { + return $id . $separator . $this->numberBetween(10000, 100000000); + } + + return $id . $separator . $this->numberBetween(80000000, 100000000); } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/et_EE/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/et_EE/Person.php new file mode 100644 index 00000000..1589a4b3 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/et_EE/Person.php @@ -0,0 +1,89 @@ + + */ +class Person extends \Faker\Provider\Person +{ + /** + * @link https://news.err.ee/114745/most-popular-baby-names-of-2014 + * @link https://www.stat.ee/public/apps/nimed/TOP + */ + protected static $firstNameMale = array( + "Andrei", "Aleksei", "Andres", "Alexander", "Aivar", "Aleksander", "Artur", "Andrus", "Ants", "Artjom", "Anatoli", "Anton", "Arvo", "Aare", "Ain", "Aleksandr", + "Dmitri", "Daniil", "Daniel", + "Eduard", "Erik", "Enn", + "Fjodorov", + "Gennadi", + "Heino", "Henri", "Hugo", + "Igor", "Indrek", "Ivan", "Ilja", + "Jüri", "Jaan", "Jevgeni", "Jaanus", "Janek", "Jaak", + "Kristjan", "Kalev", "Karl", "Kalle", "Kaido", "Kevin", "Konstantin", "Kaspar", "Kirill", "Kristo", "Kalju", "Kristofer", + "Lauri", "Lembit", "Laur", + "Martin", "Margus", "Maksim", "Marko", "Mati", "Meelis", "Mihhail", "Marek", "Mihkel", "Mart", "Madis", "Markus", "Mark", "Marten", + "Nikolai", "Nikita", "Nikolay", + "Oleg", "Oliver", "Oskar", + "Peeter", "Priit", "Pavel", + "Rein", "Roman", "Raivo", "Rasmus", "Raul", "Robert", "Riho", "Robin", "Romet", + "Sergei", "Sander", "Sergey", "Siim", "Silver", "Sebastian", + "Toomas", "Tarmo", "Tõnu", "Tiit", "Tanel", "Taavi", "Toivo", "Tõnis", + "Urmas", "Ülo", + "Vladimir", "Viktor", "Valeri", "Vello", "Vadim", "Vitali", "Vladislav", "VjatÅ¡eslav", "Victor", + ); + + /** + * @link https://news.err.ee/114745/most-popular-baby-names-of-2014 + * @link https://www.stat.ee/public/apps/nimed/TOP + */ + protected static $firstNameFemale = array( + "Aino", "Aleksandra", "Alisa", "Anastasia", "Anna", "Anne", "Anneli", "Anu", "Arina", "Annika", "Anastassia", "Alla", "Aili", "Alina", "Aime", "Antonina", + "Darja", "Diana", + "Elena", "Eliise", "Elisabeth", "Emma", "Ene", "Eve", "Eha", "Evi", + "Galina", + "Hanna", "Helen", "Heli", "Helle", "Helgi", + "Irina", "Inna", "Ingrid", + "Jekaterina", "Jelena", "Julia", "Jana", + "Kadri", "Katrin", "Kristi", "Kristiina", "Kristina", "Karin", "Kersti", "Kristel", "Kaja", "Külli", "Kätlin", "Krista", + "Laura", "Lenna", "Liisa", "Linda", "Lisandra", "Ljubov", "Ljudmila", "Liina", "Ljudmilla", "Larissa", "Liis", "Lea", "Laine", "Liudmila", + "Maie", "Malle", "Mare", "Maria", "Marina", "Marleen", "Marta", "Merike", "Mia", "Milana", "Mirtel", "Marika", "Merle", "Margit", "Milvi", "Maire", "Margarita", "Mari", "Maarja", + "Natalia", "Niina", "Nora", "Natalja", "Nadežda", "Nina", + "Olga", "Oksana", + "Piret", "Polina", "Pille", + "Reet", "Riina", + "Sandra", "Sirje", "Sofia", "Svetlana", "Silvi", + "Tamara", "Tatiana", "Tiina", "Tiiu", "Triin", "Tatjana", "Tiia", + "Ülle", "Urve", + "Valentina", "Viktoria", "Veera", "Veronika", "Vaike", + "Zinaida", + ); + + /** + * @link https://en.wikipedia.org/wiki/Category:Estonian-language_surnames + * @link https://www.stat.ee/public/apps/nimed/pere/TOP + */ + protected static $lastName = array( + "Aleksejev", "Andrejev", "Allik", "Aas", "Aleksandrov", "Aare", "Aarma", "Aas", "Aasmäe", "Aav", "Aavik", "Allik", "Alver", "Andrejeva", "Aleksejeva", "Aleksandrova", "Allik", "Aas", + "Bogdanova", "Bogdanov", + "Eenpalu", "Eskola", + "Fjodorov", "Fjodorov", "Fjodorova", "Fjodorova", + "Grigorjev", "Grigorjeva", + "Hunt", "Hein", "Hein", "Härma", + "Ivanov", "Ilves", "Ilves", "Ivanov", "Ivanova", "Ivanova", "Ilves", + "Jõgi", "Jakobson", "Jakovlev", "Jürgenson", "Jegorov", "Järv", "Johanson", "Järve", "Jakobson", "Jänes", "Järve", "Järvis", "Jõgi", "Jõgi", "Johanson", "Jürgenson", "Järv", "Jakovleva", "Jegorova", "Järve", "Jakobson", + "Kuzmina", "Kalda", "Kozlova", "Kruus", "Kask", "Kukk", "Kuznetsov", "Koppel", "Kaasik", "Kuusk", "Karu", "Kütt", "Kallas", "Kivi", "Kangur", "Kuusik", "Kõiv", "Kozlov", "Kull", "Kuzmin", "Kalda", "Kaaleste", "Kaasik", "Käbin", "Kalda", "Kaljulaid", "Kaljurand", "Kallas", "Kallaste", "Kangro", "Kangur", "Kapp", "Kärner", "Karu", "Kask", "Käsper", "Kass", "Keres", "Keskküla", "Kesküla", "Kikkas", "Kingsepp", "Kirs", "Kirsipuu", "Kivi", "Klavan", "Kõiv", "Kokk", "Kontaveit", "Koppel", "Korjus", "Kotkas", "Kreek", "Kross", "Kruus", "Kukk", "Kull", "Kütt", "Kuusik", "Kuusk", "Kuznetsov", "Kuznetsova", "Kask", "Kukk", "Kuznetsova", "Koppel", "Kaasik", "Kuusk", "Karu", "Kütt", "Kallas", "Kivi", "Kuusik", "Kangur", "Kõiv", "Kull", + "Luik", "Lepik", "Lepp", "Lõhmus", "Liiv", "Laur", "Leppik", "Lebedev", "Laas", "Laar", "Laht", "Lass", "Laur", "Laurits", "Lemsalu", "Lepik", "Lepmets", "Lepp", "Leppik", "Levandi", "Liiv", "Lill", "Lindmaa", "Linna", "Lipp", "Lippmaa", "Lõhmus", "Loo", "Lõoke", "Luik", "Luts", "Luik", "Lepik", "Lepp", "Lõhmus", "Laur", "Liiv", "Leppik", "Lebedeva", "Laas", + "Männik", "Mänd", "Mitt", "Makarova", "Mägi", "Mets", "Mihhailov", "Mölder", "Morozov", "Mitt", "Männik", "Mõttus", "Mänd", "Makarov", "Mägi", "Mälk", "Mänd", "Männik", "Margiste", "Mark", "Masing", "Mets", "Mihhailov", "Mihhailova", "Mölder", "Must", "Mägi", "Mets", "Mihhailova", "Mölder", "Morozova", + "Nikolajev", "Nõmm", "Nikitin", "Novikov", "Nõmmik", "Nurme", "Nurmsalu", "Nõmm", "Nikitina", "Nikolajeva", + "Orlova", "Orav", "Oja", "Ots", "Orav", "Orlov", "Oja", "Olesk", "Öpik", "Orav", "Ots", "Oja", "Ots", + "Petrov", "Pärn", "Põder", "Pavlov", "Popov", "Peterson", "Puusepp", "Paju", "Põld", "Pukk", "Paas", "Palm", "Pääsuke", "Padar", "Pärn", "Pavlov", "Pavlova", "Peebo", "Peetre", "Peterson", "Petrov", "Petrova", "Pihlak", "Piho", "Piip", "Põder", "Põld", "Popov", "Popova", "Poska", "Puhvel", "Pütsep", "Puusepp", "Petrova", "Pärn", "Pavlova", "Põder", "Peterson", "Popova", "Puusepp", "Paas", "Paju", "Pukk", "Parts", "Palm", "Põld", + "Romanova", "Rand", "Roos", "Rebane", "Raudsepp", "Raud", "Rand", "Roos", "Rätsep", "Raag", "Raud", "Raudsepp", "Rebane", "Reek", "Reinsalu", "Rooba", "Roolaid", "Rootare", "Rummo", "Rüütel", "Rüütli", "Rebane", "Raudsepp", "Raud", + "Saar", "Sepp", "Smirnov", "Stepanov", "Semjonov", "Sokolov", "Sild", "Sarapuu", "Saks", "Saar", "Salumäe", "Semjonov", "Sepp", "Sibul", "Siimar", "Simm", "Sirel", "Sisask", "Smirnov", "Smirnova", "Sokk", "Sokolov", "Soosaar", "Stepanov", "Stepanova", "Susi", "Saar", "Sepp", "Smirnova", "Stepanova", "Sokolova", "Saks", "Sarapuu", "Sild", "Semjonova", + "Tamme", "Tomson", "Tamm", "Teder", "Toom", "Tomson", "Tamme", "Talts", "Tamm", "Tamme", "Tarvas", "Teder", "Toom", "Toome", "Toots", "Tamm", "Teder", "Toom", + "Uibo", "Uibo", + "Vassiljev", "Vaher", "Volkov", "Valk", "Vaher", "Vahtra", "Vaino", "Vainola", "Välbe", "Valdma", "Väljas", "Valk", "Vassiljev", "Vassiljeva", "Vesik", "Veski", "Viiding", "Vitsut", "Võigemast", "Volkov", "Volkova", "Võsu", "Vassiljeva", "Vaher", "Volkova", + ); +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Address.php new file mode 100644 index 00000000..f2209138 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Address.php @@ -0,0 +1,100 @@ +generator->parse($format); + } + + /** + * @example 'کد پستی' + */ + public static function postcodePrefix() + { + return static::randomElement(static::$postcodePrefix); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Company.php new file mode 100644 index 00000000..0de47b35 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Company.php @@ -0,0 +1,57 @@ + 1; $i--) { + $sum += $subNationalCodeString[$count] * ($i); + $count++; + } + + if (($sum % 11) < 2) { + return $sum % 11; + } + return 11 - ($sum % 11); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/PhoneNumber.php new file mode 100644 index 00000000..fb80b1d2 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/PhoneNumber.php @@ -0,0 +1,75 @@ +format('dmy'); + + switch ((int)($birthdate->format('Y')/100)) { + case 18: + $centurySign = '+'; + break; + case 19: + $centurySign = '-'; + break; + case 20: + $centurySign = 'A'; + break; + default: + throw new \InvalidArgumentException('Year must be between 1800 and 2099 inclusive.'); + } + + $randomDigits = self::numberBetween(0, 89); + if ($gender && $gender == static::GENDER_MALE) { + if ($randomDigits === 0) { + $randomDigits .= static::randomElement(array(3,5,7,9)); + } else { + $randomDigits .= static::randomElement(array(1,3,5,7,9)); + } + } elseif ($gender && $gender == static::GENDER_FEMALE) { + if ($randomDigits === 0) { + $randomDigits .= static::randomElement(array(2,4,6,8)); + } else { + $randomDigits .= static::randomElement(array(0,2,4,6,8)); + } + } else { + if ($randomDigits === 0) { + $randomDigits .= self::numberBetween(2, 9); + } else { + $randomDigits .= (string)static::numerify('#'); + } + } + $randomDigits = str_pad($randomDigits, 3, '0', STR_PAD_LEFT); + + $checksum = $checksumCharacters[(int)($datePart . $randomDigits) % strlen($checksumCharacters)]; + + return $datePart . $centurySign . $randomDigits . $checksum; + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fi_FI/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/fi_FI/PhoneNumber.php index 39f0e784..a3230740 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/fi_FI/PhoneNumber.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/fi_FI/PhoneNumber.php @@ -4,17 +4,96 @@ namespace Faker\Provider\fi_FI; class PhoneNumber extends \Faker\Provider\PhoneNumber { - protected static $formats = array( - '+358 (40) ### ####', - '+358 (50) ### ####', - '+358 40 ### ####', - '+358 50 ### ####', - '040 ### ####', - '050 ### ####', - '###-########', - '### #######', - '040-#######', - '050-#######', - '(###) #######' + /** + * @link https://www.viestintavirasto.fi/en/internettelephone/numberingoftelecommunicationsnetworks/localcallsandtelecommunicationsareas/mapoftelecommunicationsareas.html + * @var array + */ + protected static $landLineareaCodes = array( + '02', + '03', + '05', + '06', + '08', + '09', + '013', + '014', + '015', + '016', + '017', + '018', + '019', ); + + /** + * @link https://www.viestintavirasto.fi/en/internettelephone/numberingoftelecommunicationsnetworks/mobilenetworks/mobilenetworkareacodes.html + * @var array + */ + protected static $mobileNetworkAreaCodes = array( + '040', + '050', + '044', + '045', + ); + + protected static $numberFormats = array( + '### ####', + '#######', + ); + + protected static $formats = array( + '+358 ({{ e164MobileNetworkAreaCode }}) {{ numberFormat }}', + '+358 {{ e164MobileNetworkAreaCode }} {{ numberFormat }}', + '+358 ({{ e164landLineAreaCode }}) {{ numberFormat }}', + '+358 {{ e164landLineAreaCode }} {{ numberFormat }}', + '{{ mobileNetworkAreaCode }}{{ separator }}{{ numberFormat }}', + '{{ landLineAreaCode }}{{ separator }}{{ numberFormat }}', + ); + + /** + * @return string + */ + public function landLineAreaCode() + { + return static::randomElement(static::$landLineareaCodes); + } + + /** + * @return string + */ + public function e164landLineAreaCode() + { + return substr(static::randomElement(static::$landLineareaCodes), 1); + } + + /** + * @return string + */ + public function mobileNetworkAreaCode() + { + return static::randomElement(static::$mobileNetworkAreaCodes); + } + + /** + * @return string + */ + public function e164MobileNetworkAreaCode() + { + return substr(static::randomElement(static::$mobileNetworkAreaCodes), 1); + } + + /** + * @return string + */ + public function numberFormat() + { + return static::randomElement(static::$numberFormats); + } + + /** + * @return string + */ + public function separator() + { + return static::randomElement(array(' ', '-')); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Address.php index 9aa35bff..7ecef77a 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Address.php @@ -2,7 +2,7 @@ namespace Faker\Provider\fr_BE; -class Address extends \Faker\Provider\Address +class Address extends \Faker\Provider\fr_FR\Address { protected static $postcode = array('####'); @@ -50,25 +50,6 @@ class Address extends \Faker\Provider\Address 'Hainaut', 'Liège', 'Luxembourg', 'Namur', 'Brabant wallon' ); - protected static $country = array( - 'Afghanistan', 'Afrique du sud', 'Albanie', 'Algérie', 'Allemagne', 'Andorre', 'Angola', 'Anguilla', 'Antarctique', 'Antigua et Barbuda', 'Antilles néerlandaises', 'Arabie saoudite', 'Argentine', 'Arménie', 'Aruba', 'Australie', 'Autriche', 'Azerbaïdjan', 'Bahamas', 'Bahrain', 'Bangladesh', 'Belgique', 'Belize', 'Benin', 'Les Bermudes', 'Bhoutan', 'Biélorussie', 'Bolivie', 'Bosnie-Herzégovine', 'Botswana', 'ÃŽles Bouvet', 'Brunei', 'Brésil', 'Bulgarie', 'Burkina Faso', 'Burundi', 'Cambodge', 'Cameroun', 'Canada', 'Cap Vert', 'ÃŽles Cayman', 'Chili', 'Chine', 'ÃŽle Christmas', 'Chypre', 'ÃŽles Cocos', 'Colombie', 'Comores', 'ÃŽles Cook', 'Corée du Nord', 'Corée du Sud', 'Costa Rica', 'Croatie', 'Cuba', 'Côte d\'Ivoire', 'Danemark', 'Djibouti', 'Dominique', 'Égypte', 'El Salvador', 'Émirats arabes unis', 'Équateur', 'Érythrée', 'Espagne', 'Estonie', 'États-Unis', 'Ethiopie', 'ÃŽle Falkland', 'République des Fidji', 'Finlande', 'France', 'ÃŽles Féroé', 'Gabon', - 'Gambie', 'Ghana', 'Gibraltar', 'Grenade', 'Groenland', 'Grèce', 'Guadeloupe', 'Guam', 'Guatemala', 'Guinée', 'Guinée Equatoriale', 'Guinée-Bissau', 'Guyane', 'Guyane française', 'Géorgie', 'ÃŽles Géorgie du Sud et Sandwich du Sud', 'Haïti', 'ÃŽles Heard et McDonald', 'Honduras', 'Hong Kong', 'Hongrie', 'ÃŽles Mineures Éloignées des États-Unis', 'Inde', 'Indonésie', 'Irak', 'Iran', 'Irlande', 'Islande', 'Israël', 'Italie', 'Jamaïque', 'Japon', 'Jordanie', 'Kazakhstan', 'Kenya', 'Kirghizistan', 'Kiribati', 'Koweit', 'La Barbad', 'Laos', 'Lesotho', 'Lettonie', 'Liban', 'Libye', 'Libéria', 'Liechtenstein', 'Lithuanie', 'Luxembourg', 'Macau', 'Macédoine', 'Madagascar', 'Malaisie', 'Malawi', 'ÃŽles Maldives', 'Mali', 'Malte', 'ÃŽles Mariannes du Nord', 'Maroc', 'ÃŽles Marshall', 'Martinique', 'Maurice', 'Mauritanie', 'Mayotte', 'Mexique', 'États fédérés de Micronésie', 'Moldavie', 'Monaco', 'Mongolie', 'Montserrat', 'Mozambique', 'Myanmar', 'Namibie', 'Nauru', 'Nepal', - 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'ÃŽles Norfolk', 'Norvège', 'Nouvelle Calédonie', 'Nouvelle-Zélande', 'Oman', 'Ouganda', 'Ouzbékistan', 'Pakistan', 'Palau', 'Panama', 'Papouasie-Nouvelle-Guinée', 'Paraguay', 'Pays-Bas', 'Philippines', 'ÃŽles Pitcairn', 'Pologne', 'Polynésie française', 'Porto Rico', 'Portugal', 'Pérou', 'Qatar', 'Roumanie', 'Royaume-Uni', 'Russie', 'Rwanda', 'Rép. dém. du Congo', 'République centrafricaine', 'République dominicaine', 'République tchèque', 'La Réunion', 'Sahara Occidental', 'Saint Pierre et Miquelon', 'Saint Vincent et les Grenadines', 'Saint-Kitts et Nevis', 'Saint-Marin', 'Sainte Hélène', 'Sainte Lucie', 'Samoa', 'Samoa', 'Seychelles', 'Sierra Leone', 'Singapour', 'Slovaquie', 'Slovénie', 'Somalie', 'Soudan', 'Sri Lanka', 'Suisse', 'Suriname', 'Suède', 'ÃŽles Svalbard et Jan Mayen', 'Swaziland', 'Syrie', 'São Tomé et Príncipe', 'Sénégal', 'Tadjikistan', 'Taiwan', 'Tanzanie', 'Tchad', - 'Territoire britannique de l\'océan Indien', 'Territoires français du sud', 'Thailande', 'Timor', 'Togo', 'Tokelau', 'Tonga', 'Trinité et Tobago', 'Tunisie', 'Turkménistan', 'ÃŽles Turks et Caïques', 'Turquie', 'Tuvalu', 'Ukraine', 'Uruguay', 'Vanuatu', 'Vatican', 'Venezuela', 'ÃŽles Vierges', 'ÃŽles Vierges britanniques', 'Vietnam', 'ÃŽles Wallis et Futuna', 'Yemen', 'Yougoslavie', 'Zambie', 'Zaïre', 'Zimbabwe' - ); - - /** - * Randomly returns a belgian region. - * - * @example 'wallonne' - * - * @return string - */ - public static function region() - { - return static::randomElement(static::$region); - } - /** * Randomly returns a belgian province. * diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Company.php index f1961301..6b8c0c7d 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Company.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Company.php @@ -2,7 +2,7 @@ namespace Faker\Provider\fr_BE; -class Company extends \Faker\Provider\Company +class Company extends \Faker\Provider\fr_FR\Company { protected static $formats = array( '{{lastName}} {{companySuffix}}', diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Payment.php index c281183f..21da5b5c 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Payment.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Payment.php @@ -16,4 +16,24 @@ class Payment extends \Faker\Provider\Payment { return static::iban($countryCode, $prefix, $length); } + + /** + * Value Added Tax (VAT) + * + * @example 'BE0123456789', ('spaced') 'BE 0123456789' + * + * @see http://ec.europa.eu/taxation_customs/vies/faq.html?locale=en#item_11 + * @see http://www.iecomputersystems.com/ordering/eu_vat_numbers.htm + * @see http://en.wikipedia.org/wiki/VAT_identification_number + * + * @param bool $spacedNationalPrefix + * + * @return string VAT Number + */ + public static function vat($spacedNationalPrefix = true) + { + $prefix = $spacedNationalPrefix ? "BE " : "BE"; + + return sprintf("%s0%d", $prefix, self::randomNumber(9, true)); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Address.php index 1ea91bdd..4930b54f 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Address.php @@ -2,7 +2,7 @@ namespace Faker\Provider\fr_CA; -class Address extends \Faker\Provider\Address +class Address extends \Faker\Provider\fr_FR\Address { protected static $cityPrefix = array('Saint-', 'Sainte-', 'St-', 'Ste-'); @@ -76,44 +76,13 @@ class Address extends \Faker\Provider\Address protected static $secondaryAddressFormats = array('Apt. ###', 'Suite ###', 'Bureau ###'); protected static $state = array( - 'Alberta', 'Colombie-Brittanique', 'Manitoba', 'Nouveau-Brunswick', 'Terre-Neuve-et-Labrador', 'Nouvelle-Écosse', 'Ontario', 'ÃŽle-du-Prince-Édouard', 'Québec', 'Saskatchewan' + 'Alberta', 'Colombie-Britannique', 'Manitoba', 'Nouveau-Brunswick', 'Terre-Neuve-et-Labrador', 'Nouvelle-Écosse', 'Ontario', 'ÃŽle-du-Prince-Édouard', 'Québec', 'Saskatchewan' ); protected static $stateAbbr = array( 'AB', 'BC', 'MB', 'NB', 'NL', 'NS', 'ON', 'PE', 'QC', 'SK' ); - /** - * This list is the same as in \Faker\Provider\fr_FR\Address.php - */ - protected static $country = array( - 'Afghanistan', 'Afrique du sud', 'Albanie', 'Algérie', 'Allemagne', 'Andorre', 'Angola', 'Anguilla', 'Antarctique', 'Antigua et Barbuda', 'Antilles néerlandaises', 'Arabie saoudite', 'Argentine', 'Arménie', 'Aruba', 'Australie', 'Autriche', 'Azerbaïdjan', - 'Bahamas', 'Bahrain', 'Bangladesh', 'Belgique', 'Belize', 'Benin', 'Bermudes (Les)', 'Bhoutan', 'Biélorussie', 'Bolivie', 'Bosnie-Herzégovine', 'Botswana', 'Bouvet (ÃŽles)', 'Brunei', 'Brésil', 'Bulgarie', 'Burkina Faso', 'Burundi', - 'Cambodge', 'Cameroun', 'Canada', 'Cap Vert', 'Cayman (ÃŽles)', 'Chili', 'Chine (Rép. pop.)', 'Christmas (ÃŽle)', 'Chypre', 'Cocos (ÃŽles)', 'Colombie', 'Comores', 'Cook (ÃŽles)', 'Corée du Nord', 'Corée, Sud', 'Costa Rica', 'Croatie', 'Cuba', 'Côte d\'Ivoire', - 'Danemark', 'Djibouti', 'Dominique', - 'Égypte', 'El Salvador', 'Émirats arabes unis', 'Équateur', 'Érythrée', 'Espagne', 'Estonie', 'États-Unis', 'Ethiopie', - 'Falkland (ÃŽle)', 'Fidji (République des)', 'Finlande', 'France', 'Féroé (ÃŽles)', - 'Gabon', 'Gambie', 'Ghana', 'Gibraltar', 'Grenade', 'Groenland', 'Grèce', 'Guadeloupe', 'Guam', 'Guatemala', 'Guinée', 'Guinée Equatoriale', 'Guinée-Bissau', 'Guyane', 'Guyane française', 'Géorgie', 'Géorgie du Sud et Sandwich du Sud (ÃŽles)', - 'Haïti', 'Heard et McDonald (ÃŽles)', 'Honduras', 'Hong Kong', 'Hongrie', - 'ÃŽles Mineures Éloignées des États-Unis', 'Inde', 'Indonésie', 'Irak', 'Iran', 'Irlande', 'Islande', 'Israël', 'Italie', - 'Jamaïque', 'Japon', 'Jordanie', - 'Kazakhstan', 'Kenya', 'Kirghizistan', 'Kiribati', 'Koweit', - 'La Barbade', 'Laos', 'Lesotho', 'Lettonie', 'Liban', 'Libye', 'Libéria', 'Liechtenstein', 'Lithuanie', 'Luxembourg', - 'Macau', 'Macédoine', 'Madagascar', 'Malaisie', 'Malawi', 'Maldives (ÃŽles)', 'Mali', 'Malte', 'Mariannes du Nord (ÃŽles)', 'Maroc', 'Marshall (ÃŽles)', 'Martinique', 'Maurice', 'Mauritanie', 'Mayotte', 'Mexique', 'Micronésie (États fédérés de)', 'Moldavie', 'Monaco', 'Mongolie', 'Montserrat', 'Mozambique', 'Myanmar', - 'Namibie', 'Nauru', 'Nepal', 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Norfolk (ÃŽles)', 'Norvège', 'Nouvelle Calédonie', 'Nouvelle-Zélande', - 'Oman', 'Ouganda', 'Ouzbékistan', - 'Pakistan', 'Palau', 'Panama', 'Papouasie-Nouvelle-Guinée', 'Paraguay', 'Pays-Bas', 'Philippines', 'Pitcairn (ÃŽles)', 'Pologne', 'Polynésie française', 'Porto Rico', 'Portugal', 'Pérou', - 'Qatar', - 'Roumanie', 'Royaume-Uni', 'Russie', 'Rwanda', 'Rép. Dém. du Congo', 'République centrafricaine', 'République Dominicaine', 'République tchèque', 'Réunion (La)', - 'Sahara Occidental', 'Saint Pierre et Miquelon', 'Saint Vincent et les Grenadines', 'Saint-Kitts et Nevis', 'Saint-Marin (Rép. de)', 'Sainte Hélène', 'Sainte Lucie', 'Samoa', 'Samoa', 'Seychelles', 'Sierra Leone', 'Singapour', 'Slovaquie', 'Slovénie', 'Somalie', 'Soudan', 'Sri Lanka', 'Suisse', 'Suriname', 'Suède', 'Svalbard et Jan Mayen (ÃŽles)', 'Swaziland', 'Syrie', 'São Tomé et Príncipe (Rép.)', 'Sénégal', - 'Tadjikistan', 'Taiwan', 'Tanzanie', 'Tchad', 'Territoire britannique de l\'océan Indien', 'Territoires français du sud', 'Thailande', 'Timor', 'Togo', 'Tokelau', 'Tonga', 'Trinité et Tobago', 'Tunisie', 'Turkménistan', 'Turks et Caïques (ÃŽles)', 'Turquie', 'Tuvalu', - 'Ukraine', 'Uruguay', - 'Vanuatu', 'Vatican (Etat du)', 'Venezuela', 'Vierges (ÃŽles)', 'Vierges britanniques (ÃŽles)', 'Vietnam', - 'Wallis et Futuna (ÃŽles)', - 'Yemen', 'Yougoslavie', - 'Zambie', 'Zaïre', 'Zimbabwe' - ); - /** * @example 'Saint-' */ diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Company.php new file mode 100644 index 00000000..b6ffefdc --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Company.php @@ -0,0 +1,7 @@ + 'Argovie'), + array('AI' => 'Appenzell Rhodes-Intérieures'), + array('AR' => 'Appenzell Rhodes-Extérieures'), + array('BE' => 'Berne'), + array('BL' => 'Bâle-Campagne'), + array('BS' => 'Bâle-Ville'), + array('FR' => 'Fribourg'), + array('GE' => 'Genève'), + array('GL' => 'Glaris'), + array('GR' => 'Grisons'), + array('JU' => 'Jura'), + array('LU' => 'Lucerne'), + array('NE' => 'Neuchâtel'), + array('NW' => 'Nidwald'), + array('OW' => 'Obwald'), + array('SG' => 'Saint-Gall'), + array('SH' => 'Schaffhouse'), + array('SO' => 'Soleure'), + array('SZ' => 'Schwytz'), + array('TG' => 'Thurgovie'), + array('TI' => 'Tessin'), + array('UR' => 'Uri'), + array('VD' => 'Vaud'), + array('VS' => 'Valais'), + array('ZG' => 'Zoug'), + array('ZH' => 'Zurich') + ); + + protected static $cityFormats = array( + '{{cityName}}', + ); + + protected static $streetNameFormats = array( + '{{streetPrefix}} {{lastName}}', + '{{streetPrefix}} de {{cityName}}', + '{{streetPrefix}} de {{lastName}}' + ); + + protected static $streetAddressFormats = array( + '{{streetName}} {{buildingNumber}}', + ); + protected static $addressFormats = array( + "{{streetAddress}}\n{{postcode}} {{city}}", + ); + + /** + * Returns a random street prefix + * @example Rue + * @return string + */ + public static function streetPrefix() + { + return static::randomElement(static::$streetPrefix); + } + + /** + * Returns a random city name. + * @example Luzern + * @return string + */ + public function cityName() + { + return static::randomElement(static::$cityNames); + } + + /** + * Returns a canton + * @example array('BE' => 'Bern') + * @return array + */ + public static function canton() + { + return static::randomElement(static::$canton); + } + + /** + * Returns the abbreviation of a canton. + * @return string + */ + public static function cantonShort() + { + $canton = static::canton(); + return key($canton); + } + + /** + * Returns the name of canton. + * @return string + */ + public static function cantonName() + { + $canton = static::canton(); + return current($canton); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_CH/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_CH/Company.php new file mode 100644 index 00000000..a4e91eaf --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_CH/Company.php @@ -0,0 +1,15 @@ + 'Guadeloupe'), array('972' => 'Martinique'), array('973' => 'Guyane'), array('974' => 'La Réunion'), array('976' => 'Mayotte') ); + protected static $secondaryAddressFormats = array('Apt. ###', 'Suite ###', 'Étage ###', "Bât. ###", "Chambre ###"); + + /** + * @example 'Appt. 350' + */ + public static function secondaryAddress() + { + return static::numerify(static::randomElement(static::$secondaryAddressFormats)); + } + /** * @example 'rue' */ diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Company.php index 5f440666..9112802c 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Company.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Company.php @@ -51,7 +51,7 @@ class Company extends \Faker\Provider\Company /** * @var array Company suffixes. */ - protected static $companySuffix = array('SA', 'S.A.', 'SARL', 'S.A.R.L.', 'S.A.S.', 'et Fils'); + protected static $companySuffix = array('SA', 'S.A.', 'SARL', 'S.A.R.L.', 'SAS', 'S.A.S.', 'et Fils'); protected static $siretNicFormats = array('####', '0###', '00#%'); @@ -112,7 +112,7 @@ class Company extends \Faker\Provider\Company */ public function siret($formatted = true) { - $siret = $this->siren(false); + $siret = self::siren(false); $nicFormat = static::randomElement(static::$siretNicFormats); $siret .= $this->numerify($nicFormat); $siret .= Luhn::computeCheckDigit($siret); @@ -129,9 +129,9 @@ class Company extends \Faker\Provider\Company * @see http://fr.wikipedia.org/wiki/Syst%C3%A8me_d%27identification_du_r%C3%A9pertoire_des_entreprises * @return string */ - public function siren($formatted = true) + public static function siren($formatted = true) { - $siren = $this->numerify('%#######'); + $siren = self::numerify('%#######'); $siren .= Luhn::computeCheckDigit($siren); if ($formatted) { $siren = substr($siren, 0, 3) . ' ' . substr($siren, 3, 3) . ' ' . substr($siren, 6, 3); @@ -166,4 +166,311 @@ class Company extends \Faker\Provider\Company return true; } + + /** + * @link http://www.pole-emploi.fr/candidat/le-code-rome-et-les-fiches-metiers-@/article.jspz?id=60702 + * @note Randomly took 300 from this list + */ + protected static $jobTitleFormat = array( + 'Agent d\'accueil', + 'Agent d\'enquêtes', + 'Agent d\'entreposage', + 'Agent de curage', + 'Agro-économiste', + 'Aide couvreur', + 'Aide à domicile', + 'Aide-déménageur', + 'Ambassadeur', + 'Analyste télématique', + 'Animateur d\'écomusée', + 'Animateur web', + 'Appareilleur-gazier', + 'Archéologue', + 'Armurier d\'art', + 'Armurier spectacle', + 'Artificier spectacle', + 'Artiste dramatique', + 'Aspigiculteur', + 'Assistant de justice', + 'Assistant des ventes', + 'Assistant logistique', + 'Assistant styliste', + 'Assurance', + 'Auteur-adaptateur', + 'Billettiste voyages', + 'Brigadier', + 'Bruiteur', + 'Bâtonnier d\'art', + 'Bûcheron', + 'Cameraman', + 'Capitaine de pêche', + 'Carrier', + 'Caviste', + 'Chansonnier', + 'Chanteur', + 'Chargé de recherche', + 'Chasseur-bagagiste', + 'Chef de fabrication', + 'Chef de scierie', + 'Chef des ventes', + 'Chef du personnel', + 'Chef géographe', + 'Chef monteur son', + 'Chef porion', + 'Chiropraticien', + 'Choréologue', + 'Chromiste', + 'Cintrier-machiniste', + 'Clerc hors rang', + 'Coach sportif', + 'Coffreur béton armé', + 'Coffreur-ferrailleur', + 'Commandant de police', + 'Commandant marine', + 'Commis de coupe', + 'Comptable unique', + 'Conception et études', + 'Conducteur de jumbo', + 'Conseiller culinaire', + 'Conseiller funéraire', + 'Conseiller relooking', + 'Consultant ergonome', + 'Contrebassiste', + 'Convoyeur garde', + 'Copiste offset', + 'Corniste', + 'Costumier-habilleur', + 'Coutelier d\'art', + 'Cueilleur de cerises', + 'Céramiste concepteur', + 'Danse', + 'Danseur', + 'Data manager', + 'Dee-jay', + 'Designer produit', + 'Diététicien conseil', + 'Diététique', + 'Doreur sur métaux', + 'Décorateur-costumier', + 'Défloqueur d\'amiante', + 'Dégustateur', + 'Délégué vétérinaire', + 'Délégué à la tutelle', + 'Désamianteur', + 'Détective', + 'Développeur web', + 'Ecotoxicologue', + 'Elagueur-botteur', + 'Elagueur-grimpeur', + 'Elastiqueur', + 'Eleveur d\'insectes', + 'Eleveur de chats', + 'Eleveur de volailles', + 'Embouteilleur', + 'Employé d\'accueil', + 'Employé d\'étage', + 'Employé de snack-bar', + 'Endivier', + 'Endocrinologue', + 'Epithésiste', + 'Essayeur-retoucheur', + 'Etainier', + 'Etancheur', + 'Etancheur-bardeur', + 'Etiqueteur', + 'Expert back-office', + 'Exploitant de tennis', + 'Extraction', + 'Facteur', + 'Facteur de clavecins', + 'Facteur de secteur', + 'Fantaisiste', + 'Façadier-bardeur', + 'Façadier-ravaleur', + 'Feutier', + 'Finance', + 'Flaconneur', + 'Foreur pétrole', + 'Formateur d\'italien', + 'Fossoyeur', + 'Fraiseur', + 'Fraiseur mouliste', + 'Frigoriste maritime', + 'Fromager', + 'Galeriste', + 'Gardien de résidence', + 'Garçon de chenil', + 'Garçon de hall', + 'Gendarme mobile', + 'Guitariste', + 'Gynécologue', + 'Géodésien', + 'Géologue prospecteur', + 'Géomètre', + 'Géomètre du cadastre', + 'Gérant d\'hôtel', + 'Gérant de tutelle', + 'Gériatre', + 'Hydrothérapie', + 'Hématologue', + 'Hôte de caisse', + 'Ingénieur bâtiment', + 'Ingénieur du son', + 'Ingénieur géologue', + 'Ingénieur géomètre', + 'Ingénieur halieute', + 'Ingénieur logistique', + 'Instituteur', + 'Jointeur de placage', + 'Juge des enfants', + 'Juriste financier', + 'Kiwiculteur', + 'Lexicographe', + 'Liftier', + 'Litigeur transport', + 'Logistique', + 'Logopède', + 'Magicien', + 'Manager d\'artiste', + 'Mannequin détail', + 'Maquilleur spectacle', + 'Marbrier-poseur', + 'Marin grande pêche', + 'Matelassier', + 'Maçon', + 'Maçon-fumiste', + 'Maçonnerie', + 'Maître de ballet', + 'Maïeuticien', + 'Menuisier', + 'Miroitier', + 'Modéliste industriel', + 'Moellonneur', + 'Moniteur de sport', + 'Monteur audiovisuel', + 'Monteur de fermettes', + 'Monteur de palettes', + 'Monteur en siège', + 'Monteur prototypiste', + 'Monteur-frigoriste', + 'Monteur-truquiste', + 'Mouleur sable', + 'Mouliste drapeur', + 'Mécanicien-armurier', + 'Médecin du sport', + 'Médecin scolaire', + 'Médiateur judiciaire', + 'Médiathécaire', + 'Net surfeur surfeuse', + 'Oenologue', + 'Opérateur de plateau', + 'Opérateur du son', + 'Opérateur géomètre', + 'Opérateur piquage', + 'Opérateur vidéo', + 'Ouvrier d\'abattoir', + 'Ouvrier serriste', + 'Ouvrier sidérurgiste', + 'Palefrenier', + 'Paléontologue', + 'Pareur en abattoir', + 'Parfumeur', + 'Parqueteur', + 'Percepteur', + 'Photographe d\'art', + 'Pilote automobile', + 'Pilote de soutireuse', + 'Pilote fluvial', + 'Piqueur en ganterie', + 'Pisteur secouriste', + 'Pizzaïolo', + 'Plaquiste enduiseur', + 'Plasticien', + 'Plisseur', + 'Poissonnier-traiteur', + 'Pontonnier', + 'Porion', + 'Porteur de hottes', + 'Porteur de journaux', + 'Portier', + 'Poseur de granit', + 'Posticheur spectacle', + 'Potier', + 'Praticien dentaire', + 'Praticiens médicaux', + 'Premier clerc', + 'Preneur de son', + 'Primeuriste', + 'Professeur d\'italien', + 'Projeteur béton armé', + 'Promotion des ventes', + 'Présentateur radio', + 'Pyrotechnicien', + 'Pédicure pour bovin', + 'Pédologue', + 'Pédopsychiatre', + 'Quincaillier', + 'Radio chargeur', + 'Ramasseur d\'asperges', + 'Ramasseur d\'endives', + 'Ravaleur-ragréeur', + 'Recherche', + 'Recuiseur', + 'Relieur-doreur', + 'Responsable de salle', + 'Responsable télécoms', + 'Revenue Manager', + 'Rippeur spectacle', + 'Rogneur', + 'Récupérateur', + 'Rédacteur des débats', + 'Régleur funéraire', + 'Régleur sur tour', + 'Sapeur-pompier', + 'Scannériste', + 'Scripte télévision', + 'Sculpteur sur verre', + 'Scénariste', + 'Second de cuisine', + 'Secrétaire juridique', + 'Semencier', + 'Sertisseur', + 'Services funéraires', + 'Solier-moquettiste', + 'Sommelier', + 'Sophrologue', + 'Staffeur', + 'Story boarder', + 'Stratifieur', + 'Stucateur', + 'Styliste graphiste', + 'Surjeteur-raseur', + 'Séismologue', + 'Technicien agricole', + 'Technicien bovin', + 'Technicien géomètre', + 'Technicien plateau', + 'Technicien énergie', + 'Terminologue', + 'Testeur informatique', + 'Toiliste', + 'Topographe', + 'Toréro', + 'Traducteur d\'édition', + 'Traffic manager', + 'Trieur de métaux', + 'Turbinier', + 'Téléconseiller', + 'Tôlier-traceur', + 'Vendeur carreau', + 'Vendeur en lingerie', + 'Vendeur en meubles', + 'Vendeur en épicerie', + 'Verrier d\'art', + 'Verrier à la calotte', + 'Verrier à la main', + 'Verrier à main levée', + 'Vidéo-jockey', + 'Vitrier', + ); } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Payment.php index 5316876a..d436dfe3 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Payment.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Payment.php @@ -4,6 +4,31 @@ namespace Faker\Provider\fr_FR; class Payment extends \Faker\Provider\Payment { + /** + * Value Added Tax (VAT) + * + * @example 'FR12123456789', ('spaced') 'FR 12 123 456 789' + * + * @see http://ec.europa.eu/taxation_customs/vies/faq.html?locale=en#item_11 + * @see http://www.iecomputersystems.com/ordering/eu_vat_numbers.htm + * @see http://en.wikipedia.org/wiki/VAT_identification_number + * + * @param bool $spacedNationalPrefix + * + * @return string VAT Number + */ + public function vat($spacedNationalPrefix = true) + { + $siren = Company::siren(false); + $key = (12 + 3 * ($siren % 97)) % 97; + $pattern = "%s%'.02d%s"; + if ($spacedNationalPrefix) { + $siren = trim(chunk_split($siren, 3, ' ')); + $pattern = "%s %'.02d %s"; + } + return sprintf($pattern, 'FR', $key, $siren); + } + /** * International Bank Account Number (IBAN) * @link http://en.wikipedia.org/wiki/International_Bank_Account_Number diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Person.php index 1907f5f0..5778a7c0 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Person.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Person.php @@ -67,4 +67,63 @@ class Person extends \Faker\Provider\Person { return static::randomElement(static::$prefix); } + + /** + * Generates a NIR / Sécurité Sociale number (13 digits + 2 digits for the key) + * + * @see https://fr.wikipedia.org/wiki/Num%C3%A9ro_de_s%C3%A9curit%C3%A9_sociale_en_France + * @return string + */ + public function nir($gender = null, $formatted = false) + { + // Gender + if ($gender === static::GENDER_MALE) { + $nir = 1; + } elseif ($gender === static::GENDER_FEMALE) { + $nir = 2; + } else { + $nir = $this->numberBetween(1, 2); + } + + $nir .= + // Year of birth (aa) + $this->numerify('##') . + // Mont of birth (mm) + sprintf('%02d', $this->numberBetween(1, 12)); + + // Department + $department = key(Address::department()); + $nir .= $department; + + // Town number, depends on department length + if (strlen($department) === 2) { + $nir .= $this->numerify('###'); + } elseif (strlen($department) === 3) { + $nir .= $this->numerify('##'); + } + + // Born number (depending of town and month of birth) + $nir .= $this->numerify('###'); + + /** + * The key for a given NIR is `97 - 97 % NIR` + * NIR has to be an integer, so we have to do a little replacment + * for departments 2A and 2B + */ + if ($department === '2A') { + $nirInteger = str_replace('2A', '19', $nir); + } elseif ($department === '2B') { + $nirInteger = str_replace('2B', '18', $nir); + } else { + $nirInteger = $nir; + } + $nir .= sprintf('%02d', 97 - $nirInteger % 97); + + // Format is x xx xx xx xxx xxx xx + if ($formatted) { + $nir = substr($nir, 0, 1) . ' ' . substr($nir, 1, 2) . ' ' . substr($nir, 3, 2) . ' ' . substr($nir, 5, 2) . ' ' . substr($nir, 7, 3). ' ' . substr($nir, 10, 3). ' ' . substr($nir, 13, 2); + } + + return $nir; + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/PhoneNumber.php index c7c9f9eb..7c0bd9d5 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/PhoneNumber.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/PhoneNumber.php @@ -14,8 +14,8 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber '+33 (0)4 ## ## ## ##', '+33 (0)5 ## ## ## ##', '+33 (0)6 ## ## ## ##', - '+33 (0)7 ## ## ## ##', - '+33 (0)8 ## ## ## ##', + '+33 (0)7 {{phoneNumber07WithSeparator}}', + '+33 (0)8 {{phoneNumber08WithSeparator}}', '+33 (0)9 ## ## ## ##', '+33 1 ## ## ## ##', '+33 1 ## ## ## ##', @@ -24,8 +24,8 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber '+33 4 ## ## ## ##', '+33 5 ## ## ## ##', '+33 6 ## ## ## ##', - '+33 7 ## ## ## ##', - '+33 8 ## ## ## ##', + '+33 7 {{phoneNumber07WithSeparator}}', + '+33 8 {{phoneNumber08WithSeparator}}', '+33 9 ## ## ## ##', '01########', '01########', @@ -34,8 +34,8 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber '04########', '05########', '06########', - '07########', - '08########', + '07{{phoneNumber07}}', + '08{{phoneNumber08}}', '09########', '01 ## ## ## ##', '01 ## ## ## ##', @@ -44,27 +44,98 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber '04 ## ## ## ##', '05 ## ## ## ##', '06 ## ## ## ##', - '07 ## ## ## ##', - '08 ## ## ## ##', + '07 {{phoneNumber07WithSeparator}}', + '08 {{phoneNumber08WithSeparator}}', '09 ## ## ## ##', ); // Mobile phone numbers start by 06 and 07 // 06 is the most common prefix protected static $mobileFormats = array( + '+33 (0)6 ## ## ## ##', '+33 6 ## ## ## ##', - '+33 7 ## ## ## ##', + '+33 (0)7 {{phoneNumber07WithSeparator}}', + '+33 7 {{phoneNumber07WithSeparator}}', '06########', - '07########', + '07{{phoneNumber07}}', '06 ## ## ## ##', - '07 ## ## ## ##', + '07 {{phoneNumber07WithSeparator}}', ); + protected static $serviceFormats = array( + '+33 (0)8 {{phoneNumber08WithSeparator}}', + '+33 8 {{phoneNumber08WithSeparator}}', + '08 {{phoneNumber08WithSeparator}}', + '08{{phoneNumber08}}', + ); + + public function phoneNumber07() + { + $phoneNumber = $this->phoneNumber07WithSeparator(); + $phoneNumber = str_replace(' ', '', $phoneNumber); + return $phoneNumber; + } + + /** + * Only 073 to 079 are acceptable prefixes with 07 + * + * @see http://www.arcep.fr/index.php?id=8146 + */ + public function phoneNumber07WithSeparator() + { + $phoneNumber = $this->generator->numberBetween(3, 9); + $phoneNumber .= $this->numerify('# ## ## ##'); + return $phoneNumber; + } + + public function phoneNumber08() + { + $phoneNumber = $this->phoneNumber08WithSeparator(); + $phoneNumber = str_replace(' ', '', $phoneNumber); + return $phoneNumber; + } + + /** + * Valid formats for 08: + * + * 0# ## ## ## + * 1# ## ## ## + * 2# ## ## ## + * 91 ## ## ## + * 92 ## ## ## + * 93 ## ## ## + * 97 ## ## ## + * 98 ## ## ## + * 99 ## ## ## + * + * Formats 089(4|6)## ## ## are valid, but will be + * attributed when other 089 resource ranges are exhausted. + * + * @see https://www.arcep.fr/index.php?id=8146#c9625 + * @see https://issuetracker.google.com/u/1/issues/73269839 + */ + public function phoneNumber08WithSeparator() + { + $regex = '([012]{1}\d{1}|(9[1-357-9])( \d{2}){3}'; + return $this->regexify($regex); + } + /** * @example '0601020304' */ - public static function mobileNumber() + public function mobileNumber() { - return static::numerify(static::randomElement(static::$mobileFormats)); + $format = static::randomElement(static::$mobileFormats); + + return static::numerify($this->generator->parse($format)); + } + /** + * @example '0891951357' + */ + public function serviceNumber() + { + $format = static::randomElement(static::$serviceFormats); + + return static::numerify($this->generator->parse($format)); } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/he_IL/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/he_IL/Address.php new file mode 100644 index 00000000..6cd9d2e9 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/he_IL/Address.php @@ -0,0 +1,122 @@ + static::latitude(46.262740, 47.564721), + 'longitude' => static::longitude(17.077949, 20.604560) + ); + } + + /* ----------- DATA -------------------- */ + + protected static $streetSuffix = array( + 'árok', 'átjáró', 'dűlÅ‘sor', 'dűlőút', 'erdÅ‘sor', 'fasor', 'forduló', 'gát', 'határsor', 'határút', 'híd', 'játszótér', 'kert', 'körönd', 'körtér', 'körút', 'köz', 'lakótelep', 'lejáró', 'lejtÅ‘', 'lépcsÅ‘', 'liget', 'mélyút', 'orom', 'országút', 'ösvény', 'park', 'part', 'pincesor', 'rakpart', 'sétány', 'sétaút', 'sor', 'sugárút', 'tér', 'tere', 'turistaút', 'udvar', 'út', 'útja', 'utca', 'üdülÅ‘part' + ); + protected static $postcode = array('####'); + protected static $state = array( + 'Budapest', 'Bács-Kiskun', 'Baranya', 'Békés', 'Borsod-Abaúj-Zemplén', 'Csongrád', 'Fejér', 'GyÅ‘r-Moson-Sopron', 'Hajdú-Bihar', 'Heves', 'Jász-Nagykun-Szolnok', 'Komárom-Esztergom', 'Nógrád', 'Pest', 'Somogy', 'Szabolcs-Szatmár-Bereg', 'Tolna', 'Vas', 'Veszprém', 'Zala' + ); + protected static $country = array( + 'Afganisztán', 'Albánia', 'Algéria', 'Amerikai Egyesült Ãllamok', 'Andorra', 'Angola', 'Antigua és Barbuda', 'Argentína', 'Ausztria', 'Ausztrália', 'Azerbajdzsán', + 'Bahama-szigetek', 'Bahrein', 'Banglades', 'Barbados', 'Belgium', 'Belize', 'Benin', 'Bhután', 'Bolívia', 'Bosznia-Hercegovina', 'Botswana', 'Brazília', 'Brunei', 'Bulgária', 'Burkina Faso', 'Burma', 'Burundi', + 'Chile', 'Ciprus', 'Costa Rica', 'Csehország', 'Csád', + 'Dominikai Köztársaság', 'Dominikai Közösség', 'Dzsibuti', 'Dánia', 'Dél-Afrika', 'Dél-Korea', 'Dél-Szudán', + 'Ecuador', 'EgyenlítÅ‘i-Guinea', 'Egyesült Arab Emírségek', 'Egyesült Királyság', 'Egyiptom', 'Elefántcsontpart', 'Eritrea', 'Etiópia', + 'Fehéroroszország', 'Fidzsi-szigetek', 'Finnország', 'Franciaország', 'Fülöp-szigetek', + 'Gabon', 'Gambia', 'Ghána', 'Grenada', 'Grúzia', 'Guatemala', 'Guinea', 'Guyana', 'Görögország', + 'Haiti', 'Hollandia', 'Horvátország', + 'India', 'Indonézia', 'Irak', 'Irán', 'Izland', 'Izrael', + 'Japán', 'Jemen', 'Jordánia', + 'Kambodzsa', 'Kamerun', 'Kanada', 'Katar', 'Kazahsztán', 'Kelet-Timor', 'Kenya', 'Kirgizisztán', 'Kiribati', 'Kolumbia', 'Kongói Demokratikus Köztársaság', 'Kongói Köztársaság', 'Kuba', 'Kuvait', 'Kína', 'Közép-Afrika', + 'Laosz', 'Lengyelország', 'Lesotho', 'Lettország', 'Libanon', 'Libéria', 'Liechtenstein', 'Litvánia', 'Luxemburg', 'Líbia', + 'Macedónia', 'Madagaszkár', 'Magyarország', 'Malawi', 'Maldív-szigetek', 'Mali', 'Malájzia', 'Marokkó', 'Marshall-szigetek', 'Mauritánia', 'Mexikó', 'Mikronézia', 'Moldova', 'Monaco', 'Mongólia', 'Montenegró', 'Mozambik', 'Málta', + 'Namíbia', 'Nauru', 'Nepál', 'Nicaragua', 'Niger', 'Nigéria', 'Norvégia', 'Németország', + 'Olaszország', 'Omán', 'Oroszország', + 'Pakisztán', 'Palau', 'Panama', 'Paraguay', 'Peru', 'Portugália', 'Pápua Új-Guinea', + 'Románia', 'Ruanda', + 'Saint Kitts és Nevis', 'Saint Vincent', 'Salamon-szigetek', 'Salvador', 'San Marino', 'Seychelle-szigetek', 'Spanyolország', 'Srí Lanka', 'Suriname', 'Svájc', 'Svédország', 'Szamoa', 'Szaúd-Arábia', 'Szenegál', 'Szerbia', 'Szingapúr', 'Szlovákia', 'Szlovénia', 'Szomália', 'Szudán', 'Szváziföld', 'Szíria', 'São Tomé és Príncipe', + 'Tadzsikisztán', 'Tanzánia', 'Thaiföld', 'Togo', 'Tonga', 'Trinidad és Tobago', 'Tunézia', 'Tuvalu', 'Törökország', 'Türkmenisztán', + 'Uganda', 'Ukrajna', 'Uruguay', + 'Vanuatu', 'Venezuela', 'Vietnám', + 'Zambia', 'Zimbabwe', 'Zöld-foki-szigetek', + 'Észak-Korea', 'Észtország', 'Ãrország', 'Örményország', 'Új-Zéland', 'Üzbegisztán' + ); + + /** + * Source: https://hu.wikipedia.org/wiki/Magyarorsz%C3%A1g_v%C3%A1rosainak_list%C3%A1ja + */ + protected static $capitals = array('Budapest'); + protected static $bigCities = array( + 'Békéscsaba', 'Debrecen', 'Dunaújváros', 'Eger', 'Érd', 'GyÅ‘r', 'HódmezÅ‘vásárhely', 'Kaposvár', 'Kecskemét', 'Miskolc', 'Nagykanizsa', 'Nyíregyháza', 'Pécs', 'Salgótarján', 'Sopron', 'Szeged', 'Székesfehérvár', 'Szekszárd', 'Szolnok', 'Szombathely', 'Tatabánya', 'Veszprém', 'Zalaegerszeg' + ); + protected static $smallerCities = array( + 'Ajka', 'Aszód', 'Bácsalmás', + 'Baja', 'Baktalórántháza', 'Balassagyarmat', 'Balatonalmádi', 'Balatonfüred', 'Balmazújváros', 'Barcs', 'Bátonyterenye', 'Békés', 'Bélapátfalva', 'Berettyóújfalu', 'Bicske', 'Bóly', 'Bonyhád', 'Budakeszi', + 'Cegléd', 'Celldömölk', 'Cigánd', 'Csenger', 'Csongrád', 'Csorna', 'Csurgó', + 'Dabas', 'Derecske', 'Devecser', 'Dombóvár', 'Dunakeszi', + 'Edelény', 'Encs', 'Enying', 'Esztergom', + 'Fehérgyarmat', 'Fonyód', 'Füzesabony', + 'Gárdony', 'GödöllÅ‘', 'Gönc', 'Gyál', 'GyomaendrÅ‘d', 'Gyöngyös', 'Gyula', + 'Hajdúböszörmény', 'Hajdúhadház', 'Hajdúnánás', 'Hajdúszoboszló', 'Hatvan', 'Heves', + 'Ibrány', + 'Jánoshalma', 'Jászapáti', 'Jászberény', + 'Kalocsa', 'Kapuvár', 'Karcag', 'Kazincbarcika', 'Kemecse', 'Keszthely', 'Kisbér', 'KiskÅ‘rös', 'Kiskunfélegyháza', 'Kiskunhalas', 'Kiskunmajsa', 'Kistelek', 'Kisvárda', 'Komárom', 'Komló', 'Körmend', 'KÅ‘szeg', 'Kunhegyes', 'Kunszentmárton', 'Kunszentmiklós', + 'Lenti', 'Letenye', + 'Makó', 'Marcali', 'Martonvásár', 'Mátészalka', 'MezÅ‘csát', 'MezÅ‘kovácsháza', 'MezÅ‘kövesd', 'MezÅ‘túr', 'Mohács', 'Monor', 'Mór', 'Mórahalom', 'Mosonmagyaróvár', + 'Nagyatád', 'Nagykálló', 'Nagykáta', 'NagykÅ‘rös', 'Nyíradony', 'Nyírbátor', + 'Orosháza', 'Oroszlány', 'Ózd', + 'Paks', 'Pannonhalma', 'Pápa', 'Pásztó', 'Pécsvárad', 'Pétervására', 'Pilisvörösvár', 'Polgárdi', 'Püspökladány', 'Putnok', + 'Ráckeve', 'Rétság', + 'Sárbogárd', 'Sarkad', 'Sárospatak', 'Sárvár', 'Sásd', 'Sátoraljaújhely', 'Sellye', 'Siklós', 'Siófok', 'Sümeg', 'Szarvas', 'Szécsény', 'Szeghalom', 'Szentendre', 'Szentes', 'Szentgotthárd', 'SzentlÅ‘rinc', 'Szerencs', 'Szigetszentmiklós', 'Szigetvár', 'Szikszó', 'Szob', + 'Tab', 'Tamási', 'Tapolca', 'Tata', 'Tét', 'Tiszafüred', 'Tiszakécske', 'Tiszaújváros', 'Tiszavasvári', 'Tokaj', 'Tolna', 'Törökszentmiklós', + 'Vác', 'Várpalota', 'Vásárosnamény', 'Vasvár', 'Vecsés', + 'Záhony', 'Zalaszentgrót', 'Zirc' + ); } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/hu_HU/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/hu_HU/Payment.php new file mode 100644 index 00000000..e2fdced5 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/hu_HU/Payment.php @@ -0,0 +1,19 @@ +generator->parse(static::randomElement(static::$formats))); + } + + public function code() + { + return static::randomElement(static::$codes); + } + + /** + * @return mixed + */ + public function numberFormat() + { + return static::randomElement(static::$numberFormats); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/id_ID/Color.php b/vendor/fzaninotto/faker/src/Faker/Provider/id_ID/Color.php new file mode 100644 index 00000000..bb1444da --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/id_ID/Color.php @@ -0,0 +1,41 @@ +birthPlaceCode(); + $nik .= $this->generator->numerify('##'); + + if (!$birthDate) { + $birthDate = $this->generator->dateTimeBetween(); + } + + if (!$gender) { + $gender = $this->generator->randomElement(array(self::GENDER_MALE, self::GENDER_FEMALE)); + } + + # if gender is female, add 40 to days + if ($gender == self::GENDER_FEMALE) { + $nik .= $birthDate->format('d') + 40; + } else { + $nik .= $birthDate->format('d'); + } + + $nik .= $birthDate->format('my'); + + # add last random digits + $nik .= $this->generator->numerify('####'); + + return $nik; + } + + /** + * Generates birth place code for NIK + * + * @link https://id.wikipedia.org/wiki/Nomor_Induk_Kependudukan + * @link http://informasipedia.com/wilayah-indonesia/daftar-kabupaten-kota-di-indonesia/ + */ + protected function birthPlaceCode() + { + return static::randomElement(static::$birthPlaceCode); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/is_IS/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/is_IS/Person.php index 1b4d5649..0fdea683 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/is_IS/Person.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/is_IS/Person.php @@ -78,7 +78,7 @@ class Person extends \Faker\Provider\Person */ public function lastNameMale() { - return $this->lastName().'dóttir'; + return $this->lastName().'son'; } /** @@ -88,7 +88,7 @@ class Person extends \Faker\Provider\Person */ public function lastNameFemale() { - return $this->lastName().'son'; + return $this->lastName().'dóttir'; } /** diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Address.php new file mode 100644 index 00000000..1eee3b6d --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Address.php @@ -0,0 +1,139 @@ + 'Argovia'), + array('AI' => 'Appenzello Interno'), + array('AR' => 'Appenzello Esterno'), + array('BE' => 'Berna'), + array('BL' => 'Basilea Campagna'), + array('BS' => 'Basilea Città'), + array('FR' => 'Friburgo'), + array('GE' => 'Ginevra'), + array('GL' => 'Glarona'), + array('GR' => 'Grigioni'), + array('JU' => 'Giura'), + array('LU' => 'Lucerna'), + array('NE' => 'Neuchâtel'), + array('NW' => 'Nidvaldo'), + array('OW' => 'Obvaldo'), + array('SG' => 'San Gallo'), + array('SH' => 'Sciaffusa'), + array('SO' => 'Soletta'), + array('SZ' => 'Svitto'), + array('TG' => 'Turgovia'), + array('TI' => 'Ticino'), + array('UR' => 'Uri'), + array('VD' => 'Vaud'), + array('VS' => 'Vallese'), + array('ZG' => 'Zugo'), + array('ZH' => 'Zurigo') + ); + + protected static $cityFormats = array( + '{{cityName}}', + ); + + protected static $streetNameFormats = array( + '{{streetSuffix}} {{firstName}}', + '{{streetSuffix}} {{lastName}}' + ); + + protected static $streetAddressFormats = array( + '{{streetName}} {{buildingNumber}}', + ); + protected static $addressFormats = array( + "{{streetAddress}}\n{{postcode}} {{city}}", + ); + + /** + * Returns a random street prefix + * @example Via + * @return string + */ + public static function streetPrefix() + { + return static::randomElement(static::$streetPrefix); + } + + /** + * Returns a random city name. + * @example Luzern + * @return string + */ + public function cityName() + { + return static::randomElement(static::$cityNames); + } + + /** + * Returns a canton + * @example array('BE' => 'Bern') + * @return array + */ + public static function canton() + { + return static::randomElement(static::$canton); + } + + /** + * Returns the abbreviation of a canton. + * @return string + */ + public static function cantonShort() + { + $canton = static::canton(); + return key($canton); + } + + /** + * Returns the name of canton. + * @return string + */ + public static function cantonName() + { + $canton = static::canton(); + return current($canton); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Company.php new file mode 100644 index 00000000..9a42b1c3 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Company.php @@ -0,0 +1,15 @@ +generator->parse($format); } /** - * @example 'アオタ' + * @param string|null $gender 'male', 'female' or null for any + * @return string + * @example 'アキラ' */ - public static function firstKanaName() + public function firstKanaName($gender = null) { - return static::randomElement(static::$firstKanaName); + if ($gender === static::GENDER_MALE) { + return static::firstKanaNameMale(); + } elseif ($gender === static::GENDER_FEMALE) { + return static::firstKanaNameFemale(); + } + + return $this->generator->parse(static::randomElement(static::$firstKanaNameFormat)); } /** * @example 'アキラ' */ + public static function firstKanaNameMale() + { + return static::randomElement(static::$firstKanaNameMale); + } + + /** + * @example 'アケミ' + */ + public static function firstKanaNameFemale() + { + return static::randomElement(static::$firstKanaNameFemale); + } + + /** + * @example 'アオタ' + */ public static function lastKanaName() { return static::randomElement(static::$lastKanaName); diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/PhoneNumber.php index f4230d1b..9f03c565 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/PhoneNumber.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/PhoneNumber.php @@ -4,9 +4,16 @@ namespace Faker\Provider\ja_JP; class PhoneNumber extends \Faker\Provider\PhoneNumber { + /** + * @link http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/number_shitei.html#kotei-denwa + */ protected static $formats = array( '080-####-####', '090-####-####', - '##-####-####' + '0#-####-####', + '0####-#-####', + '0###-##-####', + '0##-###-####', + '0##0-###-###', ); } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/Text.php new file mode 100644 index 00000000..c8671cc0 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/Text.php @@ -0,0 +1,635 @@ +generator->parse($format); + } + + public static function companyPrefix() + { + return static::randomElement(static::$companyPrefixes); + } + + public static function companyNameElement() + { + return static::randomElement(static::$companyElements); + } + + public static function companyNameSuffix() + { + return static::randomElement(static::$companyNameSuffixes); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/DateTime.php b/vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/DateTime.php new file mode 100644 index 00000000..1a1a4dd4 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/DateTime.php @@ -0,0 +1,42 @@ + 'კვირáƒ', + 'Monday' => 'áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი', + 'Tuesday' => 'სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი', + 'Wednesday' => 'áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი', + 'Thursday' => 'ხუთშáƒáƒ‘áƒáƒ—ი', + 'Friday' => 'პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი', + 'Saturday' => 'შáƒáƒ‘áƒáƒ—ი', + ); + $week = static::dateTime($max)->format('l'); + return isset($map[$week]) ? $map[$week] : $week; + } + + public static function monthName($max = 'now') + { + $map = array( + 'January' => 'იáƒáƒœáƒ•áƒáƒ áƒ˜', + 'February' => 'თებერვáƒáƒšáƒ˜', + 'March' => 'მáƒáƒ áƒ¢áƒ˜', + 'April' => 'áƒáƒžáƒ áƒ˜áƒšáƒ˜', + 'May' => 'მáƒáƒ˜áƒ¡áƒ˜', + 'June' => 'ივნისი', + 'July' => 'ივლისი', + 'August' => 'áƒáƒ’ვისტáƒ', + 'September' => 'სექტემბერი', + 'October' => 'áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი', + 'November' => 'ნáƒáƒ”მბერი', + 'December' => 'დეკემბერი', + ); + $month = static::dateTime($max)->format('F'); + return isset($map[$month]) ? $map[$month] : $month; + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/Internet.php b/vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/Internet.php new file mode 100644 index 00000000..01b15c77 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/Internet.php @@ -0,0 +1,15 @@ +generator->parse($format); - } - - public static function country() - { - return static::randomElement(static::$country); - } - - public static function postcode() - { - return static::toUpper(static::bothify(static::randomElement(static::$postcode))); - } - public static function regionSuffix() { return static::randomElement(static::$regionSuffix); @@ -109,21 +93,11 @@ class Address extends \Faker\Provider\Address return static::randomElement(static::$region); } - public static function citySuffix() - { - return static::randomElement(static::$citySuffix); - } - public function city() { return static::randomElement(static::$city); } - public static function streetSuffix() - { - return static::randomElement(static::$streetSuffix); - } - public static function street() { return static::randomElement(static::$street); diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Company.php index 56b002a3..f8f8d159 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Company.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Company.php @@ -52,7 +52,7 @@ class Company extends \Faker\Provider\Company /** * National Business Identification Numbers * - * @link http://egov.kz/wps/portal/!utWCM/p/b1/04_Sj9Q1MjAwsDQ1s9CP0I_KSyzLTE8syczPS8wB8aPM4oO8PE2cnAwdDSxMw4wMHE08nZ2CA0KDXcwMgQoikRUYWIY4gxS4hwU4mRkbGBgTp98AB3A0IKQ_XD8KVQkWF4AV4LHCzyM_N1U_uKhUPzcqx83SU9cRANth_Rk!/dl4/d5/L0lHSkovd0RNQU5rQUVnQSEhLzRKVUUvZW4!/ + * @link http://egov.kz/wps/portal/Content?contentPath=%2Fegovcontent%2Fbus_business%2Ffor_businessmen%2Farticle%2Fbusiness_identification_number&lang=en * @param \DateTime $registrationDate * @return string 12 digits, like 150140000019 */ diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Payment.php index 56285b39..ab7f20e0 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Payment.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Payment.php @@ -17,4 +17,17 @@ class Payment extends \Faker\Provider\Payment { return static::randomElement(static::$banks); } + + /** + * International Bank Account Number (IBAN) + * @link http://en.wikipedia.org/wiki/International_Bank_Account_Number + * @param string $prefix for generating bank account number of a specific bank + * @param string $countryCode ISO 3166-1 alpha-2 country code + * @param integer $length total length without country code and 2 check digits + * @return string + */ + public static function bankAccountNumber($prefix = '', $countryCode = 'KZ', $length = null) + { + return static::iban($countryCode, $prefix, $length); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Person.php index 3eca4a5c..4e1e6811 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Person.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Person.php @@ -2,9 +2,52 @@ namespace Faker\Provider\kk_KZ; +use \Faker\Provider\DateTime; + class Person extends \Faker\Provider\Person { + const GENDER_MALE = 0; + const GENDER_FEMALE = 1; + + const CENTURY_19TH = 0; + const CENTURY_20TH = 1; + const CENTURY_21ST = 2; + + const MALE_CENTURY_19TH = 1; + const MALE_CENTURY_20TH = 3; + const MALE_CENTURY_21ST = 5; + + const FEMALE_CENTURY_19TH = 2; + const FEMALE_CENTURY_20TH = 4; + const FEMALE_CENTURY_21ST = 6; + + /** + * @var array + */ + public static $firstSequenceBitWeights = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); + + /** + * @var array + */ + public static $secondSequenceBitWeights = array(3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 2); + + /** + * @var array + */ + public static $genderCenturyMap = array( + self::GENDER_MALE => array( + self::CENTURY_19TH => self::MALE_CENTURY_19TH, + self::CENTURY_20TH => self::MALE_CENTURY_20TH, + self::CENTURY_21ST => self::MALE_CENTURY_21ST, + ), + self::GENDER_FEMALE => array( + self::CENTURY_19TH => self::FEMALE_CENTURY_19TH, + self::CENTURY_20TH => self::FEMALE_CENTURY_20TH, + self::CENTURY_21ST => self::FEMALE_CENTURY_21ST, + ), + ); + /** * @see https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D0%B7%D0%B0%D1%85%D1%81%D0%BA%D0%B0%D1%8F_%D1%84%D0%B0%D0%BC%D0%B8%D0%BB%D0%B8%D1%8F * @@ -133,23 +176,82 @@ class Person extends \Faker\Provider\Person 'ІÑмет', ); + /** + * @param integer $year + * + * @return integer|null + */ + private static function getCenturyByYear($year) + { + if ($year >= 2000 && $year <= DateTime::year()) { + return self::CENTURY_21ST; + } elseif ($year >= 1900) { + return self::CENTURY_20TH; + } elseif ($year >= 1800) { + return self::CENTURY_19TH; + } + } + /** * National Individual Identification Numbers * - * @link http://egov.kz/wps/portal/!utWCM/p/b1/04_Sj9S1tDAwMzY1NjLTj9CPykssy0xPLMnMz0vMAfGjzOKDvDxNnJwMHQ0sTMOMDBxNPJ2dggNCg13MDIEKIpEVGFiGOIMUuIcFOJkZGxgYE6ffAAdwNCCkP1w_ClUJFheAFeCxws8jPzdVPzcqx83SU9cRADxWbyg!/dl4/d5/L0lDUmlTUSEhL3dHa0FKRnNBLzRKVXFDQSEhL2Vu/ + * @link http://egov.kz/wps/portal/Content?contentPath=%2Fegovcontent%2Fcitizen_migration%2Fpassport_id_card%2Farticle%2Fiin_info&lang=en + * @link https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%B4%D0%B8%D0%B2%D0%B8%D0%B4%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B8%D0%B4%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80 + * * @param \DateTime $birthDate + * @param integer $gender + * * @return string 12 digits, like 780322300455 */ - public static function individualIdentificationNumber(\DateTime $birthDate = null) + public static function individualIdentificationNumber(\DateTime $birthDate = null, $gender = self::GENDER_MALE) { if (!$birthDate) { - $birthDate = \Faker\Provider\DateTime::dateTimeBetween(); + $birthDate = DateTime::dateTimeBetween(); } - $dateAsString = $birthDate->format('ymd'); - $genderAndCenturyId = (string) static::numberBetween(1, 6); - $randomDigits = (string) static::numerify('#####'); + do { + $population = mt_rand(1000, 2000); + $century = self::getCenturyByYear((int) $birthDate->format('Y')); - return $dateAsString . $genderAndCenturyId . $randomDigits; + $iin = $birthDate->format('ymd'); + $iin .= (string) self::$genderCenturyMap[$gender][$century]; + $iin .= (string) $population; + $checksum = self::checkSum($iin); + } while ($checksum === 10); + + return $iin . (string) $checksum; + } + + /** + * @param string $iinValue + * + * @return integer + */ + public static function checkSum($iinValue) + { + $controlDigit = self::getControlDigit($iinValue, self::$firstSequenceBitWeights); + + if ($controlDigit === 10) { + return self::getControlDigit($iinValue, self::$secondSequenceBitWeights); + } + + return $controlDigit; + } + + /** + * @param string $iinValue + * @param array $sequence + * + * @return integer + */ + protected static function getControlDigit($iinValue, $sequence) + { + $sum = 0; + + for ($i = 0; $i <= 10; $i++) { + $sum += (int) $iinValue[$i] * $sequence[$i]; + } + + return $sum % 11; } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Address.php index 1c1b7e7b..9b5398d9 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Address.php @@ -4,7 +4,7 @@ namespace Faker\Provider\ko_KR; class Address extends \Faker\Provider\Address { - protected static $postcode = array('###-###'); + protected static $postcode = array('#####'); protected static $buildingNumber = array('####', '###'); protected static $metropolitanCity = array( '서울특별시', '부산광역시', '대구광역시', 'ì¸ì²œê´‘역시', '광주광역시', '대전광역시', '울산광역시', diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Internet.php b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Internet.php index 48c00388..1c3dfb5a 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Internet.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Internet.php @@ -4,6 +4,83 @@ namespace Faker\Provider\ko_KR; class Internet extends \Faker\Provider\Internet { - protected static $freeEmailDomain = array('gmail.com', 'yahoo.com', 'hotmail.com', 'gmail.co.kr', 'hotmail.co.kr'); - protected static $tld = array('com', 'com', 'com', 'com', 'com', 'biz', 'info', 'net', 'org', 'co.kr', 'kr'); + protected static $userNameFormats = array( + '{{lastNameAscii}}.{{firstNameAscii}}', '{{firstNameAscii}}.{{lastNameAscii}}', '{{firstNameAscii}}##', '?{{lastNameAscii}}', + ); + + protected static $safeEmailTld = array( + 'com', 'kr', 'me', 'net', 'org', + ); + + protected static $tld = array( + 'biz', 'com', 'info', 'kr', 'net', 'org', + ); + + /** + * {@link} http://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98_%EC%9D%B8%EA%B5%AC%EC%88%9C_%EC%84%B1%EC%94%A8_%EB%AA%A9%EB%A1%9D + */ + protected static $lastNameAscii = array( + 'ahn', 'bae', 'baek', 'chang', 'cheon', 'cho', 'choi', 'chung', 'gang', 'go', 'gwak', 'gwon', 'ha', 'han', + 'heo', 'hong', 'hwang', 'jang', 'jeon', 'jo', 'jung', 'kang', 'kim', 'ko', 'kwak', 'kwon', 'lee', 'lim', 'moon', + 'nam', 'no', 'oh', 'park', 'ryu', 'seo', 'shim', 'shin', 'son', 'song', 'yang', 'yoon', 'yu', + ); + + /** + * {@link} http://ko.wikipedia.org/wiki/%ED%95%9C%EA%B5%AD%EC%9D%98_%EC%84%B1%EC%94%A8%EC%99%80_%EC%9D%B4%EB%A6%84#.EC.8B.9C.EB.8C.80.EB.B3.84_.EA.B0.80.EC.9E.A5_.ED.9D.94.ED.95.9C_.EC.9D.B4.EB.A6.84_10.EC.84.A0.28.E9.81.B8.29 + */ + protected static $firstNameAscii = array( + 'areum', 'arin', 'banhee', 'bom', 'bomi', 'bomin', 'boram', 'byungcheol', 'byungho', 'chaehyun', 'chaewon', + 'changyoung', 'daesoo', 'daesun', 'dayoung', 'dohyunn', 'dongha', 'donghyun', 'donghyun', 'dongyoon', 'doyoon', + 'doyoun', 'eunae', 'eunhee', 'eunhye', 'eunhyoung', 'eunji', 'eunjin', 'eunju', 'eunjung', 'eunkyoung', 'eunmi', + 'eunsang', 'eunseo', 'eunsung', 'eunteck', 'eunyoung', 'gangeun', 'ganghee', 'garam', 'geongeun', 'gunho', + 'gunwoo', 'haeun', 'hana', 'hanna', 'hayun', 'heekyoung', 'heewon', 'hojin', 'homin', 'hongsun', 'hyejin', + 'hyemin', 'hyena', 'hyerim', 'hyesuk', 'hyesun', 'hyeyoun', 'hyoil', 'hyojin', 'hyounjung', 'hyuksang', + 'hyungcheol', 'hyungmin', 'hyunji', 'hyunjong', 'hyunjoo', 'hyunjun', 'hyunkyu', 'hyunwoo', 'hyunyoung', + 'ingyu', 'inhwa', 'jaecheo', 'jaeho', 'jaehun', 'jaehyuk', 'jaehyun', 'jaeyeon', 'jaeyun', 'jia', 'jieun', + 'jihee', 'jihoo', 'jihoon', 'jihye', 'jihyeon', 'jimin', 'jina', 'jinhee', 'jinho', 'jinsoo', 'jinwoo', 'jisuk', + 'jisun', 'jiwon', 'jiwoo', 'jiye', 'jiyeon', 'jiyoung', 'jonghun', 'jongju', 'jongsoo', 'jughyung', 'juhee', + 'jumi', 'jumyoung', 'jun', 'junbum', 'jungeun', 'jungho', 'junghun', 'junghwa', 'jungmin', 'jungnam', 'jungran', + 'jungshik', 'jungsoo', 'jungsoo', 'jungwoong', 'junho', 'junhyuk', 'junhyung', 'junseo', 'junyoung', 'juwon', + 'juyeon', 'kisoo', 'kiyun', 'kubum', 'kwangsoo', 'kyungchoon', 'kyunghwan', 'kyungjoo', 'kyungseok', 'kyungsoo', + 'kyusan', 'mijung', 'mikyoung', 'mina', 'mincheol', 'minhee', 'minhwan', 'minhyoung', 'minjae', 'minji', + 'minjun', 'minseo', 'minseok', 'minsoo', 'minsung', 'mira', 'miran', 'miyoung', 'moonchang', 'moonyong', + 'myungho', 'myungshik', 'naeun', 'nahyoung', 'namho', 'namsoo', 'naree', 'naroo', 'nayun', 'nuree', 'saemi', + 'sangah', 'sangcheol', 'sangho', 'sanghun', 'sanghyun', 'sangjun', 'sangmyoung', 'sangsoo', 'sangsun', + 'sangwoo', 'sangwook', 'seoho', 'seohyeon', 'seojun', 'seoyeon', 'seoyoung', 'seoyun', 'seulki', 'seungho', + 'seunghyun', 'seungmin', 'sewon', 'sieun', 'sinae', 'siwoo', 'sojung', 'somin', 'soyoun', 'soyoung', 'subin', + 'sujin', 'sujung', 'sumin', 'sungeun', 'sunggon', 'sungho', 'sunghun', 'sunghyun', 'sungjin', 'sungmi', + 'sungmin', 'sungmin', 'sungryung', 'sungsoo', 'sunhang', 'sunho', 'sunjung', 'sunwoo', 'sunyoung', 'sunyup', + 'suran', 'suwon', 'suwon', 'suyoun', 'taehee', 'taeho', 'taehyun', 'wonhee', 'wonjin', 'wonjun', 'woojin', + 'yeji', 'yejin', 'yejun', 'yeojin', 'yeon', 'yewon', 'youngcheol', 'younggil', 'youngha', 'youngho', 'younghun', + 'younghwa', 'youngil', 'youngjin', 'youngjin', 'youngshik', 'youngsoo', 'youngtae', 'youngwhan', 'youngwhan', + 'younhee', 'younsun', 'yujin', 'yujung', 'yunkyoung', 'yunmi', 'yunseo', 'yunyoung', 'yuri' + ); + + public static function lastNameAscii() + { + return static::randomElement(static::$lastNameAscii); + } + + public static function firstNameAscii() + { + return static::randomElement(static::$firstNameAscii); + } + + /** + * @example 'gunwoo.gang' + */ + public function userName() + { + $format = static::randomElement(static::$userNameFormats); + + return static::bothify($this->generator->parse($format)); + } + + /** + * @example 'kim.kr' + */ + public function domainName() + { + return static::randomElement(static::$lastNameAscii) . '.' . $this->tld(); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Person.php index 21bc22c8..92d858f5 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Person.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Person.php @@ -46,7 +46,10 @@ class Person extends \Faker\Provider\Person * {@link} http://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98_%EC%9D%B8%EA%B5%AC%EC%88%9C_%EC%84%B1%EC%94%A8_%EB%AA%A9%EB%A1%9D */ protected static $lastName = array( - 'ê°•', 'ê³ ', 'ê³½', 'ê¶Œ', 'ê¹€', '남', 'ë…¸', '류', '문', 'ë°•', 'ë°°', 'ë°±', '서', 'ì†', '송', 'ì‹ ', '심', '안', 'ì–‘', '오', - '유', '윤', 'ì´', 'ìž„', '장', 'ì „', 'ì •', 'ì¡°', '최', '하', '한', 'í—ˆ', 'í™', '황', + 'ê¹€', 'ì´', 'ë°•', '최', 'ì •', 'ê°•', 'ì¡°', '윤', '장', 'ìž„', '오', '한', 'ì‹ ', '서', 'ê¶Œ', '황', '안', '송', '류', 'í™', + 'ì „', 'ê³ ', '문', 'ì†', 'ì–‘', 'ë°°', 'ì¡°', 'ë°±', 'í—ˆ', '남', '심', '유', 'ë…¸', '하', 'ì „', 'ì •', 'ê³½', '성', 'ì°¨', '유', + '구', 'ìš°', '주', 'ìž„', '나', 'ì‹ ', '민', 'ì§„', 'ì§€', 'ì—„', 'ì›', '채', 'ê°•', '천', 'ì–‘', 'ê³µ', '현', 'ë°©', 'ë³€', '함', + 'ë…¸', 'ì—¼', 'ì—¬', 'ì¶”', 'ë³€', 'ë„', 'ì„', 'ì‹ ', '소', 'ì„ ', '주', '설', 'ë°©', '마', 'ì •', '길', '위', 'ì—°', '표', '명', + '기', '금', '왕', 'ë°˜', '옥', '육', 'ì§„', 'ì¸', 'ë§¹', 'ì œ', 'íƒ', '모', '남ê¶', 'ì—¬', '장', 'ì–´', '유', 'êµ­', 'ì€', '편', ); } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/PhoneNumber.php index c1c0a2e9..6008bbf3 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/PhoneNumber.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/PhoneNumber.php @@ -4,14 +4,39 @@ namespace Faker\Provider\ko_KR; class PhoneNumber extends \Faker\Provider\PhoneNumber { + //reference : https://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98_%EC%A0%84%ED%99%94%EB%B2%88%ED%98%B8_%EC%B2%B4%EA%B3%84 + protected static $formats = array( - '010-####-####', + //local area phone format '070-####-####', '02-####-####', '03#-####-####', '04#-####-####', '05#-####-####', '06#-####-####', - '1588-####', + + //cell phone format + '010-####-####', + + //others: Intelligent Network(기간통신사업ìž) + '15##-####', + '16##-####', + '18##-####', ); + + public function localAreaPhoneNumber() + { + $format = self::randomElement(array_slice(static::$formats, 0, 6)); + + return self::numerify($this->generator->parse($format)); + } + + + + public function cellPhoneNumber() + { + $format = self::randomElement(array_slice(static::$formats, 6, 1)); + + return self::numerify($this->generator->parse($format)); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Text.php new file mode 100644 index 00000000..5f5148e5 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Text.php @@ -0,0 +1,1723 @@ +ì— ë‚˜ì˜¤ëŠ” ìš”ê·€ì˜ ë¶ˆë¹› 모양으로 푸르무레 하게 í—ˆê³µì„ ë¹„ì¶”ì˜¤. ë™ê²½ì˜ 불바다는 ë‚´ 마ìŒì„ ë”ìš± ìŒì¹¨í•˜ê²Œ 하였소. +ì´ ë•Œì— ë’¤ì—서, +"모시모시(여보세요)." +하는 소리가 들렸소. ê·¸ê²ƒì€ í° ì €ê³ ë¦¬ë¥¼ ìž…ì€ í˜¸í…” ë³´ì´ì˜€ì†Œ. +"왜?" +하고 나는 고개만 ëŒë ¸ì†Œ. +"ì†ë‹˜ì´ 오셨습니다." +"ì†ë‹˜?" +하고 나는 ë³´ì´ì—게로 한 ê±¸ìŒ ê°€ê¹Œì´ ê°”ì†Œ. 나를 ì°¾ì„ ì†ë‹˜ì´ ì–´ë”” 있나 하고 나는 놀란 것ì´ì˜¤. +"따님께서 오셨습니다. 방으로 모셨습니다." +하고 ë³´ì´ëŠ” 들어가 버리고 ë§ì•˜ì†Œ. +"따님?" +하고 나는 ë”ìš± 놀ëžì†Œ. 순임ì´ê°€ 서울서 나를 ë”°ë¼ì™”나? ê·¸ê²ƒì€ ì•ˆ ë  ë§ì´ì˜¤. 순임ì´ê°€ ë‚´ 뒤를 ë”°ë¼ ë– ë‚¬ë”ë¼ë„ 아무리 빨리 ì™€ë„ ë‚´ì¼ì´ 아니면 못 ì™”ì„ ê²ƒì´ì˜¤. 그러면 누군가. ì •ìž„ì¸ê°€. ì •ìž„ì´ê°€ 병ì›ì—서 뛰어온 것ì¸ê°€. +나는 ë‘근거리는 ê°€ìŠ´ì„ ì–µì§€ë¡œ 진정하면서 ë‚´ ë°©ë¬¸ì„ ì—´ì—ˆì†Œ. +ê·¸ê²ƒì€ ì •ìž„ì´ì—ˆì†Œ. ì •ìž„ì€ ë‚´ê°€ 쓰다가 ë‘” 편지를 ë³´ê³  있다가 벌떡 ì¼ì–´ë‚˜ 내게 달려들어 안겨 버렸소. 나는 얼빠진 ë“¯ì´ ì •ìž„ì´ê°€ 하ë¼ëŠ” 대로 내버려ë‘었소. ê·¸ 편지는 부치려고 ì“´ ê²ƒë„ ì•„ë‹Œë° ê·¸ 편지를 ì •ìž„ì´ê°€ 본 ê²ƒì´ ì•ˆë˜ì—ˆë‹¤ê³  ìƒê°í•˜ì˜€ì†Œ. +형! 나를 ì±…ë§í•˜ì‹œì˜¤. 심히 ë¶€ë„러운 ë§ì´ì§€ë§ˆëŠ” 나는 ì •ìž„ì„ íž˜ê» ê»´ì•ˆì•„ 주고 싶었소. 나는 몇 번ì´ë‚˜ ì •ìž„ì˜ ë“±ì„ êµ½ì–´ 보면서 ë‚´ íŒ”ì— íž˜ì„ ë„£ìœ¼ë ¤ê³  하였소. ì •ìž„ì€ ì‹¬ížˆ 귀여웠소. ì •ìž„ì´ê°€ 그처럼 나를 사모하는 ê²ƒì´ ì‹¬ížˆ 기뻤소. 나는 ê°ì •ì´ ìž¬ìš°ì³ì„œ ëˆˆì´ ì•ˆ ë³´ì´ê³  ì •ì‹ ì´ ëª½ë¡±í•˜ì—¬ì§ì„ 깨달았소. 나는 아프고 쓰린 듯한 기ì¨ì„ 깨달았소. ì˜ì–´ë¡œ 엑스터시ë¼ë“ ì§€, 한문으로 ë¬´ì•„ì˜ ê²½ì§€ëž€ ì´ëŸ° ê²ƒì´ ì•„ë‹Œê°€ 하였소. 나는 사십 í‰ìƒì— ì´ëŸ¬í•œ ê²½í—˜ì„ ì²˜ìŒ í•œ 것ì´ì˜¤. +형! í˜•ì´ ì•„ì‹œë‹¤ì‹œí”¼ 나는 ë‚´ ì•„ë‚´ ì´ì™¸ì— ì Šì€ ì—¬ì„±ì—게 ì´ë ‡ê²Œ 안겨 본 ì¼ì´ 없소. 물론 안아 본 ì¼ë„ 없소. +그러나 형! 나는 나를 눌렀소. ë‚´ 타오르는 ì• ìš•ì„ ì°¨ë””ì°¬ ì´ì§€ì˜ 입김으로 불어서 ë„려고 애를 ì¼ì†Œ. +"글쎄 웬ì¼ì´ëƒ. 앓는 ê²ƒì´ ì´ ë°¤ì¤‘ì— ë¹„ë¥¼ ë§žê³  왜 나온단 ë§ì´ëƒ. 철없는 것 같으니." +하고 나는 ì•„ë²„ì§€ì˜ ìœ„ì—„ìœ¼ë¡œ ì •ìž„ì˜ ë‘ ì–´ê¹¨ë¥¼ 붙들어 ì•”ì²´ì–´ì— ì•‰í˜”ì†Œ. 그리고 ë‚˜ë„ í…Œì´ë¸”ì„ í•˜ë‚˜ 세워 ë‘ê³  ë§žì€íŽ¸ì— ì•‰ì•˜ì†Œ. +ì •ìž„ì€ ë¶€ë„러운 ë“¯ì´ ë‘ ì†ìœ¼ë¡œ ë‚¯ì„ ê°€ë¦¬ìš°ê³  ì œ ë¬´ë¦Žì— ì—Žë“œë ¤ 울기를 시작하오. +ì •ìž„ì€ ëˆ„ëŸ° ê°ˆìƒ‰ì˜ ì™¸íˆ¬ë¥¼ 입었소. ë¬´ì—‡ì„ íƒ€ê³  왔는지 모르지마는 구ë‘ì—는 꽤 ë§Žì´ ë¬¼ì´ ë¬»ê³  모ìžì—는 빗방울 ì–¼ë£©ì´ ë³´ì´ì˜¤. +"네가 ì´ëŸ¬ë‹¤ê°€ 다시 ë³‘ì´ ë”치면 어찌한단 ë§ì´ëƒ. ì•„ì´ê°€ 왜 그렇게 ì² ì´ ì—†ë‹ˆ?" +하고 나는 ë”ìš± 냉정한 어조로 ì±…ë§í•˜ê³  ë°ìŠ¤í¬ ìœ„ì— ë†“ì¸ ë‚´ 편지 초를 ì§‘ì–´ ë°•ë°• 찢어 버렸소. ì¢…ì´ ì°¢ëŠ” ì†Œë¦¬ì— ì •ìž„ì€ ìž ê¹ ê³ ê°œë¥¼ 들어서 처ìŒì—는 ë‚´ ì†ì„ ë³´ê³  다ìŒì—는 ë‚´ ì–¼êµ´ì„ ë³´ì•˜ì†Œ. 그러나 나는 모르는 체하고 ë„로 êµì˜ì— ëŒì•„와 앉아서 가만히 ëˆˆì„ ê°ì•˜ì†Œ. 그리고 ë„무지 í¥ë¶„ë˜ì§€ 아니한 ëª¨ì–‘ì„ ê¾¸ëª„ì†Œ. +형! 어떻게나 힘드는 ì¼ì´ì˜¤? 참으면 ì°¸ì„ìˆ˜ë¡ ë‚´ ì´ë¹¨ì´ 마주 부딪고, ì–¼êµ´ì˜ ê·¼ìœ¡ì€ ì”°ë£©ê±°ë¦¬ê³  ì†ì€ 불ëˆë¶ˆëˆ ì¥ì–´ì§€ì˜¤. +"ì •ë§ ë‚´ì¼ ê°€ì„¸ìš”?" +하고 아마 오 ë¶„ ë™ì•ˆì´ë‚˜ ì¹¨ë¬µì„ ì§€í‚¤ë‹¤ê°€ ì •ìž„ì´ê°€ 고개를 들고 물었소. +"그럼, 가야지." +하고 나는 빙그레 웃어 보였소. +"ì €ë„ ë°ë¦¬ê³  가세요!" +하는 ì •ìž„ì˜ ë§ì€ 마치 ì„œë¦¿ë°œì´ ë‚ ë¦¬ëŠ” 칼날과 같았소. 나는 ê¹œì§ ë†€ë¼ì„œ ì •ìž„ì„ ë°”ë¼ë³´ì•˜ì†Œ. ê·¸ì˜ ëˆˆì€ ë¹›ë‚˜ê³  ìž…ì€ ê¼­ 다물고 ì–¼êµ´ì˜ ê·¼ìœ¡ì€ íŒ½íŒ½í•˜ê²Œ 켕겼소. ì •ìž„ì˜ ì–¼êµ´ì—는 ì°¬ë°”ëžŒì´ ë„는 무서운 ê¸°ìš´ì´ ìžˆì—ˆì†Œ. +나는 즉ê°ì ìœ¼ë¡œ 죽기를 결심한 ì—¬ìžì˜ 모양ì´ë¼ê³  ìƒê°í•˜ì˜€ì†Œ. 열정으로 불ë©ì–´ë¦¬ê°€ ë˜ì—ˆë˜ ì •ìž„ì€ ë‚´ê°€ ë³´ì´ëŠ” 냉랭한 태ë„로 ë§ë¯¸ì•”ì•„ ê°‘ìžê¸° 얼어 버린 것 같았소. +"어디를?" +하고 나는 ì •ìž„ì˜ `ì €ë„ ë°ë¦¬ê³  가세요.' 하는 담대한 ë§ì— 놀ë¼ë©´ì„œ 물었소. +"어디든지, 아버지 가시는 ë°ë©´ 어디든지 저를 ë°ë¦¬ê³  가세요. 저는 아버지를 떠나서는 혼ìžì„œëŠ” 못 ì‚´ ê²ƒì„ ì§€ë‚˜ê°„ ë°˜ 달 ë™ì•ˆì— 잘 알았습니다. 아까 아버지 오셨다 가신 ë’¤ì— ìƒê°í•´ ë³´ë‹ˆê¹ ì•”ë§Œí•´ë„ ì•„ë²„ì§€ëŠ” 다시 ì €ì—게 와 보시지 아니하고 가실 것만 같애요. 그리고 저로 해서 아버지께서는 무슨 í° íƒ€ê²©ì„ ë‹¹í•˜ì‹  것만 같으셔요. ì²˜ìŒ ëµˆì˜¬ ì ì— ë²Œì¨ ê°€ìŠ´ì´ ëœ¨ë”했습니다. 그리고 ì—¬í–‰ì„ ë– ë‚˜ì‹ ë‹¤ëŠ” ë§ì”€ì„ 듣고는 반드시 무슨 í°ì¼ì´ 나셨ëŠë‹ˆë¼ê³ ë§Œ ìƒê°í–ˆìŠµë‹ˆë‹¤. 그리고 저어, 저로 해서 그러신 것만 같고, 저를 버리시고 í˜¼ìž ê°€ì‹œë ¤ëŠ” 것만 같고, 그래서 달려왔ë”니 여기 ì¨ ë†“ìœ¼ì‹  편지를 ë³´ê³  ê·¸ íŽ¸ì§€ì— ë‹¤ë¥¸ ë§ì”€ì€ ì–´ì°Œ ëë“ ì§€, 네 ì¼ê¸°ë¥¼ 보았다 하신 ë§ì”€ì„ 보고는 다 알았습니다. 저와 한 ë°©ì— ìžˆëŠ” ì• ê°€ ì•”ë§Œí•´ë„ ì–´ë¨¸ë‹ˆ 스파ì¸ê°€ë´ìš”. 제가 ìž…ì›í•˜ê¸° ì „ì—ë„ ì œ 눈치를 슬슬 ë³´ê³  ë˜ ì±…ìƒ ì„œëžë„ 뒤지는 눈치가 ë³´ì´ê¸¸ëž˜ ì¼ê¸°ì±…ì€ ëŠ˜ 쇠 잠그는 서ëžì— 넣어 ë‘ì—ˆëŠ”ë° ì•„ë§ˆ 제가 ì •ì‹  ì—†ì´ ì•“ê³  누웠는 ë™ì•ˆì— ì œ 핸드백ì—서 쇳대를 í›”ì³ ê°”ë˜ê°€ë´ìš”. 그래서는 ê·¸ ì¼ê¸°ì±…ì„ êº¼ë‚´ì„œ 서울로 보냈나ë´ìš”. 그걸루 해서 아버지께서는 불명예스러운 ëˆ„ëª…ì„ ì“°ì‹œê³  í•™êµì¼ë„ 내놓으시게 ë˜ê³  ì§‘ë„ ë– ë‚˜ì‹œê²Œ ë˜ì…¨ë‚˜ë´ìš”. 다시는 ì§‘ì— ì•ˆ ëŒì•„오실 양으로 ê²°ì‹¬ì„ í•˜ì…¨ë‚˜ë´ìš”. 아까 병ì›ì—ì„œë„ í•˜ì‹œëŠ” ë§ì”€ì´ ëª¨ë‘ ìœ ì–¸í•˜ì‹œëŠ” 것만 같아서 í½ ì˜ì‹¬ì„ ê°€ì¡Œì—ˆëŠ”ë° ì§€ê¸ˆ ê·¸ ì“°ì‹œë˜ íŽ¸ì§€ë¥¼ 보고는 다 알았습니다. 그렇지만 그렇지만." +하고 웅변으로 ë‚´ë ¤ ë§í•˜ë˜ ì •ìž„ì€ ê°‘ìžê¸° 복받치는 ì—´ì •ì„ ì´ê¸°ì§€ 못하는 듯ì´, 한 번 í•œìˆ¨ì„ ì§€ìš°ê³ , +"그렇지만 저는 아버지를 ë”°ë¼ê°€ìš”. 절루 해서 아버지께서는 ì§‘ë„ ìžƒìœ¼ì‹œê³  ëª…ì˜ˆë„ ìžƒìœ¼ì‹œê³  ì‚¬ì—…ë„ ìžƒìœ¼ì‹œê³  ì¸ìƒì˜ 모든 ê²ƒì„ ë‹¤ 잃으셨으니 저는 아버지를 ë”°ë¼ê°€ìš”. 어디를 가시든지 저는 어린 딸로 아버지를 ë”°ë¼ë‹¤ë‹ˆë‹¤ê°€ 아버지께서 먼저 ëŒì•„가시면 ì €ë„ ë”°ë¼ ì£½ì–´ì„œ 아버지 ë°œ ë°‘ì— ë¬»íž í…Œì•¼ìš”. 제가 먼저 죽거든 제가 ë³‘ì´ ìžˆìœ¼ë‹ˆê¹ ë¬¼ë¡  제가 먼저 죽지요. ì£½ì–´ë„ ì¢‹ìŠµë‹ˆë‹¤. 병ì›ì—서 앓다가 í˜¼ìž ì£½ëŠ” ê±´ ì‹«ì–´ìš”. 아버지 ê³ì—서 죽으면 아버지께서, 오 ë‚´ 딸 정임아 하시고 귀해 주시고 불ìŒížˆ 여겨 주시겠지요. 그리고 ì œ ëª¸ì„ ì–´ë””ë“ ì§€ ë•…ì— ë¬»ìœ¼ì‹œê³  `사랑하는 ë‚´ 딸 ì •ìž„ì˜ ë¬´ë¤'ì´ë¼ê³  패ë¼ë„ ì†ìˆ˜ 쓰셔서 세워 주시지 않겠습니까." +하고 ì •ìž„ì€ ë¹„ì­‰ë¹„ì­‰í•˜ë‹¤ê°€ 그만 무릎 ìœ„ì— ì—Žë”ì ¸ 울고 마오. +나는 다만 ì£½ì€ ì‚¬ëžŒ 모양으로 반쯤 ëˆˆì„ ê°ê³  앉아 있었소. 가슴 ì†ì—는 ì •ìž„ì˜ ê³ì—서 지지 않는 ì—´ì •ì„ í’ˆìœ¼ë©´ì„œë„ ì •ìž„ì˜ ë§ëŒ€ë¡œ ì •ìž„ì„ ë°ë¦¬ê³  ì•„ë¬´ë„ ëª¨ë¥´ëŠ” 곳으로 ê°€ 버리고 ì‹¶ìœ¼ë©´ì„œë„ ë‚˜ëŠ” ì´ ì—´ì •ì˜ ë¶ˆê¸¸ì„ ë‚´ 입김으로 꺼 버리지 아니하면 아니 ë˜ëŠ” 것ì´ì—ˆì†Œ. +"ì•„ì•„, 제가 왜 났어요? 왜 하나님께서 저를 세ìƒì— 보내셨어요? ì•„ë²„ì§€ì˜ ì¼ìƒì„ 파멸시키려 난 것ì´ì§€ìš”? 제가 지금 죽어 버려서 ì•„ë²„ì§€ì˜ ëª…ì˜ˆë¥¼ 회복할 수 있다면 저는 죽어 버릴 í„°ì´ì•¼ìš”. 기ì˜ê²Œ 죽어 버리겠습니다. 제가 ì—¬ëŸ ì‚´ë¶€í„° 오늘날까지 ë°›ì€ ì€í˜œë¥¼ ì œ 목숨 하나로 ê°šì„ ìˆ˜ê°€ 있다면 저는 지금으로 죽어 버리겠습니다. 그렇지만 그렇지만……. +그렇지만 그렇지만 저는 다만 얼마ë¼ë„ 다만 하루ë¼ë„ 아버지 ê³ì—서 ì‚´ê³  ì‹¶ì–´ìš” 다만 하루만ì´ë¼ë„, 아버지! 제가 왜 ì´ë ‡ìŠµë‹ˆê¹Œ, 네? 제가 어려서 ì´ë ‡ìŠµë‹ˆê¹Œ. 미친 ë…„ì´ ë˜ì–´ì„œ ì´ë ‡ìŠµë‹ˆê¹Œ. 아버지께서는 아실 테니 ë§ì”€í•´ 주세요. 하루만ì´ë¼ë„ 아버지를 모시고 아버지 ê³ì—서 살았으면 ì£½ì–´ë„ í•œì´ ì—†ê² ìŠµë‹ˆë‹¤. ì œ ìƒê°ì´ 잘못ì´ì•¼ìš”? ì œ ìƒê°ì´ 죄야요? 왜 죄입니까? 아버지, 저를 버리시고 í˜¼ìž ê°€ì‹œì§€ 마세요, 네? `정임아, 너를 ë°ë¦¬ê³  가마.' 하고 약ì†í•´ 주세요, 네." +ì •ìž„ì€ ì•„ì£¼ 담대하게 제가 í•˜ê³ ìž í•˜ëŠ” ë§ì„ 다 하오. ê·¸ 얌전한, ìˆ˜ì‚½í•œì •ìž„ì˜ ì†ì— ì–´ë”” 그러한 용기가 있었ë˜ê°€, ì°¸ ì´ìƒí•œ ì¼ì´ì˜¤. 나는 귀여운 어린 계집애 ì •ìž„ì˜ ì†ì— ì—‰í¼í•œ ì—¬ìžê°€ ë“¤ì–´ì•‰ì€ ê²ƒì„ ë°œê²¬í•˜ì˜€ì†Œ. 그가 몇 가지 재료(ë‚´ê°€ ì—¬í–‰ì„ ë– ë‚œë‹¤ëŠ” 것과 ì œ ì¼ê¸°ë¥¼ 보았다는 것)를 종합하여 나와 ì €ì™€ì˜ ìƒˆì—, ë˜ ê·¸ ë•Œë¬¸ì— ì–´ë– í•œ ì¼ì´ ì¼ì–´ë‚œ ê²ƒì„ ì¶”ì¸¡í•˜ëŠ” ê·¸ ìƒìƒë ¥ë„ 놀ëžê±°ë‹ˆì™€ 그렇게 ë‚´ 앞ì—서는 별로 ìž…ë„ ë²Œë¦¬ì§€ ì•„ë‹ˆí•˜ë˜ ê·¸ê°€ ì´ì²˜ëŸ¼ 담대하게 ì œ ì†ì— 있는 ë§ì„ ê±°ë¦¬ë‚Œì—†ì´ ë‹¤ í•´ 버리는 용기를 아니 놀랄 수 없었소. ë‚´ê°€, 사내요 ì–´ë¥¸ì¸ ë‚´ê°€ ë„리어 ì •ìž„ì—게 리드를 받고 ë†€ë¦¼ì„ ë°›ìŒì„ 깨달았소. +그러나 ì •ìž„ì„ ìœ„í•´ì„œë“ ì§€, 중년 남ìžì˜ ìœ„ì‹ ì„ ìœ„í•´ì„œë“ ì§€ 나는 ì˜ì§€ë ¥ìœ¼ë¡œ, ë„ë•력으로, ì •ìž„ì„ ëˆ„ë¥´ê³  훈계하지 아니하면 아니 ë˜ê² ë‹¤ê³  ìƒê°í•˜ì˜€ì†Œ. +"정임아." +하고 나는 비로소 ìž…ì„ ì—´ì–´ì„œ 불렀소. ë‚´ ì–´ì„±ì€ ìž¥ì¤‘í•˜ì˜€ì†Œ. 나는 í•  수 있는 ìœ„ì—„ì„ ë‹¤í•˜ì—¬ `정임아.' 하고 부른 것ì´ì˜¤. +"정임아, 네 ì†ì€ 다 알았다. 네 ë§ˆìŒ ë„¤ ëœ»ì€ ê·¸ë§Œí•˜ë©´ 다 알았다. 네가 나를 그처럼 ìƒê°í•´ 주는 ê²ƒì„ ê³ ë§™ê²Œ ìƒê°í•œë‹¤. 기ì˜ê²Œë„ ìƒê°í•œë‹¤. 그러나 정임아." +하고 나는 ì¼ì¸µ 태ë„와 소리를 엄숙하게 하여, +"네가 청하는 ë§ì€ 절대로 ë“¤ì„ ìˆ˜ 없는 ë§ì´ë‹¤. ë‚´ê°€ 너를 ì¹œë”¸ê°™ì´ ì‚¬ëž‘í•˜ê¸° ë•Œë¬¸ì— ë‚˜ëŠ” 너를 ë°ë¦¬ê³  가지 못하는 것ì´ë‹¤. 나는 세ìƒì—서 죽고 ì¡°ì„ ì—서 죽ë”ë¼ë„ 너는 죽어서 아니 ëœë‹¤. 차마 너까지는 죽ì´ê³  ì‹¶ì§€ 아니하단 ë§ì´ë‹¤. ë‚´ê°€ ì–´ë”” 가서 없어져 버리면 세ìƒì€ 네게 씌운 ëˆ„ëª…ì´ ì• ë§¤í•œ ì¤„ì„ ì•Œê²Œ ë  ê²ƒì´ ì•„ë‹ˆëƒ. 그리ë˜ë©´ 너는 ì¡°ì„ ì˜ ì¢‹ì€ ì¼ê¾¼ì´ ë˜ì–´ì„œ ì¼ë„ ë§Žì´ í•˜ê³  ë˜ ì‚¬ëž‘í•˜ëŠ” ë‚¨íŽ¸ì„ ë§žì•„ì„œ í–‰ë³µëœ ìƒí™œë„ í•  수 ìžˆì„ ê²ƒì´ ì•„ë‹ˆëƒ. ê·¸ê²ƒì´ ë‚´ê°€ 네게 ë°”ë¼ëŠ” 것ì´ë‹¤. ë‚´ê°€ ì–´ë”” ê°€ 있든지, ë‚´ê°€ ì‚´ì•„ 있는 ë™ì•ˆ 나는 네가 잘ë˜ëŠ” 것만, 행복ë˜ê²Œ 사는 것만 ë°”ë¼ë³´ê³  í˜¼ìž ê¸°ë»í•  ê²ƒì´ ì•„ë‹ˆëƒ. +네가 다 옳게 알았다. 나는 네 ë§ëŒ€ë¡œ ì¡°ì„ ì„ ì˜ì›ížˆ 떠나기로 하였다. 그렇지마는 나는 ì´ë ‡ê²Œ ëœ ê²ƒì„ ì¡°ê¸ˆë„ ìŠ¬í¼í•˜ì§€ 아니한다. 너를 위해서 ë‚´ê°€ 무슨 í¬ìƒì„ 한다고 하면 내게는 ê·¸ê²ƒì´ í° ê¸°ì¨ì´ë‹¤. ê·¸ë¿ ì•„ë‹ˆë¼, 나는 ì¸ì œëŠ” 세ìƒì´ 싫어졌다. ë” ì‚´ê¸°ê°€ 싫어졌다. ë‚´ê°€ ì‹­ì—¬ ë…„ ë™ì•ˆ ì „ìƒëª…ì„ ë°”ì³ì„œ êµìœ¡í•œ í•™ìƒë“¤ì—게까지 ë°°ì²™ì„ ë°›ì„ ë•Œì—는 나는 지금까지 살아온 ê²ƒì„ ìƒê°ë§Œ í•˜ì—¬ë„ ì§„ì €ë¦¬ê°€ 난다. 그렇지마는 나는 ì´ê²ƒì´ 다 ë‚´ê°€ 부족한 ë•Œë¬¸ì¸ ì¤„ì„ ìž˜ 안다. 나는 ì¡°ì„ ì„ ì›ë§í•œë‹¤ë“ ê°€, ë‚´ ë™í¬ë¥¼ ì›ë§í•œë‹¤ë“ ê°€, 그럴 ìƒê°ì€ 없다. ì›ë§ì„ 한다면 나 ìžì‹ ì˜ ë¶€ì¡±ì„ ì›ë§í•  ë¿ì´ë‹¤. ë‚´ê°€ ì›ì²´ êµìœ¡ì„ 한다든지 ë‚¨ì˜ ì§€ë„ìžê°€ ëœë‹¤ë“ ì§€ í•  ìžê²©ì´ ì—†ìŒì„ ì›ë§í•œë‹¤ë©´ ì›ë§í• ê¹Œ, ë‚´ê°€ 어떻게 ì¡°ì„ ì´ë‚˜ ì¡°ì„  ì‚¬ëžŒì„ ì›ë§í•˜ëŠëƒ. 그러니까 ì¸ì œ 내게 ë‚¨ì€ ì¼ì€ 나를 ì¡°ì„ ì—서 없애 버리는 것ì´ë‹¤. ê°ížˆ ì‹­ì—¬ ë…„ ê°„ êµìœ¡ê°€ë¼ê³  ìžì²˜í•´ ì˜¤ë˜ ê±°ì§“ë˜ê³  ì™¸ëžŒëœ ìƒí™œì„ ëŠì–´ 버리는 것ì´ë‹¤. 남편 ë…¸ë¦‡ë„ ëª» 하고 아버지 ë…¸ë¦‡ë„ ëª» 하는 ì‚¬ëžŒì´ ë‚¨ì˜ ìŠ¤ìŠ¹ì€ ì–´ë–»ê²Œ ë˜ê³  ì§€ë„ìžëŠ” 어떻게 ë˜ëŠëƒ. 하니까 나는 ì´ì œ 세ìƒì„ 떠나 버리는 ê²ƒì´ ì¡°ê¸ˆë„ ìŠ¬í”„ì§€ 아니하고 ë„리어 ëª¸ì´ ê°€ëœ¬í•˜ê³  유쾌해지는 것 같다. +ì˜¤ì§ í•˜ë‚˜ 마ìŒì— 걸리는 ê²ƒì€ ë‚´ ì„ ë°°ìš” 사랑하는 ë™ì§€ì´ë˜ 남 ì„ ìƒì˜ 유ì¼í•œ 혈육ì´ë˜ 네게다가 ëˆ„ëª…ì„ ì”Œìš°ê³  가는 것ì´ë‹¤." +"그게 ì–´ë”” 아버지 잘못입니까?" +하고 ì •ìž„ì€ ìž…ìˆ ì„ ê¹¨ë¬¼ì—ˆì†Œ. +"ëª¨ë‘ ì œê°€ ì² ì´ ì—†ì–´ì„œ ì € 때문ì—……." +하고 ì •ìž„ì€ ëª¸ì„ ë–¨ê³  울었소. +"아니! 그렇게 ìƒê°í•˜ì§€ 마ë¼. ë‚´ê°€ 지금 세ìƒì„ 버릴 ë•Œì— ë¬´ìŠ¨ 기ì¨ì´ 한 가지 남는 ê²ƒì´ ìžˆë‹¤ê³  하면 너 하나가, ì´ ì„¸ìƒì—서 ì˜¤ì§ ë„ˆ 하나가 나를 ë”°ë¼ ì£¼ëŠ” 것ì´ë‹¤. 아마 ë„ˆë„ ë‚˜ë¥¼ 잘못 알고 ë”°ë¼ ì£¼ëŠ” 것ì´ê² ì§€ë§ˆëŠ” 세ìƒì´ 다 나를 버리고, 처ìžê¹Œì§€ë„ 다 나를 버릴 ë•Œì— ì˜¤ì§ ë„ˆ 하나가 나를 소중히 알아 주니 ì–´ì°Œ 고맙지 않겠ëŠëƒ. 그러니까 정임아 너는 ëª¸ì„ ì¡°ì‹¬í•˜ì—¬ì„œ ê±´ê°•ì„ íšŒë³µí•˜ì—¬ì„œ 오래 잘 ì‚´ê³ , 그리고 나를 ìƒê°í•´ 다오." +하고 ë‚˜ë„ ìš¸ì—ˆì†Œ. +형! ë‚´ê°€ ì •ìž„ì—게 ì´ëŸ° ë§ì„ 한 ê²ƒì´ ìž˜ëª»ì´ì§€ìš”. 그러나 나는 ê·¸ ë•Œì— ì´ëŸ° ë§ì„ 아니 í•  수 없었소. 왜 그런고 하니, ê·¸ê²ƒì´ ë‚´ ì§„ì •ì´ë‹ˆê¹Œ. ë‚˜ë„ í•™êµ ì„ ìƒìœ¼ë¡œ, êµìž¥ìœ¼ë¡œ, ë˜ ì£¼ì œë„˜ê²Œ ì§€ì‚¬ë¡œì˜ ì¼ìƒì„ ë³´ë‚´ë…¸ë¼ê³  마치 ì˜¤ì§ ì–¼ìŒ ê°™ì€ ì˜ì§€ë ¥ë§Œ 가진 사람 모양으로 사십 í‰ìƒì„ ì‚´ì•„ 왔지마는 ë‚´ ì†ì—ë„ ì—´ì •ì€ ìžˆì—ˆë˜ ê²ƒì´ì˜¤. 다만 ê·¸ ì—´ì •ì„ ëˆ„ë¥´ê³  죽ì´ê³  ìžˆì—ˆì„ ë¿ì´ì˜¤. 물론 나는 아마 ì¼ìƒì— ì´ ì—´ì •ì˜ ê³ ì‚를 놓아 줄 ë‚ ì´ ì—†ê² ì§€ìš”. ë§Œì¼ ë‚´ê°€ ì´ ì—´ì •ì˜ ê³ ì‚를 놓아서 ìžìœ ë¡œ 달리게 한다고 하면 나는 ì´ ê²½ìš°ì— ì •ìž„ì„ ì•ˆê³ , ë‚´ 열정으로 ì •ìž„ì„ íƒœì›Œ 버렸ì„ëŠ”ì§€ë„ ëª¨ë¥´ì˜¤. 그러나 나는 ì •ìž„ì´ê°€ 열정으로 íƒˆìˆ˜ë¡ ë‚˜ëŠ” ë‚´ ì—´ì •ì˜ ê³ ì‚를 ë‘ ì†ìœ¼ë¡œ 꽉 붙들고 ì´ë¥¼ 악물고 매달릴 ê²°ì‹¬ì„ í•œ 것ì´ì˜¤. +열한 시! +"정임아. ì¸ì œ 병ì›ìœ¼ë¡œ 가거ë¼." +하고 나는 엄연하게 명령하였소. +"ë‚´ì¼ ì €ë¥¼ 보시고 떠나시지요?" +하고 ì •ìž„ì€ ëˆˆë¬¼ì„ ì”»ê³  물었소. +"그럼, Jì¡°êµìˆ˜ë„ 만나고 ë„ˆë„ ë³´ê³  떠나지." +하고 나는 ê±°ì§“ë§ì„ 하였소. ì´ ê²½ìš°ì— ë‚´ê°€ ê±°ì§“ë§ìŸì´ë¼ëŠ” í° ì£„ì¸ì´ ë˜ëŠ” ê²ƒì´ ì •ìž„ì—게 대하여 ì •ìž„ì„ ìœ„í•˜ì—¬ 가장 ì˜³ì€ ì¼ì´ë¼ê³  ìƒê°í•œ 까닭ì´ì˜¤. +ì •ìž„ì€, 무서운 ì§ê°ë ¥ê³¼ ìƒìƒë ¥ì„ 가진 ì •ìž„ì€ ë‚´ ë§ì˜ ì§„ì‹¤ì„±ì„ ì˜ì‹¬í•˜ëŠ” ë“¯ì´ ë‚˜ë¥¼ 뚫어지게 ë°”ë¼ë³´ì•˜ì†Œ. 나는 차마 ì •ìž„ì˜ ì‹œì„ ì„ ë§ˆì£¼ ë³´ì§€ 못하여 외면하여 버렸소. +ì •ìž„ì€ ìˆ˜ê±´ìœ¼ë¡œ ëˆˆë¬¼ì„ ì”»ê³  ì²´ê²½ ì•žì— ê°€ì„œ í™”ìž¥ì„ ê³ ì¹˜ê³  그리고, +"저는 가요." +하고 ë‚´ ì•žì— í—ˆë¦¬ë¥¼ 굽혀서 작별 ì¸ì‚¬ë¥¼ 하였소. +"오, ê°€ ìžê±°ë¼." +하고 나는 극히 범연하게 대답하였소. 나는 ìžë¦¬ì˜·ì„ 입었기 ë•Œë¬¸ì— í˜„ê´€ê¹Œì§€ 작별할 ìˆ˜ë„ ì—†ì–´ì„œ ë³´ì´ë¥¼ 불러 ìžë™ì°¨ë¥¼ 하나 준비하ë¼ê³  명하고 ë‚´ ë°©ì—서 작별할 ìƒê°ì„ 하였소. +"ë‚´ì¼ ë³‘ì›ì— 오세요?" +하고 ì •ìž„ì€ ê³ ê°œë¥¼ 숙ì´ê³  낙루하였소. +"오, 가마." +하고 나는 ë˜ ê±°ì§“ë§ì„ 하였소. 세ìƒì„ 버리기로 결심한 ì‚¬ëžŒì˜ ê±°ì§“ë§ì€ í•˜ë‚˜ë‹˜ê»˜ì„œë„ ìš©ì„œí•˜ì‹œê² ì§€ìš”. 설사 ë‚´ê°€ ê±°ì§“ë§ì„ 한 죄로 ì§€ì˜¥ì— ê°„ë‹¤ 하ë”ë¼ë„ ì´ ê²½ìš°ì— ì •ìž„ì„ ìœ„í•˜ì—¬ ê±°ì§“ë§ì„ 아니 í•  수가 없지 않소? ë‚´ê°€ ê±°ì§“ë§ì„ 아니 하면 ì •ìž„ì€ ì•„ë‹ˆ ê°ˆ ê²ƒì´ ë¶„ëª…í•˜ì˜€ì†Œ. +"ì „ 가요." +하고 ì •ìž„ì€ ë˜ í•œ 번 ì ˆì„ í•˜ì˜€ìœ¼ë‚˜ 소리를 내어서 울었소. +"울지 마ë¼! 몸 ìƒí•œë‹¤." +하고 나는 ì •ìž„ì—게 대한 ìµœí›„ì˜ ì¹œì ˆì„ ì •ìž„ì˜ ê³ì— 한 ê±¸ìŒ ê°€ê¹Œì´ ê°€ì„œ 어깨를 ë˜ë‹¥ë˜ë‹¥í•˜ì—¬ 주고, 외투를 입혀 주었소. +"안녕히 주무세요." +하고 ì •ìž„ì€ ë¬¸ì„ ì—´ê³  나가 버렸소. +ì •ìž„ì˜ ê±¸ì–´ê°€ëŠ” 소리가 차차 멀어졌소. +나는 얼빠진 사람 모양으로 ê·¸ ìžë¦¬ì— ìš°ë‘커니 서 있었소. +ì°½ì— ë¶€ë”ªížˆëŠ” ë¹—ë°œ 소리가 들리고 ìžë™ì°¨ 소리가 먼 나ë¼ì—서 오는 ê²ƒê°™ì´ ë“¤ë¦¬ì˜¤. ì´ê²ƒì´ ì •ìž„ì´ê°€ 타고 가는 ìžë™ì°¨ 소리ì¸ê°€. 나는 ì •ìž„ì„ ë”°ë¼ê°€ì„œ 붙들어 오고 싶었소. ë‚´ 몸과 마ìŒì€ ì •ìž„ì„ ë”°ë¼ì„œ í—ˆê³µì— ë– ê°€ëŠ” 것 같았소. +ì•„ì•„ ì´ë ‡ê²Œ 나는 ì •ìž„ì„ ê³ì— ë‘ê³  ì‹¶ì„까. ì´ë ‡ê²Œ ë‚´ê°€ ì •ìž„ì˜ ê³ì— 있고 ì‹¶ì„까. 그러하건마는 나는 ì •ìž„ì„ ë–¼ì–´ 버리고 가지 아니하면 아니 ëœë‹¤! ê·¸ê²ƒì€ ì• ë“는 ì¼ì´ë‹¤. 기막히는 ì¼ì´ë‹¤! 그러나 ë‚´ ë„ë•ì  ì±…ìž„ì€ ì—„ì •í•˜ê²Œ 그렇게 명령하지 않ëŠëƒ. 나는 ì´ ë„ë•ì  ì±…ìž„ì˜ ëª…ë ¹ ê·¸ê²ƒì€ ë”위가 없는 명령ì´ë‹¤ ì„ í„¸ë만치ë¼ë„ 휘어서는 아니 ëœë‹¤. +그러나 ì •ìž„ì´ê°€ 호텔 현관까지 ìžë™ì°¨ë¥¼ 타기 ì „ì— í•œ 번만 ë” ë°”ë¼ë³´ëŠ” ê²ƒë„ ëª» í•  ì¼ì¼ê¹Œ. 한 번만, ìž ê¹ë§Œ ë” ë°”ë¼ë³´ëŠ” ê²ƒë„ ëª» í•  ì¼ì¼ê¹Œ. ìž ê¹ë§Œ ì¼ ë¶„ë§Œ 아니 ì¼ ì´ˆë§Œ 한 시그마ë¼ëŠ” 극히 ì§§ì€ ë™ì•ˆë§Œ ë°”ë¼ë³´ëŠ” ê²ƒë„ ëª» í•  ì¼ì¼ê¹Œ. 아니, ì •ìž„ì„ í•œ 시그마 ë™ì•ˆë§Œ ë” ë³´ê³  싶다 나는 ì´ë ‡ê²Œ ìƒê°í•˜ê³  벌떡 ì¼ì–´ë‚˜ì„œ ë„ì–´ì˜ í•¸ë“¤ì— ì†ì„ 대었소. +`안 ëœë‹¤! 옳잖다!' +하고 나는 ë‚´ ì†ŒíŒŒì— ëŒì•„와서 í„¸ì© ëª¸ì„ ë˜ì¡Œì†Œ. +`ìµœí›„ì˜ ìˆœê°„ì´ ì•„ë‹ˆëƒ. ìµœí›„ì˜ ìˆœê°„ì— ìš©ê°ížˆ ì´ê²¨ì•¼ í•  ê²ƒì´ ì•„ë‹ˆëƒ. 아서ë¼! 아서ë¼!' +하고 나는 í˜¼ìž ì£¼ë¨¹ì„ ë¶ˆëˆë¶ˆëˆ ì¥ì—ˆì†Œ. +ì´ ë•Œì— ì§œë°•ì§œë°• 하고 걸어오는 소리가 들리오. ë‚´ ê°€ìŠ´ì€ ìŒë°©ë§ì´ë¡œ ë‘들기는 ê²ƒê°™ì´ ë›°ì—ˆì†Œ. +`설마 ì •ìž„ì¼ê¹Œ.' +í•˜ë©´ì„œë„ ë‚˜ëŠ” ìˆ¨ì„ ì£½ì´ê³  귀를 기울였소. +ê·¸ ë°œìžêµ­ 소리는 분명 ë‚´ 문 ë°–ì— ì™€ì„œ 그쳤소. 그리고는 소리가 없었소. +`ë‚´ ê·€ì˜ í™˜ê°ì¸ê°€.' +하고 나는 í•œìˆ¨ì„ ë‚´ì‰¬ì—ˆì†Œ. +그러나 ë‹¤ìŒ ìˆœê°„ ë˜ ë‘ì–´ 번 ë¬¸ì„ ë‘드리는 소리가 들렸소. +"ì´ì—스." +하고 나는 대답하고 ë¬¸ì„ ë°”ë¼ë³´ì•˜ì†Œ. +ë¬¸ì´ ì—´ë ¸ì†Œ. +들어오는 ì´ëŠ” ì •ìž„ì´ì—ˆì†Œ. +"웬ì¼ì´ëƒ." +하고 나는 엄숙한 태ë„를 지었소. 그것으로 ì¼ ì´ˆì˜ ì¼ì²œë¶„ì§€ ì¼ì´ë¼ë„ 다시 한 번 ë³´ê³  ì‹¶ë˜ ì •ìž„ì„ ë³´ê³  기ì¨ì„ 카무플ë¼ì£¼í•œ 것ì´ì˜¤. +ì •ìž„ì€ ì„œìŠ´ì§€ 않고 ë‚´ ë’¤ì— ì™€ì„œ ë‚´ êµì˜ì— ëª¸ì„ ê¸°ëŒ€ë©°, +"ì•”ë§Œí•´ë„ ì˜¤ëŠ˜ì´ ë§ˆì§€ë§‰ì¸ ê²ƒë§Œ 같아서, 다시 뵈올 ê¸°ì•½ì€ ì—†ëŠ” 것만 같아서 가다가 ë„로 왔습니다. 한 번만 ë” ëµ™ê³  ê°ˆ 양으로요. 그래 ë„로 ì™€ì„œë„ ë“¤ì–´ì˜¬ê¹Œ ë§ê¹Œ 하고 주저주저하다가 ì´ê²ƒì´ 마지막ì¸ë° 하고 용기를 내어서 들어왔습니다. ë‚´ì¼ ì €ë¥¼ 보시고 가신다는 ê²ƒì´ ë¶€ëŸ¬ 하신 ë§ì”€ë§Œ 같고, 마지막 뵈옵고, ëµˆì˜¨ëŒ€ë„ ê·¸ëž˜ë„ í•œ 번 ë” ëµˆì˜µê¸°ë§Œ í•´ë„……." +하고 ì •ìž„ì˜ ë§ì€ ëì„ ì•„ë¬¼ì§€ 못하였소. 그는 ë‚´ 등 ë’¤ì— ì„œ 있기 ë•Œë¬¸ì— ê·¸ê°€ 어떠한 í‘œì •ì„ í•˜ê³  있는지는 ë³¼ 수가 없었소. 나는 다만 ì•„ë²„ì§€ì˜ ìœ„ì—„ìœ¼ë¡œ ì •ë©´ì„ ë°”ë¼ë³´ê³  ìžˆì—ˆì„ ë¿ì´ì˜¤. +`정임아, ë‚˜ë„ ë„¤ê°€ ë³´ê³  싶었다. 네 뒤를 ë”°ë¼ê°€ê³  싶었다. ë‚´ 몸과 마ìŒì€ 네 뒤를 ë”°ë¼ì„œ 허공으로 날았다. 나는 너를 한 ì´ˆë¼ë„ 한 ì´ˆì˜ ì²œë¶„ì§€ ì¼ ë™ì•ˆì´ë¼ë„ 한 번 ë” ë³´ê³  싶었다. 정임아, ë‚´ ì§„ì •ì€ ë„ˆë¥¼ 언제든지 ë‚´ ê³ì— ë‘ê³  싶다. 정임아, 지금 ë‚´ ìƒëª…ì´ ê°€ì§„ ê²ƒì€ ì˜¤ì§ ë„ˆë¿ì´ë‹¤.' +ì´ëŸ° ë§ì´ë¼ë„ 하고 싶었소. 그러나 ì´ëŸ° ë§ì„ 하여서는 아니 ë˜ì˜¤! ë§Œì¼ ë‚´ê°€ ì´ëŸ° ë§ì„ 하여 준다면 ì •ìž„ì´ê°€ 기ë»í•˜ê² ì§€ìš”. 그러나 나는 ì •ìž„ì´ì—게 ì´ëŸ° 기ì¨ì„ 주어서는 아니 ë˜ì˜¤! +나는 어디까지든지 ì•„ë²„ì§€ì˜ ìœ„ì—„, ì•„ë²„ì§€ì˜ ëƒ‰ì •í•¨ì„ ì•„ë‹ˆ 지켜서는 아니 ë˜ì˜¤. +그렇지마는 ë‚´ ê°€ìŠ´ì— íƒ€ì˜¤ë¥´ëŠ” ì´ë¦„ì§€ì„ ìˆ˜ 없는 ì—´ì •ì˜ ë¶ˆê¸¸ì€ ë‚´ ì´ì„±ê³¼ ì˜ì§€ë ¥ì„ 태워 버리려 하오. 나는 ëˆˆì´ ì•„ëœ©ì•„ëœ©í•¨ì„ ê¹¨ë‹«ì†Œ. 나는 ë‚´ ìƒëª…ì˜ ë¶ˆê¸¸ì´ ê¹œë°•ê¹œë°•í•¨ì„ ê¹¨ë‹«ì†Œ. +그렇지마는! ì•„ì•„ 그렇지마는 나는 ì´ ë„ë•ì  ì±…ìž„ì˜ ë¬´ìƒ ëª…ë ¹ì˜ ë°œë ¹ìžì¸ ì“´ ìž”ì„ ë§ˆì‹œì§€ 아니하여서는 아니 ë˜ëŠ” 것ì´ì˜¤. +`ì‚°! 바위!' +나는 ì •ì‹ ì„ ê°€ë‹¤ë“¬ì–´ì„œ ì´ê²ƒì„ 염하였소. +그러나 ì—´ì •ì˜ íŒŒë„ê°€ 치는 ê³³ì— ì‚°ì€ ì›€ì§ì´ì§€ 아니하오? 바위는 í”들리지 아니하오? 태산과 ë°˜ì„ì´ ê·¸ í° ë¶ˆê¸¸ì— íƒ€ì„œ 재가 ë˜ì§€ëŠ” 아니하오? ì¸ìƒì˜ 모든 힘 ê°€ìš´ë° ì—´ì •ë³´ë‹¤ ë” í­ë ¥ì ì¸ ê²ƒì´ ì–´ë”” 있소? ì•„ë§ˆë„ ìš°ì£¼ì˜ ëª¨ë“  힘 ê°€ìš´ë° ì‚¬ëžŒì˜ ì—´ì •ê³¼ ê°™ì´ í­ë ¥ì , 불가항력ì ì¸ ê²ƒì€ ì—†ìœ¼ë¦¬ë¼. 뇌성, 벽력, 글쎄 그것ì—나 비길까. ì°¨ë¼ë¦¬ 천체와 천체가 수학ì ìœ¼ë¡œ 계산할 수 없는 비ìƒí•œ ì†ë ¥ì„ 가지고 마주 달려들어서 ìš°ë¦¬ì˜ ê·€ë¡œ ë“¤ì„ ìˆ˜ 없는 í° ì†Œë¦¬ì™€ 우리가 굳다고 ì¼ì»«ëŠ” 금강ì„ì´ë¼ë„ ì¦ê¸°ë¥¼ 만들고야 ë§ ë§Œí•œ ì—´ì„ ë°œí•˜ëŠ” ì¶©ëŒì˜ 순간ì—나 비길까. 형. 사람ì´ë¼ëŠ” 존재가 ìš°ì£¼ì˜ ëª¨ë“  존재 ì¤‘ì— ê°€ìž¥ 비ìƒí•œ ì¡´ìž¬ì¸ ê²ƒ 모양으로 ì‚¬ëžŒì˜ ì—´ì •ì˜ íž˜ì€ ìš°ì£¼ì˜ ëª¨ë“  신비한 힘 ê°€ìš´ë° ê°€ìž¥ 신비한 íž˜ì´ ì•„ë‹ˆê² ì†Œ? 대체 ìš°ì£¼ì˜ ëª¨ë“  íž˜ì€ ê·¸ê²ƒì´ ì•„ë¬´ë¦¬ í° íž˜ì´ë¼ê³  하ë”ë¼ë„ ì € ìžì‹ ì„ 깨뜨리는 ê²ƒì€ ì—†ì†Œ. 그렇지마는 사람ì´ë¼ëŠ” ì¡´ìž¬ì˜ ì—´ì •ì€ ëŠ¥ížˆ ì œ ìƒëª…ì„ ê¹¨ëœ¨ë ¤ 가루를 만들고 ì œ ìƒëª…ì„ ì‚´ë¼ì„œ 소지를 올리지 아니하오? 여보, 대체 ì´ì—서 ë” í­ë ¥ì´ìš”, 신비ì ì¸ ê²ƒì´ ì–´ë”” 있단 ë§ì´ì˜¤. +ì´ ë•Œ ë‚´ ìƒíƒœ, 어깨 ë’¤ì—서 열정으로 타고 섰는 ì •ìž„ì„ ëŠë¼ëŠ” ë‚´ ìƒíƒœëŠ” 바야í로 대í­ë°œ, 대충ëŒì„ 기다리는 아슬아슬한 때가 아니었소. ë§Œì¼ ì¡°ê¸ˆë§Œì´ë¼ë„ ë‚´ê°€ ë‚´ ì—´ì •ì˜ ê³ ì‚ì— ëŠ¦ì¶¤ì„ ì¤€ë‹¤ê³  하면 무서운 대í­ë°œì´ ì¼ì–´ë‚¬ì„ 것ì´ì˜¤. +"정임아!" +하고 나는 충분히 마ìŒì„ ì§„ì •í•´ 가지고 고개를 옆으로 ëŒë ¤ ì •ìž„ì˜ ì–¼êµ´ì„ ì°¾ì•˜ì†Œ. +"네ì—." +하고 ì •ìž„ì€ ìž…ì„ ì•½ê°„ ë‚´ ê·€ 가까ì´ë¡œ 가져와서 ê·¸ 씨근거리는 소리가 분명히 ë‚´ ê·€ì— ë“¤ë¦¬ê³  ê·¸ 후ëˆí›„ëˆí•˜ëŠ” 뜨거운 ìž…ê¹€ì´ ë‚´ 목과 ëº¨ì— ê°ê°ë˜ì—ˆì†Œ. +억지로 ì§„ì •í•˜ì˜€ë˜ ë‚´ ê°€ìŠ´ì€ ë‹¤ì‹œ 설레기를 시작하였소. ê·¸ 불규칙한 숨소리와 뜨거운 ìž…ê¹€ 때문ì´ì—ˆì„까. +"시간 늦는다. 어서 가거ë¼. ì´ ì•„ë²„ì§€ëŠ” 언제까지든지 너를 사랑하는 딸 로 소중히 소중히 ê°€ìŠ´ì— í’ˆê³  있으마. ë˜ í›„ì¼ì— 다시 만날 ë•Œë„ ìžˆì„ì§€ ì•„ëŠëƒ. 설사 다시 만날 때가 없다기로니 ê·¸ê²ƒì´ ë¬´ì—‡ì´ ê·¸ë¦¬ 대수ëƒ. ë‚˜ì´ ë§Žì€ ì‚¬ëžŒì€ ë¨¼ì € 죽고 ì Šì€ ì‚¬ëžŒì€ ì˜¤ëž˜ 살아서 ì¸ìƒì˜ ì¼ì„ ë§Žì´ í•˜ëŠ” ê²ƒì´ ìˆœì„œê°€ 아니ëƒ. 너는 ëª¸ì´ ì•„ì§ ì•½í•˜ë‹ˆ 마ìŒì„ 잘 안정해서 어서 ê±´ê°•ì„ íšŒë³µí•˜ì—¬ë¼. 그리고 굳세게 굳세게, 힘있게 힘있게 ì‚´ì•„ 다오. ì¡°ì„ ì€ ì‚¬ëžŒì„ êµ¬í•œë‹¤. 나 ê°™ì€ ì‚¬ëžŒì€ ì¸ì œ 조선서 ë” ì¼í•  ìžê²©ì„ 잃어버린 사람ì´ì§€ë§ˆëŠ” 네야 ì–´ë– ëƒ. 설사 누가 무슨 ë§ì„ 해서 í•™êµì—서 학비를 아니 준다거든 ë‚´ê°€ 네게 준 ìž¬ì‚°ì„ ê°€ì§€ê³  네 마ìŒëŒ€ë¡œ 공부를 하려무나. 네가 그렇게 í•´ 주어야 나를 위하는 것ì´ë‹¤. ìž ì¸ì œ 가거ë¼. 네 ì•žê¸¸ì´ ì–‘ì–‘í•˜ì§€ 아니하ëƒ. ìž ì¸ì œ 가거ë¼. 나는 ë‚´ì¼ ì•„ì¹¨ ë™ê²½ì„ 떠날란다. ìž ì–´ì„œ." +하고 나는 í™”í‰í•˜ê²Œ 웃는 낯으로 ì¼ì–´ì„°ì†Œ. +ì •ìž„ì€ ìš¸ë¨¹ìš¸ë¨¹í•˜ê³  고개를 숙ì´ì˜¤. +ë°–ì—서는 ë°”ëžŒì´ ì ì  강해져서 소리를 하고 ìœ ë¦¬ì°½ì„ í”드오. +"그럼, ì „ 가요." +하고 ì •ìž„ì€ ê³ ê°œë¥¼ 들었소. +"그래. 어서 가거ë¼. ë²Œì¨ ì—´í•œì‹œ ë°˜ì´ë‹¤. ë³‘ì› ë¬¸ì€ ì•„ë‹ˆ 닫니!" +ì •ìž„ì€ ëŒ€ë‹µì´ ì—†ì†Œ. +"어서!" +하고 나는 ë³´ì´ë¥¼ 불러 ìžë™ì°¨ë¥¼ 하나 준비하ë¼ê³  ì¼ë €ì†Œ. +"ê°ˆëžë‹ˆë‹¤." +하고 ì •ìž„ì€ ê³ ê°œë¥¼ 숙여서 내게 ì¸ì‚¬ë¥¼ 하고 ë¬¸ì„ í–¥í•˜ì—¬ 한 ê±¸ìŒ ê±·ë‹¤ê°€ ìž ê¹ ì£¼ì €í•˜ë”니, 다시 ëŒì•„서서, +"저를 한 번만 안아 주셔요. 아버지가 어린 ë”¸ì„ ì•ˆë“¯ì´ í•œ 번만 안아 주셔요." +하고 ë‚´ 앞으로 ê°€ê¹Œì´ ì™€ 서오. +나는 íŒ”ì„ ë²Œë ¤ 주었소. ì •ìž„ì€ ë‚´ ê°€ìŠ´ì„ í–¥í•˜ê³  ëª¸ì„ ë˜ì¡Œì†Œ. 그리고 ì œ ì´ëº¨ ì €ëº¨ì„ ë‚´ ê°€ìŠ´ì— ëŒ€ê³  비ë³ì†Œ. 나는 ë‘ íŒ”ì„ ì •ìž„ì˜ ì–´ê¹¨ ìœ„ì— ê°€ë²¼ì´ ë†“ì•˜ì†Œ. +ì´ëŸ¬í•œ ì§€ 몇 ë¶„ì´ ì§€ë‚¬ì†Œ. 아마 ì¼ ë¶„ë„ ë‹¤ 못 ë˜ì—ˆëŠ”ì§€ 모르오. +ì •ìž„ì€ ë‚´ 가슴ì—서 고개를 들어 나를 뚫어지게 우러러보ë”니, 다시 ë‚´ ê°€ìŠ´ì— ë‚¯ì„ ëŒ€ë”니 아마 ë‚´ ì‹¬ìž¥ì´ ë¬´ì„­ê²Œ 뛰는 소리를 ì •ìž„ì€ ë“¤ì—ˆì„ ê²ƒì´ì˜¤ ì •ìž„ì€ ë‹¤ì‹œ 고개를 들고, +"어디를 가시든지 편지나 주셔요." +하고 êµµì€ ëˆˆë¬¼ì„ ë–¨êµ¬ê³ ëŠ” 내게서 물러서서 ë˜ í•œ 번 절하고, +"안녕히 가셔요. 만주든지 ì•„ë ¹ì´ë“ ì§€ ì¡°ì„  사람 ë§Žì´ ì‚¬ëŠ” ê³³ì— ê°€ì…”ì„œ ì¼í•˜ê³  사셔요. ëŒì•„가실 ìƒê°ì€ 마셔요. 제가, 아버지 ë§ì”€ëŒ€ë¡œ í˜¼ìž ë–¨ì–´ì ¸ 있으니 ì•„ë²„ì§€ë„ ì œ ë§ì”€ëŒ€ë¡œ ëŒì•„가실 ìƒê°ì€ 마셔요, 네, 그렇다고 대답하셔요!" +하고는 ë˜ í•œ 번 ë‚´ ê°€ìŠ´ì— ëª¸ì„ ê¸°ëŒ€ì˜¤. +죽기를 결심한 나는 `오ëƒ, 그러마.' 하는 ëŒ€ë‹µì„ í•  수는 없었소. 그래서, +"오, ë‚´ ì‚´ë„ë¡ íž˜ì“°ë§ˆ." +하는 약ì†ì„ 주어서 ì •ìž„ì„ ëŒë ¤ë³´ëƒˆì†Œ. +ì •ìž„ì˜ ë°œìžêµ­ 소리가 안 들리게 ëœ ë•Œì— ë‚˜ëŠ” 빠른 걸ìŒìœ¼ë¡œ ì˜¥ìƒ ì •ì›ìœ¼ë¡œ 나갔소. 비가 막 뿌리오. +나는 ì •ìž„ì´ê°€ 타고 나가는 ìžë™ì°¨ë¼ë„ ë³¼ 양으로 호텔 현관 ì•žì´ ë³´ì´ëŠ” 꼭대기로 올ë¼ê°”소. í˜„ê´€ì„ ë– ë‚œ ìžë™ì°¨ 하나가 전찻길로 나서서는 ë¶ì„ 향하고 달아나서 순ì‹ê°„ì— ê·¸ ê½ë¬´ë‹ˆì— 달린 ë¶‰ì€ ë¶ˆì¡°ì°¨ 스러져 버리고 ë§ì•˜ì†Œ. +나는 미친 사람 모양으로, +"정임아, 정임아!" +하고 ìˆ˜ì—†ì´ ë¶ˆë €ì†Œ. 나는 사 층ì´ë‚˜ ë˜ëŠ” ì´ ê¼­ëŒ€ê¸°ì—서 뛰어내려서 ì •ìž„ì´ê°€ 타고 ê°„ ìžë™ì°¨ì˜ 뒤를 따르고 싶었소. +"ì•„ì•„ ì˜ì›í•œ ì¸ìƒì˜ ì´ë³„!" +나는 ê·¸ 옥ìƒì— 얼마나 오래 ì„°ë˜ì§€ë¥¼ 모르오. ë‚´ 머리와 낯과 배스로브ì—서는 ë¬¼ì´ í르오. ë°©ì— ë“¤ì–´ì˜¤ë‹ˆ ì •ìž„ì´ê°€ ë¼ì¹˜ê³  ê°„ 향기와 추억만 남았소. +나는 ë°© 안 구ì„구ì„ì— ì •ìž„ì˜ ëª¨ì–‘ì´ ë³´ì´ëŠ” ê²ƒì„ ê¹¨ë‹¬ì•˜ì†Œ. 특별히 ì •ìž„ì´ê°€ 고개를 숙ì´ê³  서 ìžˆë˜ ë‚´ êµì˜ ë’¤ì—는 분명히 갈색 외투를 ìž…ì€ ì •ìž„ì˜ ëª¨ì–‘ì´ ì™„ì—°í•˜ì˜¤. +"정임아!" +하고 나는 ê·¸ 곳으로 ë”°ë¼ê°€ì˜¤. 그러나 가면 거기는 ì •ìž„ì€ ì—†ì†Œ. +나는 êµì˜ì— 앉소. 그러면 ì •ìž„ì˜ ì”¨ê·¼ì”¨ê·¼í•˜ëŠ” 숨소리와 ë”ìš´ ìž…ê¹€ì´ ë¶„ëª… ë‚´ ì˜¤ë¥¸íŽ¸ì— ê°ê°ì´ ë˜ì˜¤. ì•„ì•„ 무서운 환ê°ì´ì—¬! +나는 ìžë¦¬ì— 눕소. 그리고 ì •ìž„ì˜ í™˜ê°ì„ 피하려고 ë¶ˆì„ ë„오. 그러면 ì •ìž„ì´ê°€ 내게 ì•ˆê¸°ë˜ ìžë¦¬ì¯¤ì— 환하게 ì •ìž„ì˜ ëª¨ì–‘ì´ ë‚˜íƒ€ë‚˜ì˜¤. +나는 ë¶ˆì„ ì¼œì˜¤. ë˜ ë¶ˆì„ ë„오. +ë‚ ì´ ë°ìž 나는 비가 ê°  ê²ƒì„ ë‹¤í–‰ìœ¼ë¡œ ë¹„í–‰ìž¥ì— ë‹¬ë ¤ê°€ì„œ 비행기를 얻어 탔소. +나는 다시 ì¡°ì„ ì˜ í•˜ëŠ˜ì„ í†µê³¼í•˜ê¸°ê°€ 싫어서 ë¶ê°•ì—서 비행기ì—서 내려서 ë¬¸ì‚¬ì— ì™€ì„œ 대련으로 가는 배를 탔소. +나는 대련ì—서 내려서 í•˜ë£»ë°¤ì„ ì—¬ê´€ì—서 ìžê³ ëŠ” ê³§ 장춘 가는 ê¸‰í–‰ì„ íƒ”ì†Œ. 물론 아무ì—ê²Œë„ ì—½ì„œ 한 장 한 ì¼ ì—†ì—ˆì†Œ. ê·¸ê²ƒì€ ì¸ì—°ì„ ëŠì€ 세ìƒì— 대하여 연연한 마ìŒì„ 가지는 ê²ƒì„ ë¶€ë„럽게 ìƒê°í•œ 까닭ì´ì˜¤. +차가 옛날ì—는 우리 ì¡°ìƒë„¤ê°€ ì‚´ê³  문화를 ì§“ë˜ ì˜› í„°ì „ì¸ ë§Œì£¼ì˜ ë²ŒíŒì„ 달릴 때ì—는 ê°íšŒë„ 없지 아니하였소. 그러나 나는 지금 그런 한가한 ê°ìƒì„ 쓸 ê²¨ë¥¼ì´ ì—†ì†Œ. +ë‚´ê°€ 믿고 가는 ê³³ì€ í•˜ì–¼ë¹ˆì— ìžˆëŠ” ì–´ë–¤ 친구요. 그는 Rë¼ëŠ” 사람으로서 ê²½ìˆ ë…„ì— A씨 ë“±ì˜ ë§ëª…ê°ì„ ë”°ë¼ ë‚˜ê°”ë‹¤ê°€ ì•„ë¼ì‚¬ì—서 무관 í•™êµë¥¼ 졸업하고 ì•„ë¼ì‚¬ 사관으로서 구주 대전ì—ë„ ì¶œì •ì„ í•˜ì˜€ë‹¤ê°€, í˜ëª… 후ì—ë„ ì´ë‚´ ì ìœ„êµ°ì— ë¨¸ë¬¼ëŸ¬ì„œ 지금까지 소비ì—트 장êµë¡œ 있는 사람ì´ì˜¤. ì§€ê¸ˆì€ ìœ¡êµ° 소장ì´ë¼ë˜ê°€. +나는 í•˜ì–¼ë¹ˆì— ê·¸ ì‚¬ëžŒì„ ì°¾ì•„ê°€ëŠ” 것ì´ì˜¤. ê·¸ ì‚¬ëžŒì„ ì°¾ì•„ì•¼ ì•„ë¼ì‚¬ì— 들어갈 ì—¬í–‰ê¶Œì„ ì–»ì„ ê²ƒì´ìš”, ì—¬í–‰ê¶Œì„ ì–»ì–´ì•¼ ë‚´ê°€ í‰ì†Œì— ì´ìƒí•˜ê²Œë„ ê·¸ë¦¬ì›Œí•˜ë˜ ë°”ì´ì¹¼ 호를 ë³¼ 것ì´ì˜¤. +í•˜ì–¼ë¹ˆì— ë‚´ë¦° ê²ƒì€ í•´ê°€ 뉘엿뉘엿 넘어가는 ì„ì–‘ì´ì—ˆì†Œ. +나는 ì•ˆì¤‘ê·¼ì´ ì´ë“±ë°•문(ä¼Šè—¤åšæ–‡:ì´í†  히로부미)ì„ ìœ ê³³ì´ ì–´ë”˜ê°€ 하고 벌íŒê³¼ ê°™ì´ ë„“ì€ í”Œëž«í¼ì— 내렸소. 과연 êµ­ì œ ë„ì‹œë¼ ì„œì–‘ 사람, 중국 사람, ì¼ë³¸ ì‚¬ëžŒì´ ê°ê¸° ì œ ë§ë¡œ 지껄ì´ì˜¤. ì•„ì•„ ì¡°ì„  ì‚¬ëžŒë„ ìžˆì„ ê²ƒì´ì˜¤ë§ˆëŠ” 다들 ì–‘ë³µì„ ìž…ê±°ë‚˜ ì²­ë³µì„ ìž…ê±°ë‚˜ 하고 ë˜ ì‚¬ëžŒì´ ë§Žì€ ê³³ì—서는 ë§ë„ 잘 하지 아니하여 ì•„ë¬´ìª¼ë¡ ì¡°ì„  ì‚¬ëžŒì¸ ê²ƒì„ í‘œì‹œí•˜ì§€ 아니하는 íŒì´ë¼ ê·¸ 골격과 í‘œì •ì„ ì‚´í”¼ê¸° ì „ì—는 ì–´ëŠ ê²ƒì´ ì¡°ì„  사람ì¸ì§€ 알 ê¸¸ì´ ì—†ì†Œ. 아마 허름하게 차리고 기운 ì—†ì´, 비창한 ë¹›ì„ ë ê³  ì‚¬ëžŒì˜ ëˆˆì„ ìŠ¬ìŠ¬ 피하는 ì € 순하게 ìƒê¸´ ì‚¬ëžŒë“¤ì´ ì¡°ì„  사람ì´ê² ì§€ìš”. 언제나 한 번 가는 곳마다 ë™ì–‘ì´ë“ ì§€, 서양ì´ë“ ì§€, +`나는 ì¡°ì„  사람ì´ì˜¤!' +하고 ë½ë‚´ê³  ë‹¤ë‹ ë‚ ì´ ìžˆì„까 하면 ëˆˆë¬¼ì´ ë‚˜ì˜¤. ë”구나, 하얼빈과 ê°™ì€ ê°ìƒ‰ ì¸ì¢…ì´ ëª¨ì—¬ì„œ ìƒì¡´ ê²½ìŸì„ 하는 ë§ˆë‹¹ì— ì„œì„œ ì´ëŸ° 비ê°ì´ 간절하오. ì•„ì•„ ì´ ë¶ˆìŒí•œ ìœ ëž‘ì˜ ë¬´ë¦¬ ì¤‘ì— ë‚˜ë„ í•˜ë‚˜ë¥¼ ë” ë³´íƒœëŠ”ê°€ 하면 ëˆˆë¬¼ì„ ì”»ì§€ 아니할 수 없었소. +나는 ì—­ì—서 나와서 ì–´ë–¤ ì•„ë¼ì‚¬ 병정 하나를 붙들고 Rì˜ ì•„ë¼ì‚¬ ì´ë¦„ì„ ë¶ˆë €ì†Œ. 그리고 ì•„ëŠëƒê³  ì˜ì–´ë¡œ 물었소. +ê·¸ ë³‘ì •ì€ ë‚´ ë§ì„ 잘못 알아들었는지, ë˜ëŠ” R를 모르는지 무엇ì´ë¼ê³  ì•„ë¼ì‚¬ë§ë¡œ 지껄ì´ëŠ” 모양ì´ë‚˜ 나는 물론 ê·¸ê²ƒì„ ì•Œì•„ë“¤ì„ ìˆ˜ê°€ 없었소. 그러나 나는 ê·¸ ë³‘ì •ì˜ í‘œì •ì—서 내게 호ì˜ë¥¼ 가진 ê²ƒì„ ì§ìž‘하고 한 번 ë” ë¶„ëª…ížˆ, +"요십 알렉산드로비치 리가ì´." +ë¼ê³  불러 보았소. +ê·¸ ë³‘ì •ì€ ë¹™ê·¸ë ˆ 웃고 고개를 í”드오. ì´ ë‘ ì™¸êµ­ ì‚¬ëžŒì˜ ì´ìƒí•œ êµì„­ì— í¥ë¯¸ë¥¼ 가지고 여러 ì•„ë¼ì‚¬ 병정과 ë™ì–‘ ì‚¬ëžŒë“¤ì´ ì‹­ì—¬ ì¸ì´ë‚˜ 우리 ì£¼ìœ„ì— ëª¨ì—¬ë“œì˜¤. +ê·¸ ë³‘ì •ì´ ë‚˜ë¥¼ ë°”ë¼ë³´ê³  ë˜ í•œ 번 ê·¸ ì´ë¦„ì„ ë¶ˆëŸ¬ ë³´ë¼ëŠ” 모양 같기로 나는 ì´ë²ˆì—는 Rì˜ ì•„ë¼ì‚¬ ì´ë¦„ì— `제너럴'ì´ë¼ëŠ” ë§ì„ 붙여 불러 보았소. +그랬ë”니 ì–´ë–¤ 다른 ë³‘ì •ì´ ë›°ì–´ë“¤ë©°, +"게네ë¼ìš° 리가ì´!" +하고 안다는 í‘œì •ì„ í•˜ì˜¤. `게네ë¼ìš°'ë¼ëŠ” ê²ƒì´ ì•„ë§ˆ ì•„ë¼ì‚¬ë§ë¡œ 장군ì´ëž€ ë§ì¸ê°€ 하였소. +"예스. 예스." +하고 나는 기ì˜ê²Œ 대답하였소. 그리고는 ì•„ë¼ì‚¬ 병정들ë¼ë¦¬ 무ì—ë¼ê³  지껄ì´ë”니, ê·¸ ì¤‘ì— í•œ ë³‘ì •ì´ ë‚˜ì„œë©´ì„œ 고개를 ë„ë•ë„ë•하고, 제가 마차 하나를 불러서 나를 태우고 ì €ë„ íƒ€ê³  어디로 달려가오. +ê·¸ ì•„ë¼ì‚¬ ë³‘ì •ì€ ì¹œì ˆížˆ ì•Œì§€ë„ ëª»í•˜ëŠ” ë§ë¡œ ì´ê²ƒì €ê²ƒì„ 가리키면서 ì„¤ëª…ì„ í•˜ë”니 ë‚´ê°€ 못 알아듣는 ì¤„ì„ ìƒê°í•˜ê³  ë‚´ 어깨를 툭 치고 웃소. 어린애와 ê°™ì´ ìˆœí•œ 사람들ì´êµ¬ë‚˜ 하고 나는 고맙다는 표로 고개만 ë„ë•ë„ë•하였소. +어디로 어떻게 가는지 서양 시가로 달려가다가 ì–´ë–¤ í° ì €íƒ ì•žì— ì´ë¥´ëŸ¬ì„œ 마차를 ê·¸ 현관 앞으로 들ì´ëª°ì•˜ì†Œ. +현관ì—서는 ì¢…ì¡¸ì´ ë‚˜ì™”ì†Œ. ë‚´ê°€ ëª…í•¨ì„ ë“¤ì—¬ë³´ëƒˆë”니 ë¶€ê´€ì¸ ë“¯í•œ ì•„ë¼ì‚¬ 장êµê°€ 나와서 나를 으리으리한 ì‘접실로 ì¸ë„하였소. 얼마 있노ë¼ë‹ˆ ì¤‘ë…„ì´ ë„˜ì€ ì–´ë–¤ ëŒ€ìž¥ì´ ë‚˜ì˜¤ëŠ”ë° êµ°ë³µì— ì¹¼ëˆë§Œ 늘였소. +"ì´ê²Œ 누구요." +하고 ê·¸ ëŒ€ìž¥ì€ ë‹¬ë ¤ë“¤ì–´ì„œ 나를 껴안았소. ì´ì‹­ì˜¤ ë…„ ë§Œì— ë§Œë‚˜ëŠ” 우리는 서로 알아본 것ì´ì˜¤. +ì´ìœ½ê³  나는 ê·¸ì˜ ë¶€ì¸ê³¼ ìžë…€ë“¤ë„ 만났소. ê·¸ë“¤ì€ ë‹¤ ì•„ë¼ì‚¬ 사람ì´ì˜¤. +ì €ë…ì´ ë난 ë’¤ì— ë‚˜ëŠ” Rì˜ ë¶€ì¸ê³¼ ë”¸ì˜ ìŒì•…ê³¼ 그림 구경과 ê¸°íƒ€ì˜ ê´€ëŒ€ë¥¼ 받고 ë‹¨ë‘˜ì´ ì´ì•¼ê¸°í•  기회를 얻었소. 경술년 당시 ì´ì•¼ê¸°ë„ 나오고, Aì”¨ì˜ ì´ì•¼ê¸°ë„ 나오고, Rì˜ ì‹ ì„¸ íƒ€ë ¹ë„ ë‚˜ì˜¤ê³ , ë‚´ ì´ì‹­ì˜¤ ë…„ ê°„ì˜ ìƒí™œ ì´ì•¼ê¸°ë„ 나오고, 소비ì—트 í˜ëª… ì´ì•¼ê¸°ë„ 나오고, 하얼빈 ì´ì•¼ê¸°ë„ 나오고, 우리네가 어려서 서로 ì‚¬ê·€ë˜ íšŒêµ¬ë‹´ë„ ë‚˜ì˜¤ê³  ì´ì•¼ê¸°ê°€ 그칠 바를 몰ëžì†Œ. "ì¡°ì„ ì€ ê·¸ë¦½ì§€ 않ì€ê°€." +하는 ë‚´ ë§ì— ì¾Œí™œí•˜ë˜ R는 고개를 숙ì´ê³  추연한 ë¹›ì„ ë³´ì˜€ì†Œ. +나는 Rì˜ ì¶”ì—°í•œ 태ë„를 아마 ê³ êµ­ì„ ê·¸ë¦¬ì›Œí•˜ëŠ” 것으로만 여겼소. 그래서 나는 그리 침ìŒí•˜ëŠ” ê²ƒì„ ë³´ê³ , +"얼마나 ê³ êµ­ì´ ê·¸ë¦½ê² ë‚˜. 나는 ê³ êµ­ì„ ë– ë‚œ 지가 ì¼ ì£¼ì¼ë„ 안 ë˜ê±´ë§ˆëŠ” 못 견디게 그리운ë°." +하고 ë™ì •하는 ë§ì„ 하였소. +í–ˆë”니, ì´ ë§ ë³´ì‹œì˜¤. 그는 침ìŒì„ 깨뜨리고 고개를 ë²ˆì© ë“¤ë©°, +"아니! 나는 ê³ êµ­ì´ ì¡°ê¸ˆë„ ê·¸ë¦½ì§€ 아니하ì´. ë‚´ê°€ 지금 ìƒê°í•œ ê²ƒì€ ìžë„¤ ë§ì„ 듣고 ê³ êµ­ì´ ê·¸ë¦¬ìš´ê°€ 그리워할 ê²ƒì´ ìžˆëŠ”ê°€ë¥¼ ìƒê°í•´ 본 것ì¼ì„¸. 그랬ë”니 아무리 ìƒê°í•˜ì—¬ë„ 나는 ê³ êµ­ì´ ê·¸ë¦½ë‹¤ëŠ” ìƒê°ì„ 가질 수가 없어. 그야 어려서 ìžë¼ë‚  ë•Œì— ë³´ë˜ ê°•ì‚°ì´ë¼ë“ ì§€ ë‚´ ê¸°ì–µì— ë‚¨ì€ ì•„ëŠ” 사람들ì´ë¼ë“ ì§€, ë³´ê³  싶다 하는 ìƒê°ë„ 없지 아니하지마는 ê·¸ê²ƒì´ ê³ êµ­ì´ ê·¸ë¦¬ìš´ 것ì´ë¼ê³  í•  수가 있ì„까. ê·¸ ë°–ì—는 나는 아무리 ìƒê°í•˜ì—¬ë„ ê³ êµ­ì´ ê·¸ë¦¬ìš´ ê²ƒì„ ì°¾ì„ ê¸¸ì´ ì—†ë„¤. ë‚˜ë„ ì§€ê¸ˆ ìžë„¤ë¥¼ ë³´ê³  ë˜ ìžë„¤ ë§ì„ 듣고 오래 ìžŠì–´ë²„ë ¸ë˜ ê³ êµ­ì„ ì¢€ 그립게, 그립다 하게 ìƒê°í•˜ë ¤ê³  í•´ 보았지마는 ë„무지 나는 ê³ êµ­ì´ ê·¸ë¦½ë‹¤ëŠ” ìƒê°ì´ 나지 않네." +ì´ ë§ì— 나는 ê¹œì§ ë†€ëžì†Œ. 몸서리치게 무서웠소. 나는 í•´ì™¸ì— ì˜¤ëž˜ 표랑하는 ì‚¬ëžŒì€ ìœ¼ë ˆ ê³ êµ­ì„ ê·¸ë¦¬ì›Œí•  것으로 믿고 있었소. ê·¸ëŸ°ë° ì´ ì‚¬ëžŒì´, ì¼ì°ì€ ê³ êµ­ì„ ì‚¬ëž‘í•˜ì—¬ ëª©ìˆ¨ê¹Œì§€ë„ ë°”ì¹˜ë ¤ë˜ ì´ ì‚¬ëžŒì´ ë„무지 ì´ì²˜ëŸ¼ ê³ êµ­ì„ ìžŠì–´ë²„ë¦°ë‹¤ëŠ” ê²ƒì€ ë†€ë¼ìš´ ì •ë„를 지나서 괘씸하기 그지없었소. ë‚˜ë„ ë¹„ë¡ ì¡°ì„ ì„ ë– ë‚œë‹¤ê³ , ì˜ì›ížˆ 버린다고 나서기는 했지마는 나로는 죽기 ì „ì—는 아니 ë¹„ë¡ ì£½ë”ë¼ë„ 잊어버리지 못할 ê³ êµ­ì„ ìžŠì–´ë²„ë¦° Rì˜ ì‹¬ì‚¬ê°€ 난측하고 ì›ë§ìŠ¤ëŸ¬ì› ì†Œ. +"ê³ êµ­ì´ ê·¸ë¦½ì§€ê°€ 않아?" +하고 Rì—게 묻는 ë‚´ 어성ì—는 격분한 ë¹›ì´ ìžˆì—ˆì†Œ. +"ì´ìƒí•˜ê²Œ ìƒê°í•˜ì‹œê² ì§€. 하지만 ê³ êµ­ì— ë¬´ìŠ¨ 그리울 ê²ƒì´ ìžˆë‹¨ ë§ì¸ê°€. ê·¸ 빈대 ë“는 오막살ì´ê°€ 그립단 ë§ì¸ê°€. 나무 한 ê°œ 없는 ì‚°ì´ ê·¸ë¦½ë‹¨ ë§ì¸ê°€. ë¬¼ë³´ë‹¤ë„ ëª¨ëž˜ê°€ ë§Žì€ ë‹¤ 늙어빠진 ê°œì²œì´ ê·¸ë¦½ë‹¨ ë§ì¸ê°€. ê·¸ 무기력하고 가난한, 시기 ë§Žê³  싸우고 하는 ê·¸ ë°±ì„±ì„ ê·¸ë¦¬ì›Œí•œë‹¨ ë§ì¸ê°€. 그렇지 아니하면 무슨 그리워할 ìŒì•…ì´ ìžˆë‹¨ ë§ì¸ê°€, ë¯¸ìˆ ì´ ìžˆë‹¨ ë§ì¸ê°€, ë¬¸í•™ì´ ìžˆë‹¨ ë§ì¸ê°€, 사ìƒì´ 있단 ë§ì¸ê°€, 사모할 만한 ì¸ë¬¼ì´ 있단 ë§ì¸ê°€! ë‚ ë”러 ê³ êµ­ì˜ ë¬´ì—‡ì„ ê·¸ë¦¬ì›Œí•˜ëž€ ë§ì¸ê°€. 나는 ì¡°êµ­ì´ ì—†ëŠ” 사람ì¼ì„¸. ë‚´ê°€ 소비ì—트 êµ°ì¸ìœ¼ë¡œ 있으니 소비ì—트가 ë‚´ ì¡°êµ­ì´ê² ì§€. 그러나 진심으로 ë‚´ ì¡°êµ­ì´ë¼ëŠ” ìƒê°ì€ 나지 아니하네." +하고 ì €ë… ë¨¹ì„ ë•Œì— ì•½ê°„ ë¶‰ì—ˆë˜ Rì˜ ì–¼êµ´ì€ ì´ìƒí•œ í¥ë¶„으로 ë”ìš± 붉어지오.유 정유 ì • +R는 ë¨¹ë˜ ë‹´ë°°ë¥¼ 화나는 ë“¯ì´ ìž¬ë–¨ì´ì— ì§‘ì–´ë˜ì§€ë©°, +"ë‚´ê°€ í•˜ì–¼ë¹ˆì— ì˜¨ 지가 ì¸ì œ 겨우 삼사 ë…„ë°–ì— ì•ˆ ë˜ì§€ë§ˆëŠ” ì¡°ì„  사람 ë•Œë¬¸ì— ë‚˜ëŠ” 견딜 수가 없어. 와서 달ë¼ëŠ” ê²ƒë„ ë‹¬ë¼ëŠ” 것ì´ì§€ë§ˆëŠ” ì¡°ì„  ì‚¬ëžŒì´ ë˜ ì–´ì°Œí•˜ì˜€ëŠë‹ˆ ë˜ ì–´ì°Œí•˜ì˜€ëŠë‹ˆ 하는 불명예한 ë§ì„ ë“¤ì„ ë•Œì—는 나는 ê¸ˆì‹œì— ì£½ì–´ 버리고 싶단 ë§ì¼ì„¸. 내게 가장 불쾌한 ê²ƒì´ ìžˆë‹¤ê³  하면 ê·¸ê²ƒì€ ê³ êµ­ì´ë¼ëŠ” 기억과 ì¡°ì„  ì‚¬ëžŒì˜ ì¡´ìž´ì„¸. ë‚´ê°€ ë§Œì¼ ì–´ëŠ ë‚˜ë¼ì˜ ë…재ìžê°€ ëœë‹¤ê³  하면 나는 첫째로 ì¡°ì„ ì¸ ìž…êµ­ 금지를 단행하려네. ë§Œì¼ ì¡°ì„ ì´ë¼ëŠ” ê²ƒì„ ìžŠì–´ë²„ë¦´ ì•½ì´ ìžˆë‹¤ê³  하면 나는 ìƒëª…ê³¼ 바꾸어서ë¼ë„ 사 먹고 ì‹¶ì–´." +하고 R는 약간 í¥ë¶„ëœ ì–´ì¡°ë¥¼ 늦추어서, +"ë‚˜ë„ ëª¨ìŠ¤í¬ë°”ì— ìžˆë‹¤ê°€ ì²˜ìŒ ì›ë™ì— ë‚˜ì™”ì„ ì ì—는 ê¸¸ì„ ë‹¤ë…€ë„ í˜¹ì‹œ ë™í¬ê°€ ëˆˆì— ëœ¨ì´ì§€ë‚˜ 아니하나 하고 찾았네. 그래서 어디서든지 ë™í¬ë¥¼ 만나면 ë°˜ê°€ì´ ì†ì„ 잡았지. 했지만 ì ì  ê·¸ë“¤ì€ ì˜¤ì§ ê·€ì°®ì€ ì¡´ìž¬ì— ì§€ë‚˜ì§€ 못하다는 ê²ƒì„ ì•Œì•˜ë‹¨ ë§ì¼ì„¸. ì¸ì œëŠ” ì¡°ì„  사람ì´ë¼ê³ ë§Œ 하면 만나기가 무섭고 ë”ì°ë”ì°í•˜ê³  진저리가 나는 걸 어떡허나. ìžë„¤ ëª…í•¨ì´ ë“¤ì–´ì˜¨ 때ì—ë„ ì¡°ì„  사람ì¸ê°€ 하고 ê°€ìŠ´ì´ ëœ¨ë”했네." +하고 R는 ì›ƒì§€ë„ ì•„ë‹ˆí•˜ì˜¤. ê·¸ì˜ ì–¼êµ´ì—는, êµ°ì¸ë‹¤ìš´ 기운찬 얼굴ì—는 ì¦ì˜¤ì™€ ë¶„ë…¸ì˜ ë¹›ì´ ë„˜ì³¤ì†Œ. +"ë‚˜ë„ ìžë„¤ ì§‘ì— í™˜ì˜ë°›ëŠ” 나그네는 ì•„ë‹ì„¸ê·¸ë ¤." +하고 나는 ì´ ê²¬ë””ê¸° 어려운 불쾌하고 무서운 공기를 완화하기 위하여 ë†ë‹´ì‚¼ì•„ 한 마디를 ë˜ì§€ê³  웃었소. +나는 Rì˜ ë§ì´ ê³¼ê²©í•¨ì— ë†€ëžì§€ë§ˆëŠ”, ë˜ ìƒê°í•˜ë©´ Rê°€ 한 ë§ ê°€ìš´ë°ëŠ” ë“¤ì„ ë§Œí•œ ì´ìœ ë„ 없지 아니하오. ê·¸ê²ƒì„ ìƒê°í•  ë•Œì— ë‚˜ëŠ” R를 괘씸하게 ìƒê°í•˜ê¸° ì „ì— ë‚´ê°€ 버린다는 ì¡°ì„ ì„ ìœ„í•˜ì—¬ì„œ ê°€ìŠ´ì´ ì•„íŒ ì†Œ. 그렇지만 ì´ì œ 나 따위가 ê°€ìŠ´ì„ ì•„íŒŒí•œëŒ€ì•¼ 무슨 ì†Œìš©ì´ ìžˆì†Œ. ì¡°ì„ ì— ë‚¨ì•„ 계신 형ì´ë‚˜ Rì˜ ë§ì„ 참고삼아 쓰시기 ë°”ë¼ì˜¤. 어쨌으나 나는 Rì—게서 목ì í•œ ì—¬í–‰ê¶Œì„ ì–»ì—ˆì†Œ. Rì—게는 다만, +`나는 피곤한 ëª¸ì„ ì¢€ 정양하고 싶다. 나는 ë‚´ê°€ í‰ì†Œì— ì¦ê²¨í•˜ëŠ” ë°”ì´ì¹¼ 호반ì—서 눈과 ì–¼ìŒì˜ í•œê²¨ìš¸ì„ ì§€ë‚´ê³  싶다.' +는 ê²ƒì„ ì—¬í–‰ì˜ ì´ìœ ë¡œ 삼았소. +R는 ë‚˜ì˜ ì´ˆì·Œí•œ ëª¨ì–‘ì„ ì§ìž‘하고 ë‚´ 핑계를 그럴듯하게 아는 모양ì´ì—ˆì†Œ. 그리고 나ë”러, `ì´ì™• 정양하려거든 카프카 지방으로 가거ë¼. 거기는 기후 í’ê²½ë„ ì¢‹ê³  ë˜ ìš”ì–‘ì›ì˜ ì„¤ë¹„ë„ ìžˆë‹¤.'는 ê²ƒì„ ë§í•˜ì˜€ì†Œ. ë‚˜ë„ í†¨ìŠ¤í† ì´ì˜ 소설ì—서, ê¸°íƒ€ì˜ ì—¬í–‰ê¸° 등ì†ì—서 ì´ ì§€ë°©ì— ê´€í•œ ë§ì„ 못 ë“¤ì€ ê²ƒì´ ì•„ë‹ˆë‚˜ 지금 ë‚´ 처지ì—는 그런 따뜻하고 경치 ì¢‹ì€ ì§€ë°©ì„ ê°€ë¦´ ì—¬ìœ ë„ ì—†ê³  ë˜ ê·¸ëŸ¬í•œ ì§€ë°©ë³´ë‹¤ë„ ëˆˆê³¼ ì–¼ìŒê³¼ ë°”ëžŒì˜ ì‹œë² ë¦¬ì•„ì˜ ê²¨ìš¸ì´ í•©ë‹¹í•œ 듯하였소. +그러나 나는 Rì˜ í˜¸ì˜ë¥¼ êµ³ì´ ì‚¬ì–‘í•  í•„ìš”ë„ ì—†ì–´ì„œ 그가 ì¨ ì£¼ëŠ” 대로 ì†Œê°œìž¥ì„ ë‹¤ 받아 넣었소. 그는 나를 처남 매부 ê°„ì´ë¼ê³  소개해 주었소. +나는 모스í¬ë°” 가는 ë‹¤ìŒ ê¸‰í–‰ì„ ê¸°ë‹¤ë¦¬ëŠ” ì‚¬í˜ ë™ì•ˆ Rì˜ ì§‘ì˜ ì†ì´ ë˜ì–´ì„œ Rë¶€ì²˜ì˜ ì¹œì ˆí•œ 대우를 받았소. +ê·¸ 후ì—는 나는 R와 ì¡°ì„ ì— ê´€í•œ í† ë¡ ì„ í•œ ì¼ì€ 없지마는 Rê°€ ì´ë¦„지어 ë§ì„ í•  때ì—는 ì¡°ì„ ì„ ìžŠì—ˆë…¸ë¼, 그리워할 ê²ƒì´ ì—†ë…¸ë¼, 하지마는 무ì˜ì‹ì ìœ¼ë¡œ ë§ì„ í•  때ì—는 ì¡°ì„ ì„ ëª» 잊고 ë˜ ì¡°ì„ ì„ ì—¬ëŸ¬ ì ìœ¼ë¡œ 그리워하는 ì–‘ì„ ë³´ì•˜ì†Œ. 나는 ê·¸ê²ƒìœ¼ë¡œì¨ ë§Œì¡±í•˜ê²Œ 여겼소. +나는 ê¸ˆìš”ì¼ ì˜¤í›„ 세시 모스í¬ë°” 가는 급행으로 í•˜ì–¼ë¹ˆì„ ë– ë‚¬ì†Œ. ì—­ë‘ì—는 R와 Rì˜ ê°€ì¡±ì´ ë‚˜ì™€ì„œ 꽃과 ê³¼ì¼ê³¼ 여러 가지 선물로 나를 전송하였소. R와 Rì˜ ê°€ì¡±ì€ ë‚˜ë¥¼ ì •ë§ í˜•ì œì˜ ì˜ˆë¡œ 대우하여 차가 떠나려 í•  ë•Œì— í¬ì˜¹ê³¼ 키스로 작별하여 주었소. +ì´ ë‚ ì€ í½ ë”°ëœ»í•˜ê³  ì¼ê¸°ê°€ ì¢‹ì€ ë‚ ì´ì—ˆì†Œ. í•˜ëŠ˜ì— êµ¬ë¦„ 한 ì , ë•…ì— ë°”ëžŒ 한 ì  ì—†ì´ ë§ˆì¹˜ ëŠ¦ì€ ë´„ë‚ ê³¼ ê°™ì´ ë”°ëœ»í•œ ë‚ ì´ì—ˆì†Œ. +차는 떠났소. íŒë‹¤ëŠ” ë‘¥ 안 íŒë‹¤ëŠ” ë‘¥ ë§ì½ ë§Žì€ ë™ì¤‘로(ì§€ê¸ˆì€ ë¶ë§Œ 철로ë¼ê³  하오.)ì˜ êµ­ì œ ì—´ì°¨ì— ëª¸ì„ ì˜íƒí•œ 것ì´ì˜¤. +송화강(æ¾èŠ±æ±Ÿ:쑹화 ê°•)ì˜ ì² êµë¥¼ 건너오. ì•„ì•„ ê·¸ë¦¬ë„ ë‚¯ìµì€ 송화강! ì†¡í™”ê°•ì´ ì™œ ë‚¯ì´ ìµì†Œ. ì´ ì†¡í™”ê°•ì€ ë¶ˆí•¨ì‚°(장백산)ì— ê·¼ì›ì„ 발하여 광막한 ë¶ë§Œì£¼ì˜ ì‚¬ëžŒë„ ì—†ëŠ” 벌íŒì„ í˜¼ìž ì†Œë¦¬ë„ ì—†ì´ í˜ëŸ¬ê°€ëŠ” ê²ƒì´ ë‚´ 신세와 같소. ì´ ë¶ë§Œì£¼ì˜ 벌íŒì„ 만든 ìžê°€ 송화강ì´ì§€ë§ˆëŠ” 나는 그만한 íž˜ì´ ì—†ëŠ” ê²ƒì´ ë¶€ë„러울 ë¿ì´ì˜¤. ì´ ê´‘ë§‰í•œ ë¶ë§Œì˜ 벌íŒì„ ë‚´ ì†ìœ¼ë¡œ 개척하여서 ì¡°ì„  ì‚¬ëžŒì˜ ë‚™ì›ì„ ë§Œë“¤ìž í•˜ê³  ë½ë‚´ì–´ 볼까. ê·¸ê²ƒì€ í˜•ì´ í•˜ì‹œì˜¤. ë‚´ ì–´ë¦°ê²ƒì´ ìžë¼ê±°ë“  그놈ì—게나 그러한 ìƒê°ì„ 넣어 주시오. +ë™ì–‘ì˜ êµ­ì œì  ê´´ë¬¼ì¸ í•˜ì–¼ë¹ˆ ì‹œê°€ë„ ê¹Œë§£ê²Œ 안개ì—서 스러져 버리고 ë§ì•˜ì†Œ. 그러나 ê·¸ 시가를 싼 까만 ê¸°ìš´ì´ êµ­ì œì  í’ìš´ì„ í¬ìž¥í•œ 것ì´ë¼ê³  할까요. +ê°€ë„ê°€ë„ ë²ŒíŒ. ì„œë¦¬ë§žì€ ë§ˆë¥¸ 풀바다. 실개천 í•˜ë‚˜ë„ ì—†ëŠ” 메마른 사막. 어디를 ë³´ì•„ë„ ì‚° 하나 없으니 하늘과 ë•…ì´ ì°© 달ë¼ë¶™ì€ 듯한 천지. 구름 한 ì  ì—†ê±´ë§Œë„ ê·¸ í° íƒœì–‘ ê°€ì§€ê³ ë„ ë¯¸ì²˜ 다 비추지 못하여 ì§€í‰ì„  호를 그린 ì§€í‰ì„  위ì—는 í•­ìƒ í™©í˜¼ì´ ë– ë„는 듯한 세계. ì´ ì†ìœ¼ë¡œ ë‚´ê°€ ëª¸ì„ ë‹´ì€ ì—´ì°¨ëŠ” 서쪽으로 서쪽으로 í•´ê°€ 가는 걸ìŒì„ ë”°ë¼ì„œ 달리고 있소. 열차가 달리는 바퀴 ì†Œë¦¬ë„ ë°˜í–¥í•  ê³³ì´ ì—†ì–´ 힘없는 í•œìˆ¨ê°™ì´ ìŠ¤ëŸ¬ì§€ê³  마오. +ê¸°ì¨ ê°€ì§„ ì‚¬ëžŒì´ ì§€ë£¨í•´ì„œ 못 견딜 ì´ í’ê²½ì€ ë‚˜ê°™ì´ ìˆ˜ì‹¬ 가진 사람ì—게는 가장 ê³µìƒì˜ ë§ì„ ë‹¬ë¦¬ê¸°ì— í•©ë‹¹í•œ ê³³ì´ì˜¤. +ì´ ê³³ì—ë„ ì‚°ë„ ìžˆê³  ëƒ‡ë¬¼ë„ ìžˆê³  ì‚¼ë¦¼ë„ ìžˆê³  ê½ƒë„ í”¼ê³  ë‚ ì§ìй, 길ì§ìŠ¹ì´ ë‚ ê³  ê¸°ë˜ ë•Œë„ ìžˆì—ˆê² ì§€ìš”. ê·¸ëŸ¬ë˜ ê²ƒì´ ëª‡ë§Œ ë…„ 지나는 ë™ì•ˆì— ì‚°ì€ ë‚®ì•„ì§€ê³  ê³¨ì€ ë†’ì•„ì ¸ì„œ 마침내 ì´ ê¼´ì´ ëœ ê²ƒì¸ê°€ 하오. ë§Œì¼ í° íž˜ì´ ìžˆì–´ ì´ ê´‘ì•¼ë¥¼ 파낸다 하면 물 í르고 고기 ë†€ë˜ ê°•ê³¼, 울고 ì›ƒë˜ ìƒë¬¼ì´ ì‚´ë˜ ìžì·¨ê°€ ìžˆì„ ê²ƒì´ì˜¤. ì•„ì•„ ì´ ëª¨ë“  ê¸°ì–µì„ ê½‰ 품고 ì£½ì€ ë“¯ì´ ìž ìž í•œ 광야ì—! +ë‚´ê°€ 탄 차가 Fì—­ì— ë„ì°©í•˜ì˜€ì„ ë•Œì—는 ë¶ë§Œì£¼ ê´‘ì•¼ì˜ ì„ì–‘ì˜ ì•„ë¦„ë‹¤ì›€ì€ ê·¸ ê·¹ë„ì— ë‹¬í•œ 것 같았소. 둥긋한 ì§€í‰ì„  ìœ„ì— ê±°ì˜ ê±¸ë¦° 커다란 í•´! 아마 ê·¸ 신비하고 ìž¥ì—„í•¨ì´ ë‚´ 경험으로는 ì´ ê³³ì—서밖ì—는 ë³¼ 수 없는 것ì´ë¼ê³ ìƒê°í•˜ì˜¤. ì´ê¸€ì´ê¸€ ì´ê¸€ì´ê¸€ ê·¸ëŸ¬ë©´ì„œë„ ë‘¥ê¸€ë‹¤ëŠ” 체모를 변치 아니하는 ê·¸ 지는 í•´! +게다가 먼 ì§€í‰ì„ ìœ¼ë¡œë¶€í„° 기어드는 í™©í˜¼ì€ ì¸ì œëŠ” 대지를 ê±°ì˜ ë‹¤ ë®ì–´ 버려서 마른 풀로 ëœ ì§€ë©´ì€ ê°€ë­‡ê°€ë­‡í•œ ë¹›ì„ ë ê³  ì‚¬ë§‰ì˜ ê°€ëŠ” 모래를 ë¨¸ê¸ˆì€ ì§€ëŠ” í•´ì˜ ê´‘ì„ ì„ ë°˜ì‚¬í•˜ì—¬ì„œ 대기는 ì§™ì€ ìžì¤ë¹›ì„ 바탕으로 한 가지ê°ìƒ‰ì˜ ëª…ì•”ì„ ê°€ì§„, ì˜¤ìƒ‰ì´ ì˜ë¡±í•œ, ë„무지 ë‚´ê°€ ì¼ì° 경험해 ë³´ì§€ 못한 ìƒ‰ì±„ì˜ ì„¸ê³„ë¥¼ ì´ë£¨ì—ˆì†Œ. ì•„ 좋다! +ê·¸ ì†ì— 수ì€ê°™ì´ 빛나는, 수없는 작고 í° í˜¸ìˆ˜ë“¤ì˜ ë¹›! ê·¸ ì†ìœ¼ë¡œ 날아오는 수없고 ì´ë¦„ 모를 ìƒˆë“¤ì˜ ë–¼ë„ ì´ ì„¸ìƒì˜ 것ì´ë¼ê³ ëŠ” ìƒê°í•˜ì§€ 아니하오. +나는 ê±°ì˜ ë¬´ì˜ì‹ì ìœ¼ë¡œ ì°¨ì—서 뛰어내렸소. ê±°ì˜ ë– ë‚  ì‹œê°„ì´ ë‹¤ ë˜ì–´ì„œ ì§ì˜ ì¼ë¶€ë¶„ì€ ë¯¸ì²˜ ê°€ì§€ì§€ë„ ëª»í•˜ê³  뛰어내렸소. 반쯤 미친 것ì´ì˜¤. +정거장 앞 조그마한 ì•„ë¼ì‚¬ ì‚¬ëžŒì˜ ì—¬ê´€ì—다가 ì§ì„ 맡겨 버리고 나는 ë‹¨ìž¥ì„ ëŒê³  ì² ë„ ì„ ë¡œë¥¼ ë›°ì–´ 건너서 í˜¸ìˆ˜ì˜ ìˆ˜ì€ë¹› 나는 ê³³ì„ ì°¾ì•„ì„œ 지향 ì—†ì´ ê±¸ì—ˆì†Œ. +한 호수를 가서 ë³´ë©´ ë˜ ì € 편 호수가 ë” ì•„ë¦„ë‹¤ì›Œ ë³´ì´ì˜¤. ì›ì»¨ëŒ€ ì € 지는 í•´ê°€ 다 지기 ì „ì— ì´ ê´‘ì•¼ì— ìžˆëŠ” 호수를 다 ëŒì•„ë³´ê³  싶소. +ë‚´ê°€ 호숫 ê°€ì— ì„°ì„ ë•Œì— ê·¸ ê±°ìš¸ê°™ì´ ìž”ìž”í•œ í˜¸ìˆ˜ë©´ì— ë¹„ì¹˜ëŠ” ë‚´ 그림ìžì˜ 외로움ì´ì—¬, 그러나 아름다움ì´ì—¬! ê·¸ 호수는 ì˜ì›í•œ ìš°ì£¼ì˜ ì‹ ë¹„ë¥¼ 품고 í•˜ëŠ˜ì´ ì˜¤ë©´ 하늘ì„, 새가 오면 새를, êµ¬ë¦„ì´ ì˜¤ë©´ 구름ì„, 그리고 ë‚´ê°€ 오면 나를 비추지 아니하오. 나는 호수가 ë˜ê³  싶소. 그러나 형! 나는 ì´ í˜¸ìˆ˜ë©´ì—서 얼마나 ì •ìž„ì˜ ì–¼êµ´ì„ ì°¾ì•˜ê² ì†Œ. ê·¸ê²ƒì€ ë¬¼ë¦¬í•™ì ìœ¼ë¡œ 불가능한 ì¼ì´ê² ì§€ìš”. ë™ê²½ì˜ ë³‘ì‹¤ì— ëˆ„ì›Œ 있는 ì •ìž„ì˜ ëª¨ì–‘ì´ ëª½ê³  ì‚¬ë§‰ì˜ í˜¸ìˆ˜ë©´ì— ë¹„ì¹  리야 있겠소. 없겠지마는 나는 호수마다 ì •ìž„ì˜ ê·¸ë¦¼ìžë¥¼ 찾았소. 그러나 ë³´ì´ëŠ” ê²ƒì€ ì™¸ë¡œìš´ ë‚´ 그림ìžë¿ì´ì˜¤. +`ê°€ìž. ë없는 사막으로 í•œì—†ì´ ê°€ìž. 가다가 ë‚´ ê¸°ìš´ì´ ì§„í•˜ëŠ” ìžë¦¬ì— 나는 ë‚´ ì†ìœ¼ë¡œ 모래를 파고 ê·¸ ì†ì— ë‚´ ëª¸ì„ ë¬»ê³  죽어 버리ìž. 살아서 다시 ë³¼ 수 없는 ì •ìž„ì˜ ã€Œì´ë°ì•„ã€ë¥¼ 안고 ì´ ê¹¨ë—한 광야ì—서 죽어 버리 ìž.' +하고 나는 지는 해를 향하고 한정 ì—†ì´ ê±¸ì—ˆì†Œ. ì‚¬ë§‰ì´ ë°›ì•˜ë˜ ë”°ëœ»í•œ ê¸°ìš´ì€ ì•„ì§ë„ 다 ì‹ì§€ëŠ” 아니하였소. 사막ì—는 바람 한 ì ë„ 없소. 소리 í•˜ë‚˜ë„ ì—†ì†Œ. ë°œìžêµ­ ë°‘ì—서 우는 마른 풀과 ëª¨ëž˜ì˜ ë°”ìŠ¤ë½ê±°ë¦¬ëŠ” 소리가 들릴 ë¿ì´ì˜¤. +나는 허리를 ì§€í‰ì„ ì— 걸었소. ê·¸ 신비한 ê´‘ì„ ì€ ë‚´ 가슴으로부터 위ì—ë§Œì„ ë¹„ì¶”ê³  있소. +ë¬¸ë“ ë‚˜ëŠ” 해를 ë”°ë¼ê°€ëŠ” 별 ë‘ ê°œë¥¼ 보았소. 하나는 ì•žì„ ì„œê³  하나는 뒤를 섰소. ì•žì˜ ë³„ì€ ì¢€ í¬ê³  ë’¤ì˜ ë³„ì€ ì¢€ 작소. ì´ëŸ° ë³„ë“¤ì€ ì‚° ë§Žì€ ë‚˜ë¼ ë‹¤ì‹œ ë§í•˜ë©´ 서쪽 ì§€í‰ì„ ì„ 보기 어려운 나ë¼ì—서만 ìƒìž¥í•œ 나로서는 ë³´ì§€ ëª»í•˜ë˜ ë³„ì´ì˜¤. 나는 ê·¸ ë³„ì˜ ì´ë¦„ì„ ëª¨ë¥´ì˜¤. `ë‘ ë³„'ì´ì˜¤. +í•´ê°€ ì§€í‰ì„ ì—서 ëš ë–¨ì–´ì§€ìž ëŒ€ê¸°ì˜ ìžì¤ë¹›ì€ 남빛으로 변하였소. ì˜¤ì§ í•´ê°€ 금시 들어간 ìžë¦¬ì—ë§Œ 주í™ë¹›ì˜ ì—¬ê´‘ì´ ìžˆì„ ë¿ì´ì˜¤. ë‚´ 눈앞ì—서는 남빛 안개가 피어오르는 듯하였소. ì•žì— ë³´ì´ëŠ” í˜¸ìˆ˜ë§Œì´ ìœ ë‚œížˆ 빛나오. ë˜ í•œ ë–¼ì˜ ì´ë¦„ 모를 ìƒˆë“¤ì´ ìˆ˜ë©´ì„ ìŠ¤ì¹˜ë©° ë‚  저문 ê²ƒì„ ë†€ë¼ëŠ” ë“¯ì´ ì–´ì§€ëŸ¬ì´ ë‚ ì•„ 지나가오. ê·¸ë“¤ì€ ì†Œë¦¬ë„ ì•„ë‹ˆ 하오. 날개치는 ì†Œë¦¬ë„ ì•„ë‹ˆ 들리오. ê·¸ê²ƒë“¤ì€ ì‚¬ë§‰ì˜ í™©í˜¼ì˜ í—ˆê¹¨ë¹„ì¸ ê²ƒ 같소. +나는 ìžê¾¸ 걷소. 해를 ë”°ë¥´ë˜ ë‚˜ëŠ” ë‘ ë³„ì„ ë”°ë¼ì„œ ìžê¾¸ 걷소. +ë³„ë“¤ì€ ì§„ 해를 ë”°ë¼ì„œ ë°”ì‚ ê±·ëŠ” ê²ƒë„ ê°™ê³ , 헤매는 나를 ì–´ë–¤ 나ë¼ë¡œ ë„는 ê²ƒë„ ê°™ì†Œ. +아니 ë‘ ë³„ ì¤‘ì— ì•žì„  ë³„ì´ í•œ 번 ë°˜ì§í•˜ê³ ëŠ” 최후로 한 번 ë°˜ì§í•˜ê³ ëŠ” ì§€í‰ì„  ë°‘ì— ìˆ¨ì–´ 버리고 마오. ë’¤ì— ë‚¨ì€ ì™¸ë³„ì˜ ì™¸ë¡œì›€ì´ì—¬! 나는 울고 싶었소. 그러나 나는 하나만 ë‚¨ì€ ìž‘ì€ ë³„ 외로운 ìž‘ì€ ë³„ì„ ë”°ë¼ì„œ ë” ë¹¨ë¦¬ 걸ìŒì„ 걸었소. ê·¸ 한 별마저 넘어가 버리면 나는 어찌하오. +ë‚´ê°€ 웬ì¼ì´ì˜¤. 나는 시ì¸ë„ 아니요, ì˜ˆìˆ ê°€ë„ ì•„ë‹ˆì˜¤. 나는 정으로 í–‰ë™í•œ ì¼ì€ 없다고 믿는 사람ì´ì˜¤. 그러나 형! ì´ ë•Œì— ë¯¸ì¹œ ê²ƒì´ ì•„ë‹ˆìš”, ë‚´ 가슴ì—는 무엇ì¸ì§€ 모를 ê²ƒì„ ë”°ë¥¼ 요샛ë§ë¡œ ì´ë¥¸ë°” ë™ê²½ìœ¼ë¡œ 찼소. +`ì•„ì•„ ì € ìž‘ì€ ë³„!' +ê·¸ê²ƒë„ ì§€í‰ì„ ì— 닿았소. +`ì•„ì•„ ì € ìž‘ì€ ë³„. 저것마저 넘어가면 나는 어찌하나.' +ì¸ì œëŠ” 어둡소. ê´‘ì•¼ì˜ í™©í˜¼ì€ ëª…ìƒ‰ë¿ì´ìš”, 순ì‹ê°„ì´ìš”, í•´ì§€ìž ì‹ ë¹„í•˜ë‹¤ê³  í•  만한 극히 ì§§ì€ ë™ì•ˆì— 아름다운 í™©í˜¼ì„ ì¡°ê¸ˆ ë³´ì´ê³ ëŠ” ê³§ ì¹ ê³¼ ê°™ì€ ì•”í‘ì´ì˜¤. í˜¸ìˆ˜ì˜ ë¬¼ë§Œì´ ì–´ë””ì„œ ì€ë¹›ì„ 받았는지 뿌옇게 ë‚˜ë§Œì´ ìœ ì¼í•œ 존재다, ë‚˜ë§Œì´ ìœ ì¼í•œ ë¹›ì´ë‹¤ 하는 ë“¯ì´ ì¸ì œëŠ” 수ì€ë¹›ì´ ì•„ë‹ˆë¼ ë‚¨ë¹›ì„ ë°œí•˜ê³  ìžˆì„ ë¿ì´ì˜¤. +나는 ê·¸ 중 ë¹›ì„ ë§Žì´ ë°›ì€, ê·¸ 중 환해 ë³´ì´ëŠ” í˜¸ìˆ˜ë©´ì„ ì°¾ì•„ ë‘리번거리며, 그러나 빠른 걸ìŒìœ¼ë¡œ 헤매었소. 그러나 ë‚´ê°€ ì¢€ë” ë§‘ì€ í˜¸ìˆ˜ë©´ì„ ì°¾ëŠ” ë™ì•ˆì— ì´ ê´‘ì•¼ì˜ ì–´ë‘ ì€ ë”ìš±ë”ìš± 짙어지오. +나는 ì–´ë–¤ 조그마한 호숫 ê°€ì— íŽ„ì© ì•‰ì•˜ì†Œ. ë‚´ 앞ì—는 ì§™ì€ ë‚¨ë¹›ì˜ ìˆ˜ë©´ì— ì¡°ê·¸ë§ˆí•œ 거울만한 ë°ì€ ë°ê°€ 있소. 마치 ë‚´ 눈ì—서 무슨 ë¹›ì´ ë‚˜ì™€ì„œ, 아마 ì •ìž„ì„ ê·¸ë¦¬ì›Œí•˜ëŠ” ë¹›ì´ ë‚˜ì™€ì„œ ê·¸ ìˆ˜ë©´ì— ë°˜ì‚¬í•˜ëŠ” 듯ì´. 나는 í—ˆê²ì§€ê² ê·¸ 빤한 ìˆ˜ë©´ì„ ë“¤ì—¬ë‹¤ë³´ì•˜ì†Œ. 혹시나 ì •ìž„ì˜ ëª¨ì–‘ì´ ê±°ê¸° 나타나지나 아니할까 하고. 세ìƒì—는 그러한 기ì ë„ 있지 아니한가 하고. +물ì—는 ì •ìž„ì˜ ì–¼êµ´ì´ ì–´ë¥¸ê±°ë¦¬ëŠ” 것 같았소. ì´ë”°ê¸ˆ ì •ìž„ì˜ ëˆˆë„ ì–´ë¥¸ê±°ë¦¬ê³  ì½”ë„ ë²ˆëœ»ê±°ë¦¬ê³  ìž…ë„ ë²ˆëœ»ê±°ë¦¬ëŠ” 것 같소. 그러나 ìˆ˜ë©´ì€ ì ì  ì–´ë‘워 가서 ê·¸ 환ì˜ì¡°ì°¨ ë”ìš± í¬ë¯¸í•´ì§€ì˜¤. +나는 í˜¸ìˆ˜ë©´ì— ë¹¤í•˜ë˜ í•œ ì¡°ê°ì¡°ì°¨ 캄캄해지는 ê²ƒì„ ë³´ê³  ìˆ¨ì´ ë§‰íž ë“¯í•¨ì„ ê¹¨ë‹¬ìœ¼ë©´ì„œ 고개를 들었소. +고개를 들려고 í•  때ì—, 형ì´ì—¬, ì´ìƒí•œ ì¼ë„ 다 있소. ê·¸ ìˆ˜ë©´ì— ì •ìž„ì˜ ëª¨ì–‘ì´, 얼굴만 아니ë¼, ê·¸ 몸 ì˜¨í†µì´ ê·¸ 어깨, 가슴, 팔, 다리까지ë„, ê·¸ 눈과 입까지ë„, ê·¸ ì–¼êµ´ì˜ í° ê²ƒê³¼ ìž…ìˆ ì´ ë¶ˆê·¸ë ˆí•œ 것까지ë„, 마치 환한 ëŒ€ë‚®ì— ì‹¤ë¬¼ì„ ëŒ€í•œ 모양으로 소ìƒí•˜ê²Œ 나타났소. +"ì •ìž„ì´!" +하고 나는 소리를 지르며 물로 뛰어들려 하였소. 그러나 형, ê·¸ ìˆœê°„ì— ì •ìž„ì˜ ëª¨ì–‘ì€ ì‚¬ë¼ì ¸ 버리고 ë§ì•˜ì†Œ. +나는 ì´ ì–´ë‘  ì†ì— ì–´ë”” ì •ìž„ì´ê°€ 나를 ë”°ë¼ì˜¨ ê²ƒê°™ì´ ìƒê°í–ˆì†Œ. 혹시나 ì •ìž„ì´ê°€ 죽어서 ê·¸ ëª¸ì€ ë™ê²½ì˜ 대학 병ì›ì— ë²—ì–´ ë‚´ì–´ë˜ì§€ê³  í˜¼ì´ ë¹ ì ¸ 나와서 ë¬¼ì— ë¹„ì¹˜ì—ˆë˜ ê²ƒì´ ì•„ë‹ê¹Œ, 나는 ê°€ìŠ´ì´ ìš¸ë ê±°ë¦¼ì„ 진정치 못하면서 호숫 ê°€ì—서 벌떡 ì¼ì–´ë‚˜ì„œ ì–´ë‘  ì†ì— ì •ìž„ì„ ë§Œì ¸ë³´ë ¤ëŠ” 듯ì´, ì–´ë‘워서 ëˆˆì— ë³´ì§€ëŠ” 못하ë”ë¼ë„ ìžê¾¸ 헤매노ë¼ë©´ ëª¸ì— ë¶€ë”ªížˆê¸°ë¼ë„ í•  것 같아서 함부로 헤매었소. 그리고는 ëˆˆì•žì— ë²ˆëœ»ê±°ë¦¬ëŠ” ì •ìž„ì˜ í™˜ì˜ì„ íŒ”ì„ ë²Œë ¤ì„œ 안고 소리를 내어서 불렀소. +"ì •ìž„ì´, ì •ìž„ì´." +하고 나는 ìˆ˜ì—†ì´ ì •ìž„ì„ ë¶€ë¥´ë©´ì„œ 헤매었소. +그러나 형, ì´ê²ƒë„ 죄지요. ì´ê²ƒë„ 하나님께서 금하시는 ì¼ì´ì§€ìš”. 그러길래 ê´‘ì•¼ì— ì•„ì£¼ ì–´ë‘ ì´ ë®ì´ê³  새까만 í•˜ëŠ˜ì— ë³„ì´ ì´ì´í•˜ê²Œ 나고는 ì˜ ì •ìž„ì˜ í—›ê·¸ë¦¼ìžì¡°ì°¨ 아니 ë³´ì´ì§€ìš”. 나는 죄를 피해서 ì •ìž„ì„ ë– ë‚˜ì„œ 멀리 온 것ì´ë‹ˆ ì •ìž„ì˜ í—›ê·¸ë¦¼ìžë¥¼ ë”°ë¼ë‹¤ë‹ˆëŠ” ê²ƒë„ ì˜³ì§€ 않지요. +그렇지만 ë‚´ê°€ ì´ë ‡ê²Œ 혼ìžì„œ ì •ìž„ì„ ìƒê°ë§Œ 하는 것ì´ì•¼ 무슨 죄 ë  ê²ƒì´ ìžˆì„까요. ë‚´ê°€ ì •ìž„ì„ ë§Œ 리나 떠나서 ì´ë ‡ê²Œ 헛그림ìžë‚˜ 그리며 그리워하는 것ì´ì•¼ 무슨 죄가 ë ê¹Œìš”. 설사 죄가 ë˜ê¸°ë¡œì„œë‹ˆ 낸들 ì´ê²ƒê¹Œì§€ì•¼ 어찌하오. ë‚´ê°€ ë‚´ í˜¼ì„ ì£½ì—¬ 버리기 ì „ì—야 ë‚´ 힘으로 어찌하오. 설사 죄가 ë˜ì–´ì„œ ë‚´ê°€ ì§€ì˜¥ì˜ êº¼ì§€ì§€ 않는 유황불 ì†ì—서 ì˜ì›í•œ í˜•ë²Œì„ ë°›ê²Œ ë˜ê¸°ë¡œì„œë‹ˆ ê·¸ê²ƒì„ ì–´ì°Œí•˜ì˜¤. 형, ì´ê²ƒ, ì´ê²ƒë„ ë§ì•„야 옳ì€ê°€ìš”. ì •ìž„ì˜ í—›ê·¸ë¦¼ìžê¹Œì§€ë„ ëŠì–´ 버려야 옳ì€ê°€ìš”. +ì´ ë•Œìš”. 바로 ì´ ë•Œìš”. ë‚´ 앞 수십 보나 ë ê¹Œ(캄캄한 ë°¤ì´ë¼ 먼지 가까운지 분명히 알 수 없지마는) 하는 ê³³ì— ë‚œë°ì—†ëŠ” 등불 하나가 나서오. 나는 ê¹œì§ ë†€ë¼ì„œ ìš°ëš ì„°ì†Œ. ì´ ë¬´ì¸ì§€ê²½, ì´ ë°¤ì¤‘ì— ê°‘ìžê¸° ë³´ì´ëŠ” 등불 ê·¸ê²ƒì€ ë§ˆì¹˜ ì´ ì„¸ìƒ ê°™ì§€ 아니하였소. +ì € ë“±ë¶ˆì´ ì–´ë–¤ 등불ì¼ê¹Œ, ê·¸ ë“±ë¶ˆì´ ëª‡ ê±¸ìŒ ê°€ê¹Œì´ ì˜¤ë‹ˆ, ê·¸ 등불 ë’¤ì— ì‚¬ëžŒì˜ ë‹¤ë¦¬ê°€ ë³´ì´ì˜¤. +"누구요?" +하는 ê²ƒì€ ê·€ì— ìµì€ ì¡°ì„ ë§ì´ì˜¤. 어떻게 ì´ ëª½ê³ ì˜ ê´‘ì•¼ì—서 ì¡°ì„ ë§ì„ 들ì„까 하고 나는 ë“±ë¶ˆì„ ì²˜ìŒ ë³¼ 때보다 ë”ìš± 놀ëžì†Œ. +"나는 ì§€ë‚˜ê°€ë˜ ì‚¬ëžŒì´ì˜¤." +하고 ë‚˜ë„ ë“±ë¶ˆì„ í–¥í•˜ì—¬ 마주 걸어갔소. +ê·¸ ì‚¬ëžŒì€ ë“±ë¶ˆì„ ë“¤ì–´ì„œ ë‚´ ì–¼êµ´ì„ ë¹„ì¶”ì–´ ë³´ë”니, +"당신 ì¡°ì„  사람ì´ì˜¤?" +하고 묻소. +"네, 나는 ì¡°ì„  사람ì´ì˜¤. ë‹¹ì‹ ë„ ìŒì„±ì„ 들으니 ì¡°ì„  사람ì¸ë°, 어떻게 ì´ëŸ° 광야ì—, 아닌 밤중ì—, 여기 계시단 ë§ì´ì˜¤." +하고 나는 놀ë¼ëŠ” 표정 그대로 대답하였소. +"나는 ì´ ê·¼ë°©ì— ì‚¬ëŠ” 사람ì´ë‹ˆê¹Œ 여기 오는 ê²ƒë„ ìžˆì„ ì¼ì´ì§€ë§ˆëŠ” 당신ì´ì•¼ë§ë¡œ ì´ ì•„ë‹Œ 밤중ì—." +하고 육혈í¬ë¥¼ 집어넣고, ì†ì„ 내밀어서 내게 악수를 구하오. +나는 반갑게 ê·¸ì˜ ì†ì„ 잡았소. 그러나 나는 `ì£½ì„ ì§€ê²½ì— ì–´ë–»ê²Œ 오셨단 ë§ì´ì˜¤.' 하고, 그가 ë‚´ê°€ 무슨 ì•…ì˜ë¥¼ 가진 í‰í•œì´ 아닌 ì¤„ì„ ì•Œê³  ì†ì— ë¹¼ì–´ë“¤ì—ˆë˜ ìœ¡í˜ˆí¬ë¡œ 시기를 ìž ê¹ì´ë¼ë„ 노린 ê²ƒì„ ë¶ˆì¾Œí•˜ê²Œ ìƒê°í•˜ì˜€ë˜ 것ì´ì˜¤. +ê·¸ë„ ë‚´ ì´ë¦„ë„ ë¬»ì§€ 아니하고 ë˜ ë‚˜ë„ ê·¸ì˜ ì´ë¦„ì„ ë¬»ì§€ 아니하고 나는 ê·¸ì—게 ëŒë ¤ì„œ 그가 ì¸ë„하는 곳으로 갔소. ê·¸ ê³³ì´ëž€ ê²ƒì€ ì•„ê¹Œ ë“±ë¶ˆì´ ì²˜ìŒ ë‚˜íƒ€ë‚˜ë˜ ê³³ì¸ ë“¯í•œë°, 거기서 ë˜ í•œ 번 놀란 ê²ƒì€ ì–´ë–¤ ë¶€ì¸ì´ 있는 것ì´ì˜¤. 남ìžëŠ” ì•„ë¼ì‚¬ì‹ ì–‘ë³µì„ ìž…ì—ˆìœ¼ë‚˜ ë¶€ì¸ì€ 중국 옷 비슷한 ì˜·ì„ ìž…ì—ˆì†Œ. 남ìžëŠ” 나를 ëŒì–´ì„œ ê·¸ ë¶€ì¸ì—게 ì¸ì‚¬í•˜ê²Œ 하고, +"ì´ëŠ” ë‚´ ì•„ë‚´ìš”." +하고 ë˜ ê·¸ ì•„ë‚´ë¼ëŠ” ë¶€ì¸ì—게는, +"ì´ ì´ëŠ” ì¡°ì„  ì–‘ë°˜ì´ì˜¤. ì„±í•¨ì´ ë‰˜ì‹œì£ ?" +하고 그는 나를 ë°”ë¼ë³´ì˜¤. 나는, +"최ì„입니다." +하고 바로 대답하였소. +"ìµœì„ ì”¨?" +하고 ê·¸ 남ìžëŠ” ì†Œê°œí•˜ë˜ ê²ƒë„ ìžŠì–´ë²„ë¦¬ê³  ë‚´ ì–¼êµ´ì„ ë“¤ì—¬ë‹¤ë³´ì˜¤. +"네, 최ì„입니다." +"ì•„ â—â—í•™êµ êµìž¥ìœ¼ë¡œ 계신 ìµœì„ ì”¨." +하고 ê·¸ 남ìžëŠ” ë”ìš± 놀ë¼ì˜¤. +"네, 어떻게 ë‚´ ì´ë¦„ì„ ì•„ì„¸ìš”?" +하고 ë‚˜ë„ ê·¸ê°€ 혹시 아는 사람ì´ë‚˜ 아닌가 하고 등불 ë¹›ì— ì–¼êµ´ì„ ë“¤ì—¬ë‹¤ 보았으나 ë„무지 ê·¸ ì–¼êµ´ì´ ë³¸ ê¸°ì–µì´ ì—†ì†Œ. +"최 ì„ ìƒì„ ë‚´ê°€ 압니다. 남 ì„ ìƒí•œí…Œ ë§ì”€ì„ ë§Žì´ ë“¤ì—ˆì§€ìš”. ê·¸ëŸ°ë° ë‚¨ ì„ ìƒë„ ëŒì•„가신 지가 ë²Œì¨ ëª‡ 핸가." +하고 ê°ê°œë¬´ëŸ‰í•œ ë“¯ì´ ê·¸ 아내를 ëŒì•„보오. +"십오 ë…„ì´ì§€ìš”." +하고 ê³ì— ì„°ë˜ ë¶€ì¸ì´ ë§í•˜ì˜¤. +"ë²Œì¨ ì‹­ì˜¤ ë…„ì¸ê°€." +하고 ê·¸ 남ìžëŠ” 나를 ë³´ê³ , +"ì •ìž„ì´ ìž˜ ìžëžë‹ˆê¹Œ? ë²Œì¨ ì´ì‹­ì´ 넘었지." +하고 ë˜ ë¶€ì¸ì„ ëŒì•„보오. +"스물세 ì‚´ì´ì§€." +하고 ë¶€ì¸ì´ 확실치 아니한 ë“¯ì´ ëŒ€ë‹µí•˜ì˜¤. +"네, 스물세 살입니다. 지금 ë™ê²½ì— 있습니다. ë³‘ì´ ë‚˜ì„œ ìž…ì›í•œ ê²ƒì„ ë³´ê³  왔는ë°." +하고 나는 ë²ˆê°œê°™ì´ ì •ìž„ì˜ ë³‘ì‹¤ê³¼ ì •ìž„ì˜ í˜¸í…” 장면 ë“±ì„ ìƒê°í•˜ê³  ê°€ìŠ´ì´ ì„¤ë ˜ì„ ê¹¨ë‹¬ì•˜ì†Œ. ì˜ì™¸ì¸ ê³³ì—서 ì˜ì™¸ì¸ ì‚¬ëžŒë“¤ì„ ë§Œë‚˜ì„œ ì •ìž„ì˜ ë§ì„ 하게 ëœ ê²ƒì„ ê¸°ë»í•˜ì˜€ì†Œ. +"무슨 병입니까. ì •ìž„ì´ê°€ 본래 ëª¸ì´ ì•½í•´ì„œ." +하고 ë¶€ì¸ì´ ì§ì ‘ 내게 묻소. +"네. ëª¸ì´ ì¢€ 약합니다. ë³‘ì´ ì¢€ ë‚˜ì€ ê²ƒì„ ë³´ê³  떠났습니다마는 염려가 ë©ë‹ˆë‹¤." +하고 나는 무ì˜ì‹ì¤‘ì— ê³ ê°œë¥¼ ë™ê²½ì´ 있는 방향으로 ëŒë ¸ì†Œ. 마치 고개를 ë™ìœ¼ë¡œ ëŒë¦¬ë©´ ì •ìž„ì´ê°€ ë³´ì´ê¸°ë‚˜ í•  것같ì´. +"ìž, 우리 집으로 갑시다." +하고 나는 ì•„ì§ ê·¸ì˜ ì„±ëª…ë„ ëª¨ë¥´ëŠ” 남ìžëŠ”, ê·¸ì˜ ì•„ë‚´ë¥¼ 재촉하ë”니, +"우리가 ì¡°ì„  ë™í¬ë¥¼ 만난 ê²ƒì´ ì‹­ì—¬ ë…„ ë§Œì´ì˜¤. ê·¸ëŸ°ë° ìµœ ì„ ìƒ, ì´ê²ƒì„ 좀 보시고 가시지요." +하고 그는 빙그레 웃으면서 나를 서너 ê±¸ìŒ ëŒê³  가오. 거기는 조그마한 무ë¤ì´ 있고 ê·¸ 앞ì—는 ì„ ìž ë†’ì´ë‚˜ ë˜ëŠ” 목패를 ì„¸ì› ëŠ”ë° ê·¸ 목패ì—는 `ë‘ ë³„ 무ë¤'ì´ë¼ëŠ” 넉 ìžë¥¼ ì¼ì†Œ. +ë‚´ê°€ ì´ìƒí•œ 눈으로 ê·¸ 무ë¤ê³¼ 목패를 ë³´ê³  있는 ê²ƒì„ ë³´ê³  그는, +"ì´ê²Œ 무슨 무ë¤ì¸ì§€ 아십니까?" +하고 유쾌하게 묻소. +"ë‘ ë³„ 무ë¤ì´ë¼ë‹ˆ 무슨 뜻ì¸ê°€ìš”?" +하고 ë‚˜ë„ ê·¸ì˜ ìœ ì¾Œí•œ í‘œì •ì— ì „ì—¼ì´ ë˜ì–´ì„œ 웃고 물었소. +"ì´ê²ƒì€ 우리 ë‘˜ì˜ ë¬´ë¤ì´ì™¸ë‹¤." +하고 그는 ì•„ë‚´ì˜ ì–´ê¹¨ë¥¼ 치며 유쾌하게 웃었소. ë¶€ì¸ì€ ë¶€ë„러운 ë“¯ì´ ì›ƒê³  고개를 숙ì´ì˜¤. +ë„무지 ëª¨ë‘ ê¿ˆ 같고 í™˜ì˜ ê°™ì†Œ. +"ìž ê°‘ì‹œë‹¤. ìžì„¸í•œ ë§ì€ 우리 ì§‘ì— ê°€ì„œ 합시다." +하고 서너 ê±¸ìŒ ì–´ë–¤ 방향으로 걸어가니 거기는 ë§ì„ 세 í•„ì´ë‚˜ 맨 마차가 있소. 몽고 ì‚¬ëžŒë“¤ì´ ê°€ì¡±ì„ ì‹£ê³  수초를 ë”°ë¼ ëŒì•„다니는 그러한 마차요. ì‚¿ìžë¦¬ë¡œ í™ì˜ˆí˜•ì˜ ì§€ë¶•ì„ ë§Œë“¤ê³  ê·¸ ì†ì— 들어가 앉게 ë˜ì—ˆì†Œ. ê·¸ì˜ ë¶€ì¸ê³¼ 나와는 ì´ ì§€ë¶• ì†ì— 들어앉고 그는 ì†ìˆ˜ ì–´ìžëŒ€ì— 앉아서 입으로 쮸쮸쮸쮸 하고 ë§ì„ 모오. ë“±ë¶ˆë„ êº¼ 버리고 캄캄한 ì†ìœ¼ë¡œ 달리오. +"ë¶ˆì´ ìžˆìœ¼ë©´ 군대ì—서 ì˜ì‹¬ì„ 하지요. ë„ì ë†ˆì´ 엿보지요. 게다가 ë¶ˆì´ ìžˆìœ¼ë©´ ë„리어 ì•žì´ ì•ˆ ë³´ì¸ë‹¨ ë§ìš”. 쯧쯧쯧쯧!" +하는 소리가 들리오. +대체 ì´ ì‚¬ëžŒì€ ë¬´ìŠ¨ 사람ì¸ê°€. ë˜ ì´ ë¶€ì¸ì€ 무슨 사람ì¸ê°€ 하고 나는 ì–´ë‘ìš´ ì†ì—서 í˜¼ìž ìƒê°í•˜ì˜€ì†Œ. 다만 잠시 본 ì¸ìƒìœ¼ë¡œ 보아서 ê·¸ë“¤ì€ í–‰ë³µëœ ë¶€ë¶€ì¸ ê²ƒ 같았소. ê·¸ë“¤ì´ ë¬´ì—‡ 하러 ì´ ì•„ë‹Œ ë°¤ì¤‘ì— ê´‘ì•¼ì— ë‚˜ì™”ë˜ê°€. ë˜ ê·¸ ì´ìƒì•¼ë¦‡í•œ ë‘ ë³„ 무ë¤ì´ëž€ 무엇ì¸ê°€. +나는 불현듯 ì§‘ì„ ìƒê°í•˜ì˜€ì†Œ. ë‚´ 아내와 ì–´ë¦°ê²ƒë“¤ì„ ìƒê°í•˜ì˜€ì†Œ. 가정과 사회ì—서 쫓겨난 ë‚´ê°€ 아니오. 쫓겨난 ìžì˜ ìƒê°ì€ 언제나 슬픔ë¿ì´ì—ˆì†Œ. +나는 ë‚´ 아내를 ì›ë§ì¹˜ 아니하오. 그는 ê²°ì½” 악한 ì—¬ìžê°€ 아니오. 다만 보통 ì—¬ìžìš”. 그는 질투 ë•Œë¬¸ì— ì´ì„±ì˜ íž˜ì„ ìžƒì€ ê²ƒì´ì˜¤. ì—¬ìžê°€ 질투 ë•Œë¬¸ì— ì´ì„±ì„ 잃는 ê²ƒì´ ì²œì§ì´ ì•„ë‹ê¹Œìš”. 그가 나를 사랑하길래 나를 위해서 질투를 가지는 ê²ƒì´ ì•„ë‹ˆì˜¤. +설사 질투가 그로 하여금 ì¹¼ì„ ë“¤ì–´ ë‚´ ê°€ìŠ´ì„ ì°Œë¥´ê²Œ 하였다 하ë”ë¼ë„ 나는 ê°ì‚¬í•œ ìƒê°ì„ 가지고 ëˆˆì„ ê°ì„ 것ì´ì˜¤. 사랑하는 ìžëŠ” 질투한다고 하오. 질투를 누르는 ê²ƒë„ ì•„ë¦„ë‹¤ìš´ ì¼ì´ì§€ë§ˆëŠ” ì§ˆíˆ¬ì— íƒ€ëŠ” ê²ƒë„ ì•„ë¦„ë‹¤ìš´ ì¼ì´ ì•„ë‹ê¹Œìš”. +ëœí¬ëŸ­ëœí¬ëŸ­ 하고 차바퀴가 ì² ë¡œê¸¸ì„ ë„˜ì–´ê°€ëŠ” 소리가 나ë”니 ì´ìœ½ê³  마차는 섰소. +ì•žì— ë¹¨ê°›ê²Œ ë¶ˆì´ ë¹„ì¹˜ì˜¤. +"ìž ì´ê²Œ 우리 ì§‘ì´ì˜¤." +하고 그가 마차ì—서 뛰어내리는 ì–‘ì´ ë³´ì´ì˜¤. ë‚´ë ¤ 보니까 ë‹¬ì´ ì˜¬ë¼ì˜¤ì˜¤. 굉장히 í° ë‹¬ì´, ë¶‰ì€ ë‹¬ì´ ì§€í‰ì„ ìœ¼ë¡œì„œ 넘ì„하고 올ë¼ì˜¤ì˜¤. +ë‹¬ë¹›ì— ë¹„ì¶”ì¸ ë°”ë¥¼ ë³´ë©´ 네모나게 ë‹´ ë‹´ì´ë¼ê¸°ë³´ë‹¤ëŠ” ì„±ì„ ë‘˜ëŸ¬ìŒ“ì€ ë‹¬ 뜨는 곳으로 열린 ëŒ€ë¬¸ì„ ë“¤ì–´ì„œì„œ ë„“ì€ ë§ˆë‹¹ì— ë‚´ë¦° ê²ƒì„ ë°œê²¬í•˜ì˜€ì†Œ. +"아버지!" +"엄마!" +하고 ì•„ì´ë“¤ì´ 뛰어나오오. ë§ë§Œí¼ì´ë‚˜ í° ê°œê°€ 네 놈ì´ë‚˜ 꼬리를 치고 나오오. ê·¸ë†ˆë“¤ì´ ì£¼ì¸ì§‘ 마차 소리를 알아듣고 ì§–ì§€ 아니한 모양ì´ì˜¤. +í° ì•„ì´ëŠ” 계집애로 ì—¬ë‚¨ì€ ì‚´, ìž‘ì€ ì•„ì´ëŠ” 사내로 육칠 세, ëª¨ë‘ ì¤‘êµ­ ì˜·ì„ ìž…ì—ˆì†Œ. +우리는 방으로 들어갔소. ë°©ì€ ì•„ë¼ì‚¬ì‹ 절반, ì¤‘êµ­ì‹ ì ˆë°˜ìœ¼ë¡œ ì„¸ê°„ì´ ë†“ì—¬ 있고 ë²½ì—는 ì¡°ì„  ì§€ë„와 ë‹¨êµ°ì˜ ì´ˆìƒì´ 걸려 있소. +그들 부처는 ì§€ë„와 단군 ì´ˆìƒ ì•žì— í—ˆë¦¬ë¥¼ 굽혀 배례하오. ë‚˜ë„ ë¬´ì˜ì‹ì ìœ¼ë¡œ 그대로 하였소. +그는 차를 마시며 ì´ë ‡ê²Œ ë§í•˜ì˜¤. +"우리는 ìžì‹ë“¤ì„ ì´ í¥ì•ˆë ¹ 가까운 무변 광야ì—서 기르는 것으로 ë‚™ì„ ì‚¼ê³  있지요. ì¡°ì„  ì‚¬ëžŒë“¤ì€ í•˜ë„ ë§ˆìŒì´ 작아서 걱정ì´ë‹ˆ ì´ëŸ° 호호탕탕한 ë„“ì€ ë²ŒíŒì—서 길러나면 마ìŒì´ 좀 커질까 하지요. ë˜ í¥ì•ˆë ¹ ë°‘ì—서 지나 중ì›ì„ 통ì¼í•œ ì œì™•ì´ ë§Žì´ ë‚¬ìœ¼ë‹ˆ 혹시나 ê·¸ 정기가 남아 있ì„까 하지요. 우리 ë¶€ì²˜ì˜ ìžì†ì´ 몇 대를 ë‘ê³  í¼ì§€ëŠ” ë™ì•ˆì—는 행여나 ë§ˆìŒ í° ì¸ë¬¼ì´ 하나 둘 날는지 알겠어요, 하하하하." +하고 그는 ì œ ë§ì„ 제가 비웃는 ë“¯ì´ í•œë°”íƒ• 웃고 나서, +"그러나 ì´ê±´ ë‚´ ì§„ì •ì´ì™¸ë‹¤. ìš°ë¦¬ë„ ì´ë ‡ê²Œ ê³ êµ­ì„ ë– ë‚˜ 있지마는 ê·¸ëž˜ë„ ê³ êµ­ 소ì‹ì´ ê¶ê¸ˆí•´ì„œ 신문 하나는 늘 보지요. 하지만 ì–´ë”” 시ì›í•œ 소ì‹ì´ 있어요. 그저 조리복소니가 ë˜ì–´ê°€ëŠ” ê²ƒì´ ì•„ë‹ˆë©´ 조그마한 ìƒê°ì„ 가지고, 눈곱만한 ì•¼ì‹¬ì„ ê°€ì§€ê³ , 서 푼어치 안 ë˜ëŠ” ì´ìƒì„ 가지고 ì°§ê³  까불고 싸우고 하는 ê²ƒë°–ì— ì•ˆ ë³´ì´ë‹ˆ ì´ê±° ì–´ë”” ì‚´ 수가 있나. 그래서 나는 ë§ˆìŒ í° ìžì†ì„ 낳아서 길러 볼까 하고 ì´ë¥¼í…Œë©´ 새 ë¯¼ì¡±ì„ í•˜ë‚˜ 만들어 볼까 하고, 둘째 단군, 둘째 아브ë¼í•¨ì´ë‚˜ 하나 낳아 볼까 하고 하하하하앗하." +하고 유쾌하게, 그러나 비통하게 웃소. +나는 ì €ë…ì„ êµ¶ì–´ì„œ ë°°ê°€ 고프고, ë°¤ê¸¸ì„ ê±¸ì–´ì„œ ëª¸ì´ ê³¤í•œ ê²ƒë„ ìžŠê³  ê·¸ì˜ ë§ì„ 들었소. +ë¶€ì¸ì´ ê¹€ì´ ë¬´ëŸ­ë¬´ëŸ­ 나는 í˜¸ë–¡ì„ í° ëšë°°ê¸°ì— ë‹´ê³  김치를 ìž‘ì€ ëšë°°ê¸°ì— ë‹´ê³ , ë˜ ë¼ì§€ê³ ê¸° ì‚¶ì€ ê²ƒì„ í•œ 접시 담아다가 íƒìž ìœ„ì— ë†“ì†Œ. +건넌방ì´ë¼ê³  í•  만한 ë°©ì—서 ì –ë¨¹ì´ ìš°ëŠ” 소리가 들리오. ë¶€ì¸ì€ 삼십ì´ë‚˜ ë˜ì—ˆì„까, ë‚¨íŽ¸ì€ ì„œë¥¸ëŒ“ ë˜ì—ˆì„ 듯한 키가 í›¨ì© í¬ê³  눈과 코가 í¬ê³  ì†ë„ í° ê±´ìž¥í•œ 대장부요, ìŒì„±ì´ 부드러운 ê²ƒì´ ì²´ê²©ì— ì–´ìš¸ë¦¬ì§€ 아니하나 ê·¸ê²ƒì´ ì•„ë§ˆ ê·¸ì˜ ì •ì‹  ìƒí™œì´ ë†’ì€ í‘œê² ì§€ìš”. +"신문ì—서 최 ì„ ìƒì´ í•™êµë¥¼ ê³ ë§Œë‘시게 ë˜ì—ˆë‹¤ëŠ” ë§ë„ 보았지요. 그러나 나는 ê·¸ê²ƒì´ ë‹¤ 최 ì„ ìƒì—게 대한 중ìƒì¸ ì¤„ì„ ì§ìž‘하였고, ë˜ ì˜¤ëŠ˜ ì´ë ‡ê²Œ 만나 보니까 ë”구나 ê·¸ê²ƒì´ ë‹¤ 중ìƒì¸ ì¤„ì„ ì•Œì§€ìš”." +하고 그는 확신 있는 어조로 ë§í•˜ì˜¤. +"고맙습니다." +나는 ì´ë ‡ê²Œë°–ì— ëŒ€ë‹µí•  ë§ì´ 없었소. +"ì•„, 머, 고맙다고 하실 ê²ƒë„ ì—†ì§€ìš”." +하고 그는 머리를 뒤로 젖히고 한참ì´ë‚˜ ìƒê°ì„ 하ë”니 ìš°ì„  껄껄 한바탕 웃고 나서, +"ë‚´ê°€ 최 ì„ ìƒì´ 당하신 경우와 ê¼­ ê°™ì€ ê²½ìš°ë¥¼ 당하였거든요. ì´ë¥¼í…Œë©´ 과부 ì„¤ì›€ì€ ë™ë¬´ 과부가 안다는 것ì´ì§€ìš”." +하고 그는 ìžê¸°ì˜ ë‚´ë ¥ì„ ë§í•˜ê¸° 시작하오. +"ë‚´ ì§‘ì€ ë³¸ëž˜ 서울입니다. ë‚´ê°€ ì–´ë ¸ì„ ì ì— ë‚´ 선친께서 ì‹œêµ­ì— ëŒ€í•´ì„œ 불í‰ì„ 품고 당신 삼 í˜•ì œì˜ ê°€ì¡±ì„ ëŒê³  ìž¬ì‚°ì„ ëª¨ë‘ íŒ”ì•„ 가지고 ê°„ë„ì—를 건너오셨지요. ê°„ë„ì— ë§¨ 먼저 â—â—í•™êµë¥¼ 세운 ì´ê°€ ë‚´ 선친ì´ì§€ìš”." +여기까지 하는 ë§ì„ 듣고 나는 그가 누구ì¸ì§€ë¥¼ 알았소. 그는 R씨ë¼ê³  ê°„ë„ ê°œì²™ìžìš”, ê°„ë„ì— ì¡°ì„ ì¸ ë¬¸í™”ë¥¼ 세운 ì´ë¡œ 유명한 ì´ì˜ ì•„ë“¤ì¸ ê²ƒì´ ë¶„ëª…í•˜ì˜¤. 나는 ê·¸ì˜ ì´ë¦„ì´ ëˆ„êµ¬ì¸ì§€ë„ 물어 ë³¼ 것 ì—†ì´ ì•Œì•˜ì†Œ. +"ì•„ 그러십니까. 네, 그러세요." +하고 나는 ê°íƒ„하였소. +"네, ë‚´ ì„ ì¹œì„ í˜¹ 아실는지요. ì„ ì¹œì˜ ë§ì”€ì´ ë…¸ 그러신단 ë§ì”€ì•¼ìš”. ì¡°ì„  ì‚¬ëžŒì€ ì†ì´ ì¢ì•„서 못쓴다고 <ì •ê°ë¡>ì—ë„ ê·¸ëŸ° ë§ì´ 있다고 ì¡°ì„ ì€ ì‚°ì´ ë§Žê³  ë“¤ì´ ì¢ì•„서 ì‚¬ëžŒì˜ ë§ˆìŒì´ 작아서 í°ì¼í•˜ê¸°ê°€ 어렵고, í°ì‚¬ëžŒì´ 나기가 어렵다고. 웬만치 í°ì‚¬ëžŒì´ 나면 서로 시기해서 í°ì¼í•  새가 ì—†ì´ í•œë‹¤ê³  그렇게 <ì •ê°ë¡>ì—ë„ ìžˆë‹¤ë”êµ°ìš”. 그래서 선친께서 ìžì†ì—게나 í¬ë§ì„ ë¶™ì´ê³  ê°„ë„로 오신 모양ì´ì§€ìš”. 거기서 ìžë¼ë‚¬ë‹¤ëŠ” ê²ƒì´ ë‚´ 꼴입니다마는, 아하하. +ë‚´ê°€ ìžë¼ì„œ 아버지께서 세우신 K여학êµì˜ êµì‚¬ë¡œ ìžˆì„ ë•Œ ì¼ìž…니다. 지금 ë‚´ 아내는 ê·¸ 때 í•™ìƒìœ¼ë¡œ 있었구. ê·¸ëŸ¬ìž ë‚´ 아버지께서 ìž¬ì‚°ì´ ë‹¤ 없어져서 í•™êµë¥¼ ë…담하실 수가 없고, ë˜ ì–¼ë§ˆ 아니해서 아버지께서 ëŒì•„가시고 보니 í•™êµì—는 세력 ë‹¤íˆ¼ì´ ìƒê²¨ì„œ ì•„ë²„ì§€ì˜ í›„ê³„ìžë¡œ 추정ë˜ëŠ” 나를 배척하게 ë˜ì—ˆë‹¨ ë§ì”€ì´ì˜¤. 거기서 나를 배척하는 ìžë£Œë¥¼ ì‚¼ì€ ê²ƒì´ ë‚˜ì™€ 지금 ë‚´ ì•„ë‚´ê°€ ëœ í•™ìƒì˜ 관계란 것ì¸ë° ì´ê²ƒì€ ì „ì—° ë¬´ê·¼ì§€ì„¤ì¸ ê²ƒì€ ë§í•  ê²ƒë„ ì—†ì†Œ. ë‚˜ë„ ì´ê°ì´ìš”, 그는 처녀니까 혼ì¸ì„ 하ìžë©´ 못 í•  ê²ƒë„ ì—†ì§€ë§ˆëŠ” ê·¸ê²ƒì´ ì‚¬ì œ 관계ë¼ë©´ 중대 문제거든. 그래서 나는 단연히 사ì§ì„ 하고 ë‚´ê°€ 사ì§í•œ ê²ƒì€ ì œ 죄를 승ì¸í•œ 것ì´ë¼ 하여서 ê·¸ í•™ìƒ ì§€ê¸ˆ ë‚´ ì•„ë‚´ë„ ì¶œêµ ì²˜ë¶„ì„ ë‹¹í•œ 것ì´ì˜¤. 그러고 보니, ê·¸ ì—¬ìžì˜ 아버지 ë‚´ 장ì¸ì´ì§€ìš” ê·¸ ì—¬ìžì˜ 아버지는 나를 ì£½ì¼ ë†ˆê°™ì´ ì›ë§ì„ 하고 ê·¸ ë”¸ì„ ì£½ì¼ ë…„ì´ë¼ê³  ê°ê¸ˆì„ 하고 어쨌으나 조그마한 ê°„ë„ ì‚¬íšŒì—서 í° íŒŒë¬¸ì„ ì¼ìœ¼ì¼°ë‹¨ ë§ì´ì˜¤. +ì´ ë¬¸ì œë¥¼ ë” í¬ê²Œ 만든 ê²ƒì€ ì§€ê¸ˆ ë‚´ ì•„ë‚´ì¸, ê·¸ ë”¸ì˜ ìžë°±ì´ì˜¤. 무어ë¼ê³  했는고 하니, 나는 ê·¸ ì‚¬ëžŒì„ ì‚¬ëž‘í•˜ì˜¤, ê·¸ 사람한테가 아니면 ì‹œì§‘ì„ ì•ˆ 가오, 하고 뻗댔단 ë§ìš”. +나는 ì´ ì—¬ìžê°€ ì´ë ‡ê²Œ 나를 ìƒê°í•˜ëŠ”ê°€ í•  때 ì˜ë¶„ì‹¬ì´ ë‚˜ì„œ 나는 어떻게 해서든지 ì´ ì—¬ìžì™€ 혼ì¸í•˜ë¦¬ë¼ê³  ê²°ì‹¬ì„ í•˜ì˜€ì†Œ. 나는 마침내 ì •ì‹ìœ¼ë¡œ K장로ë¼ëŠ” ë‚´ 장ì¸ì—게 ì²­í˜¼ì„ í•˜ì˜€ìœ¼ë‚˜ ë‹¨ë°•ì— ê±°ì ˆì„ ë‹¹í•˜ê³  ë§ì•˜ì§€ìš”. K장로는 ê·¸ ë”¸ì„ ê°„ë„ì— ë‘는 ê²ƒì´ ì˜³ì§€ 않다고 해서 서울로 보내기로 하였단 ë§ì„ 들었소. 그래서 나는 ìµœí›„ì˜ ê²°ì‹¬ìœ¼ë¡œ ê·¸ ì—¬ìž ì§€ê¸ˆ ë‚´ ì•„ë‚´ ëœ ì‚¬ëžŒì„ ë°ë¦¬ê³  ê°„ë„ì—서 ë„ë§í•˜ì˜€ì†Œ. 하하하하. ë°¤ì¤‘ì— ë‹¨ë‘˜ì´ì„œ. +지금 같으면야 ì‚¬ì œê°„ì— ê²°í˜¼ì„ í•˜ê¸°ë¡œ 그리 í° ë¬¸ì œê°€ ë  ê²ƒì´ ì—†ì§€ë§ˆëŠ” ê·¸ ë•Œì— ì–´ë”” 그랬나요. ì‚¬ì œê°„ì— í˜¼ì¸ì´ëž€ ê²ƒì€ ë¶€ë…€ê°„ì— í˜¼ì¸í•œë‹¤ëŠ” 것과 ê°™ì´ ìƒê°í•˜ì˜€ì§€ìš”. ë”구나 ê·¸ 때 ê°„ë„ ì‚¬íšŒì—는 ì²­êµë„ì  ì‚¬ìƒê³¼ 열렬한 ì• êµ­ì‹¬ì´ ìžˆì–´ì„œ ë„ë• í‘œì¤€ì´ ì—¬ê°„ 높지 아니하였지요. 그런 시대니까 ë‚´ê°€ ë‚´ ì œìžì¸ 여학ìƒì„ ë°ë¦¬ê³  달아난다는 ê²ƒì€ ì‚´ì¸ ê°•ë„를 하는 ì´ìƒìœ¼ë¡œ 무서운 ì¼ì´ì—ˆì§€ìš”. ì§€ê¸ˆë„ ë‚˜ëŠ” 그렇게 ìƒê°í•©ë‹ˆë‹¤ë§ˆëŠ”. +그래서 우리 ë‘ ì‚¬ëžŒì€ ìš°ë¦¬ ë‘ ì‚¬ëžŒì´ë¼ëŠ” ê²ƒë³´ë‹¤ë„ ë‚´ ìƒê°ì—는 어찌하였으나 나를 위해서 ì œ ëª©ìˆ¨ì„ ë²„ë¦¬ë ¤ëŠ” ê·¸ì—게 사실 ë‚˜ë„ ë§ˆìŒ ì†ìœ¼ë¡œëŠ” 그를 사랑하였지요. 다만 사제간ì´ë‹ˆê¹Œ ì˜ì›ížˆ 달할 수는 없는 사랑ì´ë¼ê³  단ë…í•˜ì˜€ì„ ë¿ì´ì§€ìš”. 그러니까 ë¹„ë¡ ë¶€ì²˜ ìƒí™œì€ 못 하ë”ë¼ë„ ë‚´ê°€ ê·¸ì˜ ì‚¬ëž‘ì„ ì•ˆë‹¤ëŠ” 것과 ë‚˜ë„ ê·¸ë¥¼ ì´ë§Œí¼ 사랑한다는 ê²ƒë§Œì„ ë³´ì—¬ 주ìžëŠ” 것ì´ì§€ìš”. +때는 마침 ê°€ì„ì´ì§€ë§ˆëŠ”, ëª¸ì— ì§€ë‹Œ ëˆë„ 얼마 없고 천신만고로 길림까지를 나와 가지고는 배를 타고 ì†¡í™”ê°•ì„ ë‚´ë ¤ì„œ í•˜ì–¼ë¹ˆì— ê°€ 가지고 ê±° 기서 간신히 ì¹˜íƒ€ê¹Œì§€ì˜ ì—¬ë¹„ì™€ ì—¬í–‰ê¶Œì„ ì–»ì–´ 가지고 차를 타고 떠나지 않았어요. ê·¸ê²ƒì´ ë°”ë¡œ ì‹­ì—¬ ë…„ ì „ 오늘ì´ëž€ ë§ì´ì˜¤." +ì´ ë•Œì— ë¶€ì¸ì´ 옥수수로 만든 국수와 ê°ìž ì‚¶ì€ ê²ƒì„ ê°€ì§€ê³  들어오오. +나는 Rì˜ ë§ì„ ë“£ë˜ ëì´ë¼ 유심히 ë¶€ì¸ì„ ë°”ë¼ë³´ì•˜ì†Œ. 그는 중키나 ë˜ëŠ” 둥근 ì–¼êµ´ì´ í˜ˆìƒ‰ì´ ì¢‹ê³  통통하여 미ì¸ì´ë¼ê¸°ë³´ë‹¤ëŠ” 씩씩한 ì—¬ìžìš”. 그런 ì¤‘ì— ì¡°ì„  ì—¬ìžë§Œì´ 가지는 아담하고 ì ìž–ì€ ë§›ì´ ìžˆì†Œ. +"앉으시지요. 지금 ë‘ ë¶„ê»˜ì„œ ì²˜ìŒ ì‚¬ëž‘í•˜ì‹œë˜ ë§ì”€ì„ 듣고 있습니다." +하고 나는 ë¶€ì¸ì—게 êµì˜ë¥¼ 권하였소. +"ì•„ì´, 그런 ë§ì”€ì€ 왜 하시오." +하고 ë¶€ì¸ì€ ê°‘ìžê¸° ì‹­ ë…„ì´ë‚˜ 어려지는 모양으로 수삽한 ë¹›ì„ ë³´ì´ê³  고개를 숙ì´ê³  달아나오. +"그래서요. 그래 ì˜¤ëŠ˜ì´ ê¸°ë…ì¼ì´ì™¸ë‹¤ê·¸ë ¤." +하고 ë‚˜ë„ ì›ƒì—ˆì†Œ. +"그렇지요. 우리는 해마다 ì˜¤ëŠ˜ì´ ì˜¤ë©´ 우리 무ë¤ì— 성묘를 가서 í•˜ë£»ë°¤ì„ ìƒˆìš°ì§€ìš”. ì˜¤ëŠ˜ì€ ì†ë‹˜ì´ 오셔서 ì¤‘ê°„ì— ëŒì•„왔지만, 하하하하." +하고 그는 유쾌하게 웃소. +"성묘ë¼ë‹ˆ?" +하고 나는 물었소. +"아까 ë³´ì‹  ë‘ ë³„ ë¬´ë¤ ë§ì´ì˜¤. ê·¸ê²ƒì´ ìš°ë¦¬ ë‚´ì™¸ì˜ ë¬´ë¤ì´ì§€ìš”. 하하하하." +"…………." +나는 ì˜ë¬¸ì„ 모르고 가만히 앉았소. +"ë‚´ ì´ì•¼ê¸°ë¥¼ 들으시지요. 그래 둘ì´ì„œ 차를 타고 오지 않았겠어요. 물론 여전히 ì„ ìƒë‹˜ê³¼ ì œìžì§€ìš”. 그렇지만 워낙 여러 ë‚  단둘ì´ì„œ ê°™ì´ ê³ ìƒì„ 하고 ì—¬í–‰ì„ í–ˆìœ¼ë‹ˆ ì‚¬ëž‘ì˜ ë¶ˆê¸¸ì´ íƒˆ 것ì´ì•¼ 물론 아니겠어요. 다만 사제ë¼ëŠ” êµ³ì€ ì˜ë¦¬ê°€ ê·¸ê²ƒì„ ê²‰ì— ë‚˜ì˜¤ì§€ 못하ë„ë¡ ëˆ„ë¥¸ 것ì´ì§€ìš”. â€¦â€¦ê·¸ëŸ°ë° ê¼­ ì˜¤ëŠ˜ê°™ì´ ì¢‹ì€ ë‚ ì¸ë° 여기는 대개 ì¼ê¸°ê°€ ì¼ì •합니다. 좀체로 비가 오는 ì¼ë„ 없고 í리는 ë‚ ë„ ì—†ì§€ìš”. í—Œë° Fì—­ì—를 오니까 ì°¸ ì„ì–‘ 경치가 좋단 ë§ì´ì˜¤. ê·¸ ë•Œì— ë¶ˆí˜„ë“¯, ì—ë¼ ì—¬ê¸°ì„œ 내려서 ì´ ì„ì–‘ ì†ì— ì € 호숫 ê°€ì— ë‘˜ì´ì„œ 헤매다가 깨ë—ì´ ì‚¬ì œì˜ ëª¸ìœ¼ë¡œ ì´ ê¹¨ë—한 ê´‘ì•¼ì— ë¬»í˜€ ë²„ë¦¬ìž í•˜ëŠ” ìƒê°ì´ 나겠지요. 그래 ê·¸ 때 ë§ì„ ë‚´ ì•„ë‚´ ê·¸ 때ì—는 ì•„ì§ ì•„ë‚´ê°€ 아니지요 ë‚´ ì•„ë‚´ì—게 그런 ë§ì„ 하였ë”니 ì°¸ 좋다고 ë°•ìž¥ì„ í•˜ê³  ë‚´ ì–´ê¹¨ì— ë§¤ë‹¬ë¦¬ëŠ”êµ¬ë ¤. 그래서 우리 ë‘˜ì€ ì°¨ê°€ ê±°ì˜ ë– ë‚  임박해서 ì°¨ì—서 뛰어내렸지요." +하고 그는 그때 ê´‘ê²½ì„ ëˆˆì•žì— ê·¸ë¦¬ëŠ” 모양으로 ë§ì„ ëŠê³  ìš°ë‘커니 í—ˆê³µì„ ë°”ë¼ë³´ì˜¤. 그러나 ê·¸ì˜ ìž… 언저리ì—는 유쾌한 회고ì—서 나오는 웃ìŒì´ì—ˆì†Œ. +"ì´ì•¼ê¸° 다 ë났어요?" +하고 ë¶€ì¸ì´ í¬ë°”스ë¼ëŠ” 청량 ìŒë£Œë¥¼ 들고 들어오오. +"아니오. ì´ì œë¶€í„°ê°€ 정통ì´ë‹ˆ ë‹¹ì‹ ë„ ê±°ê¸° 앉으시오. 지금 ì°¨ì—서 내린 ë°ê¹Œì§€ ì™”ëŠ”ë° ë‹¹ì‹ ë„ ì•‰ì•„ì„œ 한 파트를 맡으시오." +하고 R는 ë¶€ì¸ì˜ ì†ì„ 잡아서 ìžë¦¬ì— 앉히오. ë¶€ì¸ë„ 웃으면서 앉소. +"최 ì„ ìƒ ì²˜ì§€ê°€ ê¼­ 나와 같단 ë§ìš”. ì •ìž„ì˜ ì²˜ì§€ê°€ 당신과 같고." +하고 그는 ë§ì„ 계ì†í•˜ì˜¤. +"그래 ì°¨ì—서 내려서 나는 ì´ ì–‘ë°˜í•˜ê³  ë¬¼ì„ ì°¾ì•„ 헤매었지요. ì•„ë”°, ì„ì–‘ì´ ì–´ë–»ê²Œ 좋ì€ì§€ ì´ ì–‘ë°˜ì€ ë°•ìž¥ì„ í•˜ê³  노래를 부르고 우리 ë‘˜ì€ ë§ˆì¹˜ 유쾌하게 산보하는 사람 같았지요." +"ì°¸ 좋았어요. ê·¸ 때ì—는 ì°¸ 좋았어요. ê·¸ ì„ì–‘ì— ë¹„ì¹œ 광야와 호수ë¼ëŠ” ê±´ 어떻게 좋ì€ì§€ ê·¸ ìˆ˜ì€ ê°™ì€ ë¬¼ ì†ì— 텀벙 뛰어들고 싶었어요. ê·¸ 후엔 해마다 ë³´ì•„ë„ ê·¸ë§Œ 못해." +하고 ë¶€ì¸ì´ ì°¸ê²¬ì„ í•˜ì˜¤. +ì•„ì´ë“¤ì€ 다 ìžëŠ” 모양ì´ì˜¤. +"그래 ì§€í–¥ì—†ì´ í—¤ë§¤ëŠ”ë° í•´ëŠ” 뉘엿뉘엿 넘어가구, ì–´ìŠ¤ë¦„ì€ ê¸°ì–´ë“¤ê³  ê·¸ 때 마침 하늘ì—는 별 ë‘˜ì´ ë‚˜íƒ€ë‚¬ë‹¨ ë§ì´ì•¼. ê·¸ê²ƒì„ ì´ ì—¬í•™ìƒì´ 먼저 보고서 ê°‘ìžê¸° 추연해지면서 ì„ ìƒë‹˜ ì € 별 보셔요, 앞선 í° ë³„ì€ ì„ ìƒë‹˜ì´ 구 ë”°ë¼ê°€ëŠ” ìž‘ì€ ë³„ì€ ì €ì•¼ìš”, 하겠지요. ê·¸ ë§ì´, ë˜ ê·¸ 태ë„ê°€ 어떻게 가련한지. 그래서 나는 í•˜ëŠ˜ì„ ë°”ë¼ë³´ë‹ˆê¹ 과연 별 ë‘ ê°œê°€ 지는 해를 따르는 ë“¯ì´ ë”°ë¼ê°„다 ë§ìš”. ë§ì„ 듣고 보니 과연 우리 ì‹ ì„¸ì™€ë„ ê°™ì§€ 않아요? +그리고는 ì´ ì‚¬ëžŒì´ ë˜ ì´ëŸ½ë‹ˆë‹¤ê·¸ë ¤ `ì„ ìƒë‹˜, 앞선 í° ë³„ì€ ì•„ë¬´ë¦¬ ë”°ë¼ë„ ì € ìž‘ì€ ë³„ì€ ì˜ì›ížˆ ë”°ë¼ìž¡ì§€ 못하겠지요. ì˜ì›ížˆ ì˜ì›ížˆ ë”°ë¼ê°€ë‹¤ê°€ ë”°ë¼ê°€ë‹¤ê°€ 못 해서 마침내는 ì € ìž‘ì€ ë³„ì€ ì£½ì–´ì„œ ê²€ì€ ìž¬ê°€ ë˜ê³  ë§ê² ì§€ìš”? ì € ìž‘ì€ ë³„ì´ ì œ 신세와 어쩌면 그리 ê°™ì„까.' 하고 í•œíƒ„ì„ í•˜ê² ì§€ìš”. ê·¸ ë•Œì— í•œíƒ„ì„ í•˜ê³  ëˆˆë¬¼ì„ í˜ë¦¬ê³  섰는 어린 ì²˜ë…€ì˜ ì„ì–‘ë¹›ì— ë¹„ì·¬ ëª¨ì–‘ì„ ìƒìƒí•´ 보세요, 하하하하. ê·¸ 때ì—는 ë‹¹ì‹ ë„ ë¯¸ì¸ì´ì—ˆì†Œ. 하하하하." +하고 내외가 유쾌하게 웃는 ê²ƒì„ ë³´ë‹ˆ 나는 ë”ìš± ì ë§‰í•˜ì—¬ì§ì„ 깨달았소. 어쩌면 ê·¸ ì„ì–‘, ê·¸ ë‘ ë³„ì´ ì´ë“¤ì—게와 내게 ê¼­ ê°™ì€ ì¸ìƒì„ 주었ì„까 하니 참으로 ì´ìƒí•˜ë‹¤ 하였소. +"그래 ì¸ì œ." +하고 R는 다시 ì´ì•¼ê¸°ë¥¼ 계ì†í•˜ì˜¤. +"그래 ì¸ì œ 둘ì´ì„œ 그야ë§ë¡œ ê°ê°œë¬´ëŸ‰í•˜ê²Œ ë‘ ë³„ì„ ë°”ë¼ë³´ë©° 걸었지요. 그러다가 í•´ê°€ 넘어가고 앞선 í° ë³„ì´ ë„˜ì–´ê°€ê³  그리고는 혼ìžì„œ 깜빡깜빡하고 ê°€ë˜ ìž‘ì€ ë³„ì´ ë„˜ì–´ê°€ë‹ˆ 우리는 그만 ë•…ì— ì£¼ì €ì•‰ì•˜ì†Œ. 거기가 어딘고 하니 ê·¸ ë‘ ë³„ 무ë¤ì´ 있는 ê³³ì´ì§€ìš”. `ì„ ìƒë‹˜ 저를 여기다가 파묻어 주시고 가셔요. ì„ ìƒë‹˜ ì†ìˆ˜ 저를 여기다가 묻어 놓고 ê°€ 주셔요.' 하고 ì´ ì‚¬ëžŒì´ ì¡°ë¥´ì§€ìš”." +하는 ê²ƒì„ ë¶€ì¸ì€, +"ë‚´ê°€ 언제." +하고 ë‚¨íŽ¸ì„ í˜ê²¨ë³´ì˜¤. +"그럼 무ì—ë¼ê³  했소? ì–´ë”” 본ì¸ì´ 한 번 옮겨 보오." +하고 Rê°€ ë§ì„ ëŠì†Œ. +"ê°„ë„를 떠난 지가 한 ë‹¬ì´ ë˜ë„ë¡ ë‹¨ë‘˜ì´ ë‹¤ë…€ë„ ìš”ë§Œí¼ë„ 귀해 주는 ì ì´ 안 뵈니 그럼 파묻어 달ë¼ê³  안 í•´ìš”?" +하고 ë¶€ì¸ì€ 웃소. +"í¥í¥." +하고 R는 ë¶€ì¸ì˜ ë§ì— 웃고 나서, +"ê·¸ ìžë¦¬ì— 묻어 달란 ë§ì„ 들으니까, 어떻게 측ì€í•œì§€, 그럼 ë‚˜ë„ í•¨ê»˜ 묻히ìžê³  그랬지요. 나는 ê·¸ ë•Œì— ì°¸ë§ ê·¸ ìžë¦¬ì— 함께 묻히고 싶었어요. 그래서 나는 ì†ìœ¼ë¡œ ê³§ 구ë©ì´ë¥¼ 팠지요. 떡가루 ê°™ì€ ëª¨ëž˜íŒì´ë‹ˆê¹Œ 파기는 íž˜ì´ ì•„ë‹ˆ 들겠지요. ì´ì´ë„ 물ë„러미 ë‚´ê°€ ë•…ì„ íŒŒëŠ” ê²ƒì„ ë³´ê³  ì„°ë”니만 ìžê¸°ë„ 파기를 시작하겠지요." +하고 내외가 다 웃소. +"그래 순ì‹ê°„ì—……." +하고 R는 ì´ì•¼ê¸°ë¥¼ 계ì†í•˜ì˜¤. +"순ì‹ê°„ì— ë‘˜ì´ ë“œëŸ¬ëˆ„ìš¸ 만한 구ë©ì´ë¥¼ 아마 ë‘ ìž ê¹Šì´ë‚˜ ë˜ê²Œ, 네모나게 파 놓고는 ë‚´ê°€ 들어가 누워 ë³´ê³  그러고는 ë˜ íŒŒê³  하여 아주 편안한 구ë©ì´ë¥¼ 파고 나서는 나는 아주 세ìƒì„ 하ì§í•  셈으로 ì‚¬ë°©ì„ ë‘˜ëŸ¬ë³´ ê³  사방ì´ëž˜ì•¼ 컴컴한 ì–´ë‘ ë°–ì— ì—†ì§€ë§Œ ì‚¬ë°©ì„ ë‘˜ëŸ¬ë³´ê³ , ì´ë¥¼í…Œë©´ 세ìƒê³¼ ìž‘ë³„ì„ í•˜ê³  드러누웠지요. 지금 ì´ë ‡ê²Œ íšŒê³ ë‹´ì„ í•  때ì—는 ìš°ìŠµê¸°ë„ í•˜ì§€ë§ˆëŠ” ê·¸ 때ì—는 참으로 종êµì ì´ë¼ í•  만한 엄숙ì´ì—ˆì†Œ. 그때 우리 ë‘˜ì˜ ì²˜ì§€ëŠ” ì•žë„ ì ˆë²½, ë’¤ë„ ì ˆë²½ì´ì–´ì„œ 죽는 ê¸¸ë°–ì— ì—†ì—ˆì§€ìš”. ë˜ ê·¸ë¿ ì•„ë‹ˆë¼ ì¸ìƒì˜ 가장 깨ë—하고 가장 ì‚¬ëž‘ì˜ ë§‘ì€ ì •ì´ íƒ€ê³  가장 기ì˜ê³ ë„ ìŠ¬í”„ê³ ë„ ì´ë¥¼í…Œë©´ 모든 ê°ì •ì´ ì ˆì •ì— ë‹¬í•˜ê³ , 그러한 ìˆœê°„ì— ëª©ìˆ¨ì„ ëŠì–´ 버리는 ê²ƒì´ ê°€ìž¥ ì¢‹ì€ ì¼ì´ìš”, 가장 마땅한 ì¼ê°™ì´ ìƒê°í•˜ì˜€ì§€ìš”. ê´‘ì•¼ì— ì•„ë¦„ë‹¤ìš´ í™©í˜¼ì´ ìˆœê°„ì— ìŠ¤ëŸ¬ì§€ëŠ” 모양으로 우리 ë‘ ìƒëª…ì˜ ì•„ë¦„ë‹¤ì›€ë„ ìˆœê°„ì— ìŠ¤ëŸ¬ì§€ìžëŠ” 우리는 ì² í•™ìžë„ 시ì¸ë„ 아니지마는 ìš°ë¦¬ë“¤ì˜ í™˜ê²½ì´ ìš°ë¦¬ 둘ì—게 그러한 ìƒê°ì„ 넣어 준 것ì´ì§€ìš”. +그래서 ë‚´ê°€ 가만히 드러누워 있는 ê²ƒì„ ì €ì´ê°€ 물ë„러미 ë³´ê³  있ë”니 ìžê¸°ë„ ë‚´ ê³ì— 들어와 눕겠지요. 그런 ë’¤ì—는 í™©í˜¼ì— ë‚¨ì€ ë¹›ë„ ë‹¤ 스러지고 아주 캄캄한 ì•”í‘ ì„¸ê³„ê°€ ë˜ì–´ 버렸지요. í•˜ëŠ˜ì— ì–´ë–»ê²Œ 그렇게 ë³„ì´ ë§Žì€ì§€. 가만히 í•˜ëŠ˜ì„ ë°”ë¼ë³´ë…¸ë¼ë©´ ì°¸ ë³„ì´ ë§Žì•„ìš”. 우주란 ì°¸ 커요. ê·¸ëŸ°ë° ì´ ëì—†ì´ í° ìš°ì£¼ì— í•œì—†ì´ ë§Žì€ ë³„ë“¤ì´ ë‹¤ ì œìžë¦¬ë¥¼ 지키고 ì œ ê¸¸ì„ ì§€ì¼œì„œ 서로 ë¶€ë”ªì§€ë„ ì•„ë‹ˆí•˜ê³  ëì—†ì´ ê¸´ ì‹œê°„ì— ì§ˆì„œë¥¼ 유지하고 있는 ê²ƒì„ ë³´ë©´ 우주ì—는 ì–´ë–¤ 주재하는 뜻, 섭리하는 ëœ»ì´ ìžˆë‹¤ 하는 ìƒê°ì´ 나겠지요. ë‚˜ë„ ì˜ˆìˆ˜êµì¸ì˜ 가정ì—서 ìžë¼ë‚¬ì§€ë§ˆëŠ” ì´ ë•Œì²˜ëŸ¼ 하나님ì´ë¼ 할까 ì´ë¦„ì€ ë¬´ì—‡ì´ë¼ê³  하든지 ê°„ì— ìš°ì£¼ì˜ ì„­ë¦¬ìžì˜ 존재를 강렬하게 ì˜ì‹í•œ ì¼ì€ 없었지요. +그렇지만 `ì‚¬ëžŒì˜ ë§ˆìŒì— 비기면 저까짓 ë³„ë“¤ì´ ë‹¤ 무엇ì´ì˜¤?' 하고 그때 겨우 ì—´ì—¬ëŸ ì‚´ë°–ì— ì•ˆ ëœ ì´ì´ê°€ ë‚´ ê·€ì— ìž…ì„ ëŒ€ê³  ë§í•  때ì—는 ë‚˜ë„ ì°¸ìœ¼ë¡œ 놀ëžìŠµë‹ˆë‹¤. 나ì´ëŠ” 나보다 오륙 ë…„ ìƒê´€ë°–ì— ì•ˆ ë˜ì§€ë§ˆëŠ” ì´ì‹­ 세 ë‚´ì™¸ì— ì˜¤ë¥™ ë…„ ìƒê´€ì´ ì ì€ 것ì¸ê°€ìš”? 게다가 나는 ì„ ìƒì´ìš” ìžê¸°ëŠ” í•™ìƒì´ë‹ˆê¹Œ 어린애로만 ì•Œì•˜ë˜ ê²ƒì´ ê·¸ëŸ° ë§ì„ 하니 놀ëžì§€ 않아요? 어째서 ì‚¬ëžŒì˜ ë§ˆìŒì´ í•˜ëŠ˜ë³´ë‹¤ë„ ë” ì´ìƒí• ê¹Œ 하고 ë‚´ê°€ 물으니까, ê·¸ ëŒ€ë‹µì´ `나는 무엇ì´ë¼ê³  설명할 수가 없지마는 ë‚´ ë§ˆìŒ ì†ì— ì¼ì–´ë‚˜ëŠ” ê²ƒì´ í•˜ëŠ˜ì´ë‚˜ ë•…ì— ì¼ì–´ë‚˜ëŠ” 모든 ê²ƒë³´ë‹¤ë„ ë” ì•„ë¦„ë‹µê³  ë” ì•Œ 수 없고 ë” ëœ¨ê²ê³  그런 것 같아요.' 그러겠지요. ìƒëª…ì´ëž€ 모든 아름다운 것 ì¤‘ì— ê°€ìž¥ 아름다운 것ì´ë¼ëŠ” ê²ƒì„ ë‚˜ëŠ” 깨달았어요. ê·¸ ë§ì—, `그렇다 하면 ì´ ì•„ë¦„ë‹µê³  신비한 ìƒëª…ì„ ë‚´ëŠ” 우주는 ë” ì•„ë¦„ë‹¤ìš´ ê²ƒì´ ì•„ë‹ˆì˜¤?' 하고 ë‚´ê°€ 반문하니까, 당신(ë¶€ì¸ì„ 향하여) ë§ì´, `ì „ 모르겠어요, 어쨌으나 ì „ 행복합니다. 저는 ì´ í–‰ë³µì„ ê¹¨ëœ¨ë¦¬ê³  ì‹¶ì§€ 않습니다. ë†“ì³ ë²„ë¦¬ê³  ì‹¶ì§€ 않습니다. ì´ í–‰ë³µ ì„ ìƒë‹˜ ê³ì— 있는 ì´ í–‰ë³µì„ ê½‰ 안고 죽고 ì‹¶ì–´ìš”.' 그러지 않았소?" +"누가 그랬어요? ì•„ì´ ë‚œ 다 잊어버렸어요." +하고 ë¶€ì¸ì€ 차를 따르오. R는 ì¸ì œëŠ” 하하하 하는 웃ìŒì¡°ì°¨ 잊어버리고, ë¶€ì¸ì—게 ë†ë‹´ì„ ë¶™ì´ëŠ” 것조차 잊어버리고, 그야ë§ë¡œ 종êµì  엄숙 그대로ë§ì„ ì´ì–´, +"`ìž ì €ëŠ” ì•½ì„ ë¨¹ì–´ìš”.' 하고 ì†ì„ 입으로 가져가는 ë™ìž‘ì´ ê°í–‰ë˜ê² ì§€ìš”. 약ì´ëž€ ê²ƒì€ í•˜ì–¼ë¹ˆì—서 준비한 아편ì´ì§€ìš”. 하얼빈서 치타까지 가는 ë™ì•ˆì— í¥ì•ˆë ¹ì´ë‚˜ ì–´ëŠ ì‚¼ë¦¼ì§€ëŒ€ë‚˜ 어디서나 ì£½ì„ ìžë¦¬ë¥¼ ì°¾ìžê³  준비한 것ì´ë‹ˆê¹Œ. 나는 ìž… 근처로 가는 ê·¸ì˜ ì†ì„ 붙들었어요. 붙들면서 나는 `ìž ê¹ë§Œ 기다리오. 오늘 ë°¤ 안으로 ê·¸ ì•½ì„ ë¨¹ìœ¼ë©´ ê³ ë§Œì´ ì•„ë‹ˆì˜¤? ì´ í–‰ë³µëœ ìˆœê°„ì„ ìž ê¹ì´ë¼ë„ 늘립시다. 달 올ë¼ì˜¬ 때까지만.' 나는 ì´ë ‡ê²Œ ë§í–ˆì§€ìš”. `ì„ ìƒë‹˜ë„ 행복ë˜ì…”ìš”? ì„ ìƒë‹˜ì€ 불행ì´ì‹œì§€. ì € ë•Œë¬¸ì— ë¶ˆí–‰ì´ì‹œì§€. 저만 ì´ê³³ì— 묻어 주시구는 ì„ ìƒë‹˜ì€ 세ìƒì— ëŒì•„ê°€ 사셔요, 오래오래 사셔요, ì¼ ë§Žì´ í•˜ê³  사셔요.' 하고 울지 않겠어요. 나는 ê·¸ ë•Œì— ë‚´ ì•„ë‚´ê°€ í•˜ë˜ ë§ì„ 한 ë§ˆë””ë„ ìžŠì§€ 아니합니다. ê·¸ ë§ì„ ë“£ë˜ ë•Œì˜ ë‚´ ì¸ìƒì€ 아마 ì¼ìƒ ë‘ê³  잊히지 아니하겠지요. +나는 ìžë°±í•©ë‹ˆë‹¤. ê·¸ ìˆœê°„ì— ë‚˜ëŠ” 처ìŒìœ¼ë¡œ ë‚´ 아내를 안고 키스를 하였지요. ë‚´ ì†ì— 눌리고 눌리고 쌓ì´ê³  í•˜ì˜€ë˜ ì—´ì •ì´ ê·¸ë§Œ ì¼ì‹œì— í­ë°œë˜ì—ˆë˜ 것ì´ì˜¤. ì•„ì•„ ì´ê²ƒì´ ìµœì´ˆì˜ ê²ƒì´ìš”, ë™ì‹œì— ìµœí›„ì˜ ê²ƒì´ë¡œêµ¬ë‚˜ í•  ë•Œì— ë‚´ 눈ì—서는 ë“는 듯한 ëˆˆë¬¼ì´ í˜ë €ì†Œì´ë‹¤. ë‘ ì‚¬ëžŒì˜ ì‹¬ìž¥ì´ ë›°ëŠ” 소리, ë‘ ì‚¬ëžŒì˜ í’€ë¬´ 불길 ê°™ì€ ìˆ¨ì†Œë¦¬. +ì´ìœ½ê³  ë‹¬ì´ ë– ì˜¬ë¼ ì™”ìŠµë‹ˆë‹¤. ê°€ì´ì—†ëŠ” 벌íŒì´ë‹ˆê¹Œ ë‹¬ì´ ëœ¨ë‹ˆê¹Œ ê°‘ìžê¸° 천지가 환해지고 우리 ë‘˜ì´ ì†ìœ¼ë¡œ 파서 쌓아 ë†“ì€ í™ë¬´ë”기가 ì´ ì‚° 없는 세ìƒì— ì‚°ì´ë‚˜ ë˜ëŠ” ê²ƒê°™ì´ ì¡°ê·¸ë§ˆí•œ ê²€ì€ ê·¸ë¦¼ìžë¥¼ 지고 있겠지요. `ìž ìš°ë¦¬ ë‹¬ë¹›ì„ ë ê³  좀 ëŒì•„다ë‹ê¹Œ.' 하고 나는 아내를 안아 ì¼ìœ¼ì¼°ì§€ìš”. ë‚´ íŒ”ì— ì•ˆê²¨ì„œ 고개를 뒤로 젖힌 ë‚´ ì•„ë‚´ì˜ ì–¼êµ´ì´ ë‹¬ë¹›ì— ë¹„ì¹œ ì–‘ì„ ë‚˜ëŠ” 잘 기억합니다. 실신한 듯한, 만족한 듯한, ê·¸ë¦¬ê³ ë„ ì ˆë§í•œ 듯한 ê·¸ í‘œì •ì„ ë¬´ì—‡ìœ¼ë¡œ 그릴지 모릅니다. ê·¸ë¦¼ë„ ê·¸ë¦´ 줄 모르고 ì¡°ê°ë„ í•  줄 모르고 ê¸€ë„ ì“¸ 줄 모르는 ë‚´ê°€ ê·¸ê²ƒì„ ì–´ë–»ê²Œ 그립니까. 그저 가슴 ì†ì— 품고 ì´ë ‡ê²Œ ì˜¤ëŠ˜ì˜ ë‚´ 아내를 ë°”ë¼ë³¼ ë¿ì´ì§€ìš”. +나는 ë‚´ 아내를 íŒ”ì— ê±¸ê³  네, 걸었다고 하는 ê²ƒì´ ê°€ìž¥ 합당하지 ìš” ì´ë ‡ê²Œ 팔ì—다 걸고 ë‹¬ë¹›ì„ ë°›ì€ í™©ëŸ‰í•œ 벌íŒ, 아무리 í•˜ì—¬ë„ í™˜í•˜ê²Œ ë°ì•„지지는 아니하는 벌íŒì„ 헤매었습니다. ì´ë”°ê¸ˆ ë‚´ ì•„ë‚´ê°€, `어서 죽고 ì‹¶ì–´ìš”, ì „ 죽고만 ì‹¶ì–´ìš”.' 하는 ë§ì—는 ëŒ€ë‹µë„ ì•„ë‹ˆ 하고. 죽고 싶다는 ê·¸ ë§ì€ 물론 ì§„ì •ì¼ ê²ƒì´ì§€ìš”. 아무리 ë§‘ì€ ì¼ê¸°ë¼ 하ë”ë¼ë„ 오후가 ë˜ë©´ í려지는 법ì´ë‹ˆê¹Œ 오래 살아가는 ë™ì•ˆì— 늘 한 모양으로 ì´ ìˆœê°„ê°™ì´ ê¹¨ë—하고 뜨거운 기분으로 ê°ˆ 수는 없지 않아요? 불쾌한 ì¼ë„ ìƒê¸°ê³ , 보기 í‰í•œ ì¼ë„ ìƒê¸¸ëŠ”ì§€ 모르거든. 그러니까 ì´ ì™„ì „í•œ 깨ë—ê³¼ 완전한 사랑과 완전한 행복 ì†ì— 죽어 버리ìžëŠ” ëœ»ì„ ë‚˜ëŠ” 잘 알지요. ë”구나 ìš°ë¦¬ë“¤ì´ ì‚´ì•„ 남는대야 ì•žê¸¸ì´ ê¸°êµ¬í•˜ì§€ í‰íƒ„í•  리는 없지 아니해요? 그래서 나는 `죽지, 우리 ì´ ë‹¬ë°¤ì— ì‹¤ì»· ëŒì•„다니다가, ë” ëŒì•„다니기가 ì‹«ê±°ë“  ê·¸ 구ë©ì— ëŒì•„가서 ì•½ì„ ë¨¹ì시다.' ì´ë ‡ê²Œ ë§í•˜ê³  우리 ë‘˜ì€ í—¤ë§¸ì§€ìš”. ë‚®ì— ë³´ë©´ 어디까지나 í‰í‰í•œ 벌íŒì¸ 것만 같지마는 ë‹¬ë°¤ì— ë³´ë©´ ì´ ì‚¬ë§‰ì—ë„ ì•„ì§ ì±„ 스러지지 아니한 ì‚°ì˜ í˜•ì ì´ 남아 있어서 êµ°ë°êµ°ë° 거뭇거뭇한 그림ìžê°€ 있겠지요. ê·¸ ê·¸ë¦¼ìž ì†ì—는 걸어 들어가면 ì–´ë–¤ ë°ëŠ” 우리 í—ˆë¦¬ë§Œí¼ ê·¸ë¦¼ìžì— 가리우고 ì–´ë–¤ ë°ëŠ” 우리 ë‘˜ì„ ë‹¤ 가리워 버리는 ë°ë„ 있단 ë§ì•¼ìš”. 죽ìŒì˜ 그림ìžë¼ëŠ” ìƒê°ì´ 나면 ê·¸ëž˜ë„ ëª¸ì— ì†Œë¦„ì´ ë¼ì³ìš”. +차차 ë‹¬ì´ ë†’ì•„ì§€ê³  추위가 심해져서 ë°”ëžŒê²°ì´ ì§€ë‚˜ê°ˆ 때ì—는 눈ì—서 ëˆˆë¬¼ì´ ë‚  지경ì´ì§€ìš”. ì›ì²´ 대기 ì¤‘ì— ìˆ˜ë¶„ì´ ì ìœ¼ë‹ˆê¹Œ ì„œë¦¬ë„ ë§Žì§€ 않지마는, ê·¸ëž˜ë„ ëŒ€ê¸° ì¤‘ì— ìžˆëŠ” ìˆ˜ë¶„ì€ ë‹¤ 얼어 버려서 ì–¼ìŒê°€ë£¨ê°€ ë˜ì—ˆëŠ” 게지요. 공중ì—는 ë°˜ì§ë°˜ì§í•˜ëŠ” 수정가루 ê°™ì€ ê²ƒì´ ë³´ìž…ë‹ˆë‹¤. ë‚®ì—는 ë•€ì´ íë¥´ë¦¬ë§Œí¼ ë¥ë˜ ì‚¬ë§‰ë„ ë°¤ì´ ë˜ë©´ ì´ë ‡ê²Œ ê¸°ì˜¨ì´ ë‚´ë ¤ê°€ì§€ìš”. 춥다고 ìƒê°ì€ í•˜ë©´ì„œë„ ì¶¥ë‹¤ëŠ” ë§ì€ 아니 하고 우리는 ì–´ë–¤ 때ì—는 ë‹¬ì„ ë”°ë¼ì„œ, ì–´ë–¤ 때ì—는 ë‹¬ì„ ë“±ì§€ê³ , ì–´ë–¤ 때ì—는 í˜¸ìˆ˜ì— ë¹„ì¹œ ë‹¬ì„ êµ½ì–´ë³´ê³ , ì´ ëª¨ì–‘ìœ¼ë¡œ í•œì—†ì´ ë§ë„ ì—†ì´ ëŒì•„다녔지요. ì´ ì„¸ìƒ ìƒëª…ì˜ ë§ˆì§€ë§‰ ìˆœê°„ì„ íž˜ê» ì˜ì‹í•˜ë ¤ëŠ” 듯ì´. +마침내 `나는 ë” ëª» 걸어요.' 하고 ì´ì´ê°€ ë‚´ ì–´ê¹¨ì— ë§¤ë‹¬ë ¤ 버리고 ë§ì•˜ì§€ìš”." +하고 Rê°€ ë¶€ì¸ì„ ëŒì•„보니 ë¶€ì¸ì€ íŽ¸ë¬¼í•˜ë˜ ì†ì„ 쉬고, +"다리가 아픈 ì¤„ì€ ëª¨ë¥´ê² ëŠ”ë° ë‹¤ë¦¬ê°€ ì´ë¦¬ 뉘구 저리 뉘구 해서 걸ìŒì„ ê±¸ì„ ìˆ˜ê°€ 없었어요. 춥기는 하구." +하고 소리를 내어서 웃소. +"그럴 ë§Œë„ í•˜ì§€." +하고 R는 긴장한 í‘œì •ì„ ì•½ê°„ 풀고 ì•‰ì€ ìžì„¸ë¥¼ ìž ê¹ ê³ ì¹˜ë©°, +"ê·¸ í›„ì— ê·¸ ë‚  ë°¤ ëŒì•„다닌 ê³³ì„ ë”듬어 보니까, ìžì„¸ížˆëŠ” 알 수 없지마는 삼십 리는 ë” ë˜ëŠ” 것 같거든. 다리가 아프지 아니할 리가 있나." +하고 차를 한 모금 마시고 나서 ë§ì„ 계ì†í•˜ì˜¤. +"그래서 나는 ë‚´ 외투를 벗어서, ì´ì´(ë¶€ì¸)를 싸서 어린애 ì•ˆë“¯ì´ ì•ˆê³  걸었지요. 외투로 쌌으니 ìžê¸°ë„ 춥지 않구, 나는 ë˜ ë¬´ê±°ìš´ ì§ì„ 안았으니 ë•€ì´ ë‚  지경ì´êµ¬, ê·¸ë¿ ì•„ë‹ˆë¼ ë‚´ê°€ 제게 주는 ìµœí›„ì˜ ì„œë¹„ìŠ¤ë¼ í•˜ë‹ˆ 기ì˜ê³ , ë§í•˜ìžë©´ ì¼ê±° 삼ë“ì´ì§€ìš”. 하하하하. 지난 ì¼ì´ë‹ˆ 웃지마는 ê·¸ 때 ì‚¬ì •ì„ ìƒê°í•´ 보세요, 어떠했겠나." +하고 R는 약간 처참한 ë¹›ì„ ë ë©´ì„œ, +"그러니 ê·¸ 구ë©ì´ë¥¼ ì–´ë”” ì°¾ì„ ìˆ˜ê°€ 있나. 얼마를 찾아 ëŒì•„다니다가 아무 ë°ì„œë‚˜ ì£½ì„ ìƒê°ë„ í•´ 보았지마는 몸뚱ì´ë¥¼ 그냥 벌íŒì— 내놓고 죽고 싶지는 아니하고 ë˜ ê·¸ 구ë©ì´ê°€ 우리 ë‘ ì‚¬ëžŒì—게 특별한 ì˜ë¯¸ê°€ 있는 것 같아서 기어코 ê·¸ê²ƒì„ ì°¾ì•„ 내고야 ë§ì•˜ì§€ìš”. ê·¸ 때는 ë²Œì¨ ìƒˆë²½ì´ ê°€ê¹Œì› ë˜ ëª¨ì–‘ì´ì˜¤. ì—´ 시나 넘어서 뜬 í•˜í˜„ë‹¬ì´ ë‚®ì´ ê¸°ìš¸ì—ˆìœ¼ë‹ˆ 그렇지 않겠어요. ê·¸ 구ë©ì´ì— 와서 우리는 한 번 ë” í•˜ëŠ˜ê³¼ 달과 별과, 그리고 ë§ˆìŒ ì†ì— 떠오른 사람들과 하ì§í•˜ê³  약 ë¨¹ì„ ì¤€ë¹„ë¥¼ 했지요. +ì•½ì„ ê²€ì€ ê³ ì•½ê³¼ ê°™ì€ ì•„íŽ¸ì„ ë§›ì´ ì“°ë‹¤ëŠ” ì•„íŽ¸ì„ ë¬¼ë„ ì—†ì´ ë¨¹ìœ¼ë ¤ 들었지요. +우리 ë‘˜ì€ ì•„ê¹Œ 모양으로 가지런히 누워서 í•˜ëŠ˜ì„ ë°”ë¼ë³´ì•˜ëŠ”ë° ë‹¬ì´ ë°ìœ¼ë‹ˆê¹Œ ë³´ì´ë˜ 별들 ì¤‘ì— ìˆ¨ì€ ë³„ì´ ë§Žê³  ë˜ ë³„ë“¤ì˜ ìœ„ì¹˜ 우리ì—게 낯ìµì€ ë¶ë‘칠성 ìžë¦¬ë„ ë³€í–ˆì„ ê²ƒ 아니야요. ì´ìƒí•œ ìƒê°ì´ 나요. 우리가 벌íŒìœ¼ë¡œ 헤매는 ë™ì•ˆì— 천지가 ëª¨ë‘ ë³€í•œ 것 같아요. 사실 변하였지요. ê·¸ 변한 ê²ƒì´ ìš°ìŠ¤ì›Œì„œ 나는 껄껄 웃었지요. 워낙 ë‚´ê°€ 웃ìŒì´ 좀 헤프지만 ì´ ë•Œì²˜ëŸ¼ 헤프게 실컷 웃어 본 ì¼ì€ 없습니다. +왜 웃ëŠëƒê³  ì•„ë‚´ê°€ 좀 ì„±ì„ ë‚¸ ë“¯ì´ ë¬»ê¸°ë¡œ, `천지와 ì¸ìƒì´ 변하는 ê²ƒì´ ìš°ìŠ¤ì›Œì„œ 웃었소.' 그랬지요. 그랬ë”니, `천지와 ì¸ìƒì€ 변할는지 몰ë¼ë„ ë‚´ 마ìŒì€ 안 변해요!' 하고 소리를 지르겠지요. í½ ë¶„ê°œí–ˆë˜ ëª¨ì–‘ì´ì•¼." +하고 R는 ê·¸ 아내를 보오. +"그럼 ë¶„ê°œ 안 í•´ìš”? ë‚¨ì€ ì£½ì„ ê²°ì‹¬ì„ í•˜ê³  발발 떨구 ìžˆëŠ”ë° ê³ì—서 껄껄거리고 웃으니, 어째 분하지가 않아요. 나는 분해서 달아나려고 했어요." +하고 ë¶€ì¸ì€ ì•„ì§ë„ ë¶„í•¨ì´ ë‚¨ì€ ê²ƒê°™ì´ ë§í•˜ì˜¤. +"그래 달아나지 않았소?" +하고 R는 ë¶€ì¸ì´ 벌떡 ì¼ì–´ë‚˜ì„œ 비틀거리고 달아나는 í‰ë‚´ë¥¼ 팔과 다리로 ë‚´ê³  나서, +"ì´ëž˜ì„œ 죽는 ì‹œê°„ì´ ì§€ì²´ê°€ ë˜ì—ˆì§€ìš”. 그래서 ë‚´ê°€ 빌고 달래고 해서 가까스로 ì•ˆì •ì„ ì‹œí‚¤ê³  나니 ì†ì— ì¥ì—ˆë˜ ì•„íŽ¸ì´ ë•€ì— í‘¹ 젖었겠지요. ë‚´ê°€ ì›ƒì€ ê²ƒì€ ì£½ê¸° ì „ 한 번 천지와 ì¸ìƒì„ 웃어 버린 것ì¸ë° 그렇게 야단ì´ë‹ˆâ€¦â€¦ 하하하하." +R는 ì‹ì€ 차를 한 모금 ë” ë§ˆì‹œë©°, +"ì°¸ ëª©ë„ ë§ˆë¥´ê¸°ë„ í•˜ë”니. ìž…ì—는 침 한 방울 없고. 그러나 ëª»ë¬¼ì„ ë¨¹ì„ ìƒê°ë„ 없고. 나중ì—는 ë§ì„ 하려고 í•´ë„ í˜€ê°€ 안 ëŒì•„가겠지요. +ì´ëŸ¬ëŠ” ë™ì•ˆì— ë‹¬ë¹›ì´ í¬ë¯¸í•´ì§€ê¸¸ëž˜ 웬ì¼ì¸ê°€ 하고 고개를 ë²ˆì© ë“¤ì—ˆë”니 í•´ê°€ 떠오릅니다그려. 어떻게 붉고 둥글고 씩씩한지. `ì € í•´ 보오.' 하고 나는 기계ì ìœ¼ë¡œ 벌떡 ì¼ì–´ë‚˜ì„œ 구ë©ì´ì—서 뛰어나왔지요." +하고 빙그레 웃소. Rì˜ ë¹™ê·¸ë ˆ 웃는 ì–‘ì´ ì°¸ 좋았소. +"ë‚´ê°€ 뛰어나오는 ê²ƒì„ ë³´ê³  ì´ì´ë„ 뿌시시 ì¼ì–´ë‚¬ì§€ìš”. ê·¸ í•´! ê·¸ í•´ì˜ ìƒˆ ë¹›ì„ ë°›ëŠ” 하늘과 ë•…ì˜ ë¹›! 나는 ê·¸ê²ƒì„ í˜•ìš©í•  ë§ì„ 가지지 못합니다. 다만 íž˜ê» ì†Œë¦¬ì¹˜ê³  ì‹¶ê³  ê¸°ìš´ê» ë‹¬ìŒë°•질치고 ì‹¶ì€ ìƒê°ì´ ë‚  ë¿ì´ì–´ìš”. +`우리 삽시다, 죽지 ë§ê³  삽시다, 살아서 새 세ìƒì„ 하나 만들어 봅시다.' ì´ë ‡ê²Œ ë§í•˜ì˜€ì§€ìš”. 하니까 ì´ì´ê°€ 처ìŒì—는 ê¹œì§ ë†€ë¼ëŠ” 것 같아요. 그러나 마침내 ì•„ë‚´ë„ ì£½ì„ ëœ»ì„ ë³€í•˜ì˜€ì§€ìš”. 그래서 남 ì„ ìƒì„ 청하여다가 ê·¸ ë§ì”€ì„ 여쭈었ë”니 남 ì„ ìƒê»˜ì„œ 고개를 ë„ë•ë„ë•하시고 우리 ë‘˜ì˜ í˜¼ì¸ ì£¼ë¡€ë¥¼ 하셨지요. ê·¸ 후 ì‹­ì—¬ ë…„ì— ìš°ë¦¬ëŠ” ë°­ 갈고 ì•„ì´ ê¸°ë¥´ê³  ì´ëŸ° ìƒí™œì„ 하고 ìžˆëŠ”ë° ì–¸ì œë‚˜ 여기 새 ë¯¼ì¡±ì´ ìƒê¸°ê³  누가 새 ë‹¨êµ°ì´ ë ëŠ”ì§€ìš”. 하하하하, 아하하하. 피곤하시겠습니다. ì´ì•¼ê¸°ê°€ 너무 길어서." +하고 R는 ë§ì„ ëŠì†Œ. +나는 R부처가 만류하는 ê²ƒë„ ë‹¤ 뿌리치고 여관으로 ëŒì•„왔소. R와 함께 달빛 ì†, ê°œ 짖는 소리 ì†ì„ 지나서 ì•„ë¼ì‚¬ ì‚¬ëžŒì˜ ì¡°ê·¸ë§ˆí•œ 여관으로 ëŒì•„왔소. 여관 주ì¸ë„ R를 아는 모양ì´ì–´ì„œ 반갑게 ì¸ì‚¬í•˜ê³  ë˜ ë‚´ê²Œ 대한 ë¶€íƒë„ 하는 모양ì¸ê°€ 보오. +R는 ë‚´ ë°©ì— ì˜¬ë¼ì™€ì„œ ë‚´ì¼ í•˜ë£¨ 지날 ì¼ë„ ì´ì•¼ê¸°í•˜ê³  ë˜ ë‚¨ ì„ ìƒê³¼ ì •ìž„ì—게 관한 ì´ì•¼ê¸°ë„ 하였으나, 나는 그가 무슨 ì´ì•¼ê¸°ë¥¼ 하는지 잘 ë“¤ì„ ë§Œí•œ 마ìŒì˜ ì—¬ìœ ë„ ì—†ì–´ì„œ ë§ˆìŒ ì—†ëŠ” ëŒ€ë‹µì„ í•  ë¿ì´ì—ˆì†Œ. +Rê°€ ëŒì•„ê°„ ë’¤ì— ë‚˜ëŠ” ì˜·ë„ ë²—ì§€ 아니하고 ì¹¨ëŒ€ì— ë“œëŸ¬ëˆ„ì› ì†Œ. 페치카를 때기는 한 모양ì´ë‚˜ ë°©ì´ ì¨ëŠ˜í•˜ê¸° 그지없소. +`ê·¸ ë‘ ë³„ 무ë¤ì´ ì •ë§ R와 ê·¸ 여학ìƒê³¼ ë‘ ì‚¬ëžŒì´ ì˜ì›ížˆ 달치 못할 ê¿ˆì„ ì•ˆì€ ì±„ë¡œ 깨ë—하게 죽어서 묻힌 무ë¤ì´ì—ˆìœ¼ë©´ 얼마나 좋ì„까. ë§Œì¼ ê·¸ë ‡ë‹¤ 하면 ë‚´ì¼ í•œ 번 ë” ê°€ì„œ 보토ë¼ë„ 하고 오련마는.' +하고 나는 Rë¶€ì²˜ì˜ ìƒí™œì— 대하여 ì¼ì¢…ì˜ ë¶ˆë§Œê³¼ í™˜ë©¸ì„ ëŠê¼ˆì†Œ. +그리고 ë‚´ê°€ ì •ìž„ì„ ì—¬ê¸°ë‚˜ 시베리아나 ì–´ë–¤ 곳으로 불러다가 ë§Œì¼ R와 ê°™ì€ í‰ë‚´ë¥¼ 낸다 하면, 하고 ìƒê°í•´ 보고는 나는 진저리를 쳤소. 나는 내머리 ì†ì— 다시 그러한 ìƒê°ì´ 한 ì¡°ê°ì´ë¼ë„ 들어올 ê²ƒì„ ë‘려워하였소. +ê¸‰í–‰ì„ ê¸°ë‹¤ë¦¬ìžë©´ ë˜ ì‚¬í˜ì„ 기다리지 아니하면 아니 ë˜ê¸°ë¡œ 나는 ì´íŠ¿ë‚  ìƒˆë²½ì— ë– ë‚˜ëŠ” 구간차를 타고 Fì—­ì„ ë– ë‚˜ 버렸소. Rì—게는 고맙다는 편지 한 ìž¥ë§Œì„ ì¨ ë†“ê³ . 나는 R를 ë” ë³´ê¸°ë¥¼ ì›ì¹˜ 아니하였소. ê·¸ê²ƒì€ ë°˜ë“œì‹œ R를 죄ì¸ìœ¼ë¡œ 보아서 그런 ê²ƒì€ ì•„ë‹ˆì˜¤ë§ˆëŠ” 그저 나는 다시 R를 대면하기를 ì›ì¹˜ 아니한 것ì´ì˜¤. +나는 차가 Rì˜ ì§‘ ì•žì„ ì§€ë‚  때ì—ë„ Rì˜ ì§‘ì— ëŒ€í•˜ì—¬ì„œëŠ” 외면하였소. +ì´ ëª¨ì–‘ìœ¼ë¡œ 나는 í¥ì•ˆë ¹ì„ 넘고, 하ì¼ë¼ë¥´ì˜ ì†”ë°­ì„ ì§€ë‚˜ì„œ 마침내 ì´ ê³³ì— ì˜¨ 것ì´ì˜¤. +형! 나는 ì¸ì œëŠ” ì´ íŽ¸ì§€ë¥¼ ë내오. ë” ì“¸ ë§ë„ 없거니와 ì¸ì œëŠ” ì´ê²ƒì„ ì“°ê¸°ë„ ì‹«ì¦ì´ 났소. +ì´ íŽ¸ì§€ë¥¼ 쓰기 시작할 때ì—는 ë°”ì´ì¹¼ì— ë¬¼ê²°ì´ í‰ìš©í•˜ë”니 ì´ íŽ¸ì§€ë¥¼ ë내는 지금ì—는 ê°€ì˜ ê°€ê¹Œìš´ 물ì—는 ì–¼ìŒì´ 얼었소. 그리고 ì € 멀리 푸른 ë¬¼ì´ ëŠ ì‹¤ëŠ ì‹¤ 하얗게 눈 ë®ì¸ ì‚° 빛과 어울리게 ë˜ì—ˆì†Œ. +사í˜ì´ë‚˜ ì´ì–´ì„œ ì˜¤ë˜ ëˆˆì´ ë°¤ìƒˆì— ê°œê³  오늘 아침ì—는 칼날 ê°™ì€ ë°”ëžŒì´ ëˆˆì„ ë‚ ë¦¬ê³  있소. +나는 ì´ ì–¼ìŒ ìœ„ë¡œ 걸어서 ì € 푸른 물 있는 곳까지 가고 ì‹¶ì€ ìœ í˜¹ì„ ê¸ˆí•  수 없소. ë”구나 ì´ íŽ¸ì§€ë„ ë‹¤ ì“°ê³  나니, ì¸ì œëŠ” ë‚´ê°€ ì´ ì„¸ìƒì—서 í•  마지막 ì¼ê¹Œì§€ 다 한 것 같소. +ë‚´ê°€ ì´ ì•žì— ì–´ë””ë¡œ 가서 ì–´ì°Œ ë ëŠ”ì§€ëŠ” ë‚˜ë„ ëª¨ë¥´ì§€ë§ˆëŠ” í¬ë¯¸í•œ 소ì›ì„ ë§í•˜ë©´ 눈 ë®ì¸ ì‹œë² ë¦¬ì•„ì˜ ì¸ì  없는 삼림 지대로 한정 ì—†ì´ í—¤ë§¤ë‹¤ê°€ 기운 진하는 ê³³ì—서 ì´ ëª©ìˆ¨ì„ ë§ˆì¹˜ê³  싶소. +ìµœì„ êµ°ì€ `ë'ì´ë¼ëŠ” 글ìžë¥¼ ì¼ë‹¤ê°€ 지워 버리고 ë”´ 종ì´ì—다가 ì´ëŸ° ë§ì„ ì¼ë‹¤ +다 ì“°ê³  나니 ì´ëŸ° íŽ¸ì§€ë„ ë‹¤ 부질없는 ì¼ì´ì˜¤. ë‚´ê°€ ì´ëŸ° ë§ì„ 한대야 세ìƒì´ 믿어 줄 ë¦¬ë„ ì—†ì§€ 않소. ë§ì´ëž€ 소용 없는 것ì´ì˜¤. ë‚´ê°€ 아무리 ë‚´ ì•„ë‚´ì—게 ë§ì„ í–ˆì–´ë„ ì•„ë‹ˆ 믿었거든 ë‚´ ì•„ë‚´ë„ ë‚´ ë§ì„ 아니 믿었거든 하물며 세ìƒì´ ë‚´ ë§ì„ ë¯¿ì„ ë¦¬ê°€ 있소. 믿지 아니할 ë¿ ì•„ë‹ˆë¼ ë‚´ ë§ ì¤‘ì—서 ìžê¸°ë„¤ 목ì ì— 필요한 ë¶€ë¶„ë§Œì€ ë¯¿ê³ , ë˜ ìžê¸°ë„¤ 목ì ì— 필요한 ë¶€ë¶„ì€ ë§ˆìŒëŒ€ë¡œ 고치고 뒤집고 보태고 í•  것ì´ë‹ˆê¹Œ, 나는 ì´ íŽ¸ì§€ë¥¼ ì“´ ê²ƒì´ í•œ 무ìµí•˜ê³  어리ì„ì€ ì¼ì¸ ì¤„ì„ ê¹¨ë‹¬ì•˜ì†Œ. +형ì´ì•¼ ì´ íŽ¸ì§€ë¥¼ 아니 보기로니 나를 안 믿겠소? ê·¸ 중ì—는 혹 í˜•ì´ ì§€ê¸ˆê¹Œì§€ ëª¨ë¥´ë˜ ìžë£Œë„ 없지 아니하니, 형만 í˜¼ìž ë³´ì‹œê³  형만 í˜¼ìž ë‚´ ì‚¬ì •ì„ ì•Œì•„ 주시면 다행ì´ê² ì†Œ. 세ìƒì— 한 믿는 친구를 가지는 ê²ƒì´ ì €ë§ˆë‹¤ 하는 ì¼ì´ê² ì†Œ? +나는 ì´ ì“¸ë°ì—†ëŠ” 편지를 몇 번ì´ë‚˜ ë¶ˆì‚´ë¼ ë²„ë¦¬ë ¤ê³  하였으나 ê·¸ëž˜ë„ ê±°ê¸°ë„ ì¼ì¢…ì˜ ì• ì°©ì‹¬ì´ ìƒê¸°ê³  ë¯¸ë ¨ì´ ìƒê¸°ëŠ”êµ¬ë ¤. 형 한 ë¶„ì´ë¼ë„ ë³´ì—¬ 드리고 ì‹¶ì€ ë§ˆìŒì´ ìƒê¸°ëŠ”êµ¬ë ¤. ë‚´ê°€ Sí˜•ë¬´ì†Œì— ìž…ê°í•´ ìžˆì„ ì ì— 형무소 ë²½ì— ì£„ìˆ˜ê°€ ì†í†±ìœ¼ë¡œ ì„±ëª…ì„ ìƒˆê¸´ ê²ƒì„ ë³´ì•˜ì†Œ. ë’¤ì— ë¬¼ì—ˆë”니 ê·¸ê²ƒì€ í”히 사형수가 하는 ì§“ì´ë¼ê³ . 사형수가 êµìˆ˜ëŒ€ì— ëŒë ¤ 나가기 바로 ì „ì— í”히 ì†í†±ìœ¼ë¡œ ë‹´ë²¼ë½ì´ë‚˜ ë§ˆë£»ë°”ë‹¥ì— ì œ ì´ë¦„ì„ ìƒˆê¸°ëŠ” ì¼ì´ 있다고 하는 ë§ì„ 들었소. ë‚´ê°€ 형ì—게 쓰는 ì´ íŽ¸ì§€ë„ ê·¸ 심리와 비슷한 것ì¼ê¹Œìš”? +형! 나는 보통 사람보다는, 정보다는 지로, ìƒì‹ë³´ë‹¤ëŠ” ì´ë¡ ìœ¼ë¡œ, ì´í•´ë³´ë‹¤ëŠ” ì˜ë¦¬ë¡œ ì‚´ì•„ 왔다고 ìžì‹ í•˜ì˜¤. ì´ë¥¼í…Œë©´ 논리학ì ìœ¼ë¡œ 윤리학ì ìœ¼ë¡œ 살아온 것ì´ë¼ê³  할까. 나는 엄격한 êµì‚¬ìš”, êµìž¥ì´ì—ˆì†Œ. 내게는 ì˜ì§€ë ¥ê³¼ ì´ì§€ë ¥ë°–ì— ì—†ëŠ” 것 같았소. 그러한 ìƒí™œì„ 수십 ë…„ í•´ 오지 아니하였소? 나는 ì´ ì•žì— ëª‡ì‹­ ë…„ì„ ë” ì‚´ë”ë¼ë„ ë‚´ ì´ ì„±ê²©ì´ë‚˜ ìƒí™œ 태ë„ì—는 ë³€í•¨ì´ ì—†ìœ¼ë¦¬ë¼ê³  ìžì‹ í•˜ì˜€ì†Œ. ë¶ˆí˜¹ì§€ë…„ì´ ì§€ë‚¬ìœ¼ë‹ˆ 그렇게 ìƒê°í•˜ì˜€ì„ ê²ƒì´ ì•„ë‹ˆì˜¤? +ê·¸ëŸ°ë° í˜•! ì°¸ ì´ìƒí•œ ì¼ì´ 있소. ê·¸ê²ƒì€ ë‚´ê°€ 지금까지 처해 ìžˆë˜ í™˜ê²½ì„벗어나서 호호 탕탕하게 ë„“ì€ ì„¸ê³„ì— ì•Œëª¸ì„ ë‚´ì–´ë˜ì§ì„ 당하니 ë‚´ ë§ˆìŒ ì†ì—는 무서운 여러 가지 변화가 ì¼ì–´ë‚˜ëŠ”êµ¬ë ¤. 나는 ì´ ë§ë„ 형ì—게 아니 하려고 ìƒê°í•˜ì˜€ì†Œ. 노여워하지 마시오, ë‚´ê²Œê¹Œì§€ë„ ìˆ¨ê¸°ëŠëƒê³ . 그런 ê²ƒì´ ì•„ë‹ˆì˜¤, 형ì€ì»¤ë…• 나 ìžì‹ ì—ê²Œê¹Œì§€ë„ ìˆ¨ê¸°ë ¤ê³  í•˜ì˜€ë˜ ê²ƒì´ì˜¤. 혹시 그런 기다리지 아니 í•˜ì˜€ë˜ ì›, 그런 ìƒê°ì´ ë‚´ 마ìŒì˜ í•˜ëŠ˜ì— ì¼ì–´ë‚˜ë¦¬ë¼ê³  ìƒìƒë„ 아니하였ë˜, 그런 ìƒê°ì´ ì¼ì–´ë‚  때ì—는 나는 스스로 놀ë¼ê³  스스로 슬í¼í•˜ì˜€ì†Œ. 그래서 스스로 숨기기로 하였소. +ê·¸ 숨긴다는 ê²ƒì´ ë¬´ì—‡ì´ëƒ 하면 ê·¸ê²ƒì€ ì—´ì •ì´ìš”, ì •ì˜ ë¶ˆê¸¸ì´ìš”, ì •ì˜ ê´‘í’ì´ìš”, ì •ì˜ ë¬¼ê²°ì´ì˜¤. ë§Œì¼ ë‚´ ì˜ì‹ì´ 세계를 í‰í™”로운 í’€ 있고, 꽃 있고, 나무 있는 벌íŒì´ë¼ê³  하면 거기 난ë°ì—†ëŠ” 미친 ì§ìŠ¹ë“¤ì´ ë¶ˆì„ ë¿œê³  소리를 지르고 싸우고, ì˜ê°ì„ 하고 ë‚ ì³ì„œ, ì´ ë™ì‚°ì˜ í‰í™”ì˜ í™”ì´ˆë¥¼ 다 ì§“ë°Ÿì•„ 버리고 마는 그러한 모양과 같소. +형! ê·¸ ì´ìƒì•¼ë¦‡í•œ ì§ìŠ¹ë“¤ì´ ì—¬íƒœê», 사십 ë…„ ê°„ì„ ì–´ëŠ êµ¬ì„ì— ìˆ¨ì–´ 있었소? 그러다가 ì¸ì œ 뛰어나와 ê°ê° ì œ 권리를 주장하오? +지금 ë‚´ 가슴 ì†ì€ ë“소. ë‚´ ëª¸ì€ ë°”ì§ ì—¬ìœ„ì—ˆì†Œ. ê·¸ê²ƒì€ ìƒë¦¬í•™ì ìœ¼ë¡œë‚˜ 심리학ì ìœ¼ë¡œë‚˜ 타는 것ì´ìš”, 연소하는 것ì´ì˜¤. 그래서 다만 ë‚´ ëª¸ì˜ ì§€ë°©ë§Œì´ íƒ€ëŠ” ê²ƒì´ ì•„ë‹ˆë¼, 골수까지 타고, ëª¸ì´ íƒˆ ë¿ì´ ì•„ë‹ˆë¼ ìƒëª… ê·¸ ë¬¼ê±´ì´ íƒ€ê³  있는 것ì´ì˜¤. 그러면 어찌할까. +지위, 명성, 습관, 시대 사조 등등으로 ì¼ìƒì— 눌리고 ëˆŒë ¸ë˜ ë‚´ ìžì•„ì˜ ì¼ë¶€ë¶„ì´ í˜ëª…ì„ ì¼ìœ¼í‚¨ 것ì´ì˜¤? 한 ë²ˆë„ ìžìœ ë¡œ 권세를 부려 ë³´ì§€ 못한 본능과 ê°ì •ë“¤ì´ ë‚´ ìƒëª…ì´ ë나기 ì „ì— í•œ 번 ë‚ ë›°ì–´ 보려는 것ì´ì˜¤. ì´ê²ƒì´ ì„ ì´ì˜¤? ì•…ì´ì˜¤? +ê·¸ë“¤ì€ ë‚´ê°€ 지금까지 옳다고 여기고 신성하다고 ì—¬ê¸°ë˜ ëª¨ë“  권위를 모조리 둘러엎으려고 드오. 그러나 형! 나는 ë„저히 ì´ í˜ëª…ì„ ìš©ì¸í•  수가 없소. 나는 죽기까지 버티기로 ê²°ì •ì„ í•˜ì˜€ì†Œ. ë‚´ ì†ì—서 ë‘ ì„¸ë ¥ì´ ì‹¸ìš°ë‹¤ê°€ 싸우다가 승부가 ê²°ì •ì´ ëª» ëœë‹¤ë©´ 나는 ìŠ¹ë¶€ì˜ ê²°ì •ì„ ê¸°ë‹¤ë¦¬ì§€ 아니하고 살기를 그만ë‘려오. +나는 눈 ë®ì¸ 삼림 ì†ìœ¼ë¡œ 들어가려오. 나는 Vë¼ëŠ” 대삼림 지대가 ì–´ë””ì¸ ì¤„ë„ ì•Œê³  거기를 가려면 ì–´ëŠ ì •ê±°ìž¥ì—서 내릴 ê²ƒë„ ë‹¤ 알아 놓았소. +ë§Œì¼ ë‹¨ìˆœížˆ 죽는다 하면 구태여 멀리 찾아갈 í•„ìš”ë„ ì—†ì§€ë§ˆëŠ” ê·¸ëž˜ë„ ë‚˜ 혼ìžë¡œëŠ” ë‚´ 사ìƒê³¼ ê°ì •ì˜ ì²­ì‚°ì„ í•˜ê³  싶소. ì‚´ 수 있는 날까지 세ìƒì„ 떠난 ê³³ì—서 살다가 완전한 í•´ê²°ì„ ì–»ëŠ” ë‚  나는 í˜¹ì€ ìŠ¹ë¦¬ì˜, í˜¹ì€ íŒ¨ë°°ì˜ ì¢…ë§‰ì„ ë‹«ì¹  것ì´ì˜¤. ë§Œì¼ í•´ê²°ì´ ì•ˆ ë˜ë©´ 안 ë˜ëŠ” 대로 그치면 그만ì´ì§€ìš”. +나는 ì´ ë¶“ì„ ë†“ê¸° ì „ì— ì–´ì ¯ë°¤ì— ê¾¼ 꿈 ì´ì•¼ê¸° 하나는 하려오. ê¿ˆì´ í•˜ë„ ìˆ˜ìƒí•´ì„œ 마치 ë‚´ ì „ë„ì— ëŒ€í•œ ì‹ ì˜ ê³„ì‹œì™€ë„ ê°™ê¸°ë¡œ 하는 ë§ì´ì˜¤. ê·¸ ê¿ˆì€ ì´ëŸ¬í•˜ì˜€ì†Œ. +ë‚´ê°€ ê½ì´ê¹¨(꼬ì´ê¹Œë¼ëŠ” ì•„ë¼ì‚¬ë§ë¡œ 침대ë¼ëŠ” ë§ì´ ì¡°ì„  ë™í¬ì˜ 입으로 변한 ë§ì´ì˜¤.) ì§ì„ 지고 ì‚½ì„ ë©”ê³  ëˆˆì´ ë®ì¸ 삼림 ì†ì„ í˜¼ìž ê±¸ì—ˆì†Œ. ì´ ê½ì´ê¹¨ ì§ì´ëž€ ê²ƒì€ ê¸ˆì ê¾¼ë“¤ì´ ê·¸ 여행 ì¤‘ì— ì†Œìš©í’ˆ, 마른 ë¹µ, 소금, ë‚´ë³µ 등ì†ì„ 침대 ë§¤íŠ¸ë¦¬ìŠ¤ì— ë„£ì–´ì„œ 지고 다니는 것ì´ì˜¤. ì´ ì§í•˜ê³  삽 한 ê°œ, ë„ë¼ í•œ ê°œ, ê·¸ê²ƒì´ ì‹œë² ë¦¬ì•„ë¡œ ê¸ˆì„ ì°¾ì•„ 헤매는 ì¡°ì„  ë™í¬ë“¤ì˜ 행색ì´ì˜¤. ë‚´ê°€ ì´ë¥´ì¿ ì¸ í¬ì—서 ì´ëŸ¬í•œ ë™í¬ë¥¼ ë§Œë‚¬ë˜ ê²ƒì´ ê¿ˆìœ¼ë¡œ ë˜ì–´ 나온 모양ì´ì˜¤. +나는 꿈ì—는 세ìƒì„ 다 잊어버린, 아주 깨ë—하고 침착한 사람으로 ì´ ê½ì´ê¹¨ ì§ì„ 지고 ì‚½ì„ ë©”ê³  ë°¤ì¸ì§€ ë‚®ì¸ì§€ 알 수 없으나 ë•…ì€ ëˆˆë¹›ìœ¼ë¡œ í¬ê³ , í•˜ëŠ˜ì€ êµ¬ë¦„ë¹›ìœ¼ë¡œ íšŒìƒ‰ì¸ ì‚¼ë¦¼ 지대를 í—ˆë•í—ˆë• ê±¸ì—ˆì†Œ. ê¸¸ë„ ì—†ëŠ” ë°ë¥¼, ì¸ì ë„ 없는 ë°ë¥¼. +꿈ì—ë„ ë‚´ ëª¸ì€ í½ í”¼ê³¤í•´ì„œ 쉴 ìžë¦¬ë¥¼ 찾는 마ìŒì´ì—ˆì†Œ. +나는 마침내 ì–´ë–¤ ì–¸ë• ë°‘ 한 êµ°ë°ë¥¼ 골ëžì†Œ. 그리고 ìƒì‹œì— ì´ì•¼ê¸°ì—서 ë“¤ì€ ëŒ€ë¡œ 삽으로 ë‚´ê°€ 누울 ìžë¦¬ë§Œí•œ ëˆˆì„ ì¹˜ê³ , 그리고는 ë„ë¼ë¡œ ê³ì— ì„  나무 몇 개를 ì°ì–´ 누ì´ê³  거기다가 ë¶ˆì„ ë†“ê³  ê·¸ ë¶ˆê¹€ì— ë…¹ì€ ë•…ì„ ë‘ì–´ ìžë‚˜ 파내고 ê·¸ ì†ì— 드러누웠소. 훈훈한 ê²ƒì´ ì•„ì£¼ 편안하였소. +하늘ì—는 ë³„ì´ ë°˜ì§ê±°ë ¸ì†Œ. Fì—­ì—서 ë³´ë˜ ë°”ì™€ ê°™ì´ í° ë³„ ìž‘ì€ ë³„ë„ ë³´ì´ê³  í‰ì‹œì— ë³´ì§€ ëª»í•˜ë˜ ë¶‰ì€ ë³„, 푸른 별 ë“¤ë„ ë³´ì˜€ì†Œ. 나는 ì´ ì´ìƒí•œ 하늘, ì´ìƒí•œ ë³„ë“¤ì´ ìžˆëŠ” í•˜ëŠ˜ì„ ë³´ê³  드러누워 있노ë¼ë‹ˆê¹Œ ë¬¸ë“ ì–´ë””ì„œ ë°œìžêµ­ 소리가 들렸소. í‰í‰í‰í‰ 우루루루…… 나는 벌떡 ì¼ì–´ë‚˜ë ¤ 하였으나 ëª¸ì´ ì²œ ê·¼ì´ë‚˜ ë˜ì–´ì„œ 움ì§ì¼ 수가 없었소. 가까스로 고개를 조금 들고 보니 ë¿”ì´ ê¸¸ë‹¤ëž—ê³  ëˆˆì´ ë¶ˆê°™ì´ ë¶‰ì€ ì‚¬ìŠ´ì˜ ë–¼ê°€ ë¬´ì—‡ì— ë†€ëžëŠ”ì§€ 껑충껑충 ë›°ì–´ 지나가오. ì´ê²ƒì€ 아마 í¬ë¡œí¬íŠ¸í‚¨ì˜ <ìƒí˜¸ 부조론> ì†ì— ë§í•œ ì‹œë² ë¦¬ì•„ì˜ ì‚¬ìŠ´ì˜ ë–¼ê°€ ê¿ˆì´ ë˜ì–´ 나온 모양ì´ì˜¤. +그러ë”니 ê·¸ ì‚¬ìŠ´ì˜ ë–¼ê°€ 다 지나간 ë’¤ì—, ê·¸ ì‚¬ìŠ´ì˜ ë–¼ê°€ ì˜¤ë˜ ë°©í–¥ìœ¼ë¡œì„œ ì •ìž„ì´ê°€ 걸어오는 ê²ƒì´ ì•„ë‹ˆë¼ ìŠ¤ë¥´ë¥µ 하고 미ë„러져 오오. 마치 ì¸í˜•ì„ ë°€ì–´ 주는 것같ì´. +"정임아!" +하고 나는 소리를 치고 ëª¸ì„ ì¼ìœ¼í‚¤ë ¤ 하였소. +ì •ìž„ì˜ ëª¨ì–‘ì€ ë‚˜ë¥¼ ìž ê¹ ë³´ê³ ëŠ” 미ë„러지는 ë“¯ì´ í˜ëŸ¬ê°€ 버리오. +나는 정임아, 정임아를 부르고 팔다리를 부둥거렸소. 그러다가 마침내 ë‚´ ëª¸ì´ ë²ˆì© ì¼ìœ¼ì¼œì§ì„ 깨달았소. 나는 ì •ìž„ì˜ ë’¤ë¥¼ ë”°ëžì†Œ. +나는 눈 위로 삼림 ì†ìœ¼ë¡œ ì •ìž„ì˜ ê·¸ë¦¼ìžë¥¼ ë”°ëžì†Œ. ë³´ì¼ ë“¯ 안 ë³´ì¼ ë“¯, ìž¡íž ë“¯ 안 ìž¡íž ë“¯, 나는 무거운 다리를 ëŒê³  ì •ìž„ì„ ë”°ëžì†Œ. +ì •ìž„ì€ ì´ ì¶”ìš´ ë‚ ì´ì–¸ë§Œ 눈과 ê°™ì´ í° ì˜·ì„ ìž…ì—ˆì†Œ. ê·¸ ì˜·ì€ ì˜›ë‚  로마 ì—¬ì¸ì˜ 옷과 ê°™ì´ ë°”ëžŒê²°ì— íŽ„ë ê±°ë ¸ì†Œ. +"오지 마세요. 저를 ë”°ë¼ì˜¤ì§€ 못하십니다." +하고 ì •ìž„ì€ ëˆˆë³´ë¼ ì†ì— 가리워 버리고 ë§ì•˜ì†Œ. 암만 ë¶ˆëŸ¬ë„ ëŒ€ë‹µì´ ì—†ê³  눈보ë¼ê°€ 다 지나간 ë’¤ì—ë„ ë¶‰ì€ ë³„, 푸른 별과 ë¿” 긴 ì‚¬ìŠ´ì˜ ë–¼ë¿ì´ì˜¤. ì •ìž„ì€ ë³´ì´ì§€ 아니하였소. 나는 미칠 ë“¯ì´ ì •ìž„ì„ ì°¾ê³  부르다가 ìž ì„ ê¹¨ì—ˆì†Œ. +ê¿ˆì€ ì´ê²ƒë¿ì´ì˜¤. ê¿ˆì„ ê¹¨ì–´ì„œ ì°½ ë°–ì„ ë°”ë¼ë³´ë‹ˆ ì–¼ìŒê³¼ ëˆˆì— ë®ì¸ ë°”ì´ì¹¼í˜¸ 위ì—는 ìƒˆë²½ì˜ ê²¨ìš¸ ë‹¬ì´ ë¹„ì¹˜ì–´ 있었소. ì € 멀리 검푸르게 ë³´ì´ëŠ” ê²ƒì´ ì±„ 얼어붙지 아니한 물ì´ê² ì§€ìš”. 오늘 ë°¤ì— ë°”ëžŒì´ ì—†ê³  ê¸°ì˜¨ì´ ë‚´ë¦¬ë©´ 그것마저 얼어붙ì„는지 모르지요. ë²Œì¨ ì‚´ì–¼ìŒì´ ìž¡í˜”ëŠ”ì§€ë„ ëª¨ë¥´ì§€ìš”. ì•„ì•„, ê·¸ ì†ì€ 얼마나 깊ì„까. 나는 ë°”ì´ì¹¼ì˜ 물 ì†ì´ ê´€ì‹¬ì´ ë˜ì–´ì„œ 못 견디겠소. +형! 나는 ìžë°±í•˜ì§€ 아니할 수 없소. ì´ ê¿ˆì€ ë‚´ 마ìŒì˜ ì–´ë–¤ ë¶€ë¶„ì„ ì„¤ëª…í•œ 것ì´ë¼ê³ . 그러나 형! 나는 ì´ê²ƒì„ 부정하려오. 굳세게 부정하려오. 나는 ì´ ê¿ˆì„ ë¶€ì •í•˜ë ¤ì˜¤. 억지로ë¼ë„ 부정하려오. 나는 ê²°ì½” ë‚´ ì†ì— ì¼ì–´ë‚œ í˜ëª…ì„ ìš©ì¸í•˜ì§€ 아니하려오. 나는 ê·¸ê²ƒì„ í˜ëª…으로 ì¸ì •하지 아니하려오. 아니오! 아니오! ê·¸ê²ƒì€ ë°˜ëž€ì´ì˜¤! ë‚´ ì¸ê²©ì˜ 통ì¼ì— 대한 반란ì´ì˜¤. 단연코 무단ì ìœ¼ë¡œ 진정하지 아니하면 아니 ë  ë°˜ëž€ì´ì˜¤. 보시오! 나는 굳게 서서 한 걸ìŒë„ 뒤로 물러서지 아니할 것ì´ì˜¤. ë§Œì¼ì— í˜•ì´ ê´‘ì•¼ì— êµ¬ë¥´ëŠ” ë‚´ 시체나 í•´ê³¨ì„ ë³¸ë‹¤ë“ ì§€, ë˜ëŠ” 무슨 ì¸ì—°ìœ¼ë¡œ ë‚´ 무ë¤ì„ 발견하는 ë‚ ì´ ìžˆë‹¤ê³  하면 ê·¸ ë•Œì— í˜•ì€ ë‚´ê°€ ì´ ëª¨ë“  ë°˜ëž€ì„ ì§„ì •í•œ ê°œì„ ì˜ êµ°ì£¼ë¡œ ì£½ì€ ê²ƒì„ ì•Œì•„ 주시오. +ì¸ì œ ë°”ì´ì¹¼ì— ê²¨ìš¸ì˜ ì„ì–‘ì´ ë¹„ì¹˜ì—ˆì†Œ. ëˆˆì„ ì¸ ë‚˜ì§€ë§‰í•œ ì‚°ë“¤ì´ ì§€ëŠ” í–‡ë¹›ì— ìžì¤ë¹›ì„ 발하고 있소. 극히 깨ë—하고 싸늘한 ê´‘ê²½ì´ì˜¤. 아디유! +ì´ íŽ¸ì§€ë¥¼ ìš°íŽ¸ì— ë¶€ì¹˜ê³ ëŠ” 나는 ìµœí›„ì˜ ë°©ëž‘ì˜ ê¸¸ì„ ë– ë‚˜ì˜¤. ì°¾ì„ ìˆ˜ë„ ì—†ê³ , 편지 ë°›ì„ ìˆ˜ë„ ì—†ëŠ” 곳으로. +부디 í‰ì•ˆížˆ 계시오. ì¼ ë§Žì´ í•˜ì‹œì˜¤. ë¶€ì¸ê»˜ 문안 드리오. ë‚´ 가족과 ì •ìž„ì˜ ì¼ ë§¡ê¸°ì˜¤. 아디유! +ì´ê²ƒìœ¼ë¡œ ìµœì„ êµ°ì˜ íŽ¸ì§€ëŠ” ë났다. +나는 ì´ íŽ¸ì§€ë¥¼ 받고 울었다. ì´ê²ƒì´ ì¼ íŽ¸ì˜ ì†Œì„¤ì´ë¼ 하ë”ë¼ë„ 슬픈 ì¼ì´ì–´ë“ , 하물며 ë‚´ê°€ 가장 믿고 사랑하는 ì¹œêµ¬ì˜ ì¼ìž„ì—야. +ì´ íŽ¸ì§€ë¥¼ 받고 나는 ê³§ ìµœì„ êµ°ì˜ ì§‘ì„ ì°¾ì•˜ë‹¤. 주ì¸ì„ ìžƒì€ ì´ ì§‘ì—서는아ì´ë“¤ì´ 마당ì—서 떠들고 있었다. +"ì‚¼ì²­ë™ ì•„ìžì”¨ 오셨수. 어머니, ì‚¼ì²­ë™ ì•„ìžì”¨." +하고 ìµœì„ êµ°ì˜ ìž‘ì€ë”¸ì´ 나를 ë³´ê³  뛰어들어갔다. +최ì„ì˜ ë¶€ì¸ì´ 나와 나를 맞았다. +ë¶€ì¸ì€ ë¨¸ë¦¬ë„ ë¹—ì§€ 아니하고, 얼굴ì—는 ì¡°ê¸ˆë„ í™”ìž¥ì„ ì•„ë‹ˆí•˜ê³ , ë§¤ë¬´ì‹œë„ í˜ëŸ¬ë‚´ë¦´ 지경으로 ì •ëˆë˜ì§€ 못하였다. ì¼ ì£¼ì¼ì´ë‚˜ 못 만난 ë™ì•ˆì— ë¶€ì¸ì˜ ëª¨ì–‘ì€ ë”ìš± 초췌하였다. +"ë…¸ì„헌테서 무슨 기별ì´ë‚˜ 있습니까." +하고 나는 무슨 ë§ë¡œ ë§ì„ 시작할지 몰ë¼ì„œ ì´ëŸ° ë§ì„ 하였다. +"아니오. 왜 ê·¸ì´ê°€ ì§‘ì— íŽ¸ì§€í•˜ë‚˜ìš”?" +하고 ë¶€ì¸ì€ 성난 ë¹›ì„ ë³´ì´ë©°, +"ì§‘ì„ ë– ë‚œ 지가 ê·¼ 사십 ì¼ì´ ë˜ê±´ë§Œ 엽서 한 장 있나요. 집안 ì‹êµ¬ê°€ 다 죽기로 눈ì´ë‚˜ 깜ì§í•  ì¸ê°€ìš”. 그저 ì •ìž„ì´í—Œí…Œë§Œ 미ì³ì„œ 죽ì„ì§€ 살지를 모르지요." +하고 울먹울먹한다. +"잘못 아십니다. ë¶€ì¸ê»˜ì„œ ë…¸ì„ì˜ ë§ˆìŒì„ 잘못 아십니다. 그런 ê²ƒì´ ì•„ë‹™ë‹ˆë‹¤." +하고 나는 확신 있는 ë“¯ì´ ë§ì„ 시작하였다. +"ë…¸ì„ì˜ ìƒê°ì„ ë¶€ì¸ê»˜ì„œ 오해하신 ì¤„ì€ ë²Œì¨ë¶€í„° 알았지마는 오늘 ë…¸ì„ì˜ íŽ¸ì§€ë¥¼ 받아보고 ë”ìš± 분명히 알았습니다." +하고 나는 ë¶€ì¸ì˜ í‘œì •ì˜ ë³€í™”ë¥¼ 엿보았다. +"편지가 왔어요?" +하고 ë¶€ì¸ì€ 놀ë¼ë©´ì„œ, +"지금 ì–´ë”” 있어요? ì¼ë³¸ 있지요?" +하고 ì§ˆíˆ¬ì˜ ë¶ˆê¸¸ì„ ëˆˆìœ¼ë¡œ 토하였다. +"ì¼ë³¸ì´ 아닙니다. ë…¸ì„ì€ ì§€ê¸ˆ ì•„ë¼ì‚¬ì— 있습니다." +"ì•„ë¼ì‚¬ìš”?" +하고 ë¶€ì¸ì€ 놀ë¼ëŠ” ë¹›ì„ ë³´ì´ë”니, +"그럼 ì •ìž„ì´ë¥¼ ë°ë¦¬ê³  아주 ì•„ë¼ì‚¬ë¡œ 가케오치를 하였군요." +하고 히스테리컬한 웃ìŒì„ ë³´ì´ê³ ëŠ” ëª¸ì„ í•œ 번 떨었다. +ë¶€ì¸ì€ 남편과 ì •ìž„ì˜ ê´€ê³„ë¥¼ ë§í•  때마다 ì´ë ‡ê²Œ 경련ì ì¸ 웃ìŒì„ 웃고 ëª¸ì„ ë– ëŠ” ê²ƒì´ ë²„ë¦‡ì´ì—ˆë‹¤. +"아닙니다. ë…¸ì„ì€ í˜¼ìž ê°€ 있습니다. 그렇게 오해를 마세요." +하고 나는 ë³´ì— ì‹¼ 최ì„ì˜ íŽ¸ì§€ë¥¼ 내어서 ë¶€ì¸ì˜ 앞으로 밀어 놓으며, +"ì´ê²ƒì„ 보시면 다 아실 줄 압니다. 어쨌으나 ë…¸ì„ì€ ê²°ì½” ì •ìž„ì´ë¥¼ ë°ë¦¬ê³  ê°„ ê²ƒì´ ì•„ë‹ˆìš”, ë„리어 ì •ìž„ì´ë¥¼ 멀리 떠나서 ê°„ 것입니다. 그러나 ê·¸ë³´ë‹¤ë„ ì¤‘ëŒ€ 문제가 있습니다. ë…¸ì„ì€ ì´ íŽ¸ì§€ë¥¼ ë³´ë©´ ì£½ì„ ê²°ì‹¬ì„ í•œ 모양입니다." +하고 ë¶€ì¸ì˜ 주ì˜ë¥¼ 질투로부터 ê·¸ 남편ì—게 대한 ë™ì •ì— ëŒì–´ ë³´ë ¤ 하였다. +"í¥. 왜요? 시체 정사를 하나요? 좋겠습니다. 머리가 허연 ê²ƒì´ ë”¸ìžì‹ ê°™ì€ ê³„ì§‘ì• í—ˆêµ¬ 정사를 한다면 ê·¸ ê¼´ 좋겠습니다. 죽으ë¼ì§€ìš”. 죽으래요. 죽는 ê²ƒì´ ë‚«ì§€ìš”. 그리구 살아서 무엇 í•´ìš”?" +ë‚´ ëœ»ì€ í‹€ë ¤ 버렸다. ë¶€ì¸ì˜ 표정과 ë§ì—서는 ë”ìš±ë”ìš± ë…한 ì§ˆíˆ¬ì˜ ì•ˆê°œì™€ 싸늘한 ì–¼ìŒê°€ë£¨ê°€ 날았다. +나는 ë¶€ì¸ì˜ ì´ íƒœë„ì— ë°˜ê°ì„ ëŠê¼ˆë‹¤. 아무리 ì§ˆíˆ¬ì˜ ê°ì •ì´ ê°•í•˜ë‹¤ 하기로, ì‚¬ëžŒì˜ ìƒëª…ì´ ì œ ë‚¨íŽ¸ì˜ ìƒëª…ì´ ìœ„íƒœí•¨ì—ë„ ë¶ˆêµ¬í•˜ê³  ì˜¤ì§ ì œ ì§ˆíˆ¬ì˜ ê°ì •ì—ë§Œ 충실하려 하는 ê·¸ 태ë„ê°€ 불쾌하였다. 그래서 나는, +"나는 ê·¸ë§Œí¼ ë§ì”€í•´ 드렸으니 ë” í•  ë§ì”€ì€ 없습니다. 아무려나 ì¢€ë” ëƒ‰ì •í•˜ê²Œ ìƒê°í•´ 보세요. 그리고 ì´ê²ƒì„ ì½ì–´ 보세요." +하고 ì¼ì–´ë‚˜ì„œ 집으로 ëŒì•„와 버리고 ë§ì•˜ë‹¤. +ë„무지 불쾌하기 그지없는 ë‚ ì´ë‹¤. 최ì„ì˜ íƒœë„ê¹Œì§€ë„ ë¶ˆì¾Œí•˜ë‹¤. 달아나긴 왜 달아나? 죽기는 왜 죽어? 못난 것! 기운 없는 것! 하고 나는 최ì„ì´ê°€ ê³ì— 섰기나 한 것처럼 ëˆˆì„ í˜ê¸°ê³  중얼거렸다. +최ì„ì˜ ë§ëŒ€ë¡œ 최ì„ì˜ ë¶€ì¸ì€ 악한 ì‚¬ëžŒì´ ì•„ë‹ˆìš”, 그저 ë³´í†µì¸ ì—¬ì„±ì¼ëŠ”ì§€ 모른다. 그렇다 하면 ì—¬ìžì˜ 마ìŒì´ëž€ ë„ˆë¬´ë„ ì§ˆíˆ¬ì˜ ì¢…ì´ ì•„ë‹ê¹Œ. 설사 남편 ë˜ëŠ” 최ì„ì˜ ì‚¬ëž‘ì´ ì•„ë‚´ë¡œë¶€í„° ì •ìž„ì—게로 옮아 갔다고 하ë”ë¼ë„ ê·¸ê²ƒì„ ì§ˆíˆ¬ë¡œ 회복하려는 ê²ƒì€ ì–´ë¦¬ì„ì€ ì¼ì´ë‹¤. ì´ë¯¸ ì‚¬ëž‘ì´ ë– ë‚œ ë‚¨íŽ¸ì„ ë„¤ 마ìŒëŒ€ë¡œ ê°€ê±°ë¼ í•˜ê³  ìžë°œì ìœ¼ë¡œ 내어버릴 것ì´ì§€ë§ˆëŠ” ê·¸ê²ƒì„ ëª» í•  ì‚¬ì •ì´ ìžˆë‹¤ê³  하면 모르는 체하고 내버려 둘 ê²ƒì´ ì•„ë‹Œê°€. ê·¸ëž˜ë„ ì´ê²ƒì€ 우리네 남ìžì˜ ì´ë¡ ì´ìš”, ì—¬ìžë¡œëŠ” ì´ëŸ° ê²½ìš°ì— ì§ˆíˆ¬ë¼ëŠ” ë°˜ì‘ë°–ì— ì—†ë„ë¡ ìƒê¸´ 것ì¼ê¹Œ 나는 ì´ëŸ° ìƒê°ì„ 하고 있었다. +시계가 아홉시를 친다. +남대문 ë°– ì •ê±°ìž¥ì„ ë– ë‚˜ëŠ” ì—´ì°¨ì˜ ê¸°ì  ì†Œë¦¬ê°€ 들린다. +나는 만주를 ìƒê°í•˜ê³ , 시베리아를 ìƒê°í•˜ê³  최ì„ì„ ìƒê°í•˜ì˜€ë‹¤. 마ìŒìœ¼ë¡œëŠ” ì •ìž„ì„ ì‚¬ëž‘í•˜ë©´ì„œ ê·¸ ì‚¬ëž‘ì„ ë°œí‘œí•  수 없어서 ì‹œë² ë¦¬ì•„ì˜ ëˆˆ ë®ì¸ 삼림 ì†ìœ¼ë¡œ 방황하는 최ì„ì˜ ëª¨ì–‘ì´ ìµœì„ì˜ ê¿ˆ ì´ì•¼ê¸°ì— 있는 대로 ëˆˆì•žì— ì„ í•˜ê²Œ 떠나온다. +`ì‚¬ëž‘ì€ ëª©ìˆ¨ì„ ë¹¼ì•—ëŠ”ë‹¤.' +하고 나는 사랑ì¼ëž˜ ì¼ì–´ë‚˜ëŠ” ì¸ìƒì˜ ë¹„ê·¹ì„ ìƒê°í•˜ì˜€ë‹¤. 그러나 최ì„ì˜ ê²½ìš°ëŠ” 보통 있는 ê³µì‹ê³¼ëŠ” 달ë¼ì„œ ì‚¬ëž‘ì„ ì£½ì´ê¸° 위해서 ì œ ëª©ìˆ¨ì„ ì£½ì´ëŠ” 것ì´ì—ˆë‹¤. 그렇다 하ë”ë¼ë„, +`ì‚¬ëž‘ì€ ëª©ìˆ¨ì„ ë¹¼ì•—ëŠ”ë‹¤.' +는 ë°ì—는 ë‹¤ë¦„ì´ ì—†ë‹¤. +나는 ë¶ˆì¾Œë„ í•˜ê³  ëª¸ë„ ìœ¼ìŠ¤ìŠ¤í•˜ì—¬ 얼른 ìžë¦¬ì— 누웠다. ë©°ëŠë¦¬ê°€ 들어온 뒤부터 사랑 ìƒí™œì„ 하는 지가 ë²Œì¨ ì˜¤ ë…„ì´ë‚˜ ë˜ì—ˆë‹¤. 우리 부처란 ì¸ì œëŠ” 한 ì—­ì‚¬ì  ì¡´ìž¬ìš”, ìœ¤ë¦¬ì  ê´€ê³„ì— ë¶ˆê³¼í•˜ì˜€ë‹¤. 오래 사귄 친구와 ê°™ì€ ìµìˆ™í•¨ì´ 있고, ì§‘ì— ì—†ì§€ 못할 사람ì´ë¼ëŠ” í•„ìš”ê°ë„ 있지마는 ì Šì€ ë¶€ì²˜ê°€ 가지는 듯한 그런 ì •ì€ ë²Œì¨ ì—†ëŠ” ì§€ 오래였다. ì•„ë‚´ë„ ë‚˜ë¥¼ 대하면 본체만체, ë‚˜ë„ ì•„ë‚´ë¥¼ 대하면 본체만체, 무슨 필요가 있어서 ë§ì„ ë¶™ì´ë”ë¼ë„ ì•„ë¬´ìª¼ë¡ ë“£ê¸° 싫기를 ì›í•˜ëŠ” ë“¯ì´ í†¡í†¡ ë‚´ë˜ì¡Œë‹¤. ì•„ë‚´ë„ ê·¼ëž˜ì— ì™€ì„œëŠ” ì˜·ë„ ì•„ë¬´ë ‡ê²Œë‚˜, ë¨¸ë¦¬ë„ ì•„ë¬´ë ‡ê²Œë‚˜, ì–´ë”” 출입할 때밖ì—는 ë„무지 í™”ìž¥ì„ ì•„ë‹ˆ 하였다. +그러나 그렇다고 우리 ë¶€ì²˜ì˜ ìƒˆê°€ 좋지 못한 ê²ƒë„ ì•„ë‹ˆì—ˆë‹¤. 서로 소중히 여기는 마ìŒë„ 있었다. ì•„ë‚´ê°€ ì•ˆì— ìžˆë‹¤ê³  ìƒê°í•˜ë©´ 마ìŒì´ 든든하고 ë˜ ì•„ë‚´ì˜ ë§ì— ì˜í•˜ê±´ëŒ€ ë‚´ê°€ ì‚¬ëž‘ì— ìžˆê±°ë‹ˆ 하면 마ìŒì´ 든든하다고 한다. +우리 ë¶€ì²˜ì˜ ê´€ê³„ëŠ” ì´ëŸ¬í•œ 관계다. +나는 한 ë°©ì—서 í˜¼ìž ìž ì„ ìžëŠ” ê²ƒì´ ìŠµê´€ì´ ë˜ì–´ì„œ 누가 ê³ì— 있으면 ìž ì´ ìž˜ 들지 아니하였다. 혹시 ì–´ë¦°ê²ƒë“¤ì´ ë§¤ë¥¼ 얻어맞고 사랑으로 í”¼ë‚œì„ ì™€ì„œ 울다가 ë‚´ ìžë¦¬ì—서 ìž ì´ ë“¤ë©´ 귀엽기는 ê·€ì—¬ì›Œë„ ìž ìžë¦¬ëŠ” 편안치 아니하였다. 나는 ì±…ì„ ë³´ê³  ê¸€ì„ ì“°ê³  ê³µìƒì„ 하고 있으면 족하였다. 내게는 아무 ì• ìš•ì  ìš”êµ¬ë„ ì—†ì—ˆë‹¤. ì´ê²ƒì€ ë‚´ ì •ë ¥ì´ ì‡ ëª¨í•œ 까닭ì¸ì§€ 모른다. +그러나 최ì„ì˜ íŽ¸ì§€ë¥¼ 본 ê·¸ ë‚  ë°¤ì—는 ë„무지 ìž ì´ ìž˜ 들지 아니하였다. 최ì„ì˜ íŽ¸ì§€ê°€ 최ì„ì˜ ê³ ë¯¼ì´ ë‚´ ì¡¸ë˜ ì˜ì‹ì— 무슨 ìžê·¹ì„ 준 듯하였다. ì ë§‰í•œ 듯하였다. 허전한 듯하였다. 무엇ì¸ì§€ 모르나 그리운 ê²ƒì´ ìžˆëŠ” 것 같았다. +"ì–´, ì´ê±° 안ë˜ì—ˆêµ°." +하고 나는 벌떡 ì¼ì–´ë‚˜ 담배를 피워 물었다. +"나으리 주무셔 곕시오?" +하고 ì•„ë²”ì´ ì „ë³´ë¥¼ 가지고 왔다. +"명조 경성 ì°© 남정임" +ì´ë¼ëŠ” 것ì´ì—ˆë‹¤. +"ì •ìž„ì´ê°€ 와?" +하고 나는 전보를 다시 ì½ì—ˆë‹¤. +최ì„ì˜ ê·¸ 편지를 ë³´ë©´ ìµœì„ ë¶€ì¸ì—게는 ì–´ë–¤ ë°˜ì‘ì´ ì¼ì–´ë‚˜ê³  ì •ìž„ì—게는 ì–´ë–¤ ë°˜ì‘ì´ ì¼ì–´ë‚ ê¹Œ, 하고 ìƒê°í•˜ë©´ ìžëª» 마ìŒì´ 편하지 못하였다. +ì´íŠ¿ë‚  ì•„ì¹¨ì— ë‚˜ëŠ” 부산서 오는 차를 맞으려고 정거장ì—를 나갔다. +차는 ì œ ì‹œê°„ì— ë“¤ì–´ì™”ë‹¤. ë‚¨ì •ìž„ì€ ìŠˆíŠ¸ì¼€ì´ìФ 하나를 들고 ì°¨ì—서 내렸다. ê²€ì€ ì™¸íˆ¬ì— ê²€ì€ ëª¨ìžë¥¼ ì“´ ê·¸ì˜ ì–¼êµ´ì€ ë”ìš± 해쓱해 보였다. +"ì„ ìƒë‹˜!" +하고 ì •ìž„ì€ ë‚˜ë¥¼ ë³´ê³  ì†ì— ë“¤ì—ˆë˜ ì§ì„ ë•…ë°”ë‹¥ì— ë‚´ë ¤ë†“ê³ , ë‚´ 앞으로 왔다. +"í’ëž‘ì´ë‚˜ 없었나?" +하고 나는 ë‚´ ì†ì— 잡힌 ì •ìž„ì˜ ì†ì´ 싸늘한 ê²ƒì„ ê·¼ì‹¬í•˜ì˜€ë‹¤. +"네. 아주 잔잔했습니다. ì €ê°™ì´ ì•½í•œ ì‚¬ëžŒë„ ë°–ì— ë‚˜ì™€ì„œ 바다 경치를 구경하였습니다." +하고 ì •ìž„ì€ ì‚¬êµì ì¸ 웃ìŒì„ 웃었다. 그러나 ê·¸ì˜ ëˆˆì—는 ëˆˆë¬¼ì´ ìžˆëŠ” 것 같았다. +"최 ì„ ìƒë‹˜ ì–´ë”” 계신지 아세요?" +하고 ì •ìž„ì€ ë‚˜ë¥¼ ë”°ë¼ ì„œë©´ì„œ 물었다. +"ë‚˜ë„ ì§€ê¸ˆê¹Œì§€ 몰ëžëŠ”ë° ì–´ì œ 편지를 하나 받았지." +하는 ê²ƒì´ ë‚´ 대답ì´ì—ˆë‹¤. +"네? 편지 받으셨어요? ì–´ë”” 계십니까?" +하고 ì •ìž„ì€ ê±¸ìŒì„ 멈추었다. +"ë‚˜ë„ ëª°ë¼." +하고 ë‚˜ë„ ì •ìž„ê³¼ ê°™ì´ ê±¸ìŒì„ 멈추고, +"ê·¸ 편지를 ì“´ ê³³ë„ ì•Œê³  부친 ê³³ë„ ì•Œì§€ë§ˆëŠ” 지금 어디로 갔는지 ê·¸ê²ƒì€ ëª¨ë¥´ì§€. ì°¾ì„ ìƒê°ë„ ë§ê³  편지할 ìƒê°ë„ ë§ë¼ê³  했으니까." +하고 사실대로 대답하였다. +"어디야요? ê·¸ 편지 부치신 ê³³ì´ ì–´ë””ì•¼ìš”? ì € ì´ ì°¨ë¡œ ë”°ë¼ê°ˆ 테야요." +하고 ì •ìž„ì€ ì¡°ê¸‰í•˜ì˜€ë‹¤. +"ê°ˆ 때ì—는 ê°€ë”ë¼ë„ ì´ ì°¨ì—야 ê°ˆ 수가 있나." +하고 나는 겨우 ì •ìž„ì„ ëŒê³  들어왔다. +ì •ìž„ì„ ì§‘ìœ¼ë¡œ ë°ë¦¬ê³  와서 대강 ë§ì„ 하고, ì´íŠ¿ë‚  새벽 차로 떠난다는 것ì„, +"가만 있어. 어떻게 계íšì„ 세워 가지고 해야지." +하여 가까스로 붙들어 놓았다. +ì•„ì¹¨ì„ ë¨¹ê³  나서 ìµœì„ ì§‘ì—를 ê°€ 보려고 í•  즈ìŒì— 순임ì´ê°€ 와서 마루 ëì— ì„  채로, +"ì„ ìƒë‹˜, 어머니가 ìž ê¹ë§Œ 오십시사구요." +하였다. +"ì •ìž„ì´ê°€ 왔다." +하고 ë‚´ê°€ 그러니까, +"ì •ìž„ì´ê°€ìš”?" +하고 ìˆœìž„ì€ ê¹œì§ ë†€ë¼ë©´ì„œ, +"ì •ìž„ì´ëŠ” 아버지 계신 ë°ë¥¼ 알아요?" +하고 물었다. +"ì •ìž„ì´ë„ 모른단다. 너 아버지는 ì‹œë² ë¦¬ì•„ì— ê³„ì‹œê³  ì •ìž„ì´ëŠ” ë™ê²½ 있다가 ì™”ëŠ”ë° ì•Œ 리가 있니?" +하고 나는 ìˆœìž„ì˜ ìƒê°ì„ 깨뜨리려 하였다. 순임ì€, +"ì •ìž„ì´ê°€ ì–´ë”” 있어요?" +하고 방들 있는 ê³³ì„ ë‘˜ëŸ¬ë³´ë©°, +"언제 왔어요?" +하고는 그제야 ì •ìž„ì—게 대한 반가운 ì •ì´ ë°œí•˜ëŠ” 듯ì´, +"정임아!" +하고 불러 본다. +"언니요? 여기 있수." +하고 ì •ìž„ì´ê°€ 머릿방 ë¬¸ì„ ì—´ê³  ì˜·ì„ ê°ˆì•„ìž…ë˜ ì±„ë¡œ 고개를 내어민다. +ìˆœìž„ì€ êµ¬ë‘를 ì°¨ë‚´ë²„ë¦¬ë“¯ì´ ë²—ì–´ 놓고 ì •ìž„ì˜ ë°©ìœ¼ë¡œ 뛰어들어간다. +나는 최ì„ì˜ ì§‘ì—를 ê°€ëŠë¼ê³  외투를 ìž…ê³  모ìžë¥¼ ì“°ê³  ì •ìž„ì˜ ë°©ë¬¸ì„ ì—´ì–´ 보았다. ë‘ ì²˜ë…€ëŠ” 울고 있었다. +"ì •ìž„ì´ë„ 가지. 아주머니 뵈러 안 ê°€?" +하고 나는 ì •ìž„ì„ ìž¬ì´‰í•˜ì˜€ë‹¤. +"ì„ ìƒë‹˜ 먼저 ê°€ 계셔요." +하고 순임ì´ê°€ ëˆˆë¬¼ì„ ì”»ê³  ì¼ì–´ë‚˜ë©´ì„œ, +"ì´ë”°ê°€ 제가 ì •ìž„ì´í—ˆêµ¬ 갑니다." +하고 내게 ëˆˆì„ ë”ì©ê±°ë ¤ 보였다. ê°‘ìžê¸° ì •ìž„ì´ê°€ 가면 어머니와 ì •ìž„ì´ì™€ 사ì´ì— 어떠한 íŒŒëž€ì´ ì¼ì–´ë‚˜ì§€ë‚˜ 아니할까 하고 순임ì´ê°€ 염려하는 것ì´ì—ˆë‹¤. ìˆœìž„ë„ ì¸ì œëŠ” 노성하여졌다고 나는 ìƒê°í•˜ì˜€ë‹¤. +"ì„ ìƒë‹˜ ì´ íŽ¸ì§€ê°€ 다 ì°¸ë§ì¼ê¹Œìš”?" +하고 나를 보는 길로 ìµœì„ ë¶€ì¸ì´ 물었다. ìµœì„ ë¶€ì¸ì€ 히스테리를 ì¼ìœ¼í‚¨ 사람 모양으로 머리와 ì†ì„ 떨었다. +나는 ì°¸ë§ì´ëƒ 하는 ê²ƒì´ ë¬´ì—‡ì„ ê°€ë¦¬í‚¤ëŠ” ë§ì¸ì§€ 분명하지 아니하여서, +"ë…¸ì„ì´ ê±°ì§“ë§í•  사람입니까?" +하고 대체론으로 대답하였다. +"앉으십쇼. 앉으시란 ë§ì”€ë„ 안 하고." +하고 ë¶€ì¸ì€ 침착한 ëª¨ì–‘ì„ ë³´ì´ë ¤ê³  빙그레 웃었으나, ê·¸ê²ƒì€ ì‹¤íŒ¨ì˜€ë‹¤. +"그게 ì°¸ë§ì¼ê¹Œìš”? ì •ìž„ì´ê°€ 아기를 ë—€ ê²ƒì´ ì•„ë‹ˆë¼, íê°€ 나빠서 피를 토하고 ìž…ì›í•˜ì˜€ë‹¤ëŠ” 것ì´?" +하고 ë¶€ì¸ì€ 중대하다는 í‘œì •ì„ ê°€ì§€ê³  묻는다. +"그럼 ê·¸ê²ƒì´ ì°¸ë§ì´ 아니구요. ì•„ì§ë„ 그런 ì˜ì‹¬ì„ 가지고 계십니까. ì •ìž„ì´ì™€ 한 ë°©ì— ìžˆëŠ” í•™ìƒì´ 모함한 것ì´ë¼ê³  안 그랬어요? 그게 ë§ì´ ë©ë‹ˆê¹Œ." +하고 ì–¸ì„±ì„ ë†’ì—¬ì„œ 대답하였다. +"그럼 왜 ì •ìž„ì´ê°€ 호텔ì—서 왜 아버지한테 한 번 안아 달ë¼ê³  그래요? ê·¸ íŽ¸ì§€ì— ì“´ 대로 한 번 안아만 보았ì„까요?" +ì´ê²ƒì€ ë¶€ì¸ì˜ 둘째 물ìŒì´ì—ˆë‹¤. +"나는 ê·¸ë¿ì´ë¼ê³  믿습니다. ê·¸ê²ƒì´ ë„리어 깨ë—하다는 표ë¼ê³  믿습니다. 안 그렇습니까?" +하고 나는 딱하다는 í‘œì •ì„ í•˜ì˜€ë‹¤. +"글쎄요." +하고 ë¶€ì¸ì€ 한참ì´ë‚˜ ìƒê°í•˜ê³  있다가, +"ì •ë§ ì•  아버지가 í˜¼ìž ë‹¬ì•„ë‚¬ì„까요? ì •ìž„ì´ë¥¼ ë°ë¦¬ê³  가케오치한 ê²ƒì´ ì•„ë‹ê¹Œìš”? ê¼­ ê·¸ëž¬ì„ ê²ƒë§Œ ê°™ì€ë°." +하고 ë¶€ì¸ì€ 괴로운 í‘œì •ì„ ê°ì¶”려는 ë“¯ì´ ê³ ê°œë¥¼ 숙ì¸ë‹¤. +나는 남편ì—게 대한 ì•„ë‚´ì˜ ì˜ì‹¬ì´ 어떻게 깊ì€ê°€ì— 아니 놀랄 수가 없어서, +"í—ˆ." +하고 한 마디 웃고, +"그렇게 수십 ë…„ ë™ì•ˆ 부부 ìƒí™œì„ í•˜ì‹œê³ ë„ ê·¸ë ‡ê²Œ ë…¸ì„ì˜ ì¸ê²©ì„ ëª°ë¼ ì£¼ì‹­ë‹ˆê¹Œ. 나는 ë¶€ì¸ê»˜ì„œ 하시는 ë§ì”€ì´ 부러 하시는 ë†ë‹´ìœ¼ë¡œë°–ì— ì•„ë‹ˆ 들립니다. ì •ìž„ì´ê°€ 지금 서울 있습니다." +하고 ë˜ í•œ 번 웃었다. ì •ë§ ê¸°ë§‰ížŒ 웃ìŒì´ì—ˆë‹¤. +"ì •ìž„ì´ê°€ 서울 있어요?" +하고 ë¶€ì¸ì€ íŽ„ì© ë›°ë©´ì„œ, +"ì–´ë”” 있다가 언제 왔습니까? 그게 ì •ë§ìž…니까?" +하고 ì˜ì•„한 ë¹›ì„ ë³´ì¸ë‹¤. ê¼­ 최ì„ì´í•˜ê³  함께 ë‹¬ì•„ë‚¬ì„ ì •ìž„ì´ê°€ ì„œìš¸ì— ìžˆì„ ë¦¬ê°€ 없는 것ì´ì—ˆë‹¤. +"ë™ê²½ì„œ 오늘 ì•„ì¹¨ì— ì™”ìŠµë‹ˆë‹¤. 지금 우리 ì§‘ì—서 순임ì´í—ˆêµ¬ ì´ì•¼ê¸°ë¥¼ 하고 있으니까 조금 있으면 뵈오러 올 것입니다." +하고 나는 ì •ìž„ì´ê°€ 분명히 서울 있는 ê²ƒì„ ì¼ì¼ì´ ì¦ê±°ë¥¼ 들어서 ì¦ëª…하였다. 그리고 우스운 ê²ƒì„ ì†ìœ¼ë¡œ 참았다. 그러나 ë‹¤ìŒ ìˆœê°„ì—는 ì´ ë³‘ë“¤ê³  ëŠ™ì€ ì•„ë‚´ì˜ ì§ˆíˆ¬ì™€ ì˜ì‹¬ìœ¼ë¡œ 괴로워서 ëœëœëœëœ 떨고 앉았는 ê²ƒì„ ê°€ì—¾ê²Œ ìƒê°í•˜ì˜€ë‹¤. +ì •ìž„ì´ê°€ 지금 ì„œìš¸ì— ìžˆëŠ” ê²ƒì´ ë” ì˜ì‹¬í•  여지가 없는 ì‚¬ì‹¤ìž„ì´ íŒëª…ë˜ë§¤, ë¶€ì¸ì€ ë„리어 ë‚™ë§í•˜ëŠ” 듯하였다. 그가 ì œ 마ìŒëŒ€ë¡œ 그려 놓고 믿고 í•˜ë˜ ëª¨ë“  ì² í•™ì˜ ê³„í†µì´ ë¬´ë„ˆì§„ 것ì´ì—ˆë‹¤. +한참ì´ë‚˜ í©ì–´ì§„ ì •ì‹ ì„ ëª» 수습하는 ë“¯ì´ ì•‰ì•„ 있ë”니 아주 기운 없는 어조로, +"ì„ ìƒë‹˜ ì•  아버지가 ì •ë§ ì£½ì„까요? ì •ë§ ì˜ì˜ ì§‘ì—를 안 ëŒì•„올까요?" +하고 묻는다. ê·¸ 눈ì—는 ë²Œì¨ ëˆˆë¬¼ì´ ì–´ë¦¬ì—ˆë‹¤. +"글쎄요. ë‚´ ìƒê° 같아서는 다시는 ì§‘ì— ëŒì•„오지 아니할 것 같습니다. ë˜ ê·¸ë§Œì¹˜ ë§ì‹ ì„ 했으니, ì´ì œ 무슨 낯으로 ëŒì•„옵니까. ë‚´ë¼ë„ 다시 ì§‘ì— ëŒì•„올 ìƒê°ì€ 아니 내겠습니다." +하고 나는 ì˜ì‹ì ìœ¼ë¡œ ì•…ì˜ë¥¼ 가지고 ë¶€ì¸ì˜ ê°€ìŠ´ì— ì¹¼ì„ í•˜ë‚˜ 박았다. +ê·¸ ì¹¼ì€ ë¶„ëª…ížˆ ë¶€ì¸ì˜ ê°€ìŠ´ì— ì•„í”„ê²Œ 박힌 모양ì´ì—ˆë‹¤. +"ì„ ìƒë‹˜. 어떡하면 좋습니까. ì•  아버지가 죽지 않게 í•´ 주세요. 그렇지 ì•Šì•„ë„ ìˆœìž„ì´ë…„ì´ ì œê°€ ê±” 아버지를 달아나게나 한 것처럼 ì›ë§ì„ 하는ë°ìš”. 그러다가 ì •ë…• 죽으면 어떻게 합니까. ì œì¼ ë”´ ìžì‹ë“¤ì˜ ì›ë§ì„ 들ì„ê¹Œë´ ê²ì´ 납니다. ì„ ìƒë‹˜, 어떻게 ì•  아버지를 붙들어다 주세요." +하고 마침내 ì°¸ì„ ìˆ˜ ì—†ì´ ìš¸ì—ˆë‹¤. ë§ì€ ë¹„ë¡ ìžì‹ë“¤ì˜ ì›ë§ì´ ë‘렵다고 하지마는 ì§ˆíˆ¬ì˜ ê°ì •ì´ ìŠ¤ëŸ¬ì§ˆ ë•Œì— ê·¸ì—게는 남편ì—게 대한 ì•„ë‚´ì˜ ì• ì •ì´ ë§‰í˜”ë˜ ë¬¼ê³¼ ê°™ì´ í„°ì ¸ 나온 것ì´ë¼ê³  나는 í•´ì„하였다. +"글쎄, ì–´ë”” 있는 줄 알고 찾습니까. ë…¸ì„ì˜ ì„±ë¯¸ì— í•œë²ˆ 아니 한다고 했으면 다시 편지할 리는 만무하다고 믿습니다." +하여 나는 ë¶€ì¸ì˜ ê°€ìŠ´ì— ë‘˜ì§¸ ì¹¼ë‚ ì„ ë°•ì•˜ë‹¤. +나는 ë¹„ë¡ ìµœì„ì˜ ë¶€ì¸ì´ 청하지 아니하ë”ë¼ë„ 최ì„ì„ ì°¾ìœ¼ëŸ¬ 떠나지 아니하면 아니 ë  ì˜ë¬´ë¥¼ 진다. ì‚° 최ì„ì„ ëª» ì°¾ë”ë¼ë„ 최ì„ì˜ ì‹œì²´ë¼ë„, 무ë¤ì´ë¼ë„, ì£½ì€ ìžë¦¬ë¼ë„, 마지막 ìžˆë˜ ê³³ì´ë¼ë„ 찾아보지 아니하면 아니 ë  ì˜ë¬´ë¥¼ 깨닫는다. +그러나 ì‹œêµ­ì´ ë³€í•˜ì—¬ ê·¸ 때ì—는 ì•„ë¼ì‚¬ì— 가는 ê²ƒì€ ì—¬ê°„ 곤란한 ì¼ì´ 아니었다. ê·¸ 때ì—는 ë¶ë§Œì˜ í’ìš´ì´ ê¸‰ë°•í•˜ì—¬ 만주리를 통과하기는 ì‚¬ì‹¤ìƒ ë¶ˆê°€ëŠ¥ì— ê°€ê¹Œì› ë‹¤. 마ì ì‚°(馬å å±±) ì¼íŒŒì˜ 군대가 í¥ì•ˆë ¹, 하ì¼ë¼ë¥´ ë“±ì§€ì— ì›…ê±°í•˜ì—¬ 언제 대충ëŒì´ í­ë°œë ëŠ”ì§€ ëª¨ë¥´ë˜ ë•Œì˜€ë‹¤. ì´ ë•Œë¬¸ì— ì‹œë² ë¦¬ì•„ì— ë“¤ì–´ê°€ê¸°ëŠ” ê±°ì˜ ì ˆë§ ìƒíƒœë¼ê³  하겠고, ë˜ ê´€í—Œë„ ì•„ë¼ì‚¬ì— 들어가는 ì—¬í–‰ê¶Œì„ ìž˜ êµë¶€í•  것 같지 아니하였다. +ë¶€ì¸ì€ 울고, 나는 ì´ëŸ° ìƒê° 저런 ìƒê° 하고 있는 ë™ì•ˆì— 문 ë°–ì—는 순임ì´, ì •ìž„ì´ê°€ 들어오는 소리가 들렸다. +"ì•„ì´, ì •ìž„ì´ëƒ." +하고 ë¶€ì¸ì€ 반갑게 허리 굽혀 ì¸ì‚¬í•˜ëŠ” ì •ìž„ì˜ ì–´ê¹¨ì— ì†ì„ 대고, +"ìž ì•‰ì•„ë¼. 그래 ì¸ì œ ë³‘ì´ ì¢€ 나으ëƒâ€¦â€¦ 수척했구나. ë” ë…¸ì„±í•´ì§€êµ¬ ë°˜ ë…„ë„ ëª» ë˜ì—ˆëŠ”ë°." +하고 ì •ìž„ì—게 대하여 ì• ì •ì„ í‘œí•˜ëŠ” ê²ƒì„ ë³´ê³  나는 ì˜ì™¸ì§€ë§ˆëŠ” 다행으로 ìƒê°í•˜ì˜€ë‹¤. 나는 ì •ìž„ì´ê°€ 오면 보기 ì‹«ì€ í•œ ì‹ ì„ ì—°ì¶œí•˜ì§€ 않나 하고 ê·¼ì‹¬í•˜ì˜€ë˜ ê²ƒì´ë‹¤. +"í¬ ìž˜ ìžë¼ìš”?" +하고 ì •ìž„ì€ í•œì°¸ì´ë‚˜ 있다가 비로소 ìž…ì„ ì—´ì—ˆë‹¤. +"ì‘, 잘 있단다. 컸나 ê°€ ë³´ì•„ë¼." +하고 ë¶€ì¸ì€ ë”ìš± 반가운 í‘œì •ì„ ë³´ì¸ë‹¤. +"ì–´ëŠ ë°©ì´ì•¼?" +하고 ì •ìž„ì€ ì„ ë¬¼ ë³´í‰ì´ë¥¼ 들고 순임과 함께 나가 버린다. ì—¬ìžì¸ ì •ìž„ì€ í¬ì™€ 순임과 ë¶€ì¸ê³¼ ë˜ ìˆœìž„ì˜ ë‹¤ë¥¸ ë™ìƒì—게 선물 사 오는 ê²ƒì„ ìžŠì–´ë²„ë¦¬ì§€ 아니하였다. +정임과 ìˆœìž„ì€ í•œ ì´ì‚¼ ë¶„ 있다가 ëŒì•„왔다. ë°–ì—서 í¬ê°€ 무엇ì´ë¼ê³  지절대는 소리가 들린다. 아마 ì •ìž„ì´ê°€ 사다 준 ì„ ë¬¼ì„ ë°›ê³  좋아하는 모양ì´ë‹¤. +ì •ìž„ì€ ë“¤ê³  온 ë³´í‰ì´ì—서 ì—¬ìžìš© 배스로브 하나를 내어서 ë¶€ì¸ì—게주며, +"맞으실까?" +하였다. +"ì•„ì´ ê·¸ê±´ 무어ë¼ê³  사 왔니?" +하고 ë¶€ì¸ì€ 좋아ë¼ê³  ìž…ì–´ ë³´ê³ , ì´ë¦¬ ë³´ê³  저리 ë³´ê³  하면서, +"난 ì´ëŸ° ê±° ì²˜ìŒ ìž…ì–´ 본다." +하고 ìžê¾¸ ëˆì„ ë™ì—¬ë§¨ë‹¤. +"ì •ìž„ì´ê°€ 난 파ìžë§ˆë¥¼ 사다 주었어." +하고 ìˆœìž„ì€ ë”°ë¡œ ìŒŒë˜ êµµì€ ì¤„ 있는 융 파ìžë§ˆë¥¼ 내어서 경매장 사람 모양으로 í”들어 ë³´ì´ë©°, +"어머니 ê·¸ 배스로브 나 주우. 어머닌 늙ì€ì´ê°€ 그건 입어서 무엇 하우?" +하고 ë¶€ì¸ì´ ìž…ì€ ë°°ìŠ¤ë¡œë¸Œë¥¼ 벗겨서 제가 ìž…ê³  ë‘ í˜¸ì£¼ë¨¸ë‹ˆì— ì†ì„ 넣고 어기죽어기죽하고 서양 ë¶€ì¸ë„¤ í‰ë‚´ë¥¼ 낸다. +"저런 ë§ê´„량ì´ê°€ ë„ˆë„ ì •ìž„ì´ì²˜ëŸ¼ 좀 얌전해 ë³´ì•„ë¼." +하고 ë¶€ì¸ì€ ìˆœìž„ì„ í–¥í•˜ì—¬ ëˆˆì„ í˜ê¸´ë‹¤. +ì´ ëª¨ì–‘ìœ¼ë¡œ ë¶€ì¸ê³¼ ì •ìž„ê³¼ì˜ ëŒ€ë©´ì€ ê°€ìž¥ ì›ë§Œí•˜ê²Œ ë˜ì—ˆë‹¤. +그러나 ë¶€ì¸ì€ ì •ìž„ì—게 최ì„ì˜ íŽ¸ì§€ë¥¼ ë³´ì´ê¸°ë¥¼ ì›ì¹˜ 아니하였다. 편지가 왔다는 ë§ì¡°ì°¨ ìž… ë°–ì— ë‚´ì§€ 아니하였다. 그러나 순임ì´ê°€ ì •ìž„ì—게 대하여 표하는 ì• ì •ì€ ì—¬ê°„ 깊지 아니하였다. ê·¸ ë‘˜ì€ í•˜ë£¨ ì¢…ì¼ ê°™ì´ ìžˆì—ˆë‹¤. ì •ìž„ì€ ê·¸ ë‚  ì €ë…ì— ë‚˜ë¥¼ ë³´ê³ , +"순임ì´í—Œí…Œ 최 ì„ ìƒë‹˜ 편지 ì‚¬ì—°ì€ ë‹¤ 들었어요. 순임ì´ê°€ ê·¸ 편지를 í›”ì³ë‹¤ê°€ 얼른얼른 몇 êµ°ë° ì½ì–´ë„ 보았습니다. 순임ì´ê°€ 저를 í½ ë™ì •하면서 ì ˆë”러 최 ì„ ìƒì„ ë”°ë¼ê°€ ë³´ë¼ê³  그래요. í˜¼ìž ê°€ê¸°ê°€ 어려우면 ìžê¸°í—ˆêµ¬ ê°™ì´ ê°€ìžê³ . 가서 최 ì„ ìƒì„ ë°ë¦¬ê³  오ìžê³ . 어머니가 못 가게 하거든 몰래 ë‘˜ì´ ë„ë§í•´ ê°€ìžê³ . 그래서 그러ìžê³  그랬습니다. 안ë지요. ì„ ìƒë‹˜?" +하고 ì €í¬ë¼ë¦¬ ìž‘ì •ì€ ë‹¤ í•´ 놓고는 ìŠ¬ì© ë‚´ ì˜í–¥ì„ 물었다. +"ì Šì€ ì—¬ìž ë‹¨ë‘˜ì´ì„œ 먼 ì—¬í–‰ì„ ì–´ë–»ê²Œ 한단 ë§ì´ëƒ? 게다가 지금 ë¶ë§Œì£¼ 형세가 대단히 위급한 모양ì¸ë°. ë˜ ì •ìž„ì´ëŠ” ê·¸ ê±´ê°• 가지고 어디를 ê°€, ì´ ì¶”ìš´ 겨울ì—?" +하고 나는 ì´ëŸ° ë§ì´ 다 쓸ë°ì—†ëŠ” ë§ì¸ 줄 ì•Œë©´ì„œë„ ì–´ë¥¸ìœ¼ë¡œì„œ 한 마디 안 í•  수 없어서 하였다. ì •ìž„ì€ ë” ì œ ëœ»ì„ ì£¼ìž¥í•˜ì§€ë„ ì•„ë‹ˆí•˜ì˜€ë‹¤. +ê·¸ ë‚  ì €ë…ì— ì •ìž„ì€ ìˆœìž„ì˜ ì§‘ì—서 잤는지 ì§‘ì— ì˜¤ì§€ë¥¼ 아니하였다. +나는 ì´ ì¼ì„ 어찌하면 좋ì€ê°€, ì´ ë‘ ì—¬ìžì˜ í–‰ë™ì„ 어찌하면 좋ì€ê°€ 하고 í˜¼ìž ë™ë™ ìƒê°í•˜ê³  있었다. +ì´íŠ¿ë‚  나는 ê¶ê¸ˆí•´ì„œ 최ì„ì˜ ì§‘ì—를 ê°”ë”니 ë¶€ì¸ì´, +"우리 ìˆœìž„ì´ ëŒì— 갔어요?" +하고 ì˜ì™¸ì˜ ì§ˆë¬¸ì„ í•˜ì˜€ë‹¤. +"아니오." +하고 나는 놀ëžë‹¤. +"그럼, ì´ê²ƒë“¤ì´ 어딜 갔어요? 난 ì •ìž„ì´í—ˆêµ¬ ëŒì—서 ìž” 줄만 알았는ë°." +하고 ë¶€ì¸ì€ 무슨 불길한 것ì´ë‚˜ 본 ë“¯ì´ ëª¸ì„ ë–¤ë‹¤. 히스테리가 ì¼ì–´ë‚œ 것ì´ì—ˆë‹¤. +나는 ìž…ë§›ì„ ë‹¤ì‹œì—ˆë‹¤. 분명히 ì´ ë‘ ì—¬ìžê°€ 시베리아를 향하고 떠났구나 하였다. +ê·¸ ë‚ ì€ ì†Œì‹ì´ ì—†ì´ ì§€ë‚¬ë‹¤. ê·¸ ì´íŠ¿ë‚ ë„ ì†Œì‹ì´ ì—†ì´ ì§€ë‚¬ë‹¤. +ìµœì„ ë¶€ì¸ì€ 딸까지 잃어버리고 미친 ë“¯ì´ ìš¸ê³  애통하다가 머리를 싸매고 누워 버리고 ë§ì•˜ë‹¤. +ì •ìž„ì´ì™€ 순임ì´ê°€ 없어진 ì§€ ì‚¬í˜ ë§Œì— ì•„ì¹¨ ìš°íŽ¸ì— íŽ¸ì§€ 한 ìž¥ì„ ë°›ì•˜ë‹¤. ê·¸ 봉투는 봉천 ì•¼ë§ˆë„ í˜¸í…” 것ì´ì—ˆë‹¤. ê·¸ ì†ì—는 편지 ë‘ ìž¥ì´ ë“¤ì–´ 있었다. 한 ìž¥ì€ , +ì„ ìƒë‹˜! 저는 아버지를 위하여, ì •ìž„ì„ ìœ„í•˜ì—¬ 정임과 ê°™ì´ ì§‘ì„ ë– ë‚¬ìŠµë‹ˆë‹¤. +어머님께서 슬í¼í•˜ì‹¤ ì¤„ì€ ì•Œì§€ë§ˆëŠ” ì €í¬ë“¤ì´ 다행히 아버지를 찾아서 모시고 오면 ì–´ë¨¸ë‹ˆê»˜ì„œë„ ê¸°ë»í•˜ì‹¤ ê²ƒì„ ë¯¿ìŠµë‹ˆë‹¤. ì €í¬ë“¤ì´ 가지 아니하고는 아버지는 살아서 ëŒì•„오실 것 같지 아니합니다. 아버지를 ì´ì²˜ëŸ¼ 불행하시게 한 죄는 ì ˆë°˜ì€ ì–´ë¨¸ë‹ˆê»˜ 있고, ì ˆë°˜ì€ ì œê²Œ 있습니다. 저는 아버지 ì¼ì„ ìƒê°í•˜ë©´ ê°€ìŠ´ì´ ë¯¸ì–´ì§€ê³  ì´ê°€ 갈립니다. 저는 아무리 해서ë¼ë„ 아버지를 찾아내어야겠습니다. +저는 ì •ìž„ì„ ë¬´í•œížˆ ë™ì •합니다. 저는 어려서 ì •ìž„ì„ ë¯¸ì›Œí•˜ê³  아버지를 미워하였지마는 ì§€ê¸ˆì€ ì•„ë²„ì§€ì˜ ë§ˆìŒê³¼ ì •ìž„ì˜ ë§ˆìŒì„ 알아볼 만치 ìžëžìŠµë‹ˆë‹¤. +ì„ ìƒë‹˜! ì €í¬ë“¤ì€ ë‘˜ì´ ì†ì„ 잡고 어디를 가서든지 아버지를 찾아내겠습니다. í•˜ë‚˜ë‹˜ì˜ ì‚¬ìžê°€ ë‚®ì—는 êµ¬ë¦„ì´ ë˜ê³  ë°¤ì—는 ë³„ì´ ë˜ì–´ì„œ 반드시 ì €í¬ë“¤ì˜ ì•žê¸¸ì„ ì¸ë„í•  줄 믿습니다. +ì„ ìƒë‹˜, ì €í¬ ì–´ë¦°ê²ƒë“¤ì˜ ëœ»ì„ ë¶ˆìŒížˆ 여기셔서 ëˆ ì²œ ì›ë§Œ 전보로 ë³´ë‚´ 주시기를 ë°”ëžë‹ˆë‹¤. +ë§Œì¼ ë§Œì£¼ë¦¬ë¡œ 가는 ê¸¸ì´ ëŠì–´ì§€ë©´ 몽고로 ìžë™ì°¨ë¡œë¼ë„ 가려고 합니다. 아버지 íŽ¸ì§€ì— ì ížŒ Fì—­ì˜ R씨를 찾고, 그리고 ë°”ì´ì¹¼ í˜¸ë°˜ì˜ ë°”ì´ì¹¼ë¦¬ìŠ¤ì½”ì—를 찾아, ì´ ëª¨ì–‘ìœ¼ë¡œ 찾으면 반드시 아버지를 찾아 내고야 ë§ ê²ƒì„ ë¯¿ìŠµë‹ˆë‹¤. +ì„ ìƒë‹˜, ëˆ ì²œ ì›ë§Œ 봉천 ì•¼ë§ˆë„ í˜¸í…” 최순임 ì´ë¦„으로 ë¶€ì³ ì£¼ì„¸ìš”. 그리고 어머니헌테는 ì•„ì§ ë§ì”€ ë§ì•„ 주세요. +ì„ ìƒë‹˜. ì´ë ‡ê²Œ 걱정하시게 해서 미안합니다. 용서하세요. +순임 ìƒì„œ +ì´ë ‡ê²Œ ì¨ ìžˆë‹¤. ë˜ í•œ 장ì—는, +ì„ ìƒë‹˜! 저는 마침내 ëŒì•„오지 못할 ê¸¸ì„ ë– ë‚˜ë‚˜ì´ë‹¤. 어디든지 최 ì„ ìƒë‹˜ì„ 뵈옵는 ê³³ì—서 ì´ ëª¸ì„ ë¬»ì–´ 버리려 하나ì´ë‹¤. 지금 ë˜ ëª¸ì— ì—´ì´ ë‚˜ëŠ” 모양ì´ìš”, í˜ˆë‹´ë„ ë³´ì´ì˜¤ë‚˜ 최 ì„ ìƒì„ 뵈올 때까지는 아무리 하여서ë¼ë„ ì´ ëª©ìˆ¨ì„ ë¶€ì§€í•˜ë ¤ 하오며, 최 ì„ ìƒì„ 뵈옵고 제가 ì§„ ì€í˜œë¥¼ ê°ì‚¬í•˜ëŠ” 한 ë§ì”€ë§Œ 사뢰면 고대 ì£½ì‚¬ì™€ë„ ì—¬í•œì´ ì—†ì„까 하나ì´ë‹¤. +순임 언니가 제게 주시는 사랑과 ë™ì •ì€ ì˜¤ì§ ëˆˆë¬¼ê³¼ ê°ê²©ë°–ì— ë” í‘œí•  ë§ì”€ì´ 없나ì´ë‹¤. 순임 언니가 저를 보호하여 주니 마ìŒì´ 든든하여ì´ë‹¤â€¦â€¦. +ì´ë¼ê³  하였다. +편지를 보아야 별로 놀랄 ê²ƒì€ ì—†ì—ˆë‹¤. 다만 ë§ê´„량ì´ë¡œë§Œ ì•Œì•˜ë˜ ìˆœìž„ì˜ ì†ì— ì–´ëŠìƒˆì— 그러한 ê°ì •ì´ ë°œë‹¬í•˜ì˜€ë‚˜ 하는 ê²ƒì„ ë†€ëž„ ë¿ì´ì—ˆë‹¤. +그러나 ê±±ì •ì€ ì´ê²ƒì´ë‹¤. 순임ì´ë‚˜ ì •ìž„ì´ë‚˜ 다 ë‚´ê°€ ê°ë…해야 í•  ì²˜ì§€ì— ìžˆê±°ëŠ˜ ê·¸ë“¤ì´ ë§Œë¦¬ 긴 ì—¬í–‰ì„ ë– ë‚œë‹¤ê³  하니 ê°ë…ìžì¸ ë‚´ 태ë„를 어떻게 할까 하는 것ì´ë‹¤. +나는 편지를 받는 길로 ìš°ì„  ëˆ ì²œ ì›ì„ ì€í–‰ì— 가서 찾아다 놓았다. +ì•”ë§Œí•´ë„ ë‚´ê°€ ì„œìš¸ì— ê°€ë§Œížˆ 앉아서 ë‘ ì•„ì´ì—게 ëˆë§Œ ë¶€ì³ ì£¼ëŠ” ê²ƒì´ ì¸ì •ì— ì–´ê·¸ëŸ¬ì§€ëŠ” 것 같아서 나는 여러 가지로 ì£¼ì„ ì„ í•˜ì—¬ì„œ ì—¬í–‰ì˜ ì–‘í•´ë¥¼ 얻어 가지고 ë´‰ì²œì„ í–¥í•˜ì—¬ 떠났다. +ë‚´ê°€ ë´‰ì²œì— ë„착한 ê²ƒì€ ë°¤ 열시가 지나서였다. 순임과 ì •ìž„ì€ ìžë¦¬ì˜· 바람으로 ë‚´ 방으로 달려와서 반가워하였다. ê·¸ë“¤ì´ ë°˜ê°€ì›Œí•˜ëŠ” ì–‘ì€ ì‹¤ë¡œ ëˆˆë¬¼ì´ í를 만하였다. +"ì•„ì´êµ¬ ì„ ìƒë‹˜!" +"ì•„ì´êµ¬ 어쩌면!" +하는 ê²ƒì´ ê·¸ë“¤ì˜ ë‚´ê²Œ 대한 ì¸ì‚¬ì˜ 전부였다. +"ì •ìž„ì´ ì–´ë– ì˜¤?" +하고 나는 ìˆœìž„ì˜ íŽ¸ì§€ì— ì •ìž„ì´ê°€ ì—´ì´ ìžˆë‹¨ ë§ì„ ìƒê°í•˜ì˜€ë‹¤. +"무어요. 괜찮습니다." +하고 ì •ìž„ì€ ì›ƒì—ˆë‹¤. +ì „ë“±ë¹›ì— ë³´ì´ëŠ” ì •ìž„ì˜ ì–¼êµ´ì€ ê·¸ì•¼ë§ë¡œ 대리ì„으로 ê¹Žì€ ë“¯í•˜ì˜€ë‹¤. 여위고 í•기가 없는 ê²ƒì´ ë”ìš± ì •ìž„ì˜ ìš©ëª¨ì— ì—„ìˆ™í•œ ë§›ì„ ì£¼ì—ˆë‹¤. +"ëˆ ê°€ì ¸ì˜¤ì…¨ì–´ìš”?" +하고 순임ì´ê°€ 어리광 절반으로 묻다가 ë‚´ê°€ 웃고 ëŒ€ë‹µì´ ì—†ìŒì„ ë³´ê³ , +"우리를 붙들러 오셨어요?" +하고 성내는 ì–‘ì„ ë³´ì¸ë‹¤. +"그래 둘ì´ì„œë“¤ 간다니 어떻게 간단 ë§ì¸ê°€. 시베리아가 ì–´ë–¤ ê³³ì— ë¶™ì—ˆëŠ”ì§€ ì•Œì§€ë„ ëª»í•˜ë©´ì„œ." +하고 나는 ë‘ ì‚¬ëžŒì´ ê·¸ë¦¬ 슬í¼í•˜ì§€ 아니하는 ìˆœê°„ì„ ë³´ëŠ” ê²ƒì´ ë‹¤í–‰í•˜ì—¬ì„œ ë†ë‹´ì‚¼ì•„ 물었다. +"왜 몰ë¼ìš”? 시베리아가 저기 아니야요?" +하고 순임ì´ê°€ ì‚°í•´ê´€ ìª½ì„ ê°€ë¦¬í‚¤ë©°, +"ìš°ë¦¬ë„ ì§€ë¦¬ì—서 배워서 다 알아요. 어저께 하루 ì¢…ì¼ ì§€ë„를 사다 놓고 연구를 하였답니다. 봉천서 ì‹ ê²½, 신경서 하얼빈, 하얼빈ì—서 만주리, 만주리ì—서 ì´ë¥´ì¿ ì¸ í¬, 보세요, 잘 알지 않습니까. ë˜ ë§Œì¼ ì¤‘ë™ ì² ë„ê°€ 불통ì´ë©´ 어떻게 가는고 하니 여기서 ì‚°í•´ê´€ì„ ê°€ê³ , 산해관서 ë¶ê²½ì„ 가지요. 그리고는 ë¶ê²½ì„œ 장가구를 가지 않습니까. 장가구서 ìžë™ì°¨ë¥¼ 타고 몽고를 통과해서 가거든요. 잘 알지 않습니까." +하고 ì •ìž„ì˜ í—ˆë¦¬ë¥¼ 안으며, +"그렇지ì´?" +하고 ìžì‹  있는 ë“¯ì´ ì›ƒëŠ”ë‹¤. +"ë˜ ëª½ê³ ë¡œë„ ëª» 가게 ë˜ì–´ì„œ 구ë¼íŒŒë¥¼ ëŒê²Œ ë˜ë©´?" +하고 나는 êµì‚¬ê°€ ìƒë„ì—게 묻는 모양으로 물었다. +"네, ì € ì¸ë„양으로 해서 지중해로 해서 프랑스로 해서 그렇게 가지요." +"í—ˆ, 잘 아는구나." +하고 나는 웃었다. +"그렇게만 알아요? ë˜ í•´ì‚¼ìœ„ë¡œ 해서 가는 ê¸¸ë„ ì•Œì•„ìš”. ì €í¬ë¥¼ 어린애로 아시네." +"잘못했소." +"하하." +"후후." +사실 ê·¸ë“¤ì€ ë²Œì¨ ì–´ë¦°ì• ë“¤ì€ ì•„ë‹ˆì—ˆë‹¤. ìˆœìž„ë„ ë²Œì¨ ê·¸ ì•„ë²„ì§€ì˜ ë§í•  수 없는 ì‚¬ì •ì— ë™ì •í•  나ì´ê°€ ë˜ì—ˆë‹¤. 순임ì´ê°€ 기어다닌 ê²ƒì€ ë³¸ 나로는 ì´ê²ƒë„ ì´ìƒí•˜ê²Œ 보였다. 나는 ë²Œì¨ ë‚˜ì´ ë§Žì•˜êµ¬ë‚˜ 하는 ìƒê°ì´ 나지 아니할 수 없었다. +나는 ìž  안 드는 í•˜ë£»ë°¤ì„ ì§€ë‚´ë©´ì„œ 옆방ì—서 ì •ìž„ì´ê°€ ê¸°ì¹¨ì„ ì§“ëŠ” 소리를 들었다. ê·¸ 소리는 ë‚´ ê°€ìŠ´ì„ ì•„í”„ê²Œ 하였다. +ì´íŠ¿ë‚  나는 ë‘ ì‚¬ëžŒì—게 ëˆ ì²œ ì›ì„ 주어서 ì‹ ê²½ 가는 급행차를 태워 주었다. ëŒ€ë¥™ì˜ ì´ ê±´ì¡°í•˜ê³  추운 ê¸°í›„ì— ì •ìž„ì˜ ë³‘ë“  íê°€ 견디어 날까 하고 마ìŒì´ 놓ì´ì§€ 아니하였다. 그러나 나는 ê·¸ë“¤ì„ ê°€ë¼ê³  권할 수는 ìžˆì–´ë„ ê°€ì§€ ë§ë¼ê³  붙들 수는 없었다. 다만 ì œ 아버지, ì œ ì• ì¸ì„ 죽기 ì „ì— ë§Œë‚  수 있기만 빌 ë¿ì´ì—ˆë‹¤. +나는 ë‘ ì•„ì´ë¥¼ ë¶ìª½ìœ¼ë¡œ 떠나 ë³´ë‚´ê³  í˜¼ìž ì—¬ê´€ì— ë“¤ì–´ì™€ì„œ ë„무지 ì •ì‹ ì„ ì§„ì •í•˜ì§€ 못하여 ìˆ ì„ ë¨¹ê³  잊으려 하였다. 그러다가 ê·¸ ë‚  밤차로 서울로 ëŒì•„왔다. +ì´íŠ¿ë‚  ì•„ì¹¨ì— ë‚˜ëŠ” ìµœì„ ë¶€ì¸ì„ 찾아서 순임과 ì •ìž„ì´ê°€ 시베리아로 갔단 ë§ì„ 전하였다. +ê·¸ ë•Œì— ìµœ ë¶€ì¸ì€ ê±°ì˜ ì•„ë¬´ ì •ì‹ ì´ ì—†ëŠ” 듯하였다. 아무 ë§ë„ 하지 아니하고 울고만 있었다. +얼마 있다가 ë¶€ì¸ì€, +"ê·¸ê²ƒë“¤ì´ ì €í¬ë“¤ë¼ë¦¬ 가서 괜찮ì„까요?" +하는 한 마디를 í•  ë¿ì´ì—ˆë‹¤. +ë©°ì¹  í›„ì— ìˆœìž„ì—게서 편지가 왔다. ê·¸ê²ƒì€ í•˜ì–¼ë¹ˆì—서 부친 것ì´ì—ˆë‹¤. +í•˜ì–¼ë¹ˆì„ ì˜¤ëŠ˜ 떠납니다. í•˜ì–¼ë¹ˆì— ì™€ì„œ 아버지 친구 ë˜ì‹œëŠ” Rì†Œìž¥ì„ ë§Œë‚˜ëµˆì˜µê³  아버지 ì¼ì„ 물어 보았습니다. 그리고 ì €í¬ ë‘˜ì´ì„œ 찾아 떠났다는 ë§ì”€ì„ 하였ë”니 Rì†Œìž¥ì´ ëŒ€ë‹¨ížˆ ë™ì •하여서 ì—¬í–‰ê¶Œë„ ì¤€ë¹„í•´ 주시기로 ì €í¬ëŠ” 아버지를 찾아서 오늘 오후 모스í¬ë°” 가는 급행으로 떠납니다. 가다가 Fì—­ì— ë‚´ë¦¬ê¸°ëŠ” 어려울 듯합니다. ì •ìž„ì˜ ê±´ê°•ì´ ëŒ€ë‹¨ížˆ 좋지 못합니다. ì¼ê¸°ê°€ ê°‘ìžê¸° 추워지는 관계ì¸ì§€ ì •ìž„ì˜ ì‹ ì—´ì´ ì˜¤í›„ë©´ 삼십팔 ë„를 넘고 ê¸°ì¹¨ë„ ëŒ€ë‹¨í•©ë‹ˆë‹¤. 저는 염려가 ë˜ì–´ì„œ ì •ìž„ë”러 하얼빈ì—서 ìž…ì›í•˜ì—¬ 조리를 하ë¼ê³  권하였지마는 ë„무지 듣지를 아니합니다. 어디까지든지 가는 대로 가다가 ë” ëª» 가게 ë˜ë©´ ê·¸ ê³³ì—서 죽는다고 합니다. +저는 ê·¸ ë™ì•ˆ ë©°ì¹  정임과 ê°™ì´ ìžˆëŠ” ì¤‘ì— ì •ìž„ì´ê°€ 어떻게 아름답고 높고 굳세게 깨ë—한 ì—¬ìžì¸ ê²ƒì„ ë°œê²¬í•˜ì˜€ìŠµë‹ˆë‹¤. 저는 지금까지 ì •ìž„ì„ ëª°ë¼ë³¸ ê²ƒì„ ë¶€ë„럽게 ìƒê°í•©ë‹ˆë‹¤. 그리고 ë˜ ì œ 아버지께서 어떻게 갸륵한 어른ì´ì‹  ê²ƒì„ ì¸ì œì•¼ 깨달았습니다. ìžì‹ ëœ ì €ê¹Œì§€ë„ ì•„ë²„ì§€ì™€ ì •ìž„ê³¼ì˜ ê´€ê³„ë¥¼ ì˜ì‹¬í•˜ì˜€ìŠµë‹ˆë‹¤. ì˜ì‹¬í•˜ëŠ” 것보다는 세ìƒì—서 ë§í•˜ëŠ” 대로 믿고 있었습니다. 그러나 ì •ìž„ì„ ë§Œë‚˜ ë³´ê³  ì •ìž„ì˜ ë§ì„ 듣고 아버지께서 ì„ ìƒë‹˜ê»˜ 드린 편지가 ëª¨ë‘ ì°¸ì¸ ê²ƒì„ ê¹¨ë‹¬ì•˜ìŠµë‹ˆë‹¤. 아버지께서는 ì¹œêµ¬ì˜ ì˜ì§€ 없는 ë”¸ì¸ ì •ìž„ì„ ë‹¹ì‹ ì˜ ì¹œí˜ˆìœ¡ì¸ ì €ì™€ ê¼­ ê°™ì´ ì‚¬ëž‘í•˜ë ¤ê³  하신 것ì´ì—ˆìŠµë‹ˆë‹¤. ê·¸ê²ƒì´ ì–¼ë§ˆë‚˜ 갸륵한 ì¼ìž…니까. ê·¸ëŸ°ë° ì œ 어머니와 저는 ê·¸ 갸륵하신 ì •ì‹ ì„ ëª°ë¼ë³´ê³  오해하였습니다. 어머니는 질투하시고 저는 시기하였습니다. ì´ê²ƒì´ 얼마나 아버지를 그렇게 갸륵하신 아버지를 몰ë¼ëµˆì˜¨ 것입니다. ì´ê²ƒì´ 얼마나 ë¶€ë„럽고 ì›í†µí•œ ì¼ìž…니까. +ì„ ìƒë‹˜ê»˜ì„œë„ 여러 번 ì•„ë²„ì§€ì˜ ì¸ê²©ì´ 높다는 ê²ƒì„ ì €í¬ ëª¨ë…€ì—게 설명해 주셨습니다마는 마ìŒì´ 막힌 저는 ì„ ìƒë‹˜ì˜ ë§ì”€ë„ 믿지 아니하였습니다. +ì„ ìƒë‹˜, ì •ìž„ì€ ì°¸ìœ¼ë¡œ 아버지를 사랑합니다. ì •ìž„ì—게는 ì´ ì„¸ìƒì— 아버지밖ì—는 사랑하는 ì•„ë¬´ê²ƒë„ ì—†ì´, 그렇게 외â—으로, 그렇게 열렬하게 아버지를 사모하고 사랑합니다. 저는 잘 압니다. ì •ìž„ì´ê°€ 처ìŒì—는 아버지로 ì‚¬ëž‘í•˜ì˜€ë˜ ê²ƒì„, 그러나 ì–´ëŠ ìƒˆì— ì •ìž„ì˜ ì•„ë²„ì§€ì—게 대한 ì‚¬ëž‘ì´ ë¬´ì—‡ì¸ì§€ 모를 사랑으로 변한 것ì„, ê·¸ê²ƒì´ ì—°ì• ëƒ í•˜ê³  물으면 ì •ìž„ì€ ì•„ë‹ˆë¼ê³  í•  것입니다. ì •ìž„ì˜ ê·¸ ëŒ€ë‹µì€ ê²°ì½” ê±°ì§“ì´ ì•„ë‹™ë‹ˆë‹¤. ì •ìž„ì€ ìˆ™ì„±í•˜ì§€ë§ˆëŠ” ì•„ì§ë„ 극히 순결합니다. ì •ìž„ì€ ë¶€ëª¨ë¥¼ ìžƒì€ í›„ì— ì•„ë²„ì§€ë°–ì— ì‚¬ëž‘í•œ ì‚¬ëžŒì´ ì—†ìŠµë‹ˆë‹¤. ë˜ ì•„ë²„ì§€ì—ê²Œë°–ì— ì‚¬ëž‘ë°›ë˜ ì¼ë„ 없습니다. ê·¸ëŸ¬ë‹ˆê¹ ì •ìž„ì€ ì•„ë²„ì§€ë¥¼ 그저 사랑합니다 ì „ì ìœ¼ë¡œ 사랑합니다. ì„ ìƒë‹˜, ì •ìž„ì˜ ì‚¬ëž‘ì—는 ì•„ë²„ì§€ì— ëŒ€í•œ ìžì‹ì˜ 사랑, 오ë¼ë¹„ì— ëŒ€í•œ 누ì´ì˜ 사랑, 사내 ì¹œêµ¬ì— ëŒ€í•œ ì—¬ìž ì¹œêµ¬ì˜ ì‚¬ëž‘, ì• ì¸ì— 대한 ì• ì¸ì˜ 사랑, ì´ ë°–ì— ì¡´ê²½í•˜ê³  숭배하는 ì„ ìƒì— 대한 ì œìžì˜ 사랑까지, ì‚¬ëž‘ì˜ ëª¨ë“  종류가 í¬í•¨ë˜ì–´ 있는 ê²ƒì„ ì €ëŠ” 발견하였습니다. +ì„ ìƒë‹˜, ì •ìž„ì˜ ì •ìƒì€ 차마 ë³¼ 수가 없습니다. ì•„ë²„ì§€ì˜ ì•ˆë¶€ë¥¼ 근심하는 ì–‘ì€ ì œ 몇십 배나 ë˜ëŠ”ì§€ 모르게 간절합니다. ì •ìž„ì€ ì € ë•Œë¬¸ì— ì•„ë²„ì§€ê°€ 불행하게 ë˜ì…¨ë‹¤ê³  해서 차마 ë³¼ 수 없게 애통하고 있습니다. ì§„ì •ì„ ë§ì”€í•˜ì˜¤ë©´ 저는 지금 ì•„ë²„ì§€ë³´ë‹¤ë„ ì–´ë¨¸ë‹ˆë³´ë‹¤ë„ ì •ìž„ì—게 가장 ë™ì •ì´ ëŒë¦½ë‹ˆë‹¤. ì„ ìƒë‹˜, 저는 아버지를 찾아가는 ê²ƒì´ ì•„ë‹ˆë¼ ì •ìž„ì„ ë•기 위하여 간호하기 위하여 가는 것 같습니다. +ì„ ìƒë‹˜, 저는 ì•„ì§ ì‚¬ëž‘ì´ëž€ ê²ƒì´ ë¬´ì—‡ì¸ì§€ë¥¼ 모릅니다. 그러나 ì •ìž„ì„ ë³´ê³  사랑ì´ëž€ ê²ƒì´ ì–´ë–»ê²Œ 신비하고 열렬하고 놀ë¼ìš´ 것ì¸ê°€ë¥¼ 안 것 같습니다. +ìˆœìž„ì˜ íŽ¸ì§€ëŠ” 계ì†ëœë‹¤. +ì„ ìƒë‹˜, í•˜ì–¼ë¹ˆì— ì˜¤ëŠ” ê¸¸ì— ì†¡í™”ê°• êµ½ì´ë¥¼ ë³¼ 때ì—는 ì •ìž„ì´ê°€ 어떻게나 울었는지, ê·¸ê²ƒì€ ì°¨ë§ˆ ë³¼ 수가 없었습니다. 아버지께서 ì†¡í™”ê°•ì„ ë³´ì‹œê³  ê°ìƒì´ 깊으셨ë”란 ê²ƒì„ ìƒê°í•œ 것입니다. 무ì¸ì§€ê²½ìœ¼ë¡œ, 허옇게 ëˆˆì´ ë®ì¸ 벌íŒìœ¼ë¡œ í˜ëŸ¬ê°€ëŠ” 송화강 êµ½ì´, ê·¸ê²ƒì€ ìŠ¬í”ˆ í’경입니다. 아버지께서 여기를 지나실 때ì—는 마른 풀만 있는 ê´‘ì•¼ì˜€ì„ ê²ƒì´ë‹ˆ ê·¸ 때ì—는 ë”ìš± í™©ëŸ‰í•˜ì˜€ì„ ê²ƒì´ë¼ê³  ì •ìž„ì€ ë§í•˜ê³  ì›ë‹ˆë‹¤. +ì •ìž„ì€ ì œê°€ 아버지를 아는 것보다 아버지를 잘 아는 것 같습니다. í‰ì†Œì— 아버지와는 그리 ì ‘ì´‰ì´ ì—†ê±´ë§ˆëŠ” ì •ìž„ì€ ì•„ë²„ì§€ì˜ ì˜ì§€ë ¥, ì•„ë²„ì§€ì˜ ìˆ¨ì€ ì—´ì •, ì•„ë²„ì§€ì˜ ì„±ë¯¸ê¹Œì§€ 잘 압니다. 저는 ì •ìž„ì˜ ë§ì„ 듣고야 비로소 ì°¸ 그래, 하는 ê°íƒ„ì„ ë°œí•œ ì¼ì´ 여러 번 있습니다. +ì •ìž„ì˜ ë§ì„ 듣고야 비로소 아버지가 남보다 뛰어나신 ì¸ë¬¼ì¸ ê²ƒì„ ê¹¨ë‹¬ì•˜ìŠµë‹ˆë‹¤. 아버지는 ì •ì˜ê°ì´ 굳세고 겉으로는 싸늘하ë„ë¡ ì´ì§€ì ì´ì§€ë§ˆëŠ” ì†ì—는 불 ê°™ì€ ì—´ì •ì´ ìžˆìœ¼ì‹œê³ , 아버지는 쇠 ê°™ì€ ì˜ì§€ë ¥ê³¼ 칼날 ê°™ì€ íŒë‹¨ë ¥ì´ 있어서 언제나 ì£¼ì €í•˜ì‹¬ì´ ì—†ê³  ë˜ í”ë“¤ë¦¬ì‹¬ì´ ì—†ë‹¤ëŠ” 것, 아버지께서는 모든 ê²ƒì„ ìš©ì„œí•˜ê³  모든 ê²ƒì„ í˜¸ì˜ë¡œ í•´ì„하여서 누구를 미워하거나 ì›ë§í•˜ì‹¬ì´ 없는 등, ì •ìž„ì€ ì•„ë²„ì§€ì˜ ë§ˆìŒì˜ 목ë¡ê³¼ 설명서를 따로 외우는 것처럼 ì•„ë²„ì§€ì˜ ì„±ê²©ì„ ì„¤ëª…í•©ë‹ˆë‹¤. 듣고 보아서 비로소 ì•„ë²„ì§€ì˜ ë”¸ì¸ ì €ëŠ” ë‚´ 아버지가 ì–´ë–¤ 아버지ì¸ê°€ë¥¼ 알았습니다. +ì„ ìƒë‹˜, ì´í•´ê°€ ì‚¬ëž‘ì„ ë‚³ëŠ”ë‹¨ ë§ì”€ì´ 있지마는 저는 ì •ìž„ì„ ë³´ì•„ì„œ ì‚¬ëž‘ì´ ì´í•´ë¥¼ 낳는 ê²ƒì´ ì•„ë‹Œê°€ 합니다. +어쩌면 어머니와 저는 í‰ìƒì„ 아버지를 모시고 ìžˆìœ¼ë©´ì„œë„ ì•„ë²„ì§€ë¥¼ 몰ëžìŠµë‹ˆê¹Œ. ì´ì„±ì´ 무디고 ì–‘ì‹¬ì´ í려서 그랬습니까. ì •ìž„ì€ ì§„ì‹¤ë¡œ 존경할 ì—¬ìžìž…니다. 제가 남ìžë¼ 하ë”ë¼ë„ ì •ìž„ì„ ì•„ë‹ˆ 사랑하고는 못 견디겠습니다. +아버지는 분명 ì •ìž„ì„ ì‚¬ëž‘í•˜ì‹  것입니다. 처ìŒì—는 ì¹œêµ¬ì˜ ë”¸ë¡œ, 다ìŒì—는 친딸과 ê°™ì´, ë˜ ë‹¤ìŒì—는 무엇ì¸ì§€ 모르게 뜨거운 ì‚¬ëž‘ì´ ìƒê²¼ìœ¼ë¦¬ë¼ê³  믿습니다. ê·¸ê²ƒì„ ì•„ë²„ì§€ëŠ” ì£½ì¸ ê²ƒìž…ë‹ˆë‹¤. ê·¸ê²ƒì„ ì£½ì´ë ¤ê³  ì´ ë‹¬í•  수 없는 ì‚¬ëž‘ì„ ì£½ì´ë ¤ê³  시베리아로 달아나신 것입니다. ì¸ì œì•¼ 아버지께서 ì„ ìƒë‹˜ê»˜ 하신 íŽ¸ì§€ì˜ ëœ»ì´ ì•Œì•„ì§„ 것 같습니다. ë°±ì„¤ì´ ë®ì¸ ì‹œë² ë¦¬ì•„ì˜ ì‚¼ë¦¼ ì†ìœ¼ë¡œ í˜¼ìž í—¤ë§¤ë©° ì •ìž„ì—게로 향하는 ì‚¬ëž‘ì„ ì£½ì´ë ¤ê³  무진 애를 쓰시는 ê·¸ ì‹¬ì •ì´ ì•Œì•„ì§€ëŠ” 것 같습니다. +ì„ ìƒë‹˜ ì´ê²ƒì´ 얼마나 비참한 ì¼ìž…니까. 저는 ì •ìž„ì˜ ì§ì— 지니고 온 ì¼ê¸°ë¥¼ 보다가 ì´ëŸ¬í•œ êµ¬ì ˆì„ ë°œê²¬í•˜ì˜€ìŠµë‹ˆë‹¤. +ì„ ìƒë‹˜. 저는 세ì¸íЏ ì˜¤ê±°ìŠ¤í‹´ì˜ <참회ë¡>ì„ ì ˆë°˜ì´ë‚˜ 다 ë³´ê³  ë‚˜ë„ ìž ì´ ë“¤ì§€ 아니합니다. ìž ì´ ë“¤ê¸° ì „ì— ì œê°€ í•­ìƒ ì¦ê²¨í•˜ëŠ” ì•„ë² ë§ˆë¦¬ì•„ì˜ ë…¸ëž˜ë¥¼ 유성기로 듣고 나서 오늘 ì¼ê¸°ë¥¼ 쓰려고 하니 슬픈 소리만 나옵니다. +사랑하는 어른ì´ì—¬. 저는 멀리서 ë‹¹ì‹ ì„ ì¡´ê²½í•˜ê³  신뢰하는 마ìŒì—서만 살아야 í•  ê²ƒì„ ìž˜ 압니다. 여기ì—서 ì˜ì›í•œ 정지를 하지 아니하면 아니 ë©ë‹ˆë‹¤. ë¹„ë¡ ì œ ìƒëª…ì´ ê´´ë¡œì›€ìœ¼ë¡œ ëŠì–´ì§€ê³  ì œ í˜¼ì´ í”¼ì–´ ë³´ì§€ 못하고 스러져 버리ë”ë¼ë„ 저는 ì´ ë©€ë¦¬ì„œ ë°”ë¼ë³´ëŠ” 존경과 ì‹ ë¢°ì˜ ì‹¬ê²½ì—서 한 ë°œìžêµ­ì´ë¼ë„ 옮기지 않아야 í•  ê²ƒì„ ìž˜ 압니다. 나를 위하여 놓여진 ìƒì˜ 궤ë„는 ë‚˜ì˜ ìƒëª…ì„ ë¶€ì¸í•˜ëŠ” ì–µì§€ì˜ ê¸¸ìž…ë‹ˆë‹¤. 제가 몇 ë…„ ì „ 기숙사 베드ì—서 ì´ëŸ° ë°¤ì— ë‚´ë‹¤ë³´ë©´ ì¦ê²ê³  ì•„ë¦„ë‹µë˜ ë‚´ ìƒì˜ ê¿ˆì€ ë‹¤ 깨어졌습니다. +ì œ ì˜í˜¼ì˜ 한 ì¡°ê°ì´ 먼 ì„¸ìƒ ì•Œì§€ 못할 세계로 떠다니고 있습니다. 잃어버린 ë§ˆìŒ ì¡°ê° ì–´ì°Œí•˜ë‹¤ê°€ 제가 ì´ë ‡ê²Œ ë˜ì—ˆëŠ”ì§€ 모릅니다. +피어 오르는 ìƒëª…ì˜ ê´‘ì±„ë¥¼ 스스로 ì‚¬í˜•ì— ì²˜í•˜ì§€ 아니하면 아니 ë  ë•Œ ì–´ì°Œ ìŠ¬í””ì´ ì—†ê² ìŠµë‹ˆê¹Œ. ì´ê²ƒì€ 현실로 ì‚¬ëžŒì˜ ìƒëª…ì„ ì£½ì´ëŠ” 것보다 ë” ë¬´ì„œìš´ 죄가 아니오리까. ë‚˜ì˜ ì„¸ê³„ì—서 처ìŒì´ìš” 마지막으로 발견한 ë¹›ì„ ì–´ë‘  ì†ì— 소멸해 버리ë¼ëŠ” ì´ ì¼ì´ 얼마나 떨리는 ì§ë¬´ì˜¤ë¦¬ê¹Œ. ì´ í—ˆê¹¨ë¹„ì˜ í˜•ì˜ ì‚¬ëžŒì´ ì‚´ê¸° 위하여 ë‚´ ì†ìœ¼ë¡œ ì¹¼ì„ ë“¤ì–´ ë‚´ ì˜í˜¼ì˜ 환í¬ë¥¼ ì³ì•¼ 옳습니까. 저는 í•˜ë‚˜ë‹˜ì„ ì›ë§í•©ë‹ˆë‹¤. +ì´ë ‡ê²Œ 씌어 있습니다. ì„ ìƒë‹˜ ì´ê²ƒì´ 얼마나 피 í르는 고백입니까. +ì„ ìƒë‹˜, 저는 ì •ìž„ì˜ ì´ ê³ ë°±ì„ ë³´ê³  무조건으로 ì •ìž„ì˜ ì‚¬ëž‘ì„ ì‹œì¸í•©ë‹ˆë‹¤. ì„ ìƒë‹˜, ì œ ëª©ìˆ¨ì„ ë°”ì³ì„œ 하는 ì¼ì— 누가 시비를 하겠습니까. ë”구나 ê·¸ ë™ê¸°ì— í‹°ëŒë§Œí¼ë„ 불순한 ê²ƒì´ ì—†ìŒì—야 무조건으로 시ì¸í•˜ì§€ 아니하고 어찌합니까. +ë°”ë¼ê¸°ëŠ” ì •ìž„ì˜ ë³‘ì´ í¬ê²Œ ë˜ì§€ 아니하고 아버지께서 무사히 계셔서 ì†ížˆ 만나뵙게 ë˜ëŠ” 것입니다마는 ì•žê¸¸ì´ ë§ë§í•˜ì—¬ ê°€ìŠ´ì´ ë‘ê·¼ê±°ë¦¼ì„ ê¸ˆì¹˜ 못합니다. 게다가 ì˜¤ëŠ˜ì€ í•¨ë°•ëˆˆì´ í¼ë¶€ì–´ì„œ 천지가 온통 회색으로 한 ë¹›ì´ ë˜ì—ˆìœ¼ë‹ˆ ë”ìš± ì „ë„ê°€ 막막합니다. 그러나 ì„ ìƒë‹˜ 저는 앓는 ì •ìž„ì„ ë°ë¦¬ê³  ìš©ê°í•˜ê²Œ 시베리아 ê¸¸ì„ ë– ë‚©ë‹ˆë‹¤. +한 ì¼ ì£¼ì¼ í›„ì— ë˜ íŽ¸ì§€ 한 ìž¥ì´ ì™”ë‹¤. ê·¸ê²ƒë„ ìˆœìž„ì˜ íŽ¸ì§€ì—¬ì„œ ì´ëŸ¬í•œ ë§ì´ 있었다. +……오늘 ìƒˆë²½ì— í¥ì•ˆë ¹ì„ 지났습니다. 플랫í¼ì˜ 한란계는 ì˜í•˜ ì´ì‹­ì‚¼ ë„를 가리켰습니다. ì‚¬ëžŒë“¤ì˜ ì–¼êµ´ì€ ì†œí„¸ì— ì„±ì—ê°€ 슬어서 남녀 노소 í•  것 ì—†ì´ í•˜ì–—ê²Œ ë¶„ì„ ë°”ë¥¸ 것 같습니다. ìœ ë¦¬ì— ë¹„ì¹œ ë‚´ ì–¼êµ´ë„ ê·¸ì™€ ê°™ì´ í° ê²ƒì„ ë³´ê³  놀ëžìŠµë‹ˆë‹¤. ìˆ¨ì„ ë“¤ì´ì‰´ 때ì—는 ì½”í„¸ì´ ì–¼ì–´ì„œ ìˆ¨ì´ ëŠê¸°ê³  ë°”ëžŒê²°ì´ ì§€ë‚˜ê°€ë©´ ëˆˆë¬¼ì´ ì–¼ì–´ì„œ 눈ì¹ì´ 마주 붙습니다. ì‚¬ëžŒë“¤ì€ í„¸ê³¼ ê°€ì£½ì— ì‹¸ì—¬ì„œ ê³°ê°™ì´ ë³´ìž…ë‹ˆë‹¤. +ë˜ ì´ëŸ° ë§ë„ 있었다. +ì•„ë¼ì‚¬ ê³„ì§‘ì• ë“¤ì´ ìš°ìœ ë³‘ë“¤ì„ í’ˆì— í’ˆê³  서서 ì†ë‹˜ì´ 사기를 기다리고 있습니다. ì €ë„ ë‘ ë³‘ì„ ì‚¬ì„œ ì •ìž„ì´ì™€ 나누어 먹었습니다. 우유는 따뜻합니다. ê·¸ê²ƒì„ ì‹ížˆì§€ 아니할 양으로 í’ˆì— í’ˆê³  ì„°ë˜ ê²ƒìž…ë‹ˆë‹¤. +ë˜ ì´ëŸ¬í•œ êµ¬ì ˆë„ ìžˆì—ˆë‹¤. +ì •ê±°ìž¥ì— ë‹¿ì„ ë•Œë§ˆë‹¤ ì €í¬ë“¤ì€ ë°–ì„ ë‚´ë‹¤ë´…ë‹ˆë‹¤. 행여나 아버지가 거기 계시지나 아니할까 하고요. 차가 어길 때ì—는 ë”구나 마ìŒì´ 조입니다. 아버지가 ê·¸ 차를 타고 지나가시지나 아니하는가 하고요. 그리고는 ì •ìž„ì€ ì›ë‹ˆë‹¤. ê¼­ 뵈올 ì–´ë¥¸ì„ ë†“ì³ë‚˜ 버린 듯ì´. +그리고는 ì´ ì£¼ì¼ ë™ì•ˆì´ë‚˜ 소ì‹ì´ 없다가 편지 한 ìž¥ì´ ì™”ë‹¤. ê·¸ê²ƒì€ ì •ìž„ì˜ ê¸€ì”¨ì˜€ë‹¤. +ì„ ìƒë‹˜, 저는 지금 최 ì„ ìƒê»˜ì„œ ê³„ì‹œë˜ ë°”ì´ì¹¼ í˜¸ë°˜ì˜ ê·¸ ì§‘ì— ì™€ì„œ 홀로 누웠습니다. ìˆœìž„ì€ ì£¼ì¸ ë…¸íŒŒì™€ 함께 F역으로 최 ì„ ìƒì„ 찾아서 오늘 ì•„ì¹¨ì— ë– ë‚˜ê³  병든 저만 í˜¼ìž ëˆ„ì›Œì„œ ì–¼ìŒì— ì‹¸ì¸ ë°”ì´ì¹¼ í˜¸ì˜ ëˆˆë³´ë¼ì¹˜ëŠ” 바람 소리를 듣고 있습니다. ì—´ì€ ì‚¼ì‹­íŒ” ë„로부터 구 ë„ ì‚¬ì´ë¥¼ 오르내리고 ê¸°ì¹¨ì€ ë‚˜ê³  ëª¸ì˜ ê´´ë¡œì›€ì„ ê²¬ë”œ 수 없습니다. 그러하오나 ì„ ìƒë‹˜, 저는 í•˜ë‚˜ë‹˜ì„ ë¶ˆëŸ¬ì„œ ì¶•ì›í•©ë‹ˆë‹¤. ì´ ì‹¤ë‚± ê°™ì€ ìƒëª…ì´ ë‹¤ 타 버리기 ì „ì— ìµœ ì„ ìƒì˜ ë‚¯ì„ ë‹¤ë§Œ ì¼ ì´ˆ ë™ì•ˆì´ë¼ë„ 보여지ì´ë¼ê³ . 그러하오나 ì„ ìƒë‹˜, ì´ ì¶•ì›ì´ ì´ë£¨ì–´ì§€ê² ìŠµë‹ˆê¹Œ. +저는 한사코 F역까지 가려 하였사오나 순임 í˜•ì´ ìš¸ê³  막사오며 ë˜ ì£¼ì¸ ë…¸íŒŒê°€ 본래 미국 사람과 ì‚´ë˜ ì‚¬ëžŒìœ¼ë¡œ ì˜ì–´ë¥¼ 알아서 순임 í˜•ì˜ ë„ì›€ì´ ë˜ê² ê¸°ë¡œ 저는 ì´ ê³³ì— ëˆ„ì›Œ 있습니다. 순임 í˜•ì€ ê¸°ì–´ì½” 아버지를 찾아 모시고 오마고 약ì†í•˜ì˜€ì‚¬ì˜¤ë‚˜ ì´ ë„“ì€ ì‹œë² ë¦¬ì•„ì—서 ì–´ë”” 가서 찾겠습니까. +ì„ ìƒë‹˜, 저는 죽ìŒì„ 봅니다. 죽ìŒì´ 바로 ì œ ì•žì— ì™€ì„œ ì„  ê²ƒì„ ë´…ë‹ˆë‹¤. ê·¸ì˜ ì†ì€ ì œ 여윈 ì†ì„ 잡으려고 ë“¤ë¨¹ê±°ë¦¼ì„ ë´…ë‹ˆë‹¤. +ì„ ìƒë‹˜, ì£½ì€ ë’¤ì—ë„ ì˜ì‹ì´ 남습니까. ë§Œì¼ ì˜ì‹ì´ 남는다 하면 ì£½ì€ ë’¤ì—ë„ ì´ ì•„í””ê³¼ ê´´ë¡œì›€ì„ ê³„ì†í•˜ì§€ 아니하면 아니 ë©ë‹ˆê¹Œ. ì£½ì€ ë’¤ì—는 ì˜¤ì§ ì˜ì›í•œ ì–´ë‘ ê³¼ ìžŠì–´ë²„ë¦¼ì´ ìžˆìŠµë‹ˆê¹Œ. ì£½ì€ ë’¤ì—는 혹시나 ìƒì „ì— ë¨¹ì—ˆë˜ ë§ˆìŒì„ ìžìœ ë¡œ 펼 ë„리가 있습니까. ì´ ì„¸ìƒì—서 그립고 ì‚¬ëª¨í•˜ë˜ ì´ë¥¼ ì£½ì€ ë’¤ì—는 ìžìœ ë¡œ 만나 ë³´ê³  언제나 마ìŒê» ê°™ì´í•  수가 있습니까. 그런 ì¼ë„ 있습니까. ì´ëŸ° ì¼ì„ ë°”ë¼ëŠ” ê²ƒë„ ì£„ê°€ ë©ë‹ˆê¹Œ. +ì •ìž„ì˜ íŽ¸ì§€ëŠ” ë”ìš± ì ˆë§ì ì¸ 어조로 찬다. +저는 ì²˜ìŒ ë³‘ì´ ë‚¬ì„ ë•Œì—는 죽는 ê²ƒì´ ì‹«ê³  무서웠습니다. 그러나 ì§€ê¸ˆì€ ì£½ëŠ” ê²ƒì´ ì¡°ê¸ˆë„ ë¬´ì„­ì§€ 아니합니다. 다만 차마 죽지 못하는 ê²ƒì´ í•œ. +하고는 `다만 차마' ì´í•˜ë¥¼ ë°•ë°• 지워 버렸다. 그리고는 새로 시작하여 나와내 가족ì—게 대한 ë¬¸ì•ˆì„ í•˜ê³ ëŠ” ëì„ ë§‰ì•˜ë‹¤. +나는 ì´ íŽ¸ì§€ë¥¼ 받고 울었다. 무슨 í° ë¹„ê·¹ì´ ê°€ê¹Œìš´ ê²ƒì„ ì˜ˆìƒí•˜ê²Œ 하였다. +ê·¸ 후 한 ì‹­ì—¬ ì¼ì´ë‚˜ 지나서 ì „ë³´ê°€ 왔다. ê·¸ê²ƒì€ ì˜ë¬¸ìœ¼ë¡œ 씌었는ë°, +"아버지 ë³‘ì´ ê¸‰í•˜ë‹¤. 나로는 ì–´ì©” 수 없다. ëˆ ê°€ì§€ê³  ê³§ 오기를 바란다." +하고 ê·¸ ëì— B호텔ì´ë¼ê³  주소를 ì ì—ˆë‹¤. ì „ë³´ ë°œì‹ êµ­ì´ ì´ë¥´ì¿ ì¸ í¬ì¸ ê²ƒì„ ë³´ë‹ˆ B호텔ì´ë¼ í•¨ì€ ì´ë¥´ì¿ ì¸ í¬ì¸ ê²ƒì´ ë¶„ëª…í•˜ì˜€ë‹¤. +나는 ìµœì„ ë¶€ì¸ì—게 최ì„ì´ê°€ ì•„ì§ ì‚´ì•„ 있다는 ê²ƒì„ ì „í•˜ê³  ê³§ 여행권 수ì†ì„ 하였다. ì ˆë§ìœ¼ë¡œ ì•Œì•˜ë˜ ì—¬í–‰ê¶Œì€ ì‚¬ì •ì´ ì‚¬ì •ì¸ë§Œí¼ ê³§ 발부ë˜ì—ˆë‹¤. +나는 비행기로 ì—¬ì˜ë„를 떠났다. ë°±ì„¤ì— ê°œê°œí•œ ë•…ì„, 남빛으로 푸른 바다를 굽어보는 ë™ì•ˆì— ëŒ€ë ¨ì„ ë“¤ëŸ¬ 거기서 다른 비행기를 갈아타고 봉천, ì‹ ê²½, í•˜ì–¼ë¹ˆì„ ê±°ì³, ì¹˜ì¹˜í•˜ì–¼ì— ë“¤ë €ë‹¤ê°€ 만주리로 급행하였다. +웅대한 ëŒ€ë¥™ì˜ ì„¤ê²½ë„ ë‚˜ì—게 아무러한 ì¸ìƒë„ 주지 못하였다. 다만 푸른 하늘과 í¬ê³  í‰í‰í•œ ë•…ê³¼ì˜ ì‚¬ì´ë¡œ 한량 ì—†ì´ í—ˆê³µì„ ë‚ ì•„ê°„ë‹¤ëŠ” ìƒê°ë°–ì— ì—†ì—ˆë‹¤. ê·¸ê²ƒì€ ì‚¬ëž‘í•˜ëŠ” ë‘ ì¹œêµ¬ê°€ ëª©ìˆ¨ì´ ê²½ê°ì— 달린 ê²ƒì„ ìƒê°í•  ë•Œì— ë§ˆìŒì— 아무 ì—¬ìœ ë„ ì—†ëŠ” 까닭ì´ì—ˆë‹¤. +만주리ì—ì„œë„ ë¹„í–‰ê¸°ë¥¼ 타려 하였으나 소비ì—트 ê´€í—Œì´ í—ˆë½ì„ 아니 하여 열차로 ê°ˆ ìˆ˜ë°–ì— ì—†ì—ˆë‹¤. +초조한 몇 ë°¤ì„ ì§€ë‚˜ê³  ì´ë¥´ì¿ ì¸ í¬ì— 내린 ê²ƒì´ ì˜¤ì „ ë‘시. 나는 B호텔로 ì´ìŠ¤ë³´ìŠ¤ì¹˜ì¹´ë¼ëŠ” 마차를 몰았다. 죽ìŒê³¼ ê°™ì´ ê³ ìš”í•˜ê²Œ 눈 ì†ì— ìžëŠ” 시간ì—는 여기저기 ì „ë“±ì´ ë°˜ì§ê±°ë¦´ ë¿, ì´ë”°ê¸ˆ ë°¤ì˜ ì‹œê°€ë¥¼ 경계하는 ë³‘ì •ë“¤ì˜ ëˆˆì´ ë¬´ì„­ê²Œ 빛나는 ê²ƒì´ ë³´ì˜€ë‹¤. +B호텔ì—서 미스 ì´ˆì´(최 ì–‘)를 찾았으나 ìˆœìž„ì€ ì—†ê³  ì–´ë–¤ 서양 노파가 나와서, +"유 미스터 Y?" +하고 ì˜ì‹¬ìŠ¤ëŸ¬ìš´ 눈으로 나를 보았다. +그렇다는 ë‚´ ëŒ€ë‹µì„ ë“£ê³ ëŠ” 노파는 반갑게 ì†ì„ 내밀어서 ë‚´ ì†ì„ 잡았다. +나는 넉넉하지 못한 ì˜ì–´ë¡œ ê·¸ 노파ì—게서 최ì„ì´ê°€ ì•„ì§ ì‚´ì•˜ë‹¤ëŠ” ë§ê³¼ ì •ìž„ì˜ ì†Œì‹ì€ ë“¤ì€ ì§€ 오래ë¼ëŠ” ë§ê³¼ 최ì„ê³¼ ìˆœìž„ì€ ì—¬ê¸°ì„œ 삼십 마ì¼ì´ë‚˜ 떨어진 Fì—­ì—ì„œë„ ì°ë§¤ë¡œ ë” ê°€ëŠ” 삼림 ì†ì— 있다는 ë§ì„ 들었다. +나는 ê·¸ ë°¤ì„ ì—¬ê¸°ì„œ 지내고 ì´íŠ¿ë‚  ì•„ì¹¨ì— ë– ë‚˜ëŠ” 완행차로 ê·¸ 노파와 함께 ì´ë¥´ì¿ ì¸ í¬ë¥¼ 떠났다. +ì´ ë‚ ë„ ì²œì§€ëŠ” ì˜¤ì§ ëˆˆë¿ì´ì—ˆë‹¤. 차는 ê°€ë” ì‚¼ë¦¼ 중으로 가는 모양ì´ë‚˜ ëª¨ë‘ íšŒìƒ‰ë¹›ì— ê°€ë¦¬ì›Œì„œ 분명히 ë³´ì´ì§€ë¥¼ 아니하였다. +Fì—­ì´ë¼ëŠ” ê²ƒì€ ì‚¼ë¦¼ ì†ì— 있는 조그마한 정거장으로 ì§‘ì´ë¼ê³ ëŠ” 정거장 ì§‘ë°–ì— ì—†ì—ˆë‹¤. ì—­ë¶€ ë‘ì—‡ì´ í„¸ì˜·ì— í•˜ì–—ê²Œ ëˆˆì„ ë’¤ì“°ê³  졸리는 ë“¯ì´ ì˜¤ë½ê°€ë½í•  ë¿ì´ì—ˆë‹¤. +우리는 ì°ë§¤ 하나를 얻어 타고 어디가 길ì¸ì§€ ë¶„ëª…ì¹˜ë„ ì•„ë‹ˆí•œ 눈 ì†ìœ¼ë¡œ ë§ì„ 몰았다. +ë°”ëžŒì€ ì—†ëŠ” 듯하지마는 ê·¸ëž˜ë„ ëˆˆë°œì„ í•œíŽ¸ìœ¼ë¡œ 비ë¼ëŠ” 모양ì´ì–´ì„œ 아름드리 ë‚˜ë¬´ë“¤ì˜ í•œìª½ì€ í•˜ì–—ê²Œ 눈으로 쌓ì´ê³  í•œìª½ì€ ê²€ì€ ë¹›ì´ ë”ìš± ë‹ë³´ì˜€ë‹¤. ë°± ì²™ì€ ë„˜ì„ ë“¯í•œ 꼿꼿한 침엽수(전나무 따윈가)ë“¤ì´ ì–´ë””ê¹Œì§€ë“ ì§€, 하늘ì—서 ê³§ ë‚´ë ¤ë°•ì€ ëª» 모양으로, ìˆ˜ì—†ì´ ì„œ 있는 사ì´ë¡œ 우리 ì°ë§¤ëŠ” 간다. ë•…ì— ë®ì¸ ëˆˆì€ ìƒˆë¡œ 피워 ë†“ì€ ì†œê°™ì´ í¬ì§€ë§ˆëŠ” 하늘ì—서 내리는 ëˆˆì€ êµ¬ë¦„ë¹›ê³¼ 공기빛과 어울려서 ë°¥ ìž¦íž ë•Œì— êµ´ëšì—서 나오는 연기와 ê°™ì´ ì—°íšŒìƒ‰ì´ë‹¤. +ë°”ëžŒë„ ë¶ˆì§€ 아니하고 ìƒˆë„ ë‚ ì§€ 아니하건마는 나무 ë†’ì€ ê°€ì§€ì— ìŒ“ì¸ ëˆˆì´ ì´ë”°ê¸ˆ ë©ì¹˜ë¡œ 떨어져서는 고요한 수풀 ì†ì— ìž‘ì€ ë™ìš”를 ì¼ìœ¼í‚¨ë‹¤. +우리 ì°ë§¤ê°€ 가는 ê¸¸ì´ ìžì—°ìŠ¤ëŸ¬ìš´ 복잡한 커브를 ë„는 ê²ƒì„ ë³´ë©´ 필시 ì–¼ìŒ ì–¸ 개천 위로 달리는 모양ì´ì—ˆë‹¤. +한 시간ì´ë‚˜ 달린 ë’¤ì— ìš°ë¦¬ ì°ë§¤ëŠ” ëŠ¦ì€ ê²½ì‚¬ì§€ë¥¼ 올ëžë‹¤. ë§ì„ 어거하는 ì•„ë¼ì‚¬ ì‚¬ëžŒì€ ì­ˆì­ˆì­ˆì­ˆ, 후르르 하고 ì£¼ë¬¸ì„ ì™¸ìš°ë“¯ì´ ìž…ìœ¼ë¡œ ë§ì„ 재촉하고 ê³ ì‚를 ì´ë¦¬ 들고 저리 들어 ë§ì—게 ë°©í–¥ì„ ê°€ë¦¬í‚¬ ë¿ì´ìš”, 채ì°ì€ ë³´ì´ê¸°ë§Œí•˜ê³  한 ë²ˆë„ ì“°ì§€ 아니하였다. 그와 ë§ê³¼ëŠ” 완전히 뜻과 ì •ì´ ë§žëŠ” ë™ì§€ì¸ 듯하였다. +처ìŒì—는 몰ëžìœ¼ë‚˜ 차차 추워ì§ì„ 깨달았다. 발과 무르íŒì´ 시렸다. +"얼마나 머오?" +하고 나는 ì˜¤ëž˜ê°„ë§Œì— ìž…ì„ ì—´ì–´ì„œ 노파ì—게 물었다. 노파는 털수건으로 머리를 싸매고 깊숙한 눈만 남겨 가지고 실신한 사람 모양으로 허공만 ë°”ë¼ë³´ê³  있다가, ë‚´ê°€ 묻는 ë§ì— 비로소 ìž ì´ë‚˜ 깬 듯ì´, +"멀지 않소. ì¸ì   한 십오 마ì¼." +하고는 나를 ë°”ë¼ë³´ì•˜ë‹¤. ê·¸ ëˆˆì€ ì•„ë§ˆ 웃는 모양ì´ì—ˆë‹¤. +ê·¸ 얼굴, ê·¸ 눈, ê·¸ ìŒì„±ì´ ëª¨ë‘ ì´ ë…¸íŒŒê°€ ì¸ìƒ í’íŒŒì˜ ìŠ¬í”ˆ ì¼ ê´´ë¡œìš´ ì¼ì— 부대ë¼ê³  지친 ê²ƒì„ í‘œí•˜ì˜€ë‹¤. 그리고 죽는 날까지 살아간다 하는 듯하였다. +경사지를 올ë¼ì„œì„œ 보니 ê·¸ê²ƒì€ í•œ 산등성ì´ì˜€ë‹¤. ë°©í–¥ì€ ì•Œ 수 없으나 우리가 가는 ë°©í–¥ì—는 ë” ë†’ì€ ë“±ì„±ì´ê°€ 있는 모양ì´ë‚˜ 다른 ê³³ì€ ë‹¤ ì´ë³´ë‹¤ ë‚®ì€ ê²ƒ 같아서 하얀 눈바다가 ëì—†ì´ ë³´ì´ëŠ” 듯하였다. ê·¸ 눈보ë¼ëŠ” ë“¤ì‘¹ë‚ ì‘¹ì´ ìžˆëŠ” ê²ƒì„ ë³´ë©´ ì‚¼ë¦¼ì˜ ê¼­ëŒ€ê¸°ì¸ ê²ƒì´ ë¶„ëª…í•˜ì˜€ë‹¤. ë”구나 여기저기 뾰족뾰족 ëˆˆì†¡ì´ ë¶™ì„ ìˆ˜ 없는 마른 나뭇가지가 거뭇거뭇 ë³´ì´ëŠ” ê²ƒì„ ë³´ì•„ì„œ 그러하였다. ë§Œì¼ ëˆˆì´ ê±·í˜€ 주었으면 얼마나 안계가 넓으랴, ìµœì„ êµ°ì´ ê³ ë¯¼í•˜ëŠ” ê°€ìŠ´ì„ ì•ˆê³  ì´ë¦¬ë¡œ 헤매었구나 하면서 나는 ëª©ì„ ë‘˜ëŸ¬ì„œ ì‚¬ë°©ì„ ë°”ë¼ë³´ì•˜ë‹¤. +우리는 ê·¸ 등성ì´ë¥¼ 내려갔다. ë§ì´ 미처 ë°œì„ ë•…ì— ë†“ì„ ìˆ˜ê°€ 없는 ì •ë„로 빨리 내려갔다. 여기는 ì‚°ë¶ˆì´ ë‚¬ë˜ ìžë¦¬ì¸ 듯하여 거뭇거뭇 불탄 ìžêµ­ 있는 마른 ë‚˜ë¬´ë“¤ì´ ë“œë¬¸ë“œë¬¸ 서 있었다. ê·¸ ë‚˜ë¬´ë“¤ì€ ì°ì–´ 가는 ì‚¬ëžŒë„ ì—†ìœ¼ë§¤ 저절로 ì©ì–´ì„œ 없어지기를 기다릴 ìˆ˜ë°–ì— ì—†ì—ˆë‹¤. ê·¸ë“¤ì€ ë‚˜ì„œ 아주 ì©ì–´ 버리기까지 천 ë…„ ì´ìƒì€ 걸린다고 하니 ë˜í•œ 장한 ì¼ì´ë‹¤. +ì´ ëŒ€ì‚¼ë¦¼ì— ë¶ˆì´ ë¶™ëŠ”ë‹¤ 하면 ê·¸ê²ƒì€ ìž¥ê´€ì¼ ê²ƒì´ë‹¤. ë‹¬ë°¤ì— ë†’ì€ ê³³ì—서 ì´ ê²½ì¹˜ë¥¼ 내려다본다 하면 ê·¸ë„ ìž¥ê´€ì¼ ê²ƒì´ìš”, ì—¬ë¦„ì— í•œì°½ ê¸°ìš´ì„ íŽ¼ ë•Œë„ ìž¥ê´€ì¼ ê²ƒì´ë‹¤. 나는 ì˜¤ë‰´ì›”ê²½ì— ì‹œë² ë¦¬ì•„ë¥¼ 여행하는 ì´ë“¤ì´ ë없는 꽃바다를 보았다는 기ë¡ì„ ìƒê°í•˜ì˜€ë‹¤. +"저기요!" +하는 ë…¸íŒŒì˜ ë§ì— 나는 ìƒê°ì˜ ì¤„ì„ ëŠì—ˆë‹¤. 저기ë¼ê³  가리키는 ê³³ì„ ë³´ë‹ˆ 거기는 ì§‘ì´ë¼ê³  ìƒê°ë˜ëŠ” ë¬¼ê±´ì´ ë‚˜ë¬´ 사ì´ë¡œ 보였다. ì°½ì´ ìžˆìœ¼ë‹ˆ 분명 ì§‘ì´ì—ˆë‹¤. +우리 ì´ìŠ¤ë³´ìŠ¤ì¹˜ì¹´ê°€ ê°€ê¹Œì´ ì˜¤ëŠ” ê²ƒì„ ë³´ì•˜ëŠ”ì§€, ê·¸ ì§‘ ê°™ì€ ë¬¼ê±´ì˜ ë¬¸ ê°™ì€ ê²ƒì´ ì—´ë¦¬ë©° ê²€ì€ ì™¸íˆ¬ ìž…ì€ ì—¬ìž í•˜ë‚˜ê°€ íŒ”ì„ í—ˆìš°ì ê±°ë¦¬ë©° 뛰어나온다. 아마 ì†Œë¦¬ë„ ì¹˜ëŠ” 모양ì´ê² ì§€ë§ˆëŠ” ê·¸ 소리는 아니 들렸다. 나는 ê·¸ê²ƒì´ ìˆœìž„ì¸ ì¤„ì„ ì–¼ë¥¸ 알았다. ë˜ ìˆœìž„ì´ë°–ì— ë  ì‚¬ëžŒë„ ì—†ì—ˆë‹¤. +ìˆœìž„ì€ í•œì°¸ 달ìŒë°•질로 오다가 ëˆˆì´ ê¹Šì–´ì„œ 걸ìŒì„ 걷기가 íž˜ì´ ë“œëŠ”ì§€ 멈칫 섰다. ê·¸ì˜ ê²€ì€ ì™¸íˆ¬ëŠ” ì–´ëŠë§ í° ì ìœ¼ë¡œ 얼려져 가지고 어깨는 í¬ê²Œ ë˜ëŠ” ê²ƒì´ ë³´ì˜€ë‹¤. +ìˆœìž„ì˜ ê°¸ë¦„í•œ ì–¼êµ´ì´ ë³´ì˜€ë‹¤. +"ì„ ìƒë‹˜!" +하고 ìˆœìž„ë„ ë‚˜ë¥¼ 알아보고는 ë˜ íŒ”ì„ í—ˆìš°ì ê±°ë¦¬ë©° 소리를 질렀다. +ë‚˜ë„ ë°˜ê°€ì›Œì„œ 모ìžë¥¼ ë²—ì–´ 둘렀다. +"ì•„ì´ ì„ ìƒë‹˜!" +하고 ìˆœìž„ì€ ë‚´ê°€ ì°ë§¤ì—서 ì¼ì–´ì„œê¸°ë„ ì „ì— ë‚´ê²Œ 와서 매달리며 울었다. +"아버지 어떠시ëƒ?" +하고 나는 ìˆœìž„ì˜ ë“±ì„ ë‘드렸다. 나는 다리가 마비가 ë˜ì–´ì„œ ê³§ ì¼ì–´ì„¤ 수가 없었다. +"아버지 어떠시ëƒ?" +하고 나는 한 번 ë” ë¬¼ì—ˆë‹¤. +ìˆœìž„ì€ ë²Œë–¡ ì¼ì–´ë‚˜ ë‘ ì£¼ë¨¹ìœ¼ë¡œ í르는 ëˆˆë¬¼ì„ ì³ë‚´ 버리며, +"대단하셔요." +í•˜ê³ ë„ ìš¸ìŒì„ 금치 못하였다. +노파는 ë²Œì¨ ì°ë§¤ì—서 내려서 기운 없는 걸ìŒìœ¼ë¡œ 비틀비틀 걷기를 시작하였다. +나는 ìˆœìž„ì„ ë”°ë¼ì„œ ì–¸ë•ì„ ì˜¤ë¥´ë©°, +"그래 무슨 병환ì´ì‹œëƒ?" +하고 물었다. +"몰ë¼ìš”. ì‹ ì—´ì´ ëŒ€ë‹¨í•˜ì…”ìš”." +"ì •ì‹ ì€ ì°¨ë¦¬ì‹œë“ ?" +"ì²˜ìŒ ì œê°€ 여기 ì™”ì„ ì ì—는 그렇지 않ë”니 요새ì—는 ê°€ë” í˜¼ìˆ˜ ìƒíƒœì— 빠지시는 모양ì´ì•¼ìš”." +ì´ë§Œí•œ ì§€ì‹ì„ 가지고 나는 최ì„ì´ê°€ 누워 있는 ì§‘ ì•žì— ë‹¤ë‹¤ëžë‹¤. +ì´ ì§‘ì€ í†µë‚˜ë¬´ë¥¼ 댓 ê°œ 우물 ì •ìžë¡œ 가로놓고 ì§€ë¶•ì€ ë¬´ì—‡ìœ¼ë¡œ 했는지 모르나 ëˆˆì´ ë®ì´ê³ , 문 하나 ì°½ 하나를 ë‚´ì—ˆëŠ”ë° ë¬¸ì€ ë‚˜ë¬´ê»ì§ˆì¸ 모양ì´ë‚˜ ì°½ì€ ì –ë¹› 나는 ìœ ë¦¬ì°½ì¸ ì¤„ 알았ë”니 ë’¤ì— ì•Œì•„ë³¸ì¦‰ ê·¸ê²ƒì€ ìœ ë¦¬ê°€ 아니요, ì–‘ëª©ì„ ë°”ë¥´ê³  ë¬¼ì„ ë¿œì–´ì„œ 얼려 ë†“ì€ ê²ƒì´ì—ˆë‹¤. 그리고 통나무와 통나무 틈바구니ì—는 쇠털과 ê°™ì€ ë§ˆë¥¸ í’€ì„ ê¼­ê¼­ 박아서 ë°”ëžŒì„ ë§‰ì•˜ë‹¤. +ë¬¸ì„ ì—´ê³  들어서니 ë¶€ì—Œì— ë“¤ì–´ì„œëŠ” 모양으로 ì‘¥ ë¹ ì¡ŒëŠ”ë° í™”ëˆí™”ëˆí•˜ëŠ” ê²ƒì´ í•œì¦ê³¼ 같다. 그렇지 ì•Šì•„ë„ ì¹¨ì¹¨í•œ ë‚ ì— ì–¸ 눈으로 ê´‘ì„  부족한 ë°©ì— ë“¤ì–´ì˜¤ë‹ˆ, 캄캄 절벽ì´ì–´ì„œ ì•„ë¬´ê²ƒë„ ë³´ì´ì§€ 아니하였다. +순임ì´ê°€ 앞서서 ì–‘ì´ˆì— ë¶ˆì„ ì¼ ë‹¤. 촛불 ë¹›ì€ ë°© 한편 쪽 침대ë¼ê³  í•  만한 ë†’ì€ ê³³ì— ë‹´ìš”ë¥¼ ë®ê³  누운 최ì„ì˜ ì‹œì²´ì™€ ê°™ì€ í° ì–¼êµ´ì„ ë¹„ì¶˜ë‹¤. +"아버지, 아버지 샌전 아저씨 오셨어요." +하고 ìˆœìž„ì€ ìµœì„ì˜ ê·€ì— ìž…ì„ ëŒ€ê³  가만히 불렀다. +그러나 ëŒ€ë‹µì´ ì—†ì—ˆë‹¤. +나는 최ì„ì˜ ì´ë§ˆë¥¼ 만져 보았다. 축축하게 ë•€ì´ í˜ë €ë‹¤. 그러나 그리 ë”ìš´ ì¤„ì€ ëª°ëžë‹¤. +ë°© ì•ˆì˜ ê³µê¸°ëŠ” ìˆ¨ì´ ë§‰íž ë“¯í•˜ì˜€ë‹¤. ê·¸ 난방 장치는 ì‚¼êµ¿ì˜ ì›ë¦¬ë¥¼ ì´ìš©í•œ 것ì´ì—ˆë‹¤. ëŒë©©ì´ë¡œ ì•„ê¶ì´ë¥¼ 쌓고 ê·¸ ìœ„ì— í° ëŒë©©ì´ë“¤ì„ ë§Žì´ ìŒ“ê³  거기다가 ë¶ˆì„ ë•Œì–´ì„œ 달게 한 ë’¤ì— ê±°ê¸° ëˆˆì„ ë¶€ì–´ 뜨거운 ì¦ê¸°ë¥¼ 발하는 것ì´ì—ˆë‹¤. +ì´ ê±´ì¶•ë²•ì€ ì¡°ì„  ë™í¬ë“¤ì´ 시베리아로 ê¸ˆê´‘ì„ ì°¾ì•„ë‹¤ë‹ˆë©´ì„œ 하는 법ì´ëž€ ë§ì„ 들었으나 최ì„ì´ê°€ 누구ì—게서 배워 가지고 ì–´ë–¤ 모양으로 지었는지는 최ì„ì˜ ë§ì„ 듣기 ì „ì—는 알 수 없는 ì¼ì´ë‹¤. +나는 ë‚´ íž˜ì´ ë¯¸ì¹˜ëŠ” ë°ê¹Œì§€ 최ì„ì˜ ë³‘ ì¹˜ë£Œì— ëŒ€í•œ ì†ì„ ì“°ê³  어떻게 해서든지 ì´ë¥´ì¿ ì¸ í¬ì˜ 병ì›ìœ¼ë¡œ 최ì„ì„ ë°ë ¤ë‹¤ê°€ ìž…ì›ì‹œí‚¬ ë„리를 ê¶ë¦¬í•˜ì˜€ë‹¤. 그러나 냉정하게 ìƒê°í•˜ë©´ 최ì„ì€ ì‚´ì•„ë‚  ê°€ë§ì´ 없는 것만 같았다. +ë‚´ê°€ ê°„ ì§€ ì‚¬í˜ ë§Œì— ìµœì„ì€ ì²˜ìŒìœ¼ë¡œ ì •ì‹ ì„ ì°¨ë ¤ì„œ ëˆˆì„ ëœ¨ê³  나를 알아보았다. +그는 반가운 í‘œì •ì„ í•˜ê³  빙그레 웃기까지 하였다. +"다 ì¼ì—†ë‚˜?" +ì´ëŸ° ë§ë„ ì•Œì•„ë“¤ì„ ìˆ˜ê°€ 있었다. +그러나 심히 ê¸°ìš´ì´ ì—†ëŠ” 모양ì´ê¸°ë¡œ 나는 ë§Žì´ ë§ì„ 하지 아니하였다. +최ì„ì€ í•œì°¸ì´ë‚˜ ëˆˆì„ ê°ê³  있ë”니, +"ì •ìž„ì´ ì†Œì‹ ë“¤ì—ˆë‚˜?" +하였다. +"괜찮대요." +하고 ê³ì—서 순임ì´ê°€ ë§í•˜ì˜€ë‹¤. +그리고는 ë˜ í˜¼ëª½í•˜ëŠ” 듯하였다. +ê·¸ ë‚  ë˜ í•œ 번 최ì„ì€ ì •ì‹ ì„ ì°¨ë¦¬ê³  순임ë”러는 저리로 ê°€ë¼ëŠ” ëœ»ì„ í‘œí•˜ê³  나ë”러 귀를 ê°€ê¹Œì´ ëŒ€ë¼ëŠ” ëœ»ì„ ë³´ì´ê¸°ë¡œ 그대로 하였ë”니, +"ë‚´ 가방 ì†ì— ì¼ê¸°ê°€ 있으니 그걸 ìžë„¤ë§Œ 보고는 ë¶ˆì‚´ë¼ ë²„ë ¤. ë‚´ê°€ ì£½ì€ ë’¤ì—ë¼ë„ ê·¸ê²ƒì´ ì„¸ìƒ ì‚¬ëžŒì˜ ëˆˆì— ë“¤ë©´ 안 ë˜ì§€. 순임ì´ê°€ 볼까 ê±±ì •ì´ ë˜ì§€ë§ˆëŠ” ë‚´ê°€ ëª¸ì„ ê¼¼ì§í•  수가 있나." +하는 ëœ»ì„ ë§í•˜ì˜€ë‹¤. +"그러지." +하고 나는 고개를 ë„ë•ì—¬ 보였다. +그러고 난 ë’¤ì— ë‚˜ëŠ” 최ì„ì´ê°€ 시킨 대로 ê°€ë°©ì„ ì—´ê³  ì±…ë“¤ì„ ë’¤ì ¸ì„œ ê·¸ ì¼ê¸°ì±…ì´ë¼ëŠ” ê³µì±…ì„ êº¼ë‚´ì—ˆë‹¤. +"ìˆœìž„ì´ ë„ˆ ì´ê±° 보았니?" +하고 나는 ê³ì—서 ë‚´ê°€ ì±… 찾는 ê²ƒì„ ë³´ê³  ì„°ë˜ ìˆœìž„ì—게 물었다. +"아니오. 그게 무어여요?" +하고 ìˆœìž„ì€ ë‚´ ì†ì— ë“  ì±…ì„ ë¹¼ì•—ìœ¼ë ¤ëŠ” ë“¯ì´ ì†ì„ 내밀었다. +나는 ìˆœìž„ì˜ ì†ì´ ë‹¿ì§€ 않ë„ë¡ ì±…ì„ í•œíŽ¸ìœ¼ë¡œ 비키며, +"ì´ê²ƒì´ 네 아버지 ì¼ê¸°ì¸ 모양ì¸ë° 너는 ë³´ì´ì§€ ë§ê³  나만 ë³´ë¼ê³  하셨다. 네 아버지가 네가 ì´ê²ƒì„ 보았ì„까 해서 염려를 í•˜ì‹œëŠ”ë° ì•ˆ 보았으면 다행ì´ë‹¤." +하고 나는 ê·¸ ì±…ì„ ë“¤ê³  밖으로 나왔다. +ë‚ ì´ ë°ë‹¤. 해는 ì¤‘ì²œì— ìžˆë‹¤. 중천ì´ëž˜ì•¼ ì € 남쪽 ì§€í‰ì„  가까운 ë°ë‹¤. ë°¤ì´ ì—´ì—¬ëŸ ì‹œê°„, ë‚®ì´ ëŒ€ì—¬ì„¯ ì‹œê°„ë°–ì— ì•ˆ ë˜ëŠ” ë¶ìª½ 나ë¼ë‹¤. 멀건 햇빛ì´ë‹¤. +나는 ë³•ì´ ìž˜ 드는 ê³³ì„ ê³¨ë¼ì„œ ë‚˜ë¬´ì— ëª¸ì„ ê¸°ëŒ€ê³  최ì„ì˜ ì¼ê¸°ë¥¼ ì½ê¸° 시작하였다. ì½ì€ 중ì—서 몇 êµ¬ì ˆì„ ê³¨ë¼ ë³¼ê¹Œ. +"ì§‘ì´ ë‹¤ ë˜ì—ˆë‹¤. ì´ ì§‘ì€ ë‚´ê°€ ìƒì „ ì‚´ê³  ê·¸ ì†ì—서 ì´ ì„¸ìƒì„ 마칠 ì§‘ì´ë‹¤. 마ìŒì´ 기ì˜ë‹¤. 시ë„러운 세ìƒì€ 여기서 멀지 아니하ëƒ. ë‚´ê°€ 여기 홀로 있기로 누가 ì°¾ì„ ì‚¬ëžŒë„ ì—†ì„ ê²ƒì´ë‹¤. ë‚´ê°€ 여기서 죽기로 누가 슬í¼í•´ 줄 ì‚¬ëžŒë„ ì—†ì„ ê²ƒì´ë‹¤. 때로 ê³°ì´ë‚˜ 찾아올까. ì§€ë‚˜ê°€ë˜ ì‚¬ìŠ´ì´ë‚˜ 들여다볼까. +ì´ê²ƒì´ ë‚´ 소ì›ì´ 아니ëƒ. 세ìƒì˜ 시ë„ëŸ¬ì›€ì„ ë– ë‚˜ëŠ” ê²ƒì´ ë‚´ 소ì›ì´ 아니ëƒ. ì´ ì†ì—서 나는 나를 ì´ê¸°ê¸°ë¥¼ 공부하ìž." +ì²«ë‚ ì€ ì´ëŸ° í‰ë²”한 소리를 ì¼ë‹¤. +ê·¸ ì´íŠ¿ë‚ ì—는. +"어떻게나 나는 약한 사람ì¸ê³ . ì œ 마ìŒì„ 제가 지배하지 못하는 사람ì¸ê³ . 밤새ë„ë¡ ë‚˜ëŠ” ì •ìž„ì„ ìƒê°í•˜ì˜€ë‹¤. ì–´ë‘ìš´ í—ˆê³µì„ í–¥í•˜ì—¬ ì •ìž„ì„ ë¶ˆë €ë‹¤. ì •ìž„ì´ê°€ 나를 찾아서 ë™ê²½ì„ 떠나서 ì´ë¦¬ë¡œ 오지나 아니하나 하고 ìƒê°í•˜ì˜€ë‹¤. 어떻게나 ë¶€ë„러운 ì¼ì¸ê³ ? 어떻게나 ê°€ì¦í•œ ì¼ì¸ê³ ? +나는 아내를 ìƒê°í•˜ë ¤ 하였다. ì•„ì´ë“¤ì„ ìƒê°í•˜ë ¤ 하였다. 아내와 ì•„ì´ë“¤ì„ ìƒê°í•¨ìœ¼ë¡œ ì •ìž„ì˜ ìƒê°ì„ ì´ê¸°ë ¤ 하였다. +최ì„ì•„, 너는 ë‚¨íŽ¸ì´ ì•„ë‹ˆëƒ. 아버지가 아니ëƒ. ì •ìž„ì€ ë„¤ ë”¸ì´ ì•„ë‹ˆëƒ. ì´ëŸ° ìƒê°ì„ 하였다. +ê·¸ëž˜ë„ ì •ìž„ì˜ ì¼ë¥˜ì „ì€ ì•„ë‚´ì™€ ì•„ì´ë“¤ì˜ ìƒê°ì„ 밀치고 달려오는 절대 ìœ„ë ¥ì„ ê°€ì§„ 듯하였다. +ì•„, 나는 어떻게나 파렴치한 사람ì¸ê³ . ë‚˜ì´ ì‚¬ì‹­ì´ ë„˜ì–´ ì˜¤ì‹­ì„ ë°”ë¼ë³´ëŠ” ë†ˆì´ ì•„ë‹ˆëƒ. ì‚¬ì‹­ì— ë¶ˆí˜¹ì´ë¼ê³  아니 하ëŠëƒ. êµìœ¡ê°€ë¡œ 깨ë—한 êµì¸ìœ¼ë¡œ ì¼ìƒì„ ì‚´ì•„ 왔다고 ìžì²˜í•˜ëŠ” ë‚´ê°€ ì•„ë‹ˆëƒ í•˜ê³  나는 ë‚´ 입으로 ë‚´ ì†ê°€ë½ì„ 물어서 ë‘ êµ°ë°ë‚˜ 피를 내었다." +최ì„ì˜ ë‘˜ì§¸ ë‚  ì¼ê¸°ëŠ” 계ì†ëœë‹¤. +"ë‚´ ì†ê°€ë½ì—서 피가 ë‚  ë•Œì— ë‚˜ëŠ” 유쾌하였다. 나는 ìŠ¹ì²©ì˜ ê¸°ì¨ì„ 깨달았다. +그러나 ì•„ì•„ 그러나 ê·¸ 빨간, ì°¸íšŒì˜ í•방울 ì†ì—ì„œë„ ì• ìš•ì˜ ë¶ˆê¸¸ì´ ì¼ì§€ 아니하는가. 나는 마침내 ì œë„í•  수 없는 ì¸ìƒì¸ê°€." +ì´ ì§‘ì— ë“  ì§€ ë‘˜ì§¸ë‚ ì— ë²Œì¨ ì´ëŸ¬í•œ ë¹„ê´€ì  ë§ì„ 하였다. +ë˜ ë©°ì¹ ì„ ì§€ë‚œ ë’¤ ì¼ê¸°ì—, +"나는 ë™ê²½ìœ¼ë¡œ ëŒì•„가고 싶다. ì •ìž„ì˜ ê³ìœ¼ë¡œ 가고 싶다. 시베리아ì˜ê´‘ì•¼ì˜ ìœ í˜¹ë„ ì•„ë¬´ íž˜ì´ ì—†ë‹¤. ì–´ì ¯ë°¤ì€ ì‚¼ë¦¼ì˜ ì¢‹ì€ ë‹¬ì„ ë³´ì•˜ìœ¼ë‚˜ ê·¸ ë‹¬ì„ ì•„ë¦„ë‹µê²Œ ë³´ë ¤ 하였으나 아무리 í•˜ì—¬ë„ ì•„ë¦„ë‹µê²Œ ë³´ì´ì§€ë¥¼ 아니하였다. +하늘ì´ë‚˜ 달ì´ë‚˜ 삼림ì´ë‚˜ ëª¨ë‘ ë¬´ì˜ë¯¸í•œ 존재다. ì´ì²˜ëŸ¼ 무ì˜ë¯¸í•œ 존재를 나는 경험한 ì¼ì´ 없다. ê·¸ê²ƒì€ ë‹¤ë§Œ 기ì¨ì„ ìžì•„ë‚´ì§€ 아니할 ë¿ë”러 ìŠ¬í””ë„ ìžì•„ë‚´ì§€ 못하였다. ê·¸ê²ƒì€ ìž¿ë”미였다. ì•„ë¬´ë„ ë“£ëŠ” ì´ ì—†ëŠ” ë°ì„œ ë‚´ ì§„ì •ì„ ë§í•˜ë¼ë©´ ê·¸ê²ƒì€ ì´ ì²œì§€ì— ë‚´ê²Œ ì˜ë¯¸ 있는 ê²ƒì€ ì •ìž„ì´ë°–ì— ì—†ë‹¤ëŠ” 것ì´ë‹¤. +나는 ì •ìž„ì˜ ê³ì— 있고 싶다. ì •ìž„ì„ ë‚´ ê³ì— ë‘ê³  싶다. 왜? ê·¸ê²ƒì€ ë‚˜ë„ ëª¨ë¥¸ë‹¤. +ë§Œì¼ ì´ ì›€ ì†ì—ë¼ë„ ì •ìž„ì´ê°€ 있다 하면 얼마나 ì´ê²ƒì´ ì¦ê±°ìš´ ê³³ì´ ë ê¹Œ. +그러나 ì´ê²ƒì€ 불가능한 ì¼ì´ë‹¤. ì´ ì¼ì´ 있어서는 아니 ëœë‹¤. 나는 ì´ ìƒê°ì„ 죽여야 한다. 다시 ê±°ë‘를 못 하ë„ë¡ ëª©ìˆ¨ì„ ëŠì–´ 버려야 한다. +ì´ê²ƒì„ 나는 ì›í•œë‹¤. ì›í•˜ì§€ë§ˆëŠ” 내게는 ê·¸ íž˜ì´ ì—†ëŠ” 모양ì´ë‹¤. +나는 종êµë¥¼ ìƒê°í•˜ì—¬ 본다. ì² í•™ì„ ìƒê°í•˜ì—¬ 본다. ì¸ë¥˜ë¥¼ ìƒê°í•˜ì—¬ 본다. 나ë¼ë¥¼ ìƒê°í•˜ì—¬ 본다. ì´ê²ƒì„ 가지고 ë‚´ 애욕과 바꾸려고 ì• ì¨ ë³¸ë‹¤. 그렇지마는 내게 그러한 íž˜ì´ ì—†ë‹¤. 나는 완전히 í—¬í”Œë¦¬ìŠ¤í•¨ì„ ê¹¨ë‹«ëŠ”ë‹¤. +ì•„ì•„ 나는 어찌할꼬? +나는 못ìƒê¸´ 사람ì´ë‹¤. 그까짓 ê²ƒì„ ëª» ì´ê²¨? 그까짓 ê²ƒì„ ëª» ì´ê²¨? +나는 ì˜ˆìˆ˜ì˜ ê´‘ì•¼ì—ì„œì˜ ìœ í˜¹ì„ ìƒê°í•œë‹¤. 천하를 주마 하는 ìœ í˜¹ì„ ìƒê°í•œë‹¤. 나는 싯다르타 태ìžê°€ 왕ê¶ì„ 버리고 나온 ê²ƒì„ ìƒê°í•˜ê³ , ë˜ ìŠ¤í† ì•„ ì² í•™ìžì˜ ì˜ì§€ë ¥ì„ ìƒê°í•˜ì˜€ë‹¤. +그러나 나는 그러한 ìƒê°ìœ¼ë¡œë„ ì´ ìƒê°ì„ ì´ê¸¸ 수가 없는 것 같다. +나는 í˜ëª…가를 ìƒê°í•˜ì˜€ë‹¤. 모든 것 ì‚¬ëž‘ë„ ëª©ìˆ¨ë„ ë‹¤ 헌신ì§ê°™ì´ ì§‘ì–´ë˜ì§€ê³  피 í르는 마당으로 뛰어나가는 용사를 ìƒê°í•˜ì˜€ë‹¤. 나는 ì´ë없는 삼림 ì†ìœ¼ë¡œ í˜ëª…ì˜ ìš©ì‚¬ 모양으로 달ìŒë°•질치다가 ê¸°ìš´ì´ ì§„í•œ ê³³ì—서 죽어 버리는 ê²ƒì´ ì†Œì›ì´ì—ˆë‹¤. 그러나 ê±°ê¸°ê¹Œì§€ë„ ì´ ìƒê°ì€ 따르지 아니할까. +나는 지금 ê³§ 죽어 버릴까. 나는 육혈í¬ë¥¼ ì†ì— 들어 보았다. ì´ ë°©ì•„ì‡ ë¥¼ 한 번만 튕기면 ë‚´ ìƒëª…ì€ ì—†ì–´ì§€ëŠ” ê²ƒì´ ì•„ë‹Œê°€. 그리 ë˜ë©´ 모든 ì´ ë§ˆìŒì˜ 움ì§ìž„ì€ ì†Œë©¸ë˜ëŠ” ê²ƒì´ ì•„ë‹Œê°€. ì´ê²ƒìœ¼ë¡œ 만사가 í•´ê²°ë˜ëŠ” ê²ƒì´ ì•„ë‹Œê°€. +ì•„ 하나님ì´ì‹œì—¬, íž˜ì„ ì£¼ì‹œì˜µì†Œì„œ. 천하를 ì´ê¸°ëŠ” íž˜ë³´ë‹¤ë„ ë‚˜ ìžì‹ ì„ ì´ê¸°ëŠ” íž˜ì„ ì£¼ì‹œì˜µì†Œì„œ. ì´ ì£„ì¸ìœ¼ë¡œ 하여금 í•˜ë‚˜ë‹˜ì˜ ëˆˆì— ì˜ë¡­ê³  깨ë—한 사람으로 ì´ ì¼ìƒì„ 마치게 하여 주시옵소서, ì´ë ‡ê²Œ 나는 기ë„를 한다. +그러나 하나님께서는 나를 버리셨다. 하나님께서는 내게 íž˜ì„ ì£¼ì‹œì§€ 아니하시었다. 나를 ì´ ë¹„ì°¸í•œ ìžë¦¬ì—서 ì©ì–´ì ¸ 죽게 하시었다." +최ì„ì€ ì–´ë–¤ ë‚  ì¼ê¸°ì— ë˜ ì´ëŸ° ê²ƒë„ ì¼ë‹¤. ê·¸ê²ƒì€ ì˜ˆì „ 내게 보낸 íŽ¸ì§€ì— ìžˆë˜ ê¿ˆ ì´ì•¼ê¸°ë¥¼ ì—°ìƒì‹œí‚¤ëŠ” 것ì´ì—ˆë‹¤. ê·¸ê²ƒì€ ì´ëŸ¬í•˜ë‹¤. +"오늘 ë°¤ì€ ë‹¬ì´ ì¢‹ë‹¤. ì‹œë² ë¦¬ì•„ì˜ ê²¨ìš¸ 해는 ì°¸ 못ìƒê¸´ ì‚¬ëžŒê³¼ë„ ê°™ì´ ê¸°ìš´ì´ ì—†ì§€ë§ˆëŠ” 하얀 ë•…, 검푸른 í•˜ëŠ˜ì— ì €ìª½ ì§€í‰ì„ ì„ 향하고 í˜ëŸ¬ê°€ëŠ” ë°˜ë‹¬ì€ ì°¸ìœ¼ë¡œ ë§‘ìŒ ê·¸ê²ƒì´ì—ˆë‹¤. +나는 í‰ìƒ ì²˜ìŒ ì‹œ 비슷한 ê²ƒì„ ì§€ì—ˆë‹¤. +임과 ì´ë³„í•˜ë˜ ë‚  ë°¤ì—는 남쪽 나ë¼ì— 바람비가 쳤네 +ìž„ 타신 ìžë™ì°¨ì˜ ë’·ë¶ˆì´ ë¹¨ê°„ ë’·ë¶ˆì´ ë¹—ë°œì— ì°¢ê²¼ë„¤ +ìž„ 떠나 í˜¼ìž í—¤ë§¤ëŠ” ì‹œë² ë¦¬ì•„ì˜ ì˜¤ëŠ˜ ë°¤ì—는 +지려는 ìª½ë‹¬ì´ ëˆˆ ë®ì¸ ì‚¼ë¦¼ì— ê±¸ë ¸êµ¬ë‚˜ +ì•„ì•„ ì € 쪽달ì´ì—¬ +억지로 ë°˜ì„ ê°ˆê²¨ì§„ ê²ƒë„ ê°™ì•„ë¼ +ì•„ì•„ ì € 쪽달ì´ì—¬ +잃어진 ì§ì„ 찾아 +차디찬 허공 ì†ì„ ì˜ì›ížˆ 헤매는 ê²ƒë„ ê°™êµ¬ë‚˜ +ë‚˜ë„ ì € 달과 ê°™ì´ ìžƒì–´ë²„ë¦° ë°˜ìª½ì„ ì°¾ì•„ 무ê¶í•œ 시간과 공간ì—서 헤매는 것만 같다. +ì—ìµ. ë‚´ê°€ 왜 ì´ë¦¬ 약한가. 어찌하여 í¬ë‚˜í° ë§Žì€ ì¼ì„ ëŒì•„ë³´ì§€ 못하고 요만한 ì• ìš•ì˜ í¬ë¡œê°€ ë˜ëŠ”ê°€. +그러나 나는 차마 ê·¸ ë‹¬ì„ ë²„ë¦¬ê³  들어올 수가 없었다. ë‚´ê°€ 왜 ì´ë ‡ê²Œ 센티멘털하게 ë˜ì—ˆëŠ”ê³ . ë‚´ 쇠 ê°™ì€ ì˜ì§€ë ¥ì´ 어디로 갔는고. ë‚´ 누를 수 없는 ìžì¡´ì‹¬ì´ 어디로 갔는고. 나는 마치 ìœ ëª¨ì˜ ì†ì— 달린 젖먹ì´ì™€ë„ 같다. ë‚´ ì¼ì‹ ì€ ë„시 ì• ìš• ë©ì–´ë¦¬ë¡œ 화해 버린 것 같다. +ì´ë¥¸ë°” 사랑 사랑ì´ëž€ ë§ì€ 종êµì  ì˜ë¯¸ì¸ 것 ì´ì™¸ì—ë„ ìž…ì— ë‹´ê¸°ë„ ì‹«ì–´í•˜ë˜ ë§ì´ë‹¤ ì´ëŸ° ê²ƒì€ ë‚´ ì˜ì§€ë ¥ê³¼ ìžì¡´ì‹¬ì„ 녹여 버렸는가. ë˜ ì´ ë¶€ìžì—°í•œ ê³ ë…ì˜ ìƒí™œì´ 나를 ì´ë ‡ê²Œ ë‚´ ì¸ê²©ì„ ì´ë ‡ê²Œ 파괴하였는가. +그렇지 아니하면 ë‚´ ìžì¡´ì‹¬ì´ë¼ëŠ” 것ì´ë‚˜, ì˜ì§€ë ¥ì´ë¼ëŠ” 것ì´ë‚˜, ì¸ê²©ì´ë¼ëŠ” ê²ƒì´ ëª¨ë‘ ì„¸ìƒì˜ 습관과 ì‚¬ì¡°ì— íœ©ì“¸ë¦¬ë˜ ê²ƒì¸ê°€. ë‚¨ë“¤ì´ ê·¸ëŸ¬ë‹ˆê¹Œ ë‚¨ë“¤ì´ ì˜³ë‹¤ë‹ˆê¹Œ ë‚¨ë“¤ì´ ë¬´ì„œìš°ë‹ˆê¹Œ ì´ ì• ìš•ì˜ ë¬´ë¤ì— 회를 ë°œëžë˜ 것ì¸ê°€. 그러다가 ê³ ë…ê³¼ ë°˜ì„±ì˜ ê¸°íšŒë¥¼ 얻으매 모든 회칠과 ê°€ë©´ì„ ë–¼ì–´ 버리고 ë¹¨ê°€ë²—ì€ ì• ìš•ì˜ ë­‰í……ì´ê°€ 나온 것ì¸ê°€. +그렇다 하면, ì´ê²ƒì´ ì°¸ëœ ë‚˜ì¸ê°€. ì´ê²ƒì´ 하나님께서 지어 주신 ëŒ€ë¡œì˜ ë‚˜ì¸ê°€. ê°€ìŠ´ì— íƒ€ì˜¤ë¥´ëŠ” ì• ìš•ì˜ ë¶ˆê¸¸ ì´ ë¶ˆê¸¸ì´ ê³§ ë‚´ ì˜í˜¼ì˜ 불길ì¸ê°€. +어쩌면 ê·¸ 모든 ë†’ì€ ì´ìƒë“¤ ì¸ë¥˜ì— 대한, ë¯¼ì¡±ì— ëŒ€í•œ, ë„ë•ì— ëŒ€í•œ, ì‹ ì•™ì— ëŒ€í•œ ê·¸ ë†’ì€ ì´ìƒë“¤ì´ ì´ë ‡ê²Œë„ 만만하게 마치 ë°”ëžŒì— ë¶ˆë¦¬ëŠ” 재 모양으로 ìžì·¨ë„ ì—†ì´ í©ì–´ì ¸ 버리고 ë§ê¹Œ. 그리고 ê·¸ ë’¤ì—는 í‰ì†Œì—ê·¸ë ‡ê²Œë„ ë¯¸ì›Œí•˜ê³  천히 ì—¬ê¸°ë˜ ì• ìš•ì˜ ê²€ì€ í™ë§Œ 남고 ë§ê¹Œ. +ì•„ì•„ ì € 눈 ë®ì¸ ë•…ì´ì—¬, 차고 ë§‘ì€ ë‹¬ì´ì—¬, 허공ì´ì—¬! 나는 너í¬ë“¤ì„ 부러워하노ë¼. +불êµë„ë“¤ì˜ í•´íƒˆì´ë¼ëŠ” ê²ƒì´ ì´ëŸ¬í•œ ì• ìš•ì´ ë¶ˆë¶™ëŠ” 지옥ì—서 눈과 ê°™ì´ ì‹¸ëŠ˜í•˜ê³  허공과 ê°™ì´ ë¹ˆ 곳으로 들어ê°ì„ ì´ë¦„ì¸ê°€. +ì„ê°€ì˜ íŒ” ë…„ ê°„ 설산 ê³ í–‰ì´ ì´ ì• ìš•ì˜ ë¿Œë¦¬ë¥¼ ëŠìœ¼ë ¤ 함ì´ë¼ 하고 ì˜ˆìˆ˜ì˜ ì‚¬ì‹­ ì¼ ê´‘ì•¼ì˜ ê³ í–‰ê³¼ ê²Ÿì„¸ë§ˆë„¤ì˜ ê³ ë¯¼ë„ ì´ ì• ìš•ì˜ ë¿Œë¦¬ 때문ì´ì—ˆë˜ê°€. +그러나 ê·¸ê²ƒì„ ì´ê¸°ì–´ 낸 ì‚¬ëžŒì´ ì²œì§€ 개벽 ì´ëž˜ì— 몇몇ì´ë‚˜ ë˜ì—ˆëŠ”ê³ ? 나 ê°™ì€ ê²ƒì´ ê·¸ ì¤‘ì— í•œ 사람 ë˜ê¸°ë¥¼ 바랄 수가 있ì„까. +나 같아서는 마침내 ì´ ì• ìš•ì˜ ë¶ˆê¸¸ì— ë‹¤ 타서 재가 ë˜ì–´ 버릴 것만 같다. ì•„ì•„ 어떻게나 힘있고 무서운 불길ì¸ê³ ." +ì´ëŸ¬í•œ ê³ ë¯¼ì˜ ìžë°±ë„ 있었다. +ë˜ ì–´ë–¤ ë‚  ì¼ê¸°ì—는 최ì„ì€ ì´ëŸ° ë§ì„ ì¼ë‹¤. +"나는 단연히 ë™ê²½ìœ¼ë¡œ ëŒì•„가기를 결심하였다." +그리고는 ê·¸ ì´íŠ¿ë‚ ì€, +"나는 단연히 ë™ê²½ìœ¼ë¡œ ëŒì•„가리란 ê²°ì‹¬ì„ í•œ ê²ƒì„ êµ³ì„¸ê²Œ 취소한다. 나는 ì´ëŸ¬í•œ ê²°ì‹¬ì„ í•˜ëŠ” 나 ìžì‹ ì„ 굳세게 ë¶€ì¸í•œë‹¤." +ë˜ ì´ëŸ° ë§ë„ 있다. +"나는 ì •ìž„ì„ ì‹œë² ë¦¬ì•„ë¡œ 부르련다." +ë˜ ê·¸ 다ìŒì—는, +"ì•„ì•„ 나는 í•˜ë£¨ë°”ì‚ ì£½ì–´ì•¼ 한다. ì´ ëª©ìˆ¨ì„ ì—°ìž¥í•˜ì˜€ë‹¤ê°€ëŠ” 무슨 ì¼ì„ 저지를는지 모른다. 나는 깨ë—하게 나를 ì´ê¸°ëŠ” ë„ë•ì  ì¸ê²©ìœ¼ë¡œ ì´ ì¼ìƒì„ 마ì³ì•¼ 한다. ì´ ë°–ì— ë‚´ ì‚¬ì—…ì´ ë¬´ì—‡ì´ëƒ." +ë˜ ì–´ë–¤ ê³³ì—는, +"ì•„ì•„ 무서운 하룻밤ì´ì—ˆë‹¤. 나는 지난 í•˜ë£»ë°¤ì„ ëˆ„ë¥¼ 수 없는 ì• ìš•ì˜ ë¶ˆê¸¸ì— íƒ”ë‹¤. 나는 ë‚´ 주먹으로 ë‚´ ê°€ìŠ´ì„ ë‘드리고 머리를 ë²½ì— ë¶€ë”ªì³¤ë‹¤. 나는 주먹으로 ë‹´ë²½ì„ ë‘드려 ì†ë“±ì´ 터져서 피가 í˜ë €ë‹¤. 나는 ë‚´ 머리카ë½ì„ ì¥ì–´ëœ¯ì—ˆë‹¤. 나는 ìˆ˜ì—†ì´ ë°œì„ êµ´ë €ë‹¤. 나는 ì´ ë¬´ì„œìš´ ìœ í˜¹ì„ ì´ê¸°ë ¤ê³  ë‚´ ëª¸ì„ ì•„í”„ê²Œ 하였다. 나는 견디다 못하여 ë¬¸ì„ ë°•ì°¨ê³  뛰어나갔다. ë°–ì—는 ë‹¬ì´ ìžˆê³  ëˆˆì´ ìžˆì—ˆë‹¤. 그러나 ëˆˆì€ í•ë¹›ì´ìš”, ë‹¬ì€ ì°Œê·¸ëŸ¬ì§„ 것 같았다. 나는 눈 ì†ìœ¼ë¡œ 달ìŒë°•질쳤다. ë‹¬ì„ ë”°ë¼ì„œ 엎드러지며 ìžë¹ ì§€ë©° 달ìŒì§ˆì³¤ë‹¤. 나는 소리를 질렀다. 나는 미친 사람 같았다." +그러고는 어디까지 갔다가 ì–´ëŠ ë•Œì— ì–´ë– í•œ ì‹¬ê²½ì˜ ë³€í™”ë¥¼ 얻어 가지고 ëŒì•„왔다는 ë§ì€ ì“°ì´ì§€ 아니하였으나 최ì„ì˜ ë³‘ì˜ ì›ì¸ì„ 설명하는 것 같았다. +"ì—´ì´ ë‚˜ê³  ê¸°ì¹¨ì´ ë‚œë‹¤. ê°€ìŠ´ì´ ì•„í”„ë‹¤. ì´ê²ƒì´ íë ´ì´ ë˜ì–´ì„œ í˜¼ìž ê¹¨ë—하게 ì´ ìƒëª…ì„ ë§ˆì¹˜ê²Œ 하여 주소서 하고 빈다. 나는 오늘부터 먹고 마시기를 그치련다." +ì´ëŸ¬í•œ ë§ì„ ì¼ë‹¤. 그러고는, +"ì •ìž„, ì •ìž„, ì •ìž„, ì •ìž„." +하고 ì •ìž„ì˜ ì´ë¦„ì„ ìˆ˜ì—†ì´ ì“´ ê²ƒë„ ìžˆê³ , ì–´ë–¤ ë°ëŠ”, +"Overcome, Overcome." +하고 ì˜ì–´ë¡œ ì“´ ê²ƒë„ ìžˆì—ˆë‹¤. +그리고 마지막ì—, +"나는 죽ìŒê³¼ 대면하였다. 사í˜ì§¸ êµ¶ê³  ì•“ì€ ì˜¤ëŠ˜ì— ë‚˜ëŠ” 극히 ë§‘ê³  침착한 정신으로 죽ìŒê³¼ 대면하였다. 죽ìŒì€ ê²€ì€ ì˜·ì„ ìž…ì—ˆìœ¼ë‚˜ ê·¸ 얼굴ì—는 ìžë¹„ì˜ í‘œì •ì´ ìžˆì—ˆë‹¤. 죽ìŒì€ ê³§ ê²€ì€ ì˜·ì„ ìž…ì€ êµ¬ì›ì˜ ì†ì´ì—ˆë‹¤. 죽ìŒì€ 아름다운 그림ìžì˜€ë‹¤. 죽ìŒì€ 반가운 ì• ì¸ì´ìš”, ê²°ì½” 무서운 ì›ìˆ˜ê°€ 아니었다. 나는 죽ìŒì˜ ì†ì„ 잡노ë¼. ê°ì‚¬í•˜ëŠ” 마ìŒìœ¼ë¡œ 죽ìŒì˜ í’ˆì— ì•ˆê¸°ë…¸ë¼. 아멘." +ì´ê²ƒì„ ì“´ ë’¤ì—는 다시는 ì¼ê¸°ê°€ 없었다. ì´ê²ƒìœ¼ë¡œ 최ì„ì´ê°€ ê·¸ ë™ì•ˆ 지난 ì¼ì„ ì ì–´ë„ ì‹¬ë¦¬ì  ë³€í™”ë§Œì€ ëŒ€ê°• 추측할 수가 있었다. +다행히 최ì„ì˜ ë³‘ì€ ì ì  ëŒë¦¬ëŠ” 듯하였다. ì—´ë„ ë‚´ë¦¬ê³  ì‹ì€ë•€ë„ ëœ í˜ë ¸ë‹¤. 안 먹는다고 ê³ ì§‘í•˜ë˜ ìŒì‹ë„ 먹기를 시작하였다. +ì •ìž„ì—게로 ê°”ë˜ ë…¸íŒŒì—게서는 ì •ìž„ë„ ì—´ì´ ë‚´ë¦¬ê³  ì¼ì–´ë‚˜ ì•‰ì„ ë§Œí•˜ë‹¤ëŠ” 편지가 왔다. +나는 ë…¸íŒŒì˜ íŽ¸ì§€ë¥¼ 최ì„ì—게 ì½ì–´ 주었다. 최ì„ì€ ê·¸ 편지를 듣고 매우 í¥ë¶„하는 모양ì´ì—ˆìœ¼ë‚˜ ê³§ 안심하는 ë¹›ì„ ë³´ì˜€ë‹¤. +나는 최ì„ì˜ ë³‘ì´ ëŒë¦¬ëŠ” ê²ƒì„ ë³´ê³  ì •ìž„ì„ ì°¾ì•„ë³¼ 양으로 떠나려 하였으나 순임ì´ê°€ 듣지 아니하였다. 혼ìžì„œ 앓는 아버지를 ë§¡ì•„ 가지고 ìžˆì„ ìˆ˜ëŠ” 없다는 것ì´ì—ˆë‹¤. 그래서 노파가 오기를 기다리기로 하였다. +나는 최ì„ì´ê°€ ë¨¹ì„ ìŒì‹ë„ ì‚´ 겸 우편국ì—ë„ ë“¤ë¥¼ 겸 시가까지 가기로 하고 ì´ ê³³ 온 ì§€ ì¼ ì£¼ì¼ì´ë‚˜ 지나서 처ìŒìœ¼ë¡œ ì‚°ì—서 나왔다. +나는 ì´ë¥´ì¿ ì¸ í¬ì— 가서 최ì„ì„ ìœ„í•˜ì—¬ 약품과 ë¨¹ì„ ê²ƒì„ ì‚¬ê³  ë˜ ìˆœìž„ì„ ìœ„í•´ì„œë„ ë¨¹ì„ ê²ƒê³¼ ì˜ë³µê³¼ ë˜ í•˜ëª¨ë‹ˆì¹´ì™€ ì†í’ê¸ˆë„ ì‚¬ 가지고 ì •ê±°ìž¥ì— ë‚˜ì™€ì„œ ëŒì•„올 차를 기다리고 있었다. +나는 순후해 ë³´ì´ëŠ” ì•„ë¼ì‚¬ ì‚¬ëžŒë“¤ì´ ì •ê±°ìž¥ì—서 오ë½ê°€ë½í•˜ëŠ” ê²ƒì„ ë³´ê³  ì†ìœ¼ë¡œëŠ” 최ì„ì´ê°€ ë³‘ì´ ì¢€ ë‚˜ì€ ê²ƒì„ ë‹¤í–‰ìœ¼ë¡œ ìƒê°í•˜ê³ , ë˜ ìµœì„ê³¼ ì •ìž„ì˜ ìž¥ëž˜ê°€ ì–´ì°Œ ë ê¹Œ 하는 ê²ƒë„ ìƒê°í•˜ë©´ì„œ 뷔페(ì‹ë‹¹)ì—서 뜨거운 ì°¨ì´(ì°¨)를 마시고 있었다. +ì´ ë•Œì— ë°–ì„ ë°”ë¼ë³´ê³  ìžˆë˜ ë‚´ ëˆˆì€ ë¬¸ë“ ì´ìƒí•œ ê²ƒì„ ë³´ì•˜ë‹¤. ê·¸ê²ƒì€ ê·¸ 노파가 ì´ë¦¬ë¡œ 향하고 걸어오는 것ì¸ë° ê·¸ 노파와 íŒ”ì„ ê±¸ì€ ì Šì€ ì—¬ìžê°€ 있는 것ì´ë‹¤. 머리를 ê²€ì€ ìˆ˜ê±´ìœ¼ë¡œ 싸매고 ìž…ê³¼ 코를 가리웠으니 분명히 알 수 없으나 í˜¹ì€ ì •ìž„ì´ë‚˜ 아닌가 í•  ìˆ˜ë°–ì— ì—†ì—ˆë‹¤. ì •ìž„ì´ê°€ 몸만 기ë™í•˜ê²Œ ë˜ë©´ 최ì„ì„ ë³´ëŸ¬ 올 ê²ƒì€ ì •ìž„ì˜ ì—´ì •ì ì¸ 성격으로 보아서 당연한 ì¼ì´ê¸° 때문ì´ì—ˆë‹¤. +나는 반쯤 ë¨¹ë˜ ì°¨ë¥¼ 놓고 뷔페 밖으로 뛰어나갔다. +"오 미시즈 체스터필드?" +하고 나는 노파 ì•žì— ì†ì„ 내어밀었다. 노파는 체스터필드ë¼ëŠ” 미국 ë‚¨íŽ¸ì˜ ì„±ì„ ë”°ë¼ì„œ 부르는 ê²ƒì„ ê¸°ì–µí•˜ì˜€ë‹¤. +"ì„ ìƒë‹˜!" +하는 ê²ƒì€ ì •ìž„ì´ì—ˆë‹¤. ê·¸ ì†Œë¦¬ë§Œì€ ë³€ì¹˜ 아니하였다. 나는 ê²€ì€ ìž¥ê°‘ì„ ë‚€ ì •ìž„ì˜ ì†ì„ 잡았다. 나는 여러 ë§ ì•„ë‹ˆí•˜ê³  노파와 ì •ìž„ì„ ë·”íŽ˜ë¡œ ëŒê³  들어왔다. +ëŠ™ì€ ë·”íŽ˜ ë³´ì´ëŠ” 번ì©ë²ˆì©í•˜ëŠ” 사모바르ì—서 ì°¨ ë‘ ìž”ì„ ë”°ë¼ë‹¤ê°€ 노파와 ì •ìž„ì˜ ì•žì— ë†“ì•˜ë‹¤. +노파는 어린애ì—게 하는 모양으로 ì •ìž„ì˜ ìˆ˜ê±´ì„ ë²—ê²¨ 주었다. ê·¸ ì†ì—서는 해쓱하게 여윈 ì •ìž„ì˜ ì–¼êµ´ì´ ë‚˜ì™”ë‹¤. ë‘ ë³¼ì— ë¶ˆê·¸ë ˆí•˜ê²Œ í™í›ˆì´ ë„는 ê²ƒë„ ë³‘ 때문ì¸ê°€. +"어때? ì‹ ì—´ì€ ì—†ë‚˜?" +하고 나는 ì •ìž„ì—게 물었다. +"괜찮아요." +하고 ì •ìž„ì€ ì›ƒìœ¼ë©°, +"최 ì„ ìƒë‹˜ê»˜ì„œëŠ” 어떠세요?" +하고 묻는다. +"좀 나으신 모양ì´ì•¼. 그래서 나는 오늘 ì •ìž„ì„ ì¢€ 보러 가려고 í–ˆëŠ”ë° ì´ ì²´ìŠ¤í„°í•„ë“œ ë¶€ì¸ê»˜ì„œ 아니 오시면 순임ì´ê°€ í˜¼ìž ìžˆì„ ìˆ˜ê°€ 없다고 해서, 그래 ì´ë ‡ê²Œ 최 ì„ ìƒ ìžì‹¤ ê²ƒì„ ì‚¬ 가지고 가는 길ì´ì•¼." +하고 ë§ì„ í•˜ë©´ì„œë„ ë‚˜ëŠ” ì •ìž„ì˜ ëˆˆê³¼ ìž…ê³¼ 목ì—서 ê·¸ì˜ ë³‘ê³¼ 마ìŒì„ 알아보려고 애를 ì¼ë‹¤. +ì¤‘ë³‘ì„ ì•“ì€ ê¹ í•´ì„œëŠ” 한 달 ì „ 남대문서 ë³¼ 때보다 얼마 ë” ì´ˆì·Œí•œ 것 같지는 아니하였다. +"네ì—." +하고 ì •ìž„ì€ ê³ ê°œë¥¼ 숙였다. ê·¸ì˜ ì•ˆê²½ì•Œì—는 ì´ìŠ¬ì´ ë§ºí˜”ë‹¤. +"ì„ ìƒë‹˜ ëŒì€ 다 안녕하셔요?" +"ì‘, ë‚´ê°€ ë– ë‚  때ì—는 괜찮았어." +"최 ì„ ìƒë‹˜ ëŒë„?" +"ì‘." +"ì„ ìƒë‹˜ í½ì€ 애를 쓰셨어요." +하고 ì •ìž„ì€ ìš¸ìŒì¸ì§€ 웃ìŒì¸ì§€ 모를 웃ìŒì„ 웃는다. +ë§ì„ 모르는 노파는 우리가 하는 ë§ì„ 눈치나 채려는 ë“¯ì´ ë©€ê±°ë‹ˆ ë³´ê³  있다가 서투른 ì˜ì–´ë¡œ, +"ì•„ì§ ë¯¸ìŠ¤ ë‚¨ì€ ì‹ ì—´ì´ ìžˆë‹µë‹ˆë‹¤. ê·¸ëž˜ë„ ê°€ 본다고, ì£½ì–´ë„ ê°€ 본다고 ë‚´ ë§ì„ 안 듣고 ë”°ë¼ì™”지요." +하고 ì •ìž„ì—게 ì• ì • 있는 눈í˜ê¹€ì„ 주며, +"유 노티 ì°¨ì¼ë“œ(ë§ì½ê¾¼ì´)." +하고 ìž…ì„ ì”°ë£©í•˜ë©° ì •ìž„ì„ ì•ˆê²½ 위로 본다. +"니체워, 마뚜슈까(괜찮아요, 어머니)." +하고 ì •ìž„ì€ ë…¸íŒŒë¥¼ ë³´ê³  웃었다. ì •ìž„ì˜ ì„œì–‘ 사람ì—게 대한 í–‰ë™ì€ 서양ì‹ìœ¼ë¡œ 째었다고 ìƒê°í•˜ì˜€ë‹¤. +ì •ìž„ì€ ë„리어 유쾌한 ë¹›ì„ ë³´ì˜€ë‹¤. 다만 ê·¸ì˜ ë¶‰ì€ë¹› ë¤ ëˆˆê³¼ 마른 ìž…ìˆ ì´ ê·¸ì˜ ëª¸ì— ì—´ì´ ìžˆìŒì„ 보였다. 나는 ê·¸ì˜ ì†ëê³¼ ë°œëì´ ì‹¸ëŠ˜í•˜ê²Œ ì–¼ì—ˆì„ ê²ƒì„ ìƒìƒí•˜ì˜€ë‹¤. +마침 ì´ ë‚ ì€ ë‚ ì´ ì˜¨í™”í•˜ì˜€ë‹¤. ì—·ì€ í–‡ë¹›ë„ ì˜¤ëŠ˜ì€ ë‘꺼워진 듯하였다. +우리 세 ì‚¬ëžŒì€ Fì—­ì—서 내려서 ì°ë§¤ 하나를 얻어 타고 산으로 향하였다. ì‚°ë„ ì•„ë‹ˆì§€ë§ˆëŠ” ì‚° 있는 나ë¼ì—서 ì‚´ë˜ ìš°ë¦¬ëŠ” 최ì„ì´ê°€ 사는 ê³³ì„ ì‚°ì´ë¼ê³  부르는 ìŠµê´€ì„ ì§€ì—ˆë‹¤. ì‚¼ë¦¼ì´ ìžˆìœ¼ë‹ˆ ì‚°ê°™ì´ ìƒê°ëœ 까닭ì´ì—ˆë‹¤. +노파가 오른편 ëì— ì•‰ê³ , 가운ë°ë‹¤ê°€ ì •ìž„ì„ ì•‰ížˆê³  왼편 ëì— ë‚´ê°€ 앉았다. +쩟쩟쩟 하는 ì†Œë¦¬ì— ë§ì€ 달리기 시작하였다. 한 í•„ì€ í‚¤ í° ë§ì´ìš”, 한 í•„ì€ í‚¤ê°€ ìž‘ì€ ë§ì¸ë° 키 í° ë§ì€ 아마 ëŠ™ì€ êµ°ë§ˆ 퇴물ì¸ê°€ 싶게 허우대는 좋으나 ëª¸ì´ ì—¬ìœ„ê³  털ì—는 ìœ¤ì´ ì—†ì—ˆë‹¤. 조금만 올ë¼ê°€ëŠ” ê¸¸ì´ ë˜ì–´ë„ 고개를 숙ì´ê³  애를 ì¼ë‹¤. ìž‘ì€ ë§ì€ 까불어서 ê°€ë” ì±„ì°ìœ¼ë¡œ 얻어맞았다. +"ì•„ì´ ì‚¼ë¦¼ì´ ì¢‹ì•„ìš”." +하고 ì •ìž„ì€ ì •ë§ ê¸°ìœ ë“¯ì´ ë‚˜ë¥¼ ëŒì•„보았다. +"좋아?" +하고 나는 ë©‹ì—†ì´ ëŒ€ê¾¸í•˜ê³  나서, 후회ë˜ëŠ” 듯ì´, +"밤낮 삼림 ì†ì—서만 사니까 지루한ë°." +하는 ë§ì„ 붙였다. +"저는 ì € 눈 있는 삼림 ì†ìœ¼ë¡œ 한정 ì—†ì´ ê°€ê³  ì‹¶ì–´ìš”. 그러나 저는 ì¸ì œ ê¸°ìš´ì´ ì—†ìœ¼ë‹ˆê¹ ì›¬ê±¸ 그래 ë³´ê² ì–´ìš”?" +하고 í•œìˆ¨ì„ ì‰¬ì—ˆë‹¤. +"왜 그런 소릴 í•´. ì¸ì œ 나ì„걸." +하고 나는 ì •ìž„ì˜ ëˆˆì„ ë“¤ì—¬ë‹¤ë³´ì•˜ë‹¤. 마치 슬픈 눈물 방울ì´ë‚˜ 찾으려는 듯ì´. +"제가 ì§€ê¸ˆë„ ì—´ì´ ì‚¼ì‹­íŒ” ë„ê°€ 넘습니다. ì •ì‹ ì´ í릿해지는 ê²ƒì„ ë³´ë‹ˆê¹Œ 아마 ë” ì˜¬ë¼ê°€ë‚˜ ë´ìš”. ê·¸ëž˜ë„ ê´œì°®ì•„ìš”. 오늘 하루야 못 ì‚´ë¼ê³ ìš”. 오늘 하루만 ì‚´ë©´ 괜찮아요. 최 ì„ ìƒë‹˜ë§Œ 한 번 뵙고 죽으면 괜찮아요." +"왜 그런 소릴 í•´?" +하고 나는 ì±…ë§í•˜ëŠ” ë“¯ì´ ì–¸ì„±ì„ ë†’ì˜€ë‹¤. +ì •ìž„ì€ ê¸°ì¹¨ì„ ì‹œìž‘í•˜ì˜€ë‹¤. 한바탕 ê¸°ì¹¨ì„ í•˜ê³ ëŠ” ê¸°ìš´ì´ ì§„í•œ ë“¯ì´ ë…¸íŒŒì—게 기대며 ì¡°ì„ ë§ë¡œ, +"추워요." +하였다. ì´ ì—¬í–‰ì´ ì–´ë–»ê²Œ ì •ìž„ì˜ ë³‘ì— ì¢‹ì§€ 못할 ê²ƒì€ ì˜ì‚¬ê°€ 아닌 ë‚˜ë¡œë„ ì§ìž‘í•  수가 있었다. 그러나 나로는 ë” ì–´ì°Œí•  수가 없었다. +나는 외투를 벗어서 ì •ìž„ì—게 입혀 주고 노파는 ì •ìž„ì„ ì•ˆì•„ì„œ ëª¸ì´ ëœ í”들리ë„ë¡ ë˜ ì¶¥ì§€ 않ë„ë¡ í•˜ì˜€ë‹¤. +나는 ì •ìž„ì˜ ëª¨ì–‘ì„ ì• ì²˜ë¡œì›Œì„œ 차마 ë³¼ 수가 없었다. 그러나 ì´ê²ƒì€ 하나님밖ì—는 어찌할 ë„리가 없는 ì¼ì´ì—ˆë‹¤. +얼마를 지나서 ì •ìž„ì€ ê°‘ìžê¸° 고개를 들고 ì¼ì–´ë‚˜ë©°, +"ì¸ì œ ëª¸ì´ ì¢€ 녹았습니다. ì„ ìƒë‹˜ 추우시겠어요. ì´ ì™¸íˆ¬ 입으셔요." +하고 ê·¸ì˜ ìž…ë§Œ 웃는 웃ìŒì„ 웃었다. +"난 춥지 않아. 어서 ìž…ê³  있어." +하고 나는 ì •ìž„ì´ê°€ 외투를 벗는 ê²ƒì„ ë§‰ì•˜ë‹¤. ì •ìž„ì€ ë” ê³ ì§‘í•˜ë ¤ê³ ë„ ì•„ë‹ˆí•˜ê³ , +"ì„ ìƒë‹˜ ì‹œë² ë¦¬ì•„ì˜ ì‚¼ë¦¼ì€ ì°¸ 좋아요. 눈 ë®ì¸ ê²ƒì´ ë” ì¢‹ì€ ê²ƒ 같아요. 저는 ì´ ì¸ì  없고 ìžìœ ë¡œìš´ 삼림 ì†ìœ¼ë¡œ 헤매어 ë³´ê³  ì‹¶ì–´ìš”." +하고 아까 í•˜ë˜ ê²ƒê³¼ ê°™ì€ ë§ì„ ë˜ í•˜ì˜€ë‹¤. +"ë©°ì¹  잘 정양하여서, ë‚ ì´ë‚˜ 따뜻하거든 한 번 산보나 í•´ ë³´ì§€." +하고 나는 ì •ìž„ì˜ ë§ ëœ»ì´ ë‹¤ë¥¸ ë° ìžˆëŠ” ì¤„ì„ ì•Œë©´ì„œë„ ë¶€ëŸ¬ í‰ë²”하게 대답하였다. +ì •ìž„ì€ ëŒ€ë‹µì´ ì—†ì—ˆë‹¤. +"ì—¬ê¸°ì„œë„ ì•„ì§ ë©€ì–´ìš”?" +하고 ì •ìž„ì€ ëª¸ì´ í”들리는 ê²ƒì„ ì‹¬ížˆ 괴로워하는 모양으로 ë‘ ì†ì„ ìžë¦¬ì— ì§šì–´ ëª¸ì„ ë²„í‹°ë©´ì„œ ë§í•˜ì˜€ë‹¤. +"고대야, 최 ì„ ìƒì´ 반가워할 í„°ì´ì§€. 오죽ì´ë‚˜ 반갑겠나." +하고 나는 ì •ìž„ì„ ìœ„ë¡œí•˜ëŠ” 뜻으로 ë§í•˜ì˜€ë‹¤. +"ì•„ì´ ì°¸ 미안해요. 제가 죄ì¸ì´ì•¼ìš”. ì € ë•Œë¬¸ì— ì• ë§¤í•œ ëˆ„ëª…ì„ ì“°ì‹œê³  저렇게 ì‚¬ì—…ë„ ë²„ë¦¬ì‹œê³  병환까지 나시니 저는 어떡허면 ì´ ì£„ë¥¼ 씻습니까?" +하고 눈물 ê³ ì¸ ëˆˆìœ¼ë¡œ ì •ìž„ì€ ë‚˜ë¥¼ ì³ë‹¤ë³´ì•˜ë‹¤. +나는 정임과 최ì„ì„ ì´ ìžìœ ë¡œìš´ ì‹œë² ë¦¬ì•„ì˜ ì‚¼ë¦¼ ì†ì— ë‹¨ë‘˜ì´ ì‚´ê²Œ 하고 싶었다. 그러나 최ì„ì€ ì‚´ì•„ë‚˜ê°€ê² ì§€ë§ˆëŠ” ì •ìž„ì´ê°€ ì‚´ì•„ë‚  수가 있ì„까, 하고 나는 ì •ìž„ì˜ ì–´ê¹¨ë¥¼ ë°”ë¼ë³´ì•˜ë‹¤. ê·¸ì˜ ëª©ìˆ¨ì€ ì‹¤ë‚± ê°™ì€ ê²ƒ 같았다. 바람받ì´ì— ë†“ì¸ ë“±ìž”ë¶ˆê³¼ë§Œ ê°™ì€ ê²ƒ 같았다. ì´ ëª©ìˆ¨ì´ ëŠì–´ì§€ê¸° ì „ì— ì‚¬ëž‘í•˜ëŠ” ì´ì˜ ì–¼êµ´ì„ í•œ 번 대하겠다는 ê²ƒë°–ì— ì•„ë¬´ 소ì›ì´ 없는 ì •ìž„ì€ ì°¸ìœ¼ë¡œ 가엾어서 ê°€ìŠ´ì´ ë¯¸ì–´ì§€ëŠ” 것 같았다. +"염려 ë§ì–´. 무슨 걱정ì´ì•¼? 최 ì„ ìƒë„ ë³‘ì´ ëŒë¦¬ê³  ì •ìž„ë„ ì¸ì œ 얼마 정양하면 ë‚˜ì„ ê²ƒ 아닌가. 아무 염려 ë§ì•„ìš”." +하고 나는 ë”ìš± 최ì„ê³¼ 정임과 ë‘ ì‚¬ëžŒì˜ ì‚¬ëž‘ì„ ë‹¬í•˜ê²Œ í•  ê²°ì‹¬ì„ í•˜ì˜€ë‹¤. 하나님께서 계시다면 ì´ ê°€ì—¾ì€ ê°„ì ˆí•œ ë‘ ì‚¬ëžŒì˜ ë§ˆìŒì„ 가슴 미어지게 아니 ìƒê°í•  리가 없다고 ìƒê°í•˜ì˜€ë‹¤. ìš°ì£¼ì˜ ëª¨ë“  ì¼ ì¤‘ì— ì •ìž„ì˜ ì •ê²½ë³´ë‹¤ ë” ìŠ¬í”„ê³  불ìŒí•œ ì •ê²½ì´ ë˜ ìžˆì„까 하였다. 차디찬 눈으로 ë®ì¸ ì‹œë² ë¦¬ì•„ì˜ ê´‘ì•¼ì— ë³‘ë“  ì •ìž„ì˜ ì‚¬ëž‘ìœ¼ë¡œ 타는 불똥과 ê°™ì´ ë‚ ì•„ê°€ëŠ” ì´ ì •ê²½ì€ ì¸ìƒì´ 가질 수 있는 최대한 ë¹„ê·¹ì¸ ê²ƒ 같았다. +ì •ìž„ì€ ì§€ì³ì„œ 고개를 숙ì´ê³  ìžˆë‹¤ê°€ë„ ê°€ë” ê³ ê°œë¥¼ 들어서는 기운 나는 ì–‘ì„ ë³´ì´ë ¤ê³ , 유쾌한 ì–‘ì„ ë³´ì´ë ¤ê³  애를 ì¼ë‹¤. +"ì € 나무 보셔요. 오백 ë…„ì€ ì‚´ì•˜ê² ì§€ìš”?" +ì´ëŸ° ë§ë„ 하였다. 그러나 ê·¸ê²ƒì€ ë‹¤ 억지로 지어서 하는 것ì´ì—ˆë‹¤. 그러다가는 ë˜ ê¸°ìš´ì´ ì§€ì³ì„œëŠ” 고개를 숙ì´ê³ , í˜¹ì€ ë…¸íŒŒì˜ ì–´ê¹¨ì— í˜¹ì€ ë‚´ ì–´ê¹¨ì— ì“°ëŸ¬ì¡Œë‹¤. +마침내 우리가 향하고 가는 ì›€ì§‘ì´ ë³´ì˜€ë‹¤. +"ì •ìž„ì´, 저기야." +하고 나는 ì›€ì§‘ì„ ê°€ë¦¬ì¼°ë‹¤. +"네ì—?" +하고 ì •ìž„ì€ ë‚´ ì†ê°€ë½ 가는 ê³³ì„ ë³´ê³  다ìŒì—는 ë‚´ ì–¼êµ´ì„ ë³´ì•˜ë‹¤. 잘 ë³´ì´ì§€ 않는 모양ì´ë‹¤. +"저기 저것 ë§ì•¼. 저기 ì € ê³ ìž‘ í° ì „ë‚˜ë¬´ ë‘ ê°œê°€ 있지 않아? ê·¸ 사ì´ë¡œ ë³´ì´ëŠ” ì €, 저거 ë§ì•¼. 옳지 옳지, ìˆœìž„ì´ ì§€ê¸ˆ 나오지 않아?" +하였다. +순임ì´ê°€ ë¬´ì—‡ì„ ê°€ì§€ëŸ¬ 나오는지 ë¬¸ì„ ì—´ê³  나와서는 ë°¥ ì§“ëŠë¼ê³  지어 ë†“ì€ ì´ë¥¼í…Œë©´ 부엌ì—를 들어갔다가 나오는 ê¸¸ì— ì´ ìª½ì„ ë°”ë¼ë³´ë‹¤ê°€ 우리를 발견하였는지 몇 ê±¸ìŒ ë¹¨ë¦¬ 오다가는 서서 ë³´ê³  오다가는 서서 ë³´ë”니 ë‚´ê°€ 모ìžë¥¼ ë‚´ë‘르는 ê²ƒì„ ë³´ê³ ì•¼ 우리 ì¼í–‰ì¸ ê²ƒì„ í™•ì‹¤ížˆ 알고 달ìŒë°•ì§ˆì„ ì³ì„œ 나온다. +우리 ì°ë§¤ë¥¼ 만나ìž, +"ì •ìž„ì´ì•¼? 어쩌면 ì´ ì¶”ìš´ë°." +하고 ìˆœìž„ì€ ì •ìž„ì„ ì•ˆê³  ê·¸ 안경으로 ì •ìž„ì˜ ëˆˆì„ ë“¤ì—¬ë‹¤ë³¸ë‹¤. +"어쩌면 앓으면서 ì´ë ‡ê²Œ 와?" +하고 ìˆœìž„ì€ ë…¸íŒŒì™€ 나를 ì±…ë§í•˜ëŠ” ë“¯ì´ ëŒì•„보았다. +"아버지 어떠시ëƒ?" +하고 나는 ì§ì„ 들고 앞서서 오면서 뒤따르는 순임ì—게 물었다. +"아버지요?" +하고 ìˆœìž„ì€ ì–´ë¥¸ì—게 대한 ê²½ì˜ë¥¼ 표하노ë¼ê³  ë‚´ ê³ì— 와서 걸으며, +"아버지께서 ì˜¤ëŠ˜ì€ ë§ì”€ì„ ë§Žì´ í•˜ì…¨ì–´ìš”. 순임ì´ê°€ ê³ ìƒí•˜ëŠ”êµ¬ë‚˜ 고맙다, ì´ëŸ° ë§ì”€ë„ 하시고, 지금 같아서는 ì¼ì–´ë‚  ê²ƒë„ ê°™ì€ë° ê¸°ìš´ì´ ì—†ì–´ì„œ, ì´ëŸ° ë§ì”€ë„ 하시고, ë˜ ì„ ìƒë‹˜ì´ ì´ë¥´ì¿ ì¸ í¬ì—를 들어가셨으니 ë¬´ì—‡ì„ ì‚¬ 오실 듯싶으ëƒ, 알아맞혀 ë³´ì•„ë¼, ì´ëŸ° ë†ë‹´ë„ 하시고, ì •ìž„ì´ê°€ 어떤가 한 번 보았으면, ì´ëŸ° ë§ì”€ë„ 하시겠지요. ë˜ ìˆœìž„ì•„, ë‚´ê°€ 죽ë”ë¼ë„ ì •ìž„ì„ ë„¤ 친ë™ìƒìœ¼ë¡œ 알아서 부디 잘 사랑해 주어ë¼, ì •ìž„ì€ ë¶ˆìŒí•œ 애다, ì°¸ ì •ìž„ì€ ë¶ˆìŒí•´! ì´ëŸ° ë§ì”€ë„ 하시겠지요. 그렇게 여러 가지 ë§ì”€ì„ ë§Žì´ í•˜ì‹œë”니, 순임아 ë‚´ê°€ 죽거든 ì„ ìƒë‹˜ì„ 아버지로 알고 ê·¸ ì§€ë„를 받아ë¼, 그러시길래 제가 아버지 안 ëŒì•„가셔요! 그랬ë”니 아버지께서 웃으시면서, 죽지 ë§ê¹Œ, 하시고는 어째 ê°€ìŠ´ì´ ì¢€ ê±°ë¶í•œê°€, 하시ë”니 ìž ì´ ë“œì…¨ì–´ìš”. 한 시간ì´ë‚˜ ë˜ì—ˆì„까, 온." +ì§‘ ì•žì— ê±°ì˜ ë‹¤ 가서는 ìˆœìž„ì€ ì •ìž„ì˜ íŒ”ì„ ê¼ˆë˜ ê²ƒì„ ë†“ê³  빨리 집으로 뛰어들어갔다. +치마í­ì„ 펄럭거리고 뛰는 ì–‘ì—는 ì–´ë ¸ì„ ì  ë§ê´„ëŸ‰ì´ ìˆœìž„ì˜ ëª¨ìŠµì´ ë‚¨ì•„ 있어서 나는 í˜¼ìž ì›ƒì—ˆë‹¤. ìˆœìž„ì€ ì •ìž„ì´ê°€ 왔다는 ê¸°ìœ ì†Œì‹ì„ 한 시ê°ì´ë¼ë„ 빨리 아버지께 전하고 ì‹¶ì—ˆë˜ ê²ƒì´ë‹¤. +"아버지, 주무시우? ì •ìž„ì´ê°€ 왔어요. ì •ìž„ì´ê°€ 왔습니다." +하고 부르는 소리가 ë°–ì—ì„œë„ ë“¤ë ¸ë‹¤. +ë‚˜ë„ ë°©ì— ë“¤ì–´ì„œê³ , ì •ìž„ë„ ë’¤ë”°ë¼ ë“¤ì–´ì„œê³ , 노파는 부엌으로 ë¬¼ê±´ì„ ë‘러 들어갔다. +ë°©ì€ ì ˆë²½ê°™ì´ ì–´ë‘웠다. +"순임아, ë¶ˆì„ ì¢€ 켜려무나." +하고 최ì„ì˜ ì–¼êµ´ì„ ì°¾ëŠë¼ê³  ëˆˆì„ í¬ê²Œ 뜨고 고개를 숙ì´ë©°, +"ìžë‚˜? ì •ìž„ì´ê°€ 왔네." +하고 불렀다. +ì •ìž„ë„ ê³ì— 와서 선다. +최ì„ì€ ëŒ€ë‹µì´ ì—†ì—ˆë‹¤. +순임ì´ê°€ ì´›ë¶ˆì„ ì¼œìž ìµœì„ì˜ ì–¼êµ´ì´ í™˜í•˜ê²Œ 보였다. +"여보게, ì—¬ë´. ìžë‚˜?" +하고 나는 무서운 예ê°ì„ 가지면서 최ì„ì˜ ì–´ê¹¨ë¥¼ í”들었다. +ê·¸ê²ƒì´ ë¬´ì—‡ì¸ì§€ 모르지마는 최ì„ì€ ì‹œì²´ë¼ í•˜ëŠ” ê²ƒì„ ë‚˜ëŠ” ë‚´ ì†ì„ 통해서 깨달았다. +나는 ê¹œì§ ë†€ë¼ì„œ ì´ë¶ˆì„ 벗기고 최ì„ì˜ íŒ”ì„ ìž¡ì•„ ë§¥ì„ ì§šì–´ 보았다. 거기는 ë§¥ì´ ì—†ì—ˆë‹¤. +나는 최ì„ì˜ ìžë¦¬ì˜· ê°€ìŠ´ì„ í—¤ì¹˜ê³  귀를 ê°€ìŠ´ì— ëŒ€ì—ˆë‹¤. ê·¸ ì‚´ì€ ì–¼ìŒê³¼ ê°™ì´ ì°¨ê³  ê·¸ ê°€ìŠ´ì€ ê³ ìš”í•˜ì˜€ë‹¤. ì‹¬ìž¥ì€ ë›°ê¸°ë¥¼ 그친 것ì´ì—ˆë‹¤. +나는 최ì„ì˜ ê°€ìŠ´ì—서 귀를 떼고 ì¼ì–´ì„œë©´ì„œ, +"네 아버지는 ëŒì•„가셨다. 네 ì†ìœ¼ë¡œ 눈ì´ë‚˜ ê°ê²¨ 드려ë¼." +하였다. ë‚´ 눈ì—서는 ëˆˆë¬¼ì´ í˜ë €ë‹¤. +"ì„ ìƒë‹˜!" +하고 ì •ìž„ì€ ì „ì—°ížˆ 절제할 íž˜ì„ ìžƒì–´ë²„ë¦° ë“¯ì´ ìµœì„ì˜ ê°€ìŠ´ì— ì—Žì–´ì¡Œë‹¤. 그러고는 소리를 ë‚´ì–´ 울었다. 순임ì€, +"아버지, 아버지!" +하고 최ì„ì˜ ë² ê°œ ê³ì— ì´ë§ˆë¥¼ 대고 울었다. +ì•„ë¼ì‚¬ ë…¸íŒŒë„ ìš¸ì—ˆë‹¤. +ë°© 안ì—는 ì˜¤ì§ ìš¸ìŒ ì†Œë¦¬ë¿ì´ìš”, ë§ì´ 없었다. 최ì„ì€ ë²Œì¨ ì´ ìŠ¬í”ˆ ê´‘ê²½ë„ ëª°ë¼ë³´ëŠ” 사람ì´ì—ˆë‹¤. +최ì„ì´ê°€ ìžê¸°ì˜ ì‹¸ì›€ì„ ì´ê¸°ê³  죽었는지, ë˜ëŠ” ë까지 지다가 죽었는지 ê·¸ê²ƒì€ ì˜ì›í•œ 비밀ì´ì–´ì„œ 알 ë„리가 없었다. 그러나 ì´ê²ƒë§Œì€ 확실하다 ê·¸ì˜ ì˜ì‹ì´ 마지막으로 ë나는 ìˆœê°„ì— ê·¸ì˜ ì˜ì‹ê¸°ì— ë– ì˜¤ë¥´ë˜ ì˜¤ì§ í•˜ë‚˜ê°€ ì •ìž„ì´ì—ˆìœ¼ë¦¬ë¼ëŠ” 것만ì€. +지금 ì •ìž„ì´ê°€ ê·¸ì˜ ê°€ìŠ´ì— ì—Žì–´ì ¸ 울지마는, ì •ìž„ì˜ ëœ¨ê±°ìš´ ëˆˆë¬¼ì´ ê·¸ì˜ ê°€ìŠ´ì„ ì ì‹œê±´ë§ˆëŠ” 최ì„ì˜ ê°€ìŠ´ì€ ë›¸ ì¤„ì„ ëª¨ë¥¸ë‹¤. ì´ê²ƒì´ 죽ìŒì´ëž€ 것ì´ë‹¤. +ë’¤ì— ê²½ì°°ì˜ê°€ 와서 검사한 ê²°ê³¼ì— ì˜í•˜ë©´, 최ì„ì€ í렴으로 ì•“ë˜ ê²°ê³¼ë¡œ 심장마비를 ì¼ìœ¼í‚¨ 것ì´ë¼ê³  하였다. +나는 최ì„ì˜ ìž¥ë¡€ë¥¼ ëë‚´ê³  순임과 ì •ìž„ì„ ë°ë¦¬ê³  오려 하였으나 ì •ìž„ì€ ë“£ì§€ 아니하고 노파와 ê°™ì´ ë°”ì´ì¹¼ 촌으로 ê°€ 버렸다. +그런 뒤로는 ì •ìž„ì—게서는 ì¼ì²´ ìŒì‹ ì´ 없다. 때때로 노파ì—게서 편지가 ì˜¤ëŠ”ë° ì •ìž„ì€ ìµœì„ì´ê°€ ìžˆë˜ ë°©ì— ê°€ë§Œížˆ 있다고만 하였다. +서투른 ì˜ì–´ê°€ ëœ»ì„ ì¶©ë¶„ížˆ 발표하지 못하는 것ì´ì—ˆë‹¤. +나는 ì •ìž„ì—게 안심하고 ë³‘ì„ ì¹˜ë£Œí•˜ë¼ëŠ” íŽ¸ì§€ë„ í•˜ê³  ëˆì´ 필요하거든 청구하ë¼ëŠ” íŽ¸ì§€ë„ í•˜ë‚˜ ì˜ ë‹µìž¥ì´ ì—†ë‹¤. +ë§Œì¼ ì •ìž„ì´ê°€ 죽었다는 ê¸°ë³„ì´ ì˜¤ë©´ 나는 한 번 ë” ì‹œë² ë¦¬ì•„ì— ê°€ì„œ ë‘˜ì„ ê°€ì§€ëŸ°ížˆ 묻고 `ë‘ ë³„ 무ë¤'ì´ë¼ëŠ” 비를 세워 줄 ìƒê°ì´ë‹¤. 그러나 나는 ì •ìž„ì´ê°€ 조선으로 오기를 바란다. +ì—¬ëŸ¬ë¶„ì€ ìµœì„ê³¼ ì •ìž„ì—게 대한 ì´ ê¸°ë¡ì„ 믿고 ê·¸ ë‘ ì‚¬ëžŒì—게 대한 오해를 í’€ë¼. +EOT; +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Address.php new file mode 100644 index 00000000..5f446408 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Address.php @@ -0,0 +1,131 @@ +generator->parse($format); + } + + public static function country() + { + return static::randomElement(static::$country); + } + + public static function postcode() + { + return static::toUpper(static::bothify(static::randomElement(static::$postcode))); + } + + public static function regionSuffix() + { + return static::randomElement(static::$regionSuffix); + } + + public static function region() + { + return static::randomElement(static::$region); + } + + public static function citySuffix() + { + return static::randomElement(static::$citySuffix); + } + + public function city() + { + return static::randomElement(static::$city); + } + + public static function streetSuffix() + { + return static::randomElement(static::$streetSuffix); + } + + public static function street() + { + return static::randomElement(static::$street); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Company.php new file mode 100644 index 00000000..4a110c2c --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Company.php @@ -0,0 +1,15 @@ +generator->parse(static::randomElement(static::$lastNameFormat)); + } + + /** + * Return male last name + * @return string + * @example 'Vasiliauskas' + */ + public function lastNameMale() + { + return static::randomElement(static::$lastNameMale); + } + + /** + * Return female last name + * @return string + * @example 'ŽukauskaitÄ—' + */ + public function lastNameFemale() + { + return static::randomElement(static::$lastNameFemale); + } + + /** + * Return driver license number + * @return string + * @example 12345678 + */ + public function driverLicence() + { + return $this->bothify("########"); + } + + /** + * Return passport number + * @return string + * @example 12345678 + */ + public function passportNumber() + { + return $this->bothify("########"); + } + + /** + * National Personal Identity number (asmens kodas) + * @link https://en.wikipedia.org/wiki/National_identification_number#Lithuania + * @link https://lt.wikipedia.org/wiki/Asmens_kodas + * @param string [male|female] + * @param \DateTime $birthdate + * @param string $randomNumber three integers + * @return string on format XXXXXXXXXXX + */ + public function personalIdentityNumber($gender = 'male', \DateTime $birthdate = null, $randomNumber = '') + { + if (!$birthdate) { + $birthdate = \Faker\Provider\DateTime::dateTimeThisCentury(); + } + + $genderNumber = ($gender == 'male') ? 1 : 0; + $firstNumber = (int) floor($birthdate->format('Y') / 100) * 2 - 34 - $genderNumber; + + $datePart = $birthdate->format('ymd'); + $randomDigits = (string) ( ! $randomNumber || strlen($randomNumber) < 3) ? static::numerify('###') : substr($randomNumber, 0, 3); + $partOfPerosnalCode = $firstNumber . $datePart . $randomDigits; + + $sum = self::calculateSum($partOfPerosnalCode, 1); + $liekana = $sum % 11; + + if ($liekana !== 10) { + $lastNumber = $liekana; + return $firstNumber . $datePart . $randomDigits . $lastNumber; + } + + $sum = self::calculateSum($partOfPerosnalCode, 2); + $liekana = $sum % 11; + + $lastNumber = ($liekana !== 10) ? $liekana : 0; + return $firstNumber . $datePart . $randomDigits . $lastNumber; + } + + /** + * Calculate the sum of personal code + * @link https://en.wikipedia.org/wiki/National_identification_number#Lithuania + * @link https://lt.wikipedia.org/wiki/Asmens_kodas + * @param string $numbers + * @param int $time [1|2] + * @return int + */ + private static function calculateSum($numbers, $time = 1) + { + if ($time == 1) { + $multipliers = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 1 ); + } else { + $multipliers = array(3, 4, 5, 6, 7, 8, 9, 1, 2, 3 ); + } + + $sum = 0; + for ($i=1; $i <= 10; $i++) { + $sum += $numbers[$i-1] * $multipliers[$i-1]; + } + + return (int) $sum; + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/PhoneNumber.php new file mode 100644 index 00000000..752eb78b --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/PhoneNumber.php @@ -0,0 +1,17 @@ +bothify("??######"); + return static::bothify('??######'); } public function passportNumber() { - return $this->bothify("??#######"); + return static::bothify('??#######'); } /** @@ -70,7 +115,7 @@ class Person extends \Faker\Provider\Person public function personalIdentityNumber(\DateTime $birthdate = null) { if (!$birthdate) { - $birthdate = \Faker\Provider\DateTime::dateTimeThisCentury(); + $birthdate = DateTime::dateTimeThisCentury(); } $datePart = $birthdate->format('dmy'); diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/lv_LV/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/lv_LV/PhoneNumber.php index f6b61486..29c19f63 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/lv_LV/PhoneNumber.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/lv_LV/PhoneNumber.php @@ -4,10 +4,12 @@ namespace Faker\Provider\lv_LV; class PhoneNumber extends \Faker\Provider\PhoneNumber { + /** + * {@link} https://en.wikipedia.org/wiki/Telephone_numbers_in_Latvia + **/ protected static $formats = array( - '##-###-###', - '##-######', '########', - '+371 #######', + '## ### ###', + '+371 ########', ); } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/me_ME/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/me_ME/Address.php index 5b9caf14..422207ea 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/me_ME/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/me_ME/Address.php @@ -109,19 +109,11 @@ class Address extends \Faker\Provider\Address return static::randomElement(static::$cityNames); } - /** - * @example '77.147489' - */ - public static function latitude() + public static function localCoordinates() { - return number_format(mt_rand(42430000, 42450000)/1000000, 6); - } - - /** - * @example '86.211205' - */ - public static function longitude() - { - return number_format(mt_rand(19260000, 19270000)/1000000, 6); + return array( + 'latitude' => static::latitude(42.43, 42.45), + 'longitude' => static::longitude(19.16, 19.27) + ); } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/mn_MN/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/mn_MN/Person.php new file mode 100644 index 00000000..3042b5bb --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/mn_MN/Person.php @@ -0,0 +1,100 @@ +generator->parse(static::$idNumberFormat)); + } + + /** + * @return string + * @example 'Ф' + */ + public function alphabet() + { + return static::randomElement(static::$alphabet); + } + + /** + * @return string + * @example 'Э' + */ + public function namePrefix() + { + return static::randomElement(static::$namePrefix); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/mn_MN/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/mn_MN/PhoneNumber.php new file mode 100644 index 00000000..dd0bb4ab --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/mn_MN/PhoneNumber.php @@ -0,0 +1,13 @@ + Townships + * @link https://en.wikipedia.org/wiki/Template:Johor > Townships + * @link https://en.wikipedia.org/wiki/Template:Kedah > Townships + * @link https://en.wikipedia.org/wiki/Template:Kelantan > Townships + * @link https://en.wikipedia.org/wiki/Template:Melaka > Townships + * @link https://en.wikipedia.org/wiki/Template:Negeri_Sembilan > Townships + * @link https://en.wikipedia.org/wiki/Template:Perak > Townships + * @link https://en.wikipedia.org/wiki/Template:Penang > Townships + * @link https://en.wikipedia.org/wiki/Template:Selangor > Townships + * @link https://en.wikipedia.org/wiki/Template:Terengganu > Townships + */ + protected static $townshipPrefix = array( + 'Alam','Apartment','Ara', + 'Bandar','Bandar','Bandar','Bandar','Bandar','Bandar', + 'Bandar Bukit','Bandar Seri','Bandar Sri','Bandar Baru','Batu','Bukit', + 'Desa','Damansara', + 'Kampung','Kampung Baru','Kampung Baru','Kondominium','Kota', + 'Laman','Lembah', + 'Medan', + 'Pandan','Pangsapuri','Petaling','Puncak', + 'Seri','Sri', + 'Taman','Taman','Taman','Taman','Taman','Taman', + 'Taman Desa', + ); + protected static $townshipSuffix = array( + 'Aman','Amanjaya','Anggerik','Angkasa','Antarabangsa','Awan', + 'Bahagia','Bangsar','Baru','Belakong','Bendahara','Bestari','Bintang','Brickfields', + 'Casa','Changkat','Country Heights', + 'Damansara','Damai','Dato Harun','Delima','Duta', + 'Flora', + 'Gembira','Genting', + 'Harmoni','Hartamas', + 'Impian','Indah','Intan', + 'Jasa','Jaya', + 'Keramat','Kerinchi','Kiara','Kinrara','Kuchai', + 'Laksamana', + 'Mahkota','Maluri','Manggis','Maxwell','Medan','Melawati','Menjalara','Meru','Mulia','Mutiara', + 'Pahlawan','Perdana','Pertama','Permai','Pelangi','Petaling','Pinang','Puchong','Puteri','Putra', + 'Rahman','Rahmat','Raya','Razak','Ria', + 'Saujana','Segambut','Selamat','Selatan','Semarak','Sentosa','Seputeh','Setapak','Setia Jaya','Sinar','Sungai Besi','Sungai Buaya','Sungai Long','Suria', + 'Tasik Puteri','Tengah','Timur','Tinggi','Tropika','Tun Hussein Onn','Tun Perak','Tunku', + 'Ulu','Utama','Utara', + 'Wangi', + ); + + /** + * @link https://en.wikipedia.org/wiki/Template:Greater_Kuala_Lumpur + * @link https://en.wikipedia.org/wiki/Template:Johor + * @link https://en.wikipedia.org/wiki/Template:Kedah + * @link https://en.wikipedia.org/wiki/Template:Kelantan + * @link https://en.wikipedia.org/wiki/Template:Labuan + * @link https://en.wikipedia.org/wiki/Template:Melaka + * @link https://en.wikipedia.org/wiki/Template:Negeri_Sembilan + * @link https://en.wikipedia.org/wiki/Template:Pahang + * @link https://en.wikipedia.org/wiki/Template:Perak + * @link https://en.wikipedia.org/wiki/Template:Perlis + * @link https://en.wikipedia.org/wiki/Template:Penang + * @link https://en.wikipedia.org/wiki/Template:Sabah + * @link https://en.wikipedia.org/wiki/Template:Sarawak + * @link https://en.wikipedia.org/wiki/Template:Selangor + * @link https://en.wikipedia.org/wiki/Template:Terengganu + */ + protected static $towns = array( + 'johor' => array( + 'Ayer Hitam', + 'Batu Pahat','Bukit Gambir','Bukit Kepong','Bukit Naning', + 'Desaru', + 'Endau', + 'Gelang Patah','Gemas Baharu', + 'Iskandar Puteri', + 'Jementah','Johor Lama','Johor Bahru', + 'Kempas','Kluang','Kota Iskandar','Kota Tinggi','Kukup','Kulai', + 'Labis ','Larkin','Layang-Layang', + 'Mersing','Muar', + 'Pagoh','Paloh','Parit Jawa','Pasir Gudang','Pekan Nanas','Permas Jaya','Pontian Kechil', + 'Renggam', + 'Segamat','Senai','Simpang Renggam','Skudai','Sri Gading', + 'Tangkak','Tebrau', + 'Ulu Tiram', + 'Yong Peng', + ), + 'kedah' => array( + 'Alor Setar', + 'Baling','Bukit Kayu Hitam', + 'Changlun', + 'Durian Burung', + 'Gurun', + 'Jitra', + 'Kepala Batas','Kuah','Kuala Kedah','Kuala Ketil','Kulim', + 'Langgar','Lunas', + 'Merbok', + 'Padang Serai','Pendang', + 'Serdang','Sintok','Sungai Petani', + 'Tawar, Baling', + 'Yan', + ), + 'kelantan' => array( + 'Bachok','Bunut Payong', + 'Dabong', + 'Gua Musang', + 'Jeli', + 'Ketereh','Kota Bharu','Kuala Krai', + 'Lojing', + 'Machang', + 'Pasir Mas','Pasir Puteh', + 'Rantau Panjang', + 'Salor', + 'Tok Bali', + 'Wakaf Bharu','Wakaf Che Yeh', + ), + 'kl' => array( + 'Ampang', + 'Bandar Tasik Selatan','Bandar Tun Razak','Bangsar','Batu','Brickfields','Bukit Bintang','Bukit Jalil','Bukit Tunku', + 'Cheras','Chow Kit', + 'Damansara Town Centre','Dang Wangi','Desa Petaling','Desa Tun Hussein Onn', + 'Jinjang', + 'Kampung Baru','Kampung Kasipillay','Kampung Pandan','Kampung Sungai Penchala','Kepong','KLCC','Kuchai Lama', + 'Lake Gardens','Lembah Pantai', + 'Medan Tuanku','Mid Valley City','Mont Kiara', + 'Pantai Dalam','Pudu', + 'Salak South','Segambut','Semarak','Sentul','Setapak','Setiawangsa','Seputeh','Sri Hartamas','Sri Petaling','Sungai Besi', + 'Taman Desa','Taman Melawati','Taman OUG','Taman Tun Dr Ismail','Taman U-Thant','Taman Wahyu','Titiwangsa','Tun Razak Exchange', + 'Wangsa Maju', + ), + 'labuan' => array( + 'Batu Manikar', + 'Kiamsam', + 'Layang-Layang', + 'Rancha-Rancha' + ), + 'melaka' => array( + 'Alor Gajah', + 'Bandaraya Melaka','Batu Berendam','Bukit Beruang','Bukit Katil', + 'Cheng', + 'Durian Tunggal', + 'Hang Tuah Jaya', + 'Jasin', + 'Klebang', + 'Lubuk China', + 'Masjid Tanah', + 'Naning', + 'Pekan Asahan', + 'Ramuan China', + 'Simpang Ampat', + 'Tanjung Bidara','Telok Mas', + 'Umbai', + ), + 'nsembilan' => array( + 'Ayer Kuning','Ampangan', + 'Bahau','Batang Benar', + 'Chembong', + 'Dangi', + 'Gemas', + 'Juasseh', + 'Kuala Pilah', + 'Labu','Lenggeng','Linggi', + 'Mantin', + 'Nilai', + 'Pajam','Pedas','Pengkalan Kempas','Port Dickson', + 'Rantau','Rompin', + 'Senawang','Seremban','Sungai Gadut', + 'Tampin','Tiroi', + ), + 'pahang' => array( + 'Bandar Tun Razak','Bentong','Brinchang','Bukit Fraser','Bukit Tinggi', + 'Chendor', + 'Gambang','Genting Highlands','Genting Sempah', + 'Jerantut', + 'Karak','Kemayan','Kota Shahbandar','Kuala Lipis','Kuala Pahang','Kuala Rompin','Kuantan', + 'Lanchang','Lubuk Paku', + 'Maran','Mengkuang','Mentakab', + 'Nenasi', + 'Panching', + 'Pekan','Penor', + 'Raub', + 'Sebertak','Sungai Lembing', + 'Tanah Rata','Tanjung Sepat','Tasik Chini','Temerloh','Teriang','Tringkap', + ), + 'penang' => array( + 'Air Itam', + 'Balik Pulau','Batu Ferringhi','Batu Kawan','Bayan Lepas','Bukit Mertajam','Butterworth', + 'Gelugor','George Town', + 'Jelutong', + 'Kepala Batas', + 'Nibong Tebal', + 'Permatang Pauh','Pulau Tikus', + 'Simpang Ampat', + 'Tanjung Bungah','Tanjung Tokong', + ), + 'perak' => array( + 'Ayer Tawar', + 'Bagan Serai','Batu Gajah','Behrang','Bidor','Bukit Gantang','Bukit Merah', + 'Changkat Jering','Chemor','Chenderiang', + 'Damar Laut', + 'Gerik','Gopeng','Gua Tempurung', + 'Hutan Melintang', + 'Ipoh', + 'Jelapang', + 'Kamunting','Kampar','Kuala Kangsar', + 'Lekir','Lenggong','Lumut', + 'Malim Nawar','Manong','Menglembu', + 'Pantai Remis','Parit','Parit Buntar','Pasir Salak','Proton City', + 'Simpang Pulai','Sitiawan','Slim River','Sungai Siput','Sungkai', + 'Taiping','Tambun','Tanjung Malim','Tanjung Rambutan','Tapah','Teluk Intan', + 'Ulu Bernam', + ), + 'perlis' => array( + 'Arau', + 'Beseri', + 'Chuping', + 'Kaki Bukit','Kangar','Kuala Perlis', + 'Mata Ayer', + 'Padang Besar', + 'Sanglang','Simpang Empat', + 'Wang Kelian', + ), + 'putrajaya' => array( + 'Precinct 1','Precinct 4','Precinct 5', + 'Precinct 6','Precinct 8','Precinct 10', + 'Precinct 11','Precinct 12','Precinct 13', + 'Precinct 16','Precinct 18','Precinct 19', + ), + 'sabah' => array( + 'Beaufort','Bingkor', + 'Donggongon', + 'Inanam', + 'Kinabatangan','Kota Belud','Kota Kinabalu','Kuala Penyu','Kimanis','Kundasang', + 'Lahad Datu','Likas','Lok Kawi', + 'Manggatal', + 'Nabawan', + 'Papar','Pitas', + 'Ranau', + 'Sandakan','Sapulut','Semporna','Sepanggar', + 'Tambunan','Tanjung Aru','Tawau','Tenom','Tuaran', + 'Weston', + ), + 'sarawak' => array( + 'Asajaya', + 'Ba\'kelalan','Bario','Batu Kawa','Batu Niah','Betong','Bintulu', + 'Dalat','Daro', + 'Engkilili', + 'Julau', + 'Kapit','Kota Samarahan','Kuching', + 'Lawas','Limbang','Lubok Antu', + 'Marudi','Matu','Miri', + 'Oya', + 'Pakan', + 'Sadong Jaya','Sematan','Sibu','Siburan','Song','Sri Aman','Sungai Tujoh', + 'Tanjung Kidurong','Tanjung Manis','Tatau', + ), + 'selangor' => array( + 'Ampang','Assam Jawa', + 'Balakong','Bandar Baru Bangi','Bandar Baru Selayang','Bandar Sunway','Bangi','Banting','Batang Kali','Batu Caves','Bestari Jaya','Bukit Lanjan', + 'Cheras','Cyberjaya', + 'Damansara','Dengkil', + 'Ijok', + 'Jenjarom', + 'Kajang','Kelana Jaya','Klang','Kuala Kubu Bharu','Kuala Selangor','Kuang', + 'Lagong', + 'Morib', + 'Pandamaran','Paya Jaras','Petaling Jaya','Port Klang','Puchong', + 'Rasa','Rawang', + 'Salak Tinggi','Sekinchan','Selayang','Semenyih','Sepang','Serendah','Seri Kembangan','Shah Alam','Subang','Subang Jaya','Sungai Buloh', + 'Tanjung Karang','Tanjung Sepat', + 'Ulu Klang','Ulu Yam', + ), + 'terengganu' => array( + 'Ajil', + 'Bandar Ketengah Jaya','Bandar Permaisuri','Bukit Besi','Bukit Payong', + 'Chukai', + 'Jerteh', + 'Kampung Raja','Kerteh','Kijal','Kuala Besut','Kuala Berang','Kuala Dungun','Kuala Terengganu', + 'Marang','Merchang', + 'Pasir Raja', + 'Rantau Abang', + 'Teluk Kalung', + 'Wakaf Tapai', + ) + ); + + /** + * @link https://en.wikipedia.org/wiki/States_and_federal_territories_of_Malaysia + */ + protected static $states = array( + 'johor' => array( + 'Johor Darul Ta\'zim', + 'Johor' + ), + 'kedah' => array( + 'Kedah Darul Aman', + 'Kedah' + ), + 'kelantan' => array( + 'Kelantan Darul Naim', + 'Kelantan' + ), + 'kl' => array( + 'KL', + 'Kuala Lumpur', + 'WP Kuala Lumpur' + ), + 'labuan' => array( + 'Labuan' + ), + 'melaka' => array( + 'Malacca', + 'Melaka' + ), + 'nsembilan' => array( + 'Negeri Sembilan Darul Khusus', + 'Negeri Sembilan' + ), + 'pahang' => array( + 'Pahang Darul Makmur', + 'Pahang' + ), + 'penang' => array( + 'Penang', + 'Pulau Pinang' + ), + 'perak' => array( + 'Perak Darul Ridzuan', + 'Perak' + ), + 'perlis' => array( + 'Perlis Indera Kayangan', + 'Perlis' + ), + 'putrajaya' => array( + 'Putrajaya' + ), + 'sabah' => array( + 'Sabah' + ), + 'sarawak' => array( + 'Sarawak' + ), + 'selangor' => array( + 'Selangor Darul Ehsan', + 'Selangor' + ), + 'terengganu' => array( + 'Terengganu Darul Iman', + 'Terengganu' + ) + ); + + /** + * @link https://ms.wikipedia.org/wiki/Senarai_negara_berdaulat + */ + protected static $country = array( + 'Abkhazia','Afghanistan','Afrika Selatan','Republik Afrika Tengah','Akrotiri dan Dhekelia','Albania','Algeria','Amerika Syarikat','Andorra','Angola','Antigua dan Barbuda','Arab Saudi','Argentina','Armenia','Australia','Austria','Azerbaijan', + 'Bahamas','Bahrain','Bangladesh','Barbados','Belanda','Belarus','Belgium','Belize','Benin','Bhutan','Bolivia','Bonaire','Bosnia dan Herzegovina','Botswana','Brazil','Brunei Darussalam','Bulgaria','Burkina Faso','Burundi', + 'Cameroon','Chad','Chile','Republik Rakyat China','Republik China di Taiwan','Colombia','Comoros','Republik Demokratik Congo','Republik Congo','Kepulauan Cook','Costa Rica','Côte d\'Ivoire (Ivory Coast)','Croatia','Cuba','Curaçao','Cyprus','Republik Turki Cyprus Utara','Republik Czech', + 'Denmark','Djibouti','Dominika','Republik Dominika', + 'Ecuador','El Salvador','Emiriah Arab Bersatu','Eritrea','Estonia', + 'Kepulauan Faroe','Fiji','Filipina','Finland', + 'Gabon','Gambia','Georgia','Ghana','Grenada','Greece (Yunani)','Guatemala','Guinea','Guinea-Bissau','Guinea Khatulistiwa','Guiana Perancis','Guyana', + 'Habsyah (Etiopia)','Haiti','Honduras','Hungary', + 'Iceland','India','Indonesia','Iran','Iraq','Ireland','Israel','Itali', + 'Jamaika','Jepun','Jerman','Jordan', + 'Kanada','Kazakhstan','Kemboja','Kenya','Kiribati','Korea Selatan','Korea Utara','Kosovo','Kuwait','Kyrgyzstan', + 'Laos','Latvia','Lesotho','Liberia','Libya','Liechtenstein','Lithuania','Lubnan','Luxembourg', + 'Macedonia','Madagaskar','Maghribi','Malawi','Malaysia','Maldives','Mali','Malta','Kepulauan Marshall','Mauritania','Mauritius','Mesir','Mexico','Persekutuan Micronesia','Moldova','Monaco','Montenegro','Mongolia','Mozambique','Myanmar', + 'Namibia','Nauru','Nepal','New Zealand','Nicaragua','Niger','Nigeria','Niue','Norway', + 'Oman','Ossetia Selatan', + 'Pakistan','Palau','Palestin','Panama','Papua New Guinea','Paraguay','Perancis','Peru','Poland','Portugal', + 'Qatar', + 'Romania','Russia','Rwanda', + 'Sahara Barat','Saint Kitts dan Nevis','Saint Lucia','Saint Vincent dan Grenadines','Samoa','San Marino','São Tomé dan Príncipe','Scotland','Senegal','Sepanyol','Serbia','Seychelles','Sierra Leone','Singapura','Slovakia','Slovenia','Kepulauan Solomon','Somalia','Somaliland','Sri Lanka','Sudan','Sudan Selatan','Suriname','Swaziland','Sweden','Switzerland','Syria', + 'Tajikistan','Tanjung Verde','Tanzania','Thailand','Timor Leste','Togo','Tonga','Transnistria','Trinidad dan Tobago','Tunisia','Turki','Turkmenistan','Tuvalu', + 'Uganda','Ukraine','United Kingdom','Uruguay','Uzbekistan', + 'Vanuatu','Kota Vatican','Venezuela','Vietnam', + 'Yaman', + 'Zambia','Zimbabwe', + ); + + /** + * Return a building prefix + * + * @example 'No.' + * + * @return @string + */ + public static function buildingPrefix() + { + return static::randomElement(static::$buildingPrefix); + } + + /** + * Return a building number + * + * @example '123' + * + * @return @string + */ + public static function buildingNumber() + { + return static::toUpper(static::lexify(static::numerify(static::randomElement(static::$buildingNumber)))); + } + + /** + * Return a street prefix + * + * @example 'Jalan' + */ + public function streetPrefix() + { + $format = static::randomElement(static::$streetPrefix); + + return $this->generator->parse($format); + } + + /** + * Return a complete streename + * + * @example 'Jalan Utama 7' + * + * @return @string + */ + public function streetName() + { + $format = static::toUpper(static::lexify(static::numerify(static::randomElement(static::$streetNameFormats)))); + + return $this->generator->parse($format); + } + + /** + * Return a randown township + * + * @example Taman Bahagia + * + * @return @string + */ + public function township() + { + $format = static::toUpper(static::lexify(static::numerify(static::randomElement(static::$townshipFormats)))); + + return $this->generator->parse($format); + } + + /** + * Return a township prefix abbreviation + * + * @example 'USJ' + * + * @return @string + */ + public function townshipPrefixAbbr() + { + return static::randomElement(static::$townshipPrefixAbbr); + } + + /** + * Return a township prefix + * + * @example 'Taman' + * + * @return @string + */ + public function townshipPrefix() + { + return static::randomElement(static::$townshipPrefix); + } + + /** + * Return a township suffix + * + * @example 'Bahagia' + */ + public function townshipSuffix() + { + return static::randomElement(static::$townshipSuffix); + } + + /** + * Return a postcode based on state + * + * @example '55100' + * @link https://en.wikipedia.org/wiki/Postal_codes_in_Malaysia#States + * + * @param null|string $state 'state' or null + * + * @return @string + */ + public static function postcode($state = null) + { + $format = array( + 'perlis' => array( // (01000 - 02800) + '0' . mt_rand(1000, 2800) + ), + 'kedah' => array( // (05000 - 09810) + '0' . mt_rand(5000, 9810) + ), + 'penang' => array( // (10000 - 14400) + mt_rand(10000, 14400) + ), + 'kelantan' => array( // (15000 - 18500) + mt_rand(15000, 18500) + ), + 'terengganu' => array( // (20000 - 24300) + mt_rand(20000, 24300) + ), + 'pahang' => array( // (25000 - 28800 | 39000 - 39200 | 49000, 69000) + mt_rand(25000, 28800), + mt_rand(39000, 39200), + mt_rand(49000, 69000) + ), + 'perak' => array( // (30000 - 36810) + mt_rand(30000, 36810) + ), + 'selangor' => array( // (40000 - 48300 | 63000 - 68100) + mt_rand(40000, 48300), + mt_rand(63000, 68100) + ), + 'kl' => array( // (50000 - 60000) + mt_rand(50000, 60000), + ), + 'putrajaya' => array( // (62000 - 62988) + mt_rand(62000, 62988) + ), + 'nsembilan' => array( // (70000 - 73509) + mt_rand(70000, 73509) + ), + 'melaka' => array( // (75000 - 78309) + mt_rand(75000, 78309) + ), + 'johor' => array( // (79000 - 86900) + mt_rand(79000, 86900) + ), + 'labuan' => array( // (87000 - 87033) + mt_rand(87000, 87033) + ), + 'sabah' => array( // (88000 - 91309) + mt_rand(88000, 91309) + ), + 'sarawak' => array( // (93000 - 98859) + mt_rand(93000, 98859) + ) + ); + + $postcode = is_null($state) ? static::randomElement($format) : $format[$state]; + return (string)static::randomElement($postcode); + } + + /** + * Return the complete town address with matching postcode and state + * + * @example 55100 Bukit Bintang, Kuala Lumpur + * + * @return @string + */ + public function townState() + { + $state = static::randomElement(array_keys(static::$states)); + $postcode = static::postcode($state); + $town = static::randomElement(static::$towns[$state]); + $state = static::randomElement(static::$states[$state]); + + return $postcode . ' ' . $town . ', ' . $state; + } + + /** + * Return a random city (town) + * + * @example 'Ampang' + * + * @return @string + */ + public function city() + { + $state = static::randomElement(array_keys(static::$towns)); + return static::randomElement(static::$towns[$state]); + } + + /** + * Return a random state + * + * @example 'Johor' + * + * @return @string + */ + public function state() + { + $state = static::randomElement(array_keys(static::$states)); + return static::randomElement(static::$states[$state]); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Company.php new file mode 100644 index 00000000..0e681330 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Company.php @@ -0,0 +1,105 @@ +generator->parse($formats); + } + + /** + * Return Peninsular prefix alphabet + * + * @example 'W' + * + * @return @string + */ + public static function peninsularPrefix() + { + return static::randomElement(static::$peninsularPrefix); + } + + /** + * Return Sarawak state prefix alphabet + * + * @example 'QA' + * + * @return @string + */ + public static function sarawakPrefix() + { + return static::randomElement(static::$sarawakPrefix); + } + + /** + * Return Sabah state prefix alphabet + * + * @example 'SA' + * + * @return @string + */ + public static function sabahPrefix() + { + return static::randomElement(static::$sabahPrefix); + } + + /** + * Return specialty licence plate prefix + * + * @example 'G1M' + * + * @return @string + */ + public static function specialPrefix() + { + return static::randomElement(static::$specialPrefix); + } + + /** + * Return a valid license plate alphabet + * + * @example 'A' + * + * @return @string + */ + public static function validAlphabet() + { + return static::randomElement(static::$validAlphabets); + } + + /** + * Return a valid number sequence between 1 and 9999 + * + * @example '1234' + * + * @return @integer + */ + public static function numberSequence() + { + return mt_rand(1, 9999); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Payment.php new file mode 100644 index 00000000..4a46af16 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Payment.php @@ -0,0 +1,244 @@ +generator->parse($formats); + } + + /** + * Return a Malaysian Bank account number + * + * @example '1234567890123456' + * + * @return @string + */ + public function bankAccountNumber() + { + $formats = static::randomElement(static::$bankAccountNumberFormats); + + return static::numerify($formats); + } + + /** + * Return a Malaysian Local Bank + * + * @example 'Public Bank' + * + * @return @string + */ + public static function localBank() + { + return static::randomElement(static::$localBanks); + } + + /** + * Return a Malaysian Foreign Bank + * + * @example 'Citibank Berhad' + * + * @return @string + */ + public static function foreignBank() + { + return static::randomElement(static::$foreignBanks); + } + + /** + * Return a Malaysian Government Bank + * + * @example 'Bank Simpanan Nasional' + * + * @return @string + */ + public static function governmentBank() + { + return static::randomElement(static::$governmentBanks); + } + + /** + * Return a Malaysian insurance company + * + * @example 'AIA Malaysia' + * + * @return @string + */ + public static function insurance() + { + return static::randomElement(static::$insuranceCompanies); + } + + /** + * Return a Malaysian Bank SWIFT Code + * + * @example 'MBBEMYKLXXX' + * + * @return @string + */ + public static function swiftCode() + { + return static::toUpper(static::lexify(static::randomElement(static::$swiftCodes))); + } + + /** + * Return the Malaysian currency symbol + * + * @example 'RM' + * + * @return @string + */ + public static function currencySymbol() + { + return static::randomElement(static::$currencySymbol); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Person.php new file mode 100644 index 00000000..28d1092a --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Person.php @@ -0,0 +1,813 @@ +generator->parse(static::randomElement($formats)); + } + + /** + * Return a Malaysian I.C. No. + * + * @example '890123-45-6789' + * + * @link https://en.wikipedia.org/wiki/Malaysian_identity_card#Structure_of_the_National_Registration_Identity_Card_Number_(NRIC) + * + * @param string|null $gender 'male', 'female' or null for any + * @param bool|string|null $hyphen true, false, or any separator characters + * + * @return string + */ + public static function myKadNumber($gender = null, $hyphen = false) + { + // year of birth + $yy = mt_rand(0, 99); + + // month of birth + $mm = DateTime::month(); + + // day of birth + $dd = DateTime::dayOfMonth(); + + // place of birth (1-59 except 17-20) + while (in_array($pb = mt_rand(1, 59), array(17, 18, 19, 20))) { + } + + // random number + $nnn = mt_rand(0, 999); + + // gender digit. Odd = MALE, Even = FEMALE + $g = mt_rand(0, 9); + //Credit: https://gist.github.com/mauris/3629548 + if ($gender === static::GENDER_MALE) { + $g = $g | 1; + } elseif ($gender === static::GENDER_FEMALE) { + $g = $g & ~1; + } + + // formatting with hyphen + if ($hyphen === true) { + $hyphen = "-"; + } elseif ($hyphen === false) { + $hyphen = ""; + } + + return sprintf("%02d%02d%02d%s%02d%s%03d%01d", $yy, $mm, $dd, $hyphen, $pb, $hyphen, $nnn, $g); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/PhoneNumber.php new file mode 100644 index 00000000..f89111d9 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/PhoneNumber.php @@ -0,0 +1,217 @@ +generator->parse($format)); + } else { + return static::numerify($this->generator->parse($format)); + } + } + + /** + * Return prefix digits for 011 numbers + * + * @example '10' + * + * @return string + */ + public static function zeroOneOnePrefix() + { + return static::numerify(static::randomElement(static::$zeroOneOnePrefix)); + } + + /** + * Return prefix digits for 014 numbers + * + * @example '2' + * + * @return string + */ + public static function zeroOneFourPrefix() + { + return static::numerify(static::randomElement(static::$zeroOneFourPrefix)); + } + + /** + * Return prefix digits for 015 numbers + * + * @example '1' + * + * @return string + */ + public static function zeroOneFivePrefix() + { + return static::numerify(static::randomElement(static::$zeroOneFivePrefix)); + } + + /** + * Return a Malaysian Fixed Line Phone Number. + * + * @example '+603-4567-8912' + * + * @param bool $countryCodePrefix true, false + * @param bool $formatting true, false + * + * @return string + */ + public function fixedLineNumber($countryCodePrefix = true, $formatting = true) + { + if ($formatting) { + $format = static::randomElement(static::$fixedLineNumberFormatsWithFormatting); + } else { + $format = static::randomElement(static::$fixedLineNumberFormats); + } + + if ($countryCodePrefix) { + return static::countryCodePrefix($formatting) . static::numerify($this->generator->parse($format)); + } else { + return static::numerify($this->generator->parse($format)); + } + } + + /** + * Return a Malaysian VoIP Phone Number. + * + * @example '+6015-678-9234' + * + * @param bool $countryCodePrefix true, false + * @param bool $formatting true, false + * + * @return string + */ + public function voipNumber($countryCodePrefix = true, $formatting = true) + { + if ($formatting) { + $format = static::randomElement(static::$voipNumberWithFormatting); + } else { + $format = static::randomElement(static::$voipNumber); + } + + if ($countryCodePrefix) { + return static::countryCodePrefix($formatting) . static::numerify($this->generator->parse($format)); + } else { + return static::numerify($this->generator->parse($format)); + } + } + + /** + * Return a Malaysian Country Code Prefix. + * + * @example '+6' + * + * @param bool $formatting true, false + * + * @return string + */ + public static function countryCodePrefix($formatting = true) + { + if ($formatting) { + return static::randomElement(static::$plusSymbol) . static::randomElement(static::$countryCodePrefix); + } else { + return static::randomElement(static::$countryCodePrefix); + } + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/no_NO/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/Address.php similarity index 99% rename from vendor/fzaninotto/faker/src/Faker/Provider/no_NO/Address.php rename to vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/Address.php index 845afc17..d1d8c9e4 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/no_NO/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/Address.php @@ -1,6 +1,6 @@ format('dmy'); - + /** * @todo These number should be random based on birth year * @link http://no.wikipedia.org/wiki/F%C3%B8dselsnummer */ $randomDigits = (string)static::numerify('##'); - - switch($gender) { + + switch ($gender) { case static::GENDER_MALE: $genderDigit = static::randomElement(array(1,3,5,7,9)); break; @@ -310,16 +310,16 @@ class Person extends \Faker\Provider\Person default: $genderDigit = (string)static::numerify('#'); } - - + + $digits = $datePart.$randomDigits.$genderDigit; - + /** * @todo Calculate modulo 11 of $digits * @link http://no.wikipedia.org/wiki/F%C3%B8dselsnummer */ $checksum = (string)static::numerify('##'); - + return $digits.$checksum; } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/PhoneNumber.php new file mode 100644 index 00000000..c97e720a --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/PhoneNumber.php @@ -0,0 +1,41 @@ +generator->parse($format)); + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Address.php index 7f69a5bc..ee81af28 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Address.php @@ -78,7 +78,7 @@ class Address extends \Faker\Provider\Address 'Macao', 'Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands', 'Martinique', 'Mauritania', 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', 'Moldova', 'Monaco', 'Mongolia', 'Montenegro', 'Montserrat', 'Morocco', 'Mozambique', 'Myanmar', 'Namibia', 'Nauru', 'Nepal', 'Netherlands Antilles', 'Netherlands', 'New Caledonia', 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Norfolk Island', 'Northern Mariana Islands', 'Norway', 'Oman', - 'Pakistan', 'Palau', 'Palestinian Territory', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico', + 'Pakistan', 'Palau', 'Palestinian Territories', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico', 'Qatar', 'Reunion', 'Romania', 'Russian Federation', 'Rwanda', 'Saint Barthelemy', 'Saint Helena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Martin', 'Saint Pierre and Miquelon', 'Saint Vincent and the Grenadines', 'Samoa', 'San Marino', 'Sao Tome and Principe', 'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovakia (Slovak Republic)', 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa', 'South Georgia and the South Sandwich Islands', 'Spain', 'Sri Lanka', 'Sudan', 'Suriname', 'Svalbard & Jan Mayen Islands', 'Swaziland', 'Sweden', 'Switzerland', 'Syrian Arab Republic', diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Person.php index 0a88375e..706cd339 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Person.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Person.php @@ -45,11 +45,11 @@ class Person extends \Faker\Provider\Person 'Kabindra', 'Kailash', 'Kalyan', 'Kamal', 'Kamod', 'Kapil', 'Karan', 'Karna', 'Khagendra', 'Kishor', 'Kris', 'Krishna', 'Krisus', 'Kuber', 'Lakshman', 'Lalit', 'Lava', 'Lochan', 'Lokesh', 'Madhav', 'Madhukar', 'Madhur', 'Mandeep', 'Manish', 'Manjul', 'Manoj', 'Milan', 'Mohit', 'Mridul', - 'Nabin', 'Nakul', 'Narayan', 'Narendra', 'Naresh', 'Neil', 'Nerain', 'Nirajan', 'Nirajan', 'Nirmal', 'Nirupam', 'Nischal', 'Nishad', 'Nishant', 'Nutan', + 'Nabin', 'Nakul', 'Narayan', 'Narendra', 'Naresh', 'Neil', 'Nerain', 'Nirajan', 'Nirmal', 'Nirupam', 'Nischal', 'Nishad', 'Nishant', 'Nutan', 'Om', 'Paras', 'Parikshit', 'Parimal', 'Pawan', 'Piyush', 'Prabal', 'Prabesh', 'Prabhat', 'Prabin', 'Prajwal', 'Prakash', 'Pramesh', 'Pramod', 'Pranaya', 'Pranil', 'Prasanna', 'Prashant', 'Prasun', 'Pratap', 'Pratik', 'Prayag', 'Prianshu', 'Prithivi', 'Purna', 'Pushkar', 'Raghab', 'Rahul', 'Rajan', 'Rajesh', 'Rakesh', 'Ramesh', 'Ranjan', 'Ranjit', 'Ricky', 'Rijan', 'Rishab', 'Rishikesh', 'Rohan', 'Rohit', 'Roshan', - 'Sabin', 'Sachit', 'Safal', 'Sahaj', 'Sahan', 'Sajal', 'Sakar', 'Samir', 'Sanchit', 'Sandesh', 'Sanjay', 'Sanjeev', 'Sankalpa', 'Santosh', 'Sarad', 'Saroj', 'Sashi', 'Saumya', 'Sevak', 'Shailesh', 'Shakti', 'Shamundra', 'Shantanu', 'Shashank', 'Shashwat', 'Shekar', 'Shyam', 'Siddhartha', 'Sitaram', 'Sohan', 'Sohil', 'Soviet', 'Spandan', 'Subal', 'Subham', 'Subodh', 'Sudan', 'Sudhir', 'Sudin', 'Sudip', 'Sujan', 'Sujit', 'Sukanta', 'Sumel', 'Sunil', 'Suraj', 'Suraj', 'Surendra', 'Surya', 'Sushant', 'Sushil', 'Suyash', 'Suyog', 'Swagat', 'Swapnil', 'Swarup', + 'Sabin', 'Sachit', 'Safal', 'Sahaj', 'Sahan', 'Sajal', 'Sakar', 'Samir', 'Sanchit', 'Sandesh', 'Sanjay', 'Sanjeev', 'Sankalpa', 'Santosh', 'Sarad', 'Saroj', 'Sashi', 'Saumya', 'Sevak', 'Shailesh', 'Shakti', 'Shamundra', 'Shantanu', 'Shashank', 'Shashwat', 'Shekar', 'Shyam', 'Siddhartha', 'Sitaram', 'Sohan', 'Sohil', 'Soviet', 'Spandan', 'Subal', 'Subham', 'Subodh', 'Sudan', 'Sudhir', 'Sudin', 'Sudip', 'Sujan', 'Sujit', 'Sukanta', 'Sumel', 'Sunil', 'Suraj', 'Surendra', 'Surya', 'Sushant', 'Sushil', 'Suyash', 'Suyog', 'Swagat', 'Swapnil', 'Swarup', 'Tej', 'Tilak', 'Tirtha', 'Trailokya', 'Trilochan', 'Udit', 'Ujjwal', 'Umesh', 'Uttam', 'Yogendra', 'Yogesh', 'Yuvaraj', @@ -80,7 +80,7 @@ class Person extends \Faker\Provider\Person protected static $lastName = array( 'Acharya', 'Adhikari', 'Agarwal', 'Amatya', 'Aryal', 'Baidya', 'Bajracharya', 'Balami', 'Banepali', 'Baniya', 'Banjade', 'Baral', 'Basnet', 'Bastakoti', 'Bastola', 'Basyal', 'Belbase', 'Bhandari', 'Bhatta', 'Bhattarai', 'Bhusal', 'Bijukchhe', 'Bisht', 'Bohara', 'Budathoki', 'Byanjankar', - 'Chalise', 'Chamling', 'Chapagain', 'Chaudhary', 'Chhetri', 'Chhetri', + 'Chalise', 'Chamling', 'Chapagain', 'Chaudhary', 'Chhetri', 'Dahal', 'Dangol', 'Dawadi', 'Devkota', 'Dhakal', 'Dhamla', 'Dhaubhadel', 'Dhungel', 'Gauchan', 'Gautam', 'Ghale', 'Ghimire', 'Giri', 'Golchha', 'Gurung', 'Gyalzen', 'Gyawali', 'Hamal', 'Himanshu', 'Humagain', diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Address.php index 8b699644..d0f6d362 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Address.php @@ -4,7 +4,20 @@ namespace Faker\Provider\nl_BE; class Address extends \Faker\Provider\Address { - protected static $postcode = array('####'); + protected static $postcodes = array( + '2970', '3700', '7510', '9420', '8511', '3800', '9300', '9880', '3200', '8700', '8211', '2630', '4557', + '4280', '3930', '5590', '5362', '4219', '6280', '9991', '8660', '1790', '9051', '5544', '4317', '5310', + '6250', '5070', '3570', '5550', '4432', '1652', '8690', '4540', '6680', '6953', '4770', '6997', '7750', + '5300', '1070', '6150', '4821', '4031', '7387', '5537', '6721', '6890', '4430', '5500', '5520', '4520', + '4160', '7640', '2000', '2018', '2020', '2030', '2040', '2050', '2060', '2099', '7910', '8570', '9200', + '9400', '5170', '7811', '4990', '1390', '8850', '2370', '4601', '6700', '7181', '5060', '6870', '3665', + '9404', '9890', '7040', '1730', '8310', '1007', '9960', '6860', '3460', '5330', '9800', '7800', '6791', + '3404', '3384', '6717', '7941', '6790', '7972', '4880', '5660', '6880', '7382', '6706', '1367', '5580', + '8630', '8580', '4260', '3271', '4340', '4400', '6900', '4630', '4920', '3128', '9310', '2387', '4837', + '6464', '6460', '5555', '7730', '5377', '7380', '1470', '5190', '9860', '2490', '6951', '6500', '4671', + '5570', '7534', '5370', '6940', '7971', '4983', '4690', '9968', '7830', '6600', '3870', '4651', '7130', + '7331', '7870', '7604', '1401', '9520', '8531', '9150', '4052', '6980', '1320', '6594', '7532', '3960', + ); protected static $streetAddressFormats = array( '{{streetName}} {{buildingNumber}}' @@ -88,6 +101,11 @@ class Address extends \Faker\Provider\Address 'Wit-Rusland', 'Zambia', 'Zuid-Afrika', 'Zuid-Georgia en de Zuidelijke Sandwicheilanden', 'Zimbabwe' ); + public static function postcode() + { + return static::randomElement(static::$postcodes); + } + /** * @example 'Gelderland' */ diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Payment.php index d587e675..f8eb2338 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Payment.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Payment.php @@ -16,4 +16,24 @@ class Payment extends \Faker\Provider\Payment { return static::iban($countryCode, $prefix, $length); } + + /** + * Value Added Tax (VAT) + * + * @example 'BE0123456789', ('spaced') 'BE 0123456789' + * + * @see http://ec.europa.eu/taxation_customs/vies/faq.html?locale=en#item_11 + * @see http://www.iecomputersystems.com/ordering/eu_vat_numbers.htm + * @see http://en.wikipedia.org/wiki/VAT_identification_number + * + * @param bool $spacedNationalPrefix + * + * @return string VAT Number + */ + public static function vat($spacedNationalPrefix = true) + { + $prefix = $spacedNationalPrefix ? "BE " : "BE"; + + return sprintf("%s0%d", $prefix, self::randomNumber(9, true)); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Person.php index c9ac865b..bde3bf64 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Person.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Person.php @@ -2,6 +2,8 @@ namespace Faker\Provider\nl_BE; +use Faker\Provider\DateTime; + class Person extends \Faker\Provider\Person { protected static $firstNameMale = array( @@ -69,4 +71,36 @@ class Person extends \Faker\Provider\Person 'Vermeersch', 'Vermeiren', 'Vermeulen', 'Verschueren', 'Verstraete', 'Verstraeten', 'Vervoort', 'Wauters', 'Willems', 'Wouters', 'Wuyts', 'Yildirim', 'Yilmaz' ); + + /** + * Belgian Rijksregister numbers are used to identify each citizen, + * it consists of three parts, the person's day of birth, in the + * format 'ymd', followed by a number between 1 and 997, odd for + * males, even for females. The last part is used to check if it's + * a valid number. + * + * @link https://nl.wikipedia.org/wiki/Rijksregisternummer + * + * @param string|null $gender 'male', 'female' or null for any + * @return string + */ + public static function rrn($gender = null) + { + $middle = self::numberBetween(1, 997); + if ($gender === static::GENDER_MALE) { + $middle = $middle %2 === 1 ? $middle : $middle+1; + } elseif ($gender === static::GENDER_FEMALE) { + $middle = $middle %2 === 0 ? $middle : $middle+1; + } + $middle = sprintf('%03d', $middle); + + $date = DateTime::dateTimeThisCentury(); + $dob = sprintf('%06d', $date->format('ymd')); + $help = $date->format('Y') >= 2000 ? 2 : null; + + $check = intval($help.$dob.$middle); + $rest = sprintf('%02d', 97 - ($check % 97)); + + return $dob.$middle.$rest; + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Text.php new file mode 100644 index 00000000..d41104d1 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Text.php @@ -0,0 +1,25347 @@ +generator->lastName; + break; + } + + if (0 !== static::numberBetween(0, 1)) { + return $companyName . ' ' . static::randomElement(static::$companySuffix); + } + + return $companyName; + } + + /** + * Belasting Toegevoegde Waarde (BTW) = VAT + * + * @example 'NL123456789B01' + * + * @see http://www.belastingdienst.nl/wps/wcm/connect/bldcontentnl/belastingdienst/zakelijk/btw/administratie_bijhouden/btw_nummers_controleren/uw_btw_nummer + * + * @return string VAT Number + */ + public static function vat() + { + return sprintf("%s%d%s%d", 'NL', self::randomNumber(9, true), 'B', self::randomNumber(2, true)); + } + + /** + * Alias dutch vat number format + * + * @return string + */ + public static function btw() + { + return self::vat(); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Person.php index 45f6074a..a3d7dc8a 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Person.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Person.php @@ -26,10 +26,26 @@ class Person extends \Faker\Provider\Person 'mr.', 'dr.', 'ir.', 'drs', 'bacc.', 'kand.', 'dr.h.c.', 'prof.', 'ds.', 'ing.', 'bc.' ); - private static $suffix = array( + protected static $suffix = array( 'BA', 'Bsc', 'LLB', 'LLM', 'MA', 'Msc', 'MPhil', 'D', 'PhD', 'AD', 'B', 'M' ); + protected static $prefix = array("'s", "'t", 'a', 'aan', "aan 't", 'aan de', 'aan den', 'aan der', 'aan het', + "aan t", 'af', 'al', 'am', 'am de', 'auf', 'auf dem', 'auf den', 'auf der', 'auf ter', 'aus', "aus 'm", + 'aus dem', 'aus den', 'aus der', 'aus m', 'ben', 'bij', "bij 't", 'bij de', 'bij den', 'bij het', 'bij t', + 'bin', 'boven d', "boven d'", 'd', "d'", 'da', 'dal', 'dal’', 'dalla', 'das', 'de', 'de die', 'de die le', + 'de l', 'de l’', 'de la', 'de las', 'de le', 'de van der', 'deca', 'degli', 'dei', 'del', 'della', 'den', + 'der', 'des', 'di', 'die le', 'do', 'don', 'dos', 'du', 'el', 'het', 'i', 'im', 'in', "in 't", 'in de', 'in den', + 'in der', 'in het', 'in t', 'l', 'l’', 'la', 'las', 'le', 'les', 'lo', 'los', 'of', 'onder', "onder 't", + 'onder de', 'onder den', 'onder het', 'onder t', 'op', "op 't", 'op de', 'op den', 'op der', 'op gen', 'op het', + 'op t', 'op ten', 'over', "over 't", 'over de', 'over den', 'over het', 'over t', 's', "s'", 't', 'te', 'ten', + 'ter', 'tho', 'thoe', 'thor', 'to', 'toe', 'tot', 'uijt', "uijt 't", 'uijt de', 'uijt den', 'uijt te de', + 'uijt ten', 'uit', "uit 't", 'uit de', 'uit den', 'uit het', 'uit t', 'uit te de', 'uit ten', 'unter', 'van', + "van 't", 'van De', 'van de', 'van de l', "van de l'", 'van den', 'van der', 'van gen', 'van het', 'van la', + 'van t', 'van ter', 'van van de', 'ver', 'vom', 'von', "von 't", 'von dem', 'von den', 'von der', 'von t', 'voor', + "voor 't", 'voor de', 'voor den', "voor in 't", 'voor in t', 'vor', 'vor der', 'zu', 'zum', 'zur' + ); + protected static $commonDutchLastNames = array( 'de Jong', 'Jansen', 'de Vries', 'van de Berg', 'van den Berg', 'van der Berg', 'van Dijk', 'Bakker', 'Janssen', 'Visser', 'Smit', 'Meijer', 'Meyer', 'de Boer', 'Mulder', 'de Groot', 'Bos', 'Vos', 'Peters', 'Hendriks', @@ -70,7 +86,7 @@ class Person extends \Faker\Provider\Person 'Coreth von und zu Coredo und Starkenberg', 'Cornelisse', 'Cornelissen', 'Cornelisz', 'van den Corput', 'Corstiaens', 'Cosman', 'van de Coterlet', 'Courtier', 'van Cuijck', 'van Daal', 'Dachgelder', 'Dachgeldt', 'Dachgelt', 'van Dagsburg', 'van Dalem', 'van Dam', 'van de Darnau', 'David', 'Dekker', 'Demmendaal', - 'Dennenberg', 'Die Bont', 'Diesbergen', 'van Dijk', 'Dijkman', 'van Dillen', 'Dircken', 'Dirksen', 'Dirven', + 'Dennenberg', 'die Bont', 'Diesbergen', 'van Dijk', 'Dijkman', 'van Dillen', 'Dircken', 'Dirksen', 'Dirven', 'Doesburg', 'van Dokkum', 'van Dommelen', 'van Dongen', 'van Dooren', 'Doorhof', 'Doornhem', 'Dorsman', 'Doyle', 'Draaisma', 'van Drenthe', 'Dries', 'Drysdale', 'Dubois', 'van Duivenvoorde', 'Duivenvoorden', 'van Duvenvoirde', 'van Duyvenvoorde', 'die Bont', 'die Pelser', 'die Witte', 'van Eck', 'Eckhardt', 'Eelman', @@ -89,18 +105,18 @@ class Person extends \Faker\Provider\Person 'Groote', 'de Grote', 'Gruijl', 'de Gruijl', 'de Gruijter', 'de Gruil', 'de Grunt', 'de Gruson', 'le Guellec', 'Guit', 'le Gulcher', 'Höning', 'Haack', 'den Haag', 'van Haarlem', 'de Haas', 'van Haeften', 'Haengreve', 'van Hagen', 'Hagendoorn', 'Hak', 'Hakker', 'van Ham', 'van Hamaland', 'Haneberg', 'Hanegraaff', 'Haring', - 'Haselaar', 'van Haspengouw Hesbaye', 'van Haspengouw', 'Hazenveld', 'de Heer', 'Heere', 'Heerkens', + 'Haselaar', 'van Haspengouw', 'Hazenveld', 'de Heer', 'Heere', 'Heerkens', 'Heerschop', 'Hehl', 'van der Heiden', 'van der Heijden', 'Heijman', 'Heijmans', 'Heijmen', 'Heinrichs', - 'Hekker', 'Hellevoort', 'Helmerhorst', 'van Hemert', 'Hemma van Allemanië', 'Hendricks', 'Hendriks', - 'Hendrikse', 'van Henegouwen', 'Henric van den Nuwenhuse', 'van den Henst', 'Heribert van Laon', 'd\' Heripon', + 'Hekker', 'Hellevoort', 'Helmerhorst', 'van Hemert', 'Hemma', 'Hendricks', 'Hendriks', + 'Hendrikse', 'van Henegouwen', 'van den Henst', 'Heribert van Laon', "d' Heripon", 'Hermans', 'van Herstal', 'van Heusden', 'Hexspoor', 'Heymans', 'Heyne', 'Hoedemakers', 'van den Hoek', 'Hoeks', 'Hoelen', 'Hoes', 'van Hoevel en van Zwindrecht', 'van der Hoeven', 'van Holland', 'Hollander', 'Holthuis', 'Hondeveld', 'Honing', 'de Hoog', 'Hoogers', 'de Hoogh', 'Hoppenbrouwer', 'Horrocks', 'van der Horst', - 'van Hostaden', 'Houdijk', 'van \'t Houteveen', 'Huberts', 'Huel', 'Huijben', 'Huijbrechts', 'Huijs', + 'van Hostaden', 'Houdijk', "van 't Houteveen", 'Huberts', 'Huel', 'Huijben', 'Huijbrechts', 'Huijs', 'Huijzing', 'Huisman', 'Huls', 'Hulshouts', 'Hulskes', 'Hulst', 'van Hulten', 'Huurdeman', 'van het Heerenveen', 'Jaceps', 'Jacobi', 'Jacobs', 'Jacquot', 'de Jager', 'Jans', 'Jansdr', 'Janse', 'Jansen', 'Jansen', 'Jansse', - 'Janssen', 'Janssens', 'Jasper dr.', 'Jdotte', 'Jeggij', 'Jekel', 'Jerusalem', 'Jochems', 'de Jode Vastraedsd', - 'Jones', 'de Jong', 'Jonkman', 'Joosten', 'Jorlink', 'Jorrisen', 'van Jumiège', 'Jurrijens', 'Köster', + 'Janssen', 'Janssens', 'Jasper dr', 'Jdotte', 'Jeggij', 'Jekel', 'Jerusalem', 'Jochems', + 'Jones', 'de Jong', 'Jonkman', 'Joosten', 'Jorlink', 'Jorissen', 'van Jumiège', 'Jurrijens', 'Köster', 'van der Kaay', 'de Kale', 'Kallen', 'Kalman', 'Kamp', 'Kamper', 'Karels', 'Kas', 'van Kasteelen', 'Kathagen', 'Keijser', 'de Keijser', 'Keijzer', 'de Keijzer', 'Keltenie', 'van Kempen', 'Kerkhof', 'Ketel', 'Ketting', 'der Kijnder', 'van der Kint', 'Kirpenstein', 'Kisman', 'van Klaarwater', 'van de Klashorst', 'Kleibrink', @@ -135,7 +151,7 @@ class Person extends \Faker\Provider\Person 'van de Plas', 'van der Plas', 'van der Ploeg', 'van der Pluijm', 'Poncelet', 'Ponci', 'Pons', 'van Poppel', 'Post', 'Potters', 'van der Pouw', 'van Praagh', 'Pratt', 'Prinsen', 'Puig', 'Rackham', 'Rademaker', 'Ramaker', 'Recer', 'Recers', 'de Reede', 'Rehorst', 'Reijers', 'Reimes', 'Rek', 'Remmers', 'van Rheineck', 'Ridder', - 'Riem', 'van Riet', 'van \'t Riet', 'Rietveld', 'Rijcken', 'Rijks', 'Rijn', 'van Rijnsbergen', 'Rijntjes', + 'Riem', 'van Riet', "van 't Riet", 'Rietveld', 'Rijcken', 'Rijks', 'Rijn', 'van Rijnsbergen', 'Rijntjes', 'van Rijthoven', 'Rippey', 'Risma', 'Robbrechts Bruijne', 'Roessink', 'van Roijen', 'Romijn', 'de Roo', 'Roodesteijn', 'van Rooij', 'Room', 'de Roos', 'Roose', 'Roosenboom', 'van Rossum', 'Rotteveel', 'Roukes', 'Rousselet', 'Rouwenhorst', 'Rouwhorst', 'Rubben', 'Ruijs', 'Rutten', 'van Saksen', 'Salet', 'van Salm', @@ -152,20 +168,20 @@ class Person extends \Faker\Provider\Person 'van Stralen', 'van der Strigt', 'de Strigter', 'Strijker', 'Strik', 'Stuivenberg', 'Suijker', 'van Suinvorde', 'van Susa', 'de Swart', 'Symons', 'Takkelenburg', 'Tammerijn', 'Tamsma', 'Terry', 'den Teuling', 'Teunissen', 'Texier', 'Thatcher', 'The Elder', 'Thomas', 'Thout', 'Tielemans', 'Tillmanno', 'Timmerman', 'Timmermans', - 'Tins', 'Tirie', 'Totwiller', 'van Tours', 'van Tuijl', 'Tuithof', 'Uit de Willigen', 'Uittenbosch', 'Ulrich', - 'Unruoch Hunerik', 'Uphaus', 'Uphuis', 'Uphus', 'VI', 'Vaessen', 'Vallenduuk', 'Van Bragt', 'Vandenbergh', + 'Tins', 'Tirie', 'Totwiller', 'van Tours', 'van Tuijl', 'Tuithof', 'Uittenbosch', 'Ulrich', + 'Uphaus', 'Uphuis', 'Uphus', 'VI', 'Vaessen', 'Vallenduuk', 'Van Bragt', 'Vandenbergh', 'Vastenhouw', 'Veenendaal', 'Vegt', 'van der Veiver', 'Velderman', 'van Velthoven', 'Veltman', 'van Velzen', 'van de Ven', 'van Venrooy', 'Verbeeck', 'Verbeek', 'Verboom', 'Verbruggen', 'Verda', 'van Verdun', 'Vergeer', 'Verhaar', 'Verhagen', 'Verharen', 'Verheij', 'Verheuvel', 'Verhoeven', 'Verkade', 'van Vermandois', 'Vermeulen', 'Verschuere', 'Verschut', 'Versluijs', 'Vertoor', 'Vertooren', 'Vervoort', 'Verwoert', 'Vial', 'Vierdag', 'Vignon', 'van Vlaanderen', 'Volcke', 'van Voorhout', 'van Voorst', 'Voortman', 'Vos', 'Vrancken', 'de Vries', 'de Vroege', 'de Vrome', 'ter Waarbeek', 'Waardeloo', 'van Waas', 'Wagenvoort', 'van Wallaert', - 'Walsteijn', 'Walter', 'Waltrade Walderade', 'van Wassenaar', 'van de Water', 'Weeldenburg', 'Weerdenburg', - 'Weijland', 'Weijters', 'van Wel', 'van \'t Wel', 'Welf', 'Wendt', 'Wensen', 'de Werd', 'Werdes', - 'Werl-Arnsberg, van', 'van Wessex', 'West-Francië, van', 'Westerbeek', 'Westerburg', 'Westermann', + 'Walsteijn', 'Walter', 'van Wassenaar', 'van de Water', 'Weeldenburg', 'Weerdenburg', + 'Weijland', 'Weijters', 'van Wel', "van 't Wel", 'Welf', 'Wendt', 'Wensen', 'de Werd', 'Werdes', + 'van Wessex', 'Westerbeek', 'Westerburg', 'Westermann', 'van Westfalen', 'van de Weterink', 'Wever', 'Weyland', 'Weylant', 'van Wickerode', 'van de Wiel', 'Wigman', 'Wijland', 'van Wijland', 'Wilcken', 'Wildschut', 'Willems', 'Willems van Lier', 'Willemsen', 'Wilmont', - 'Wilson', 'Winnrich', 'Winters', 'Wipstrik', 'de Wit', 'van den Wittenboer', 'Wolffel', 'Wolfsdr', + 'Wilson', 'Winnrich', 'Winters', 'Wipstrik', 'de Wit', 'van den Wittenboer', 'Wolffel', 'Wolfswinkel', 'Wolters', 'Wolzak', 'Wooning', 'Woudenberg', 'Wouters', 'Wouters van Eijndhoven', 'Woutersz', 'Wright', 'Wunderink', 'Wutke', 'Zaal', 'Zeemans', 'Zeldenrust', 'Zevenboom', 'van der Zijl', 'Zijlemans', 'Zijlmans', 'Zuidweg', 'Zuijdveld', 'van Zwaben', 'Zwart', 'Zwijsen' @@ -248,14 +264,14 @@ class Person extends \Faker\Provider\Person */ public function lastName() { - $determinator = static::numberBetween(0, 3); + $determinator = static::numberBetween(0, 25); if ($determinator === 0) { $lastName = static::randomElement(static::$longLastNames); - } elseif ($determinator === 1) { + } elseif ($determinator <= 10) { $lastName = static::randomElement(static::$commonDutchLastNames); - } elseif ($determinator === 2) { + } elseif ($determinator <= 15) { $lastName = static::randomElement(static::$commonForeignLastNames); - } elseif ($determinator === 3) { + } else { $lastName = static::randomElement(static::$dutchLastNames); } @@ -272,7 +288,7 @@ class Person extends \Faker\Provider\Person */ public static function titleMale() { - return static::title(); + return static::randomElement(static::$title); } /** @@ -280,7 +296,7 @@ class Person extends \Faker\Provider\Person */ public static function titleFemale() { - return static::title(); + return static::randomElement(static::$title); } /** @@ -290,4 +306,44 @@ class Person extends \Faker\Provider\Person { return static::randomElement(static::$suffix); } + + /* + * @example 'van der' + */ + public static function prefix() + { + return static::randomElement(static::$prefix); + } + + /** + * @link https://nl.wikipedia.org/wiki/Burgerservicenummer#11-proef + * + * @return string + */ + public function idNumber() + { + $return = ''; + $nr = array(); + $nr[] = 0; + while (count($nr) < 8) { + $nr[] = static::randomDigit(); + } + $nr[] = mt_rand(0, 6); + if ($nr[7] == 0 && $nr[8] == 0) { + $nr[7] = 0; + } + + $bsn = (9 * $nr[8]) + (8 * $nr[7]) + (7 * $nr[6]) + (6 * $nr[5]) + (5 * $nr[4]) + (4 * $nr[3]) + (3 * $nr[2]) + (2 * $nr[1]); + $nr[0] = floor($bsn - floor($bsn / 11) * 11); + if ($nr[0] > 9) { + if ($nr[1] > 0) { + $nr[0] = 8; + $nr[1]--; + } else { + $nr[0] = 1; + $nr[1]++; + } + } + return implode('', array_reverse($nr)); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Text.php new file mode 100644 index 00000000..4ac1f0b6 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Text.php @@ -0,0 +1,3932 @@ + 'Aareal Bank Aktiengesellschaft (Spółka Akcyjna) - OddziaÅ‚ w Polsce', - '249' => 'Alior Bank SA', - '247' => 'Banco Espirito Santo de Investimento, S.A. Spółka Akcyjna OddziaÅ‚ w Polsce', - '238' => 'Banco Mais S.A. (SA) OddziaÅ‚ w Polsce', - '106' => 'Bank BPH SA', - '219' => 'Bank DnB NORD Polska SA', - '203' => 'Bank Gospodarki Å»ywnoÅ›ciowej SA', - '113' => 'Bank Gospodarstwa Krajowego', - '122' => 'Bank Handlowo - Kredytowy SA (w likwidacji 31.03.92)', - '103' => 'Bank Handlowy w Warszawie SA', - '116' => 'Bank Millennium SA', - '154' => 'Bank Ochrony Åšrodowiska SA', - '260' => 'Bank of China (Luxembourg)S.A. Spółka Akcyjna OddziaÅ‚ w Polsce', - '221' => 'Bank of Tokyo-Mitsubishi UFJ (Polska) SA', - '132' => 'Bank Pocztowy SA', - '124' => 'Bank Polska Kasa Opieki SA', - '193' => 'BANK POLSKIEJ SPÓÅDZIELCZOÅšCI SA', - '109' => 'Bank Zachodni WBK SA', - '224' => 'Banque PSA Finance SA OddziaÅ‚ w Polsce', - '160' => 'BNP PARIBAS BANK POLSKA SA', - '235' => 'BNP PARIBAS SA OddziaÅ‚ w Polsce', - '243' => 'BNP Paribas Securities Services SKAOddziaÅ‚ w Polsce', - '229' => 'BPI Bank Polskich Inwestycji SA', - '215' => 'BRE Bank Hipoteczny SA', - '114' => 'BRE Bank SA', - '239' => 'CAIXABANK, S.A. (SPÓÅKA AKCYJNA)ODDZIAÅ W POLSCE', - '254' => 'Citibank Europe plc (Publiczna Spółka Akcyjna) OddziaÅ‚ w Polsce', - '194' => 'Credit Agricole Bank Polska SA', - '252' => 'CREDIT SUISSE (LUXEMBOURG) S.A. Spółka Akcyjna, OddziaÅ‚ w Polsce', - '236' => 'Danske Bank A/S SA OddziaÅ‚ w Polsce', - '191' => 'Deutsche Bank PBC SA', - '188' => 'Deutsche Bank Polska SA', - '174' => 'DZ BANK Polska SA', - '241' => 'Elavon Financial Services Limited (Spółka z ograniczonÄ… odpowiedzialnoÅ›ciÄ…) OddziaÅ‚ w Polsce', - '147' => 'Euro Bank SA', - '265' => 'EUROCLEAR Bank SA/NV (Spółka Akcyjna) - OddziaÅ‚ w Polsce', - '207' => 'FCE Bank Polska SA', - '214' => 'Fiat Bank Polska SA', - '253' => 'FM Bank SA', - '248' => 'Getin Noble Bank SA', - '128' => 'HSBC Bank Polska SA', - '195' => 'Idea Bank SA', - '255' => 'Ikano Bank GmbH (Sp. z o.o.) OddziaÅ‚ w Polsce', - '262' => 'Industrial and Commercial Bank of China (Europe) S.A. (Spółka Akcyjna) OddziaÅ‚ w Polsce', - '105' => 'ING Bank ÅšlÄ…ski SA', - '266' => 'Intesa Sanpaolo S.p.A. Spółka Akcyjna OddziaÅ‚ w Polsce', - '168' => 'INVEST - BANK SA', - '258' => 'J.P. Morgan Europe Limited Sp. z o.o. OddziaÅ‚ w Polsce', - '158' => 'Mercedes-Benz Bank Polska SA', - '130' => 'Meritum Bank ICB SA', '101' => 'Narodowy Bank Polski', - '256' => 'Nordea Bank AB SA OddziaÅ‚ w Polsce', - '144' => 'NORDEA BANK POLSKA SA', - '232' => 'Nykredit Realkredit A/S SA - OddziaÅ‚ w Polsce', - '189' => 'Pekao Bank Hipoteczny SA', - '187' => 'Polski Bank PrzedsiÄ™biorczoÅ›ci SA', '102' => 'Powszechna Kasa OszczÄ™dnoÅ›ci Bank Polski SA', - '200' => 'Rabobank Polska SA', - '175' => 'Raiffeisen Bank Polska SA', - '167' => 'RBS Bank (Polska) SA', - '264' => 'RCI Banque Spółka Akcyjna OddziaÅ‚ w Polsce', - '212' => 'Santander Consumer Bank SA', - '263' => 'Saxo Bank A/S Spółka Akcyjna OddziaÅ‚ w Polsce', + '103' => 'Bank Handlowy w Warszawie SA', + '105' => 'ING Bank ÅšlÄ…ski SA', + '106' => 'Bank BPH SA', + '109' => 'Bank Zachodni WBK SA', + '113' => 'Bank Gospodarstwa Krajowego', + '114' => 'mBank SA', + '116' => 'Bank Millennium SA', + '122' => 'Bank Handlowo-Kredytowy Spółka Akcyjna w Katowicach w likwidacji', + '124' => 'Bank Polska Kasa Opieki SA', + '128' => 'HSBC Bank Polska SA', + '132' => 'Bank Pocztowy SA', + '147' => 'Euro Bank SA', + '154' => 'Bank Ochrony Åšrodowiska SA', + '158' => 'Mercedes-Benz Bank Polska SA', '161' => 'SGB-Bank SA', - '237' => 'Skandinaviska Enskilda Banken AB (SA) - OddziaÅ‚ w Polsce', + '167' => 'RBS Bank (Polska) SA', + '168' => 'PLUS BANK SA', + '175' => 'Raiffeisen Bank Polska SA', '184' => 'Societe Generale SA OddziaÅ‚ w Polsce', - '225' => 'Svenska Handelsbanken AB SA OddziaÅ‚ w Polsce', - '227' => 'Sygma Banque Societe Anonyme (SA) OddziaÅ‚ w Polsce', - '216' => 'Toyota Bank Polska SA', - '257' => 'UBS Limited (spółka z ograniczonÄ… odpowiedzialnoÅ›ciÄ…) OddziaÅ‚ w Polsce', - '261' => 'Vanquis Bank Limited (spółka z ograniczonÄ… odpowiedzialnoÅ›ciÄ…) OddziaÅ‚ w Polsce', + '187' => 'Nest Bank S.A.', + '189' => 'Pekao Bank Hipoteczny SA', + '191' => 'Deutsche Bank Polska SA', + '193' => 'BANK POLSKIEJ SPÓÅDZIELCZOÅšCI SA', + '194' => 'Credit Agricole Bank Polska SA', + '195' => 'Idea Bank SA', + '203' => 'Bank BGÅ» BNP Paribas SA', + '212' => 'Santander Consumer Bank SA', '213' => 'VOLKSWAGEN BANK POLSKA SA', + '214' => 'FCA-Group Bank Polska SA', + '215' => 'mBank Hipoteczny SA', + '216' => 'Toyota Bank Polska SA', + '219' => 'DNB Bank Polska SA', + '224' => 'Banque PSA Finance SA OddziaÅ‚ w Polsce', + '225' => 'Svenska Handelsbanken AB SA OddziaÅ‚ w Polsce', + '229' => 'BPI Bank Polskich Inwestycji SA', + '232' => 'Nykredit Realkredit A/S SA - OddziaÅ‚ w Polsce', + '235' => 'BNP PARIBAS SA OddziaÅ‚ w Polsce', + '236' => 'Danske Bank A/S SA OddziaÅ‚ w Polsce', + '237' => 'Skandinaviska Enskilda Banken AB (SA) - OddziaÅ‚ w Polsce', + '239' => 'CAIXABANK, S.A. (SPÓÅKA AKCYJNA)ODDZIAÅ W POLSCE', + '241' => 'Elavon Financial Services Designated Activity Company (spółka z o.o. o wyznaczonym przedmiocie dziaÅ‚alnoÅ›ci) OddziaÅ‚ w Polsce', + '243' => 'BNP Paribas Securities Services SKA OddziaÅ‚ w Polsce', + '247' => 'HAITONG BANK, S.A. Spółka Akcyjna OddziaÅ‚ w Polsce', + '248' => 'Getin Noble Bank SA', + '249' => 'Alior Bank SA', + '251' => 'Aareal Bank Aktiengesellschaft (Spółka Akcyjna) - OddziaÅ‚ w Polsce', + '254' => 'Citibank Europe plc (Publiczna Spółka Akcyjna) OddziaÅ‚ w Polsce', + '255' => 'Ikano Bank AB (publ) Spółka Akcyjna OddziaÅ‚ w Polsce', + '256' => 'Nordea Bank AB SA OddziaÅ‚ w Polsce', + '257' => 'UBS Limited (spółka z ograniczonÄ… odpowiedzialnoÅ›ciÄ…) OddziaÅ‚ w Polsce', + '258' => 'J.P. Morgan Europe Limited Sp. z o.o. OddziaÅ‚ w Polsce', + '260' => 'Bank of China (Luxembourg) S.A. Spółka Akcyjna OddziaÅ‚ w Polsce', + '262' => 'Industrial and Commercial Bank of China (Europe) S.A. (Spółka Akcyjna) OddziaÅ‚ w Polsce', + '263' => 'Saxo Bank A/S Spółka Akcyjna OddziaÅ‚ w Polsce w likwidacji', + '264' => 'RCI Banque Spółka Akcyjna OddziaÅ‚ w Polsce', + '265' => 'EUROCLEAR Bank SA/NV (Spółka Akcyjna) - OddziaÅ‚ w Polsce', + '266' => 'Intesa Sanpaolo S.p.A. Spółka Akcyjna OddziaÅ‚ w Polsce', + '267' => 'Western Union International Bank GmbH, Sp. z o.o. OddziaÅ‚ w Polsce', + '269' => 'PKO Bank Hipoteczny SA', + '270' => 'TF BANK AB (Spółka z ograniczonÄ… odpowiedzialnoÅ›ciÄ…) OddziaÅ‚ w Polsce', + '271' => 'FCE Bank Spółka Akcyjna OddziaÅ‚ w Polsce', + '272' => 'AS Inbank Spółka Akcyjna - OddziaÅ‚ w Polsce', + '273' => 'China Construction Bank (Europe) S.A. (Spółka Akcyjna) OddziaÅ‚ w Polsce', + '274' => 'MUFG Bank (Europe) N.V. S.A. OddziaÅ‚ w Polsce', + '275' => 'John Deere Bank S.A. Spółka Akcyjna OddziaÅ‚ w Polsce', ); /** @@ -105,7 +100,7 @@ class Payment extends \Faker\Provider\Payment protected static function addBankCodeChecksum($iban, $countryCode = 'PL') { - if ($countryCode != "PL" || strlen($iban) <= 8) { + if ($countryCode != 'PL' || strlen($iban) <= 8) { return $iban; } $checksum = 0; diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Person.php index c6b2402e..380f4d9f 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Person.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Person.php @@ -159,11 +159,12 @@ class Person extends \Faker\Provider\Person for ($i = 6; $i < $length; $i++) { $result[$i] = static::randomDigit(); } - if ($sex == "M") { - $result[$length - 1] |= 1; - } elseif ($sex == "F") { - $result[$length - 1] ^= 1; + + $result[$length - 1] |= 1; + if ($sex == "F") { + $result[$length - 1] -= 1; } + $checksum = 0; for ($i = 0; $i < $length; $i++) { $checksum += $weights[$i] * $result[$i]; diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Text.php index 0f242105..9739b83e 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Text.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Text.php @@ -48,7 +48,7 @@ class Text extends \Faker\Provider\Text * * * - * Produced by Pawel Sobkowiak--Scanned and proofread by + * Produced by Pawel Sobkowiak - Scanned and proofread by * Polska Biblioteka Internetowa * * @@ -75,13 +75,13 @@ starszym bratem na pastwÄ™ biaÅ‚ych od żaru i oszoÅ‚amiajÄ…cych dni letnich. WertowaliÅ›my, odurzeni Å›wiatÅ‚em, w tej wielkiej ksiÄ™dze wakacji, której wszystkie karty paÅ‚aÅ‚y od blasku i miaÅ‚y na dnie sÅ‚odki do omdlenia miąższ zÅ‚otych gruszek. Adela wracaÅ‚a w Å›wietliste poranki, jak Pomona z -ognia dnia rozżagwionego, wysypujÄ…c z koszyka barwnÄ… urodÄ™ sÅ‚oÅ„ca-- +ognia dnia rozżagwionego, wysypujÄ…c z koszyka barwnÄ… urodÄ™ sÅ‚oÅ„ca - lÅ›niÄ…ce, peÅ‚ne wody pod przejrzystÄ… skórkÄ… czereÅ›nie, tajemnicze, czarne wiÅ›nie, których woÅ„ przekraczaÅ‚a to, co ziszczaÅ‚o siÄ™ w smaku; morele, w których miąższu zÅ‚otym byÅ‚ rdzeÅ„ dÅ‚ugich popoÅ‚udni; a obok tej czystej poezji owoców wyÅ‚adowywaÅ‚a nabrzmiaÅ‚e siłą i pożywnoÅ›ciÄ… pÅ‚aty miÄ™sa z klawiaturÄ… żeber cielÄ™cych, wodorosty jarzyn, niby zabite gÅ‚owonogi i -meduzy--surowy materiaÅ‚ obiadu o smaku jeszcze nie uformowanym i +meduzy - surowy materiaÅ‚ obiadu o smaku jeszcze nie uformowanym i jaÅ‚owym, wegetatywne i telluryczne ingrediencje obiadu o zapachu dzikim i polnym. Przez ciemne mieszkanie na pierwszym piÄ™trze kamienicy w rynku przechodziÅ‚o co dzieÅ„ na wskroÅ› caÅ‚e wielkie lato: cisza drgajÄ…cych @@ -99,10 +99,10 @@ sÅ‚onecznÄ… kÄ…piel dnia. Przechodnie, brodzÄ…c w zÅ‚ocie, mieli oczy zmrużone od żaru, jakby zalepione miodem, a podciÄ…gniÄ™ta górna warga odsÅ‚aniaÅ‚a im dziÄ…sÅ‚a i zÄ™by. I wszyscy brodzÄ…cy w tym dniu zÅ‚ocistym mieli ów grymas skwaru, jak gdyby sÅ‚oÅ„ce naÅ‚ożyÅ‚o swym wyznawcom jednÄ… i -tÄ™ samÄ… maskÄ™--zÅ‚otÄ… maskÄ™ bractwa sÅ‚onecznego; i wszyscy, którzy szli +tÄ™ samÄ… maskÄ™ - zÅ‚otÄ… maskÄ™ bractwa sÅ‚onecznego; i wszyscy, którzy szli dziÅ› ulicami, spotykali siÄ™, mijali, starcy i mÅ‚odzi, dzieci i kobiety, pozdrawiali siÄ™ w przejÅ›ciu tÄ… maskÄ…, namalowanÄ… grubÄ…, zÅ‚otÄ… farbÄ… na -twarzy, szczerzyli do siebie ten grymas bakchiczny--barbarzyÅ„skÄ… maskÄ™ +twarzy, szczerzyli do siebie ten grymas bakchiczny - barbarzyÅ„skÄ… maskÄ™ kultu pogaÅ„skiego. Rynek byÅ‚ pusty i żółty od żaru, wymieciony z kurzu gorÄ…cymi wiatrami, jak biblijna pustynia. Cierniste akacje, wyrosÅ‚e z pustki żółtego placu, kipiaÅ‚y nad nim jasnym listowiem, bukietami @@ -129,7 +129,7 @@ troskliwie chorego męża z rozpalonego siodÅ‚a, ażeby go po chÅ‚odnych schodach wnieść ostrożnie na pachnÄ…ce szabasem piÄ™tro. Tak wÄ™drowaliÅ›my z matkÄ… przez dwie sÅ‚oneczne strony rynku, wodzÄ…c nasze zaÅ‚amane cienie po wszystkich domach, jak po klawiszach. Kwadraty bruku mijaÅ‚y powoli -pod naszymi miÄ™kkimi i pÅ‚askimi krokami--jedne bladoróżowe jak skóra +pod naszymi miÄ™kkimi i pÅ‚askimi krokami - jedne bladoróżowe jak skóra ludzka, inne zÅ‚ote i sine, wszystkie pÅ‚askie, ciepÅ‚e, aksamitne na sÅ‚oÅ„cu, jak jakieÅ› twarze sÅ‚oneczne, zadeptane stopami aż do niepoznaki, do bÅ‚ogiej nicoÅ›ci. Aż wreszcie na rogu ulicy Stryjskiej weszliÅ›my w @@ -227,9 +227,9 @@ w dziwnie prostej syntezie życie tych ludzi, alembik rasy, gatunek krwi i sekret ich losu, zawarty niedostrzegalnie w codziennym mijaniu ich wÅ‚asnego, odrÄ™bnego czasu. Stare, mÄ…dre drzwi, których ciemne westchnienia wpuszczaÅ‚y i wypuszczaÅ‚y tych ludzi, milczÄ…cy Å›wiadkowie -wchodzenia i wychodzenia matki, córek i synów--otworzyÅ‚y siÄ™ bezgÅ‚oÅ›nie +wchodzenia i wychodzenia matki, córek i synów - otworzyÅ‚y siÄ™ bezgÅ‚oÅ›nie jak odrzwia szafy i weszliÅ›my w ich życie. Siedzieli jakby w cieniu -swego losu i nie bronili siÄ™--w pierwszych niezrÄ™cznych gestach +swego losu i nie bronili siÄ™ - w pierwszych niezrÄ™cznych gestach wydalinam swojÄ… tajemnicÄ™. Czyż nie byliÅ›my krwiÄ… i losem spokrewnieni z nimi? Pokój byÅ‚ ciemny i aksamitny od granatowych obić ze zÅ‚otym deseniem, lecz echo dnia pÅ‚omiennego drgaÅ‚o i tutaj jeszcze mosiÄ…dzem na @@ -288,7 +288,7 @@ oczyma, wychodzÄ…c do drugiego pokoju. PodążyÅ‚em za nim. SiedziaÅ‚ nisko na maÅ‚ej kozetce, z kolanami krzyżujÄ…cymi siÄ™ niemal na wysokoÅ›ci gÅ‚owy, Å‚ysej jak kula bilardowa. ZdawaÅ‚o siÄ™, że to ubranie samo leży, faÅ‚dziste, zmiÄ™te, przerzucone przez fotel. Twarz jego byÅ‚a jak -tchnienie twarzy--smuga, którÄ… nieznany przechodzieÅ„ zostawiÅ‚ w +tchnienie twarzy - smuga, którÄ… nieznany przechodzieÅ„ zostawiÅ‚ w powietrzu. TrzymaÅ‚ w bladych, emaliowanych błękitnie dÅ‚oniach portfel, w którym coÅ› oglÄ…daÅ‚. Z mgÅ‚y twarzy wyÅ‚oniÅ‚o siÄ™ z trudem wypukÅ‚e bielmo bladego oka, wabiÄ…c mnie figlarnym mruganiem. CzuÅ‚em doÅ„ nieprzepartÄ… @@ -301,13 +301,13 @@ i zbiegÅ‚ miÄ™ dreszczem niepokoju, falÄ… nagÅ‚ego zrozumienia. Ale tymczasem ta mgieÅ‚ka uÅ›miechu, która siÄ™ zarysowaÅ‚a pod miÄ™kkim i piÄ™knym jego wÄ…sem, zawiÄ…zek pożądania, który napiÄ…Å‚ siÄ™ na jego skroniach pulsujÄ…cÄ… żyłą, natężenie trzymajÄ…ce przez chwilÄ™ jego rysy w -skupieniu--upadÅ‚y z powrotem w nicość i twarz odeszÅ‚a w nieobecność, +skupieniu - upadÅ‚y z powrotem w nicość i twarz odeszÅ‚a w nieobecność, zapomniaÅ‚a o sobie, rozwiaÅ‚a siÄ™, NAWIEDZENIE 1 Już wówczas miasto nasze popadaÅ‚o coraz bardziej w chronicznÄ… szarość zmierzchu, porastaÅ‚o na krawÄ™dziach liszajem cienia, puszystÄ… pleÅ›niÄ… i mchem koloru żelaza. Ledwo rozpowity z brunatnych -dymów i mgieÅ‚ poranka--przechylaÅ‚ siÄ™ dzieÅ„ od razu w niskie +dymów i mgieÅ‚ poranka - przechylaÅ‚ siÄ™ dzieÅ„ od razu w niskie bursztynowe popoÅ‚udnie, stawaÅ‚ siÄ™ przez chwilÄ™ przezroczysty i zÅ‚oty jak ciemne piwo, ażeby potem zejść pod wielokrotnie rozczÅ‚onkowane, fantastyczne sklepienia kolorowych i rozlegÅ‚ych nocy. MieszkaliÅ›my w @@ -337,7 +337,7 @@ bokami po podÅ‚odze i Å›cianach; szedÅ‚ budzić ciężko chrapiÄ…cych z twardego jak kamieÅ„ snu. W Å›wietle pozostawionej przezeÅ„ Å›wiecy wywijali siÄ™ leniwie z brudnej poÅ›cieli, wystawiali, siadajÄ…c na łóżkach, bose i brzydkie nogi i z skarpetkÄ… w rÄ™ce oddawali siÄ™ jeszcze przez chwilÄ™ -rozkoszy ziewania--ziewania przeciÄ…gniÄ™tego aż do lubieżnoÅ›ci, do +rozkoszy ziewania - ziewania przeciÄ…gniÄ™tego aż do lubieżnoÅ›ci, do bolesnego skurczu podniebienia, jak przy tÄ™gich wymiotach. W kÄ…tach siedziaÅ‚y nieruchomo wielkie karakony, wyogromnione wÅ‚asnym cieniem, którym obarczaÅ‚a każdego pÅ‚onÄ…ca Å›wieca i który nie odłączaÅ‚ siÄ™ od nich @@ -365,7 +365,7 @@ bezradnie, jakby czegoÅ› szukajÄ…c. Wówczas bywaÅ‚o, że zbiegaÅ‚ po cichu z to rodzaj klepsydry wodnej albo wielkiej fioli szklanej, podzielonej na uncje i napeÅ‚nionej ciemnym fluidem. Mój ojciec łączyÅ‚ siÄ™ z tym instrumentem dÅ‚ugÄ… kiszkÄ… gumowÄ…, jakby krÄ™tÄ…, bolesnÄ… pÄ™powinÄ…, i tak -połączony z żaÅ‚osnym przyrzÄ…dem--nieruchomiaÅ‚ w skupieniu, a oczy jego +połączony z żaÅ‚osnym przyrzÄ…dem - nieruchomiaÅ‚ w skupieniu, a oczy jego ciemniaÅ‚y, zaÅ› na twarz przybladłą wystÄ™powaÅ‚ wyraz cierpienia czy jakiejÅ› wystÄ™pnej rozkoszy. Potem znów przychodziÅ‚y dni cichej skupionej pracy, przeplatanej samotnymi monologami. Gdy tak siedziaÅ‚ w Å›wietle @@ -386,7 +386,7 @@ nocy tapety wiÄ™dÅ‚y, zwijaÅ‚y siÄ™, gubiÅ‚y liÅ›cie i kwiaty i przerzedzaÅ‚y siÄ™ jesiennie, przepuszczajÄ…c dalekie Å›witanie. Wtedy wÅ›ród Å›wiergotu tapetowych ptaków, w żółtym zimowym Å›wicie zasypiaÅ‚ na parÄ™ godzin gÄ™stym, czarnym snem. Od dni, od tygodni, gdy zdawaÅ‚ siÄ™ być pogrążonym -w zawiÅ‚ych konto-korrentach--myÅ›l jego zapuszczaÅ‚a siÄ™ tajnie w +w zawiÅ‚ych konto-korrentach - myÅ›l jego zapuszczaÅ‚a siÄ™ tajnie w labirynty wÅ‚asnych wnÄ™trznoÅ›ci. WstrzymywaÅ‚ oddech i nasÅ‚uchiwaÅ‚. I gdy wzrok jego wracaÅ‚ zbielaÅ‚y i mÄ™tny z tamtych głębin, uspokajaÅ‚ go uÅ›miechem. Nie wierzyÅ‚ jeszcze i odrzucaÅ‚ jak absurd te uroszczenia, te @@ -405,7 +405,7 @@ który jeszcze urÄ…ga. Nie widziaÅ‚em nigdy proroków Starego Testamentu, ale na widok tego męża, którego gniew boży obaliÅ‚, rozkraczonego szeroko na ogromnym porcelanowym urynale, zakrytego wichrem ramion, chmurÄ… rozpaczliwych Å‚amaÅ„ców, nad którymi wyżej jeszcze unosiÅ‚ siÄ™ gÅ‚os jego, -obcy i twardy--zrozumiaÅ‚em gniew boży Å›wiÄ™tych mężów. ByÅ‚ to dialog +obcy i twardy - zrozumiaÅ‚em gniew boży Å›wiÄ™tych mężów. ByÅ‚ to dialog groźny jak mowa piorunów. ÅamaÅ„ce rak jego rozrywaÅ‚y niebo na sztuki, a w szczelinach ukazywaÅ‚a siÄ™ twarz Jehowy, wzdÄ™ta gniewem i plujÄ…ca przekleÅ„stwa. Nie patrzÄ…c widziaÅ‚em go, groźnego Demiurga, jak leżąc na @@ -491,14 +491,14 @@ pozostaÅ‚o, to trochÄ™ cielesnej powÅ‚oki i ta garść bezsensownych dziwactw PTAKI NadeszÅ‚y żółte, peÅ‚ne nudy dni zimowe. Zrudziałą ziemiÄ™ pokrywaÅ‚ dziurawy, przetarty, za krótki obrus Å›niegu. Na wiele dachów nie starczyÅ‚o go i staÅ‚y czarne lub rdzawe, gontowe strzechy i arki kryjÄ…ce -w sobie zakopcone przestrzenie strychów--czarne, zwÄ™glone katedry, -najeżone żebrami krokwi, pÅ‚atwi i bantów--ciemne pÅ‚uca wichrów +w sobie zakopcone przestrzenie strychów - czarne, zwÄ™glone katedry, +najeżone żebrami krokwi, pÅ‚atwi i bantów - ciemne pÅ‚uca wichrów zimowych. Każdy Å›wit odkrywaÅ‚ nowe kominy i dymniki, wyrosÅ‚e w nocy, wydÄ™te przez wicher nocny, czarne piszczaÅ‚ki organów diabelskich. Kominiarze nie mogli opÄ™dzić siÄ™ od wron, które na ksztaÅ‚t żywych czarnych liÅ›ci obsiadaÅ‚y wieczorem gałęzie drzew pod koÅ›cioÅ‚em, odrywaÅ‚y siÄ™ znów, trzepocÄ…c, by wreszcie przylgnąć, każda do wÅ‚aÅ›ciwego miejsca -na wÅ‚aÅ›ciwej gałęzi, a o Å›wicie ulatywaÅ‚y wielkimi stadami--tumany +na wÅ‚aÅ›ciwej gałęzi, a o Å›wicie ulatywaÅ‚y wielkimi stadami - tumany sadzy, pÅ‚atki kopciu, falujÄ…ce i fantastyczne, plamiÄ…c migotliwym krakaniem mÄ™tnożółte smugi Å›witu. Dni stwardniaÅ‚y od zimna i nudy, jak zeszÅ‚oroczne bochenki chleba. Napoczynano je tÄ™pymi nożami, bez apetytu, @@ -507,8 +507,8 @@ studiowaÅ‚ nigdy niezgłębionÄ… istotÄ™ ognia, wyczuwaÅ‚ sÅ‚ony, metaliczny posmak i wÄ™dzony zapach zimowych pÅ‚omieni, chÅ‚odnÄ… pieszczotÄ™ salamander, liżących bÅ‚yszczÄ…cÄ… sadzÄ™ w gardzieli komina. Z zamiÅ‚owaniem wykonywaÅ‚ w owych dniach wszystkie reparatury w górnych regionach -pokoju. O każdej porze dnia można go byÅ‚o widzieć, jak--przykucniÄ™ty na -szczycie drabiny--majstrowaÅ‚ coÅ› przy suficie, przy kamiszach wysokich +pokoju. O każdej porze dnia można go byÅ‚o widzieć, jak - przykucniÄ™ty na +szczycie drabiny - majstrowaÅ‚ coÅ› przy suficie, przy kamiszach wysokich okien, przy kulach i Å‚aÅ„cuchach lamp wiszÄ…cych. Zwyczajem malarzy posÅ‚ugiwaÅ‚ siÄ™ drabinÄ… jak ogromnymi szczudÅ‚ami i czuÅ‚ siÄ™ dobrze w tej ptasiej perspektywie, w pobliżu malowanego nieba, arabesek i ptaków @@ -519,7 +519,7 @@ sÅ‚uchaÅ‚ jej z roztargnieniem, peÅ‚en niepokoju, z drgawkami w nieobecnej twarzy. I bywaÅ‚o, że przerywaÅ‚ jej nagle zaklinajÄ…cym gestem rÄ™ki, ażeby pobiec w kÄ…t pokoju, przylgnąć uchem do szpary w podÅ‚odze i z podniesionymi palcami wskazujÄ…cymi obu rÄ…k, wyrażajÄ…cymi najwyższÄ… -ważność badania--nasÅ‚uchiwać. Nie rozumieliÅ›my wówczas jeszcze smutnego +ważność badania - nasÅ‚uchiwać. Nie rozumieliÅ›my wówczas jeszcze smutnego tÅ‚a tych ekstrawagancji, opÅ‚akanego kompleksu, który dojrzewaÅ‚ w głębi. Matka nie miaÅ‚a naÅ„ żadnego wpÅ‚ywu, natomiast wielkÄ… czciÄ… i uwagÄ… darzyÅ‚ AdelÄ™. SprzÄ…tanie pokoju byÅ‚o dlaÅ„ wielkÄ… i ważnÄ… ceremoniÄ…, @@ -546,11 +546,11 @@ na Å›wiatÅ‚o dzienne. Zaczęło siÄ™ to od wylÄ™gania jaj ptasich. Z wielkim nakÅ‚adem trudu i pieniÄ™dzy sprowadzaÅ‚ ojciec z Hamburga, z Holandii, z afrykaÅ„skich stacji zoologicznych zapÅ‚odnione jaja ptasie, które dawaÅ‚ do wylÄ™gania ogromnym kurom belgijskim. ByÅ‚ to proceder nader zajmujÄ…cy -i dla mnie--to wykluwanie siÄ™ pisklÄ…t, prawdziwych dziwotworów w +i dla mnie - to wykluwanie siÄ™ pisklÄ…t, prawdziwych dziwotworów w ksztaÅ‚cie i ubarwieniu. Nie podobna byÅ‚o dopatrzyć siÄ™ w tych monstrach o ogromnych, fantastycznych dziobach, które natychmiast po urodzeniu rozdzieraÅ‚y siÄ™ szeroko, syczÄ…c żarÅ‚ocznie czeluÅ›ciami gardÅ‚a, w tych -jaszczurach o wÄ…tÅ‚ym, nagim ciele garbusów--przyszÅ‚ych pawi, bażantów, +jaszczurach o wÄ…tÅ‚ym, nagim ciele garbusów - przyszÅ‚ych pawi, bażantów, gÅ‚uszców i kondorów. Umieszczony w koszykach, w wacie, smoczy ten pomiot podnosiÅ‚ na cienkich szyjach Å›lepe, bielmem zarosle gÅ‚owy, kwaczÄ…c bezgÅ‚oÅ›nie z niemych gardzieli. Mój ojciec chodziÅ‚ wzdÅ‚uż półek w @@ -575,13 +575,13 @@ godnoÅ›ci w caÅ‚ym zachowaniu, kierujÄ…cy siÄ™ żelaznym ceremoniaÅ‚em swego wielkiego rodu. Gdy siedziaÅ‚ naprzeciw ojca, nieruchomy w swej monumentalnej pozycji odwiecznych bóstw egipskich, z okiem zawleczonym biaÅ‚awym bielmem, które zasuwaÅ‚ z boku na źrenice, ażeby zamknąć siÄ™ -zupeÅ‚nie w kontemplacji swej dostojnej samotnoÅ›ci--wydawaÅ‚ siÄ™ ze swym +zupeÅ‚nie w kontemplacji swej dostojnej samotnoÅ›ci - wydawaÅ‚ siÄ™ ze swym kamiennym profilem starszym bratem mego ojca. Ta sama materia ciaÅ‚a, Å›ciÄ™gien i pomarszczonej twardej skóry, ta sama twarz wyschÅ‚a i koÅ›cista, te same zrogowaciaÅ‚e, głębokie oczodoÅ‚y. Nawet rÄ™ce, silne w wÄ™zÅ‚ach, dÅ‚ugie, chude dÅ‚onie ojca, z wypukÅ‚ymi paznokciami, miaÅ‚y swój analogon w szponach kondora. Nie mogÅ‚em siÄ™ oprzeć wrażeniu, widzÄ…c go -tak uÅ›pionego, że mam przed sobÄ… mumiÄ™--wyschłą i dlatego pomniejszonÄ… +tak uÅ›pionego, że mam przed sobÄ… mumiÄ™ - wyschłą i dlatego pomniejszonÄ… mumiÄ™ mego ojca. SÄ…dzÄ™, że i uwagi matki nie uszÅ‚o to przedziwne podobieÅ„stwo, chociaż nigdy nie poruszaliÅ›my tego tematu. Charakterystyczne jest, że kondor używaÅ‚ wspólnego z moim ojcem naczynia @@ -594,7 +594,7 @@ wszelkiego rodzaju skrzydlacze z dalekich stron. Nawet dÅ‚ugo po zlikwidowaniu ptasiego gospodarstwa utrzymywaÅ‚a siÄ™ w Å›wiecie ptasim ta tradycja naszego domu i w okresie wiosennych wÄ™drówek spadaÅ‚y nieraz na nasz dach caÅ‚e chmary żurawi, pelikanów, pawi i wszelkiego ptactwa. -Impreza ta wzięła jednak niebawem--po krótkiej Å›wietnoÅ›ci--smutny +Impreza ta wzięła jednak niebawem - po krótkiej Å›wietnoÅ›ci - smutny obrót. Wkrótce okazaÅ‚a siÄ™ bowiem konieczna translokacja ojca do dwóch pokojów na poddaszu, które sÅ‚użyÅ‚y za rupieciarnie. StamtÄ…d dochodziÅ‚ już o wczesnym Å›wicie zmieszany klangor gÅ‚osów ptasich. Drewniane pudÅ‚a @@ -618,7 +618,7 @@ przerażeniu próbowaÅ‚ wznieść siÄ™ w powietrze. Zwolna przerzedzaÅ‚ siÄ™ tuman skrzydlaty, aż w koÅ„cu na pobojowisku zostaÅ‚a sama Adela, wyczerpana, dyszÄ…ca, oraz mój ojciec z minÄ… zafrasowanÄ… i zawstydzonÄ…, gotów do przyjÄ™cia każdej kapitulacji. W chwilÄ™ później schodziÅ‚ mój -ojciec ze schodów swojego dominium--czÅ‚owiek zÅ‚amany, król-banita, +ojciec ze schodów swojego dominium - czÅ‚owiek zÅ‚amany, król-banita, który straciÅ‚ tron i królowanie. MANEKINY Ta ptasia impreza mego ojca byÅ‚a ostatnim wybuchem kolorowoÅ›ci, @@ -698,7 +698,7 @@ fizjonomiÄ™. Subiekci spożywali go z namaszczeniem, z powagÄ… kalendarzowej ceremonii. Zapach pieprzu rozchodziÅ‚ siÄ™ po pokoju. A gdy wytarli buÅ‚kÄ… ostatek galarety ze swych talerzy, rozważajÄ…c w myÅ›li heraldykÄ™ nastÄ™pnych dni tygodnia, i na półmisku zostawaÅ‚y tylko gÅ‚owy z -wygotowanymi oczyma--czuliÅ›my wszyscy, że dzieÅ„ zostaÅ‚ wspólnymi siÅ‚ami +wygotowanymi oczyma - czuliÅ›my wszyscy, że dzieÅ„ zostaÅ‚ wspólnymi siÅ‚ami pokonany i że reszta nie wchodziÅ‚a już w rachubÄ™. W samej rzeczy z resztÄ… tÄ…, wydanÄ… na jej Å‚askÄ™, Adela nie robiÅ‚a sobie dÅ‚ugich ceregieli. WÅ›ród brzÄ™ku garnków i chlustów zimnej wody likwidowaÅ‚a z @@ -732,7 +732,7 @@ lekkomyÅ›lnych i pÅ‚ochych, którymi zasypać mogÅ‚y cale miasto, jak kolorowÄ… fantastycznÄ… Å›nieżycÄ…. Nagle byÅ‚o im gorÄ…co i otwieraÅ‚y okno, ażeby w niecierpliwoÅ›ci swej samotni, w gÅ‚odzie obcych twarzy, przynajmniej bezimiennÄ… twarz zobaczyć, do okna przyciÅ›niÄ™tÄ…. WachlowaÅ‚y -rozpalone swe policzki przed wzbierajÄ…cÄ… firankami nocÄ… zimowÄ…-- +rozpalone swe policzki przed wzbierajÄ…cÄ… firankami nocÄ… zimowÄ… - odsÅ‚aniaÅ‚y pÅ‚onÄ…ce dekolty, peÅ‚ne nienawiÅ›ci do siebie i rywalizacji, gotowe stanąć do walki o tego pierrota, którego by ciemny powiew nocy przywiaÅ‚ na okno. Ach! jak maÅ‚o wymagaÅ‚y one od rzeczywistoÅ›ci. MiaÅ‚y @@ -753,26 +753,26 @@ drzwi podniósÅ‚ firanki u okna, panienki dawaÅ‚y siÄ™ oglÄ…dać, krÄ™cÄ…c siÄ™ biodrach, polÅ›niewajÄ…c emaliÄ… oczu, lakiem skrzypiÄ…cych pantofelków, sprzÄ…czkami podwiÄ…zek pod wzdÄ™tÄ… od wiatru sukienkÄ…; szmatki jęły umykać po podÅ‚odze, jak szczury, ku uchylonym drzwiom ciemnego pokoju, a ojciec -mój przyglÄ…daÅ‚ siÄ™ uważnie prychajÄ…cym osóbkom, szepcÄ…c półgÅ‚osem:-- +mój przyglÄ…daÅ‚ siÄ™ uważnie prychajÄ…cym osóbkom, szepcÄ…c półgÅ‚osem: - Genus avium... jeÅ›li siÄ™ nie mylÄ™, scansores albo pistacci... w najwyższym stopniu godne uwagi. Przypadkowe to spotkanie staÅ‚o siÄ™ poczÄ…tkiem caÅ‚ej serii seansów, podczas których ojciec mój zdoÅ‚aÅ‚ rychÅ‚o oczarować obie panienki urokiem swej przedziwnej osobistoÅ›ci. OdpÅ‚acajÄ…c siÄ™ za peÅ‚nÄ… galanterii i dowcipu konwersacjÄ™, którÄ… zapeÅ‚niaÅ‚ im pustkÄ™ -wieczorów--dziewczÄ™ta pozwalaÅ‚y zapalonemu badaczowi studiować +wieczorów - dziewczÄ™ta pozwalaÅ‚y zapalonemu badaczowi studiować strukturÄ™ swych szczupÅ‚ych i tandetnych ciaÅ‚ek. DziaÅ‚o siÄ™ to w toku konwersacji, z powagÄ… i wytwornoÅ›ciÄ…, która najryzykowniejszym punktom tych badaÅ„ odbieraÅ‚a dwuznaczny ich pozór. OdsuwajÄ…c poÅ„czoszkÄ™ z kolana Pauliny i studiujÄ…c rozmiÅ‚owanymi oczyma zwiÄ™złą i szlachetnÄ… -konstrukcjÄ™ przegubu, ojciec mój mówiÅ‚:--Jakże peÅ‚na uroku i jak +konstrukcjÄ™ przegubu, ojciec mój mówiÅ‚: - Jakże peÅ‚na uroku i jak szczęśliwa jest forma bytu, którÄ… panie obraÅ‚y. Jakże piÄ™kna i prosta jest teza, którÄ… dano wam swym życiem ujawnić. Lecz za to z jakim mistrzostwem, z jakÄ… finezjÄ… wywiÄ…zujÄ… siÄ™ panie z tego zadania. Gdybym odrzucajÄ…c respekt przed StwórcÄ…, chciaÅ‚ siÄ™ zabawić w krytykÄ™ -stworzenia, woÅ‚aÅ‚bym:--mniej treÅ›ci, wiÄ™cej formy! Ach, jakby ulżyÅ‚ +stworzenia, woÅ‚aÅ‚bym: - mniej treÅ›ci, wiÄ™cej formy! Ach, jakby ulżyÅ‚ Å›wiatu ten ubytek treÅ›ci. WiÄ™cej skromnoÅ›ci w zamierzeniach, wiÄ™cej -wstrzemięźliwoÅ›ci w pretensjach--panowie demiurdzy--a Å›wiat byÅ‚by -doskonalszy!--woÅ‚aÅ‚ mój ojciec akurat w momencie, gdy dÅ‚oÅ„ jego +wstrzemięźliwoÅ›ci w pretensjach - panowie demiurdzy - a Å›wiat byÅ‚by +doskonalszy! - woÅ‚aÅ‚ mój ojciec akurat w momencie, gdy dÅ‚oÅ„ jego wyÅ‚uskiwaÅ‚a białą Å‚ydkÄ™ Pauliny z uwiÄ™zi poÅ„czoszki. W tej chwili Adela stanęła w otwartych drzwiach jadalni, niosÄ…c tacÄ™ z podwieczorkiem. ByÅ‚o to pierwsze spotkanie dwu tych wrogich potÄ™g od czasu wielkiej rozprawy. @@ -802,8 +802,8 @@ należytÄ… ostrożnoÅ›ciÄ…, i unikajÄ…c zgorszenia, tÄ™ nader kacerskÄ… doktrynÄ™, która opÄ™taÅ‚a wówczas na dÅ‚ugie miesiÄ…ce mego ojca i opanowaÅ‚a wszystkie jego poczynania. -TRAKTAT O MANEKINACH ALBO WTÓRA KSIĘGA RODZAJU Demiurgos--mówiÅ‚ mój -ojciec--nie posiadÅ‚ monopolu na tworzenie--tworzenie jest przywilejem +TRAKTAT O MANEKINACH ALBO WTÓRA KSIĘGA RODZAJU Demiurgos - mówiÅ‚ mój +ojciec - nie posiadÅ‚ monopolu na tworzenie - tworzenie jest przywilejem wszystkich duchów. Materii dana jest nieskoÅ„czona pÅ‚odność, niewyczerpana moc życiowa i zarazem uwodna siÅ‚a pokusy, która nas nÄ™ci do formowania. W głębi materii ksztaÅ‚tujÄ… siÄ™ niewyraźne uÅ›miechy, @@ -813,7 +813,7 @@ dreszczami. CzekajÄ…c na ożywcze tchnienie ducha, przelewa siÄ™ ona w sobie bez koÅ„ca, kusi tysiÄ…cem sÅ‚odkich okrÄ…glizn i miÄ™kkoÅ›ci, które z siebie w Å›lepych rojeniach wymajacza. Pozbawiona wÅ‚asnej inicjatywy, lubieżnie podatna, po kobiecemu plastyczna, ulegÅ‚a wobec wszystkich -impulsów--stanowi ona teren wyjÄ™ty spod prawa, otwarty dla wszelkiego +impulsów - stanowi ona teren wyjÄ™ty spod prawa, otwarty dla wszelkiego rodzaju szarlatanerii i dyletantyzmów, domenÄ™ wszelkich nadużyć i wÄ…tpliwych manipulacji demiurgicznych. Materia jest najbierniejszÄ… i najbezbronniejszÄ… istotÄ… w kosmosie. Każdy może jÄ… ugniatać, formować, @@ -824,8 +824,8 @@ Jest ono nieraz koniecznym gwaÅ‚tem wobec opornych i skostniaÅ‚ych form bytu, które przestaÅ‚y być zajmujÄ…ce. W interesie ciekawego i ważnego eksperymentu może ono nawet stanowić zasÅ‚ugÄ™. Tu jest punkt wyjÅ›cia dla nowej apologii sadyzmu. Mój ojciec byÅ‚ niewyczerpany w gloryfikacji tego -przedziwnego elementu, jakim byÅ‚a materia.--Nie ma materii martwej-- -nauczaÅ‚--martwota jest jedynie pozorem, za którym ukrywajÄ… siÄ™ nieznane +przedziwnego elementu, jakim byÅ‚a materia. - Nie ma materii martwej - +nauczaÅ‚ - martwota jest jedynie pozorem, za którym ukrywajÄ… siÄ™ nieznane formy życia. Skala tych form jest nieskoÅ„czona, a odcienie i niuanse niewyczerpane. Demiurgos byÅ‚ w posiadaniu ważnych i ciekawych recept twórczych. DziÄ™ki nim stworzyÅ‚ on mnogość rodzajów, odnawiajÄ…cych siÄ™ @@ -848,20 +848,20 @@ ironicznym palcem, póki nie doÅ‚askotaÅ‚ siÄ™ bÅ‚ysku zrozumienia i Å›miechu, kapitulować. DziewczÄ™ta siedziaÅ‚y nieruchomo, lampa kopciÅ‚a, sukno pod igłą maszyny dawno siÄ™ zsunęło, a maszyna stukotaÅ‚a pusto, stÄ™bnujÄ…c czarne, bezgwiezdne sukno, odwijajÄ…ce siÄ™ z postawu nocy zimowej za -oknem.--Zbyt dÅ‚ugo żyliÅ›my pod terrorem niedoÅ›cigÅ‚ej doskonaÅ‚oÅ›ci -Demiurga--mówiÅ‚ mój ojciec--zbyt dÅ‚ugo doskonaÅ‚ość jego tworu +oknem. - Zbyt dÅ‚ugo żyliÅ›my pod terrorem niedoÅ›cigÅ‚ej doskonaÅ‚oÅ›ci +Demiurga - mówiÅ‚ mój ojciec - zbyt dÅ‚ugo doskonaÅ‚ość jego tworu paraliżowaÅ‚a naszÄ… wÅ‚asnÄ… twórczość. Nie chcemy z nim konkurować. Nie mamy ambicji mu dorównać. Chcemy być twórcami we wÅ‚asnej, niższej sferze, pragniemy dla siebie twórczoÅ›ci, pragniemy rozkoszy twórczej, -pragniemy--jednym sÅ‚owem--demiurgii.--Nie wiem, w czyim imieniu +pragniemy - jednym sÅ‚owem - demiurgii. - Nie wiem, w czyim imieniu proklamowaÅ‚ mój ojciec te postulaty, jaka zbiorowość, jaka korporacja, sekta czy zakon, nadawaÅ‚a swÄ… solidarnoÅ›ciÄ… patos jego sÅ‚owom. Co do nas, to byliÅ›my dalecy od wszelkich zakusów demÅ‚urgicznych. Lecz ojciec mój rozwinÄ…Å‚ tymczasem program tej wtórej demiurgii, obraz tej drugiej generacji stworzeÅ„, która stanąć miaÅ‚a w otwartej opozycji do panujÄ…cej -epoki.--Nie zależy nam--mówiÅ‚ on--na tworach o dÅ‚ugim oddechu, na +epoki. - Nie zależy nam - mówiÅ‚ on - na tworach o dÅ‚ugim oddechu, na istotach na dalekÄ… metÄ™. Nasze kreatury nie bÄ™dÄ… bohaterami romansów w -wielu tomach. Ich role bÄ™dÄ… krótkie, lapidarne, ich charaktery--bez +wielu tomach. Ich role bÄ™dÄ… krótkie, lapidarne, ich charaktery - bez dalszych planów. CzÄ™sto dla jednego gestu, dla jednego sÅ‚owa podejmiemy siÄ™ trudu powoÅ‚ania ich do życia na tÄ™ jednÄ… chwilÄ™. Przyznajemy otwarcie: nie bÄ™dziemy kÅ‚adli nacisku na trwaÅ‚ość ani solidność @@ -876,9 +876,9 @@ powoÅ‚amy do życia innego czÅ‚owieka. Taki jest nasz smak, to bÄ™dzie Å›wiat wedÅ‚ug naszego gustu. Demiurgos kochaÅ‚ siÄ™ w wytrawnych, doskonaÅ‚ych i skomplikowanych materiaÅ‚ach, my dajemy pierwszeÅ„stwo tandecie. Po prostu porywa nas, zachwyca taniość, lichota, tandetność materiaÅ‚u. Czy -rozumiecie--pytaÅ‚ mój ojciec--głęboki sens tej sÅ‚aboÅ›ci, tej pasji do +rozumiecie - pytaÅ‚ mój ojciec - głęboki sens tej sÅ‚aboÅ›ci, tej pasji do pstrej bibuÅ‚ki, do papier mâ ché , do lakowej farby, do kÅ‚aków i -trociny? To jest--mówiÅ‚ z bolesnym uÅ›miechem--nasza miÅ‚ość do materii +trociny? To jest - mówiÅ‚ z bolesnym uÅ›miechem - nasza miÅ‚ość do materii jako takiej, do jej puszystoÅ›ci i porowatoÅ›ci, do jej jedynej, mistycznej konsystencji. Demiurgos, ten wielki mistrz i artysta, czyni jÄ… niewidzialnÄ…, każe jej zniknąć pod grÄ… życia. My, przeciwnie, kochamy @@ -887,8 +887,8 @@ gestem, pod każdym ruchem widzieć jej ociężaÅ‚y wysiÅ‚ek, jej bezwÅ‚ad, jej sÅ‚odkÄ… niedźwiedziowatość. DziewczÄ™ta siedziaÅ‚y nieruchomo z szklanymi oczyma. Twarze ich byÅ‚y wyciÄ…gniÄ™te i zgÅ‚upiaÅ‚e zasÅ‚uchaniem, policzki podmalowane wypiekami, trudno byÅ‚o w tej chwili ocenić, czy należą do -pierwszej, czy do drugiej generacji stworzenia.--SÅ‚owem--konkludowaÅ‚ -mój ojciec--chcemy stworzyć po raz wtóry czÅ‚owieka, na obraz i +pierwszej, czy do drugiej generacji stworzenia. - SÅ‚owem - konkludowaÅ‚ +mój ojciec - chcemy stworzyć po raz wtóry czÅ‚owieka, na obraz i podobieÅ„stwo manekinu. Tu musimy dla wiernoÅ›ci sprawozdawczej opisać pewien drobny i bÅ‚ahy incydent, który zaszedÅ‚ w tym punkcie prelekcji i do którego nie przywiÄ…zujemy żadnej wagi. Incydent ten, caÅ‚kowicie @@ -907,11 +907,11 @@ po obu bokach. Wszystkie trzy patrzyÅ‚y rozszerzonymi oczami na ojca. Mój ojciec chrzÄ…knÄ…Å‚, zamilkÅ‚, pochyliÅ‚ siÄ™ i staÅ‚ siÄ™ nagle bardzo czerwony. W jednej chwili lineatura jego twarzy, dopiero co tak rozwichrzona i peÅ‚na wibracji, zamknęła siÄ™ na spokorniaÅ‚ych rysach. On -- herezjarcha natchniony, ledwo wypuszczony z wichru uniesienia--zÅ‚ożyÅ‚ +- herezjarcha natchniony, ledwo wypuszczony z wichru uniesienia - zÅ‚ożyÅ‚ siÄ™ nagle w sobie, zapadÅ‚ i zwinÄ…Å‚. A może wymieniono go na innego. Ten inny siedziaÅ‚ sztywny, bardzo czerwony, ze spuszczonymi oczyma. Panna Polda podeszÅ‚a i pochyliÅ‚a siÄ™ nad nim. KlepiÄ…c go lekko po plecach, -mówiÅ‚a tonem Å‚agodnej zachÄ™ty:--Jakub bÄ™dzie rozsÄ…dny, Jakub posÅ‚ucha, +mówiÅ‚a tonem Å‚agodnej zachÄ™ty: - Jakub bÄ™dzie rozsÄ…dny, Jakub posÅ‚ucha, Jakub nie bÄ™dzie uparty. No, proszÄ™... Jakub, Jakub... WypiÄ™ty pantofelek Adeli drżaÅ‚ lekko i bÅ‚yszczaÅ‚ jak jÄ™zyczek węża. Mój ojciec podniósÅ‚ siÄ™ powoli ze spuszczonymi oczyma, postÄ…piÅ‚ krok naprzód, jak @@ -924,8 +924,8 @@ odnowionÄ… swadÄ… ciemny i zawiÅ‚y swój temat. Lineatura jego zmarszczek rozwijaÅ‚a siÄ™ i zawijaÅ‚a z wyrafinowanÄ… chytroÅ›ciÄ…. W każdej spirali ukryty byÅ‚ pocisk ironii. Ale czasami inspiracja rozszerzaÅ‚a krÄ™gi jego zmarszczek, które rosÅ‚y jakÄ…Å› ogromnÄ… wirujÄ…cÄ… grozÄ…, uchodzÄ…c w -milczÄ…cych wolutach w głąb nocy zimowej.--Figury panopticum, moje panie -- zaczÄ…Å‚ on--kalwaryjskie parodie manekinów, ale nawet w tej postaci +milczÄ…cych wolutach w głąb nocy zimowej. - Figury panopticum, moje panie +- zaczÄ…Å‚ on - kalwaryjskie parodie manekinów, ale nawet w tej postaci strzeżcie siÄ™ lekko je traktować. Materia nie zna żartów. Jest ona zawsze peÅ‚na tragicznej powagi. Kto oÅ›miela siÄ™ myÅ›leć, że można igrać z materiÄ…, że ksztaÅ‚tować jÄ… można dla żartu, że żart nie wrasta w niÄ…, @@ -971,9 +971,9 @@ zażądaÅ‚a bardzo dobitnie... Panienki siedziaÅ‚y sztywno, ze spuszczonymi oczyma, w dziwnej drÄ™twoÅ›ci... TRAKTAT O MANEKINACH DokoÅ„czenie KtóregoÅ› z nastÄ™pnych wieczorów ojciec -mój w te sÅ‚owa ciÄ…gnÄ…Å‚ dalej swÄ… prelekcjÄ™:--Nie o tych +mój w te sÅ‚owa ciÄ…gnÄ…Å‚ dalej swÄ… prelekcjÄ™: - Nie o tych nieporozumieniach ucieleÅ›nionych, nie o tych smutnych parodiach, moje -panie, owocach prostackiej i wulgarnej niepowÅ›ciÄ…gliwoÅ›ci--chciaÅ‚em +panie, owocach prostackiej i wulgarnej niepowÅ›ciÄ…gliwoÅ›ci - chciaÅ‚em mówić zapowiadajÄ…c mÄ… rzecz o manekinach. MiaÅ‚em na myÅ›li coÅ› innego. Tu ojciec mój zaczÄ…Å‚ budować przed naszymi oczyma obraz tej wymarzonej przez niego „generaiio aequivocaâ€, jakiegoÅ› pokolenia istot na wpół @@ -984,8 +984,8 @@ myliÅ‚. ByÅ‚y to w istocie istoty amorfne, bez wewnÄ™trznej struktury, pÅ‚ody imitatywnej tendencji materii, która obdarzona pamiÄ™ciÄ…, powtarza z przyzwyczajenia raz przyjÄ™te ksztaÅ‚ty. Skala morfologii, której podlega materia, jest w ogóle ograniczona i pewien zasób form powtarza -siÄ™ wciąż na różnych kondygnacjach bytu. Istoty te--ruchliwe, wrażliwe -na bodźce, a jednak dalekie od prawdziwego życia--można byÅ‚o otrzymać +siÄ™ wciąż na różnych kondygnacjach bytu. Istoty te - ruchliwe, wrażliwe +na bodźce, a jednak dalekie od prawdziwego życia - można byÅ‚o otrzymać zawieszajÄ…c pewne skomplikowane koloidy w roztworach soli kuchennej. Koloidy te po kilku dniach formowaÅ‚y siÄ™, organizowaÅ‚y w pewne zagÄ™szczenia substancji przypominajÄ…cej niższe formy fauny. U istot tak @@ -995,8 +995,8 @@ biaÅ‚kowych ani w ogóle zwiÄ…zków wÄ™gla. Wszelako prymitywne te formy byÅ‚y niczym w porównaniu z bogactwem ksztaÅ‚tów i wspaniaÅ‚oÅ›ci pseudofauny i flory, która pojawia siÄ™ niekiedy w pewnych Å›ciÅ›le okreÅ›lonych Å›rodowiskach. Åšrodowiskami tymi sÄ… stare mieszkania, przesycone -emanacjami wielu żywotów i zdarzeÅ„--zużyte atmosfery, bogate w -specyficzne ingrediencje marzeÅ„ ludzkich--rumowiska, obfitujÄ…ce w humus +emanacjami wielu żywotów i zdarzeÅ„ - zużyte atmosfery, bogate w +specyficzne ingrediencje marzeÅ„ ludzkich - rumowiska, obfitujÄ…ce w humus wspomnieÅ„, tÄ™sknot, jaÅ‚owej nudy. Na takiej glebie owa pseudowegetacja kieÅ‚kowaÅ‚a szybko i powierzchownie, pasożytowaÅ‚a obficie i efemerycznie, pÄ™dziÅ‚a krótkotrwaÅ‚e generacje, które rozkwitaÅ‚y raptownie i Å›wietnie, @@ -1006,15 +1006,15 @@ kadencjach rytmów; nic dziwnego, że schodzÄ… na manowce dalekich, ryzykownych rojeÅ„. RdzeÅ„ mebli, ich substancja musi już być rozluźniona, zdegenerowana i podlegÅ‚a wystÄ™pnym pokusom: wtedy na tej chorej, zmÄ™czonej i zdziczaÅ‚ej glebie wykwita, jak piÄ™kna wysypka, nalot -fantastyczny, kolorowa, bujajÄ…ca pleśń.--WiedzÄ… panie--mówiÅ‚ ojciec -mój--że w starych mieszkaniach bywajÄ… pokoje, o których siÄ™ zapomina. +fantastyczny, kolorowa, bujajÄ…ca pleśń. - WiedzÄ… panie - mówiÅ‚ ojciec +mój - że w starych mieszkaniach bywajÄ… pokoje, o których siÄ™ zapomina. Nie odwiedzane miesiÄ…cami, wiÄ™dnÄ… w opuszczeniu miÄ™dzy starymi murami i zdarza siÄ™, że zasklepiajÄ… siÄ™ w sobie, zarastajÄ… cegłą i, raz na zawsze stracone dla naszej pamiÄ™ci, powoli tracÄ… też swÄ… egzystencjÄ™. Drzwi, prowadzÄ…ce do nich z jakiegoÅ› podestu tylnych schodów, mogÄ… być tak dhigo przeoczane przez domowników, aż wrastajÄ…, wchodzÄ… w Å›cianÄ™, która -zaciera ich Å›lad w fantastycznym rysunku pÄ™knięć i rys.--WszedÅ‚em raz-- -mówiÅ‚ ojciec mój--wczesnym rankiem na schyÅ‚ku zimy, po wielu miesiÄ…cach +zaciera ich Å›lad w fantastycznym rysunku pÄ™knięć i rys. - WszedÅ‚em raz - +mówiÅ‚ ojciec mój - wczesnym rankiem na schyÅ‚ku zimy, po wielu miesiÄ…cach nieobecnoÅ›ci, do takiego na wpół zapomnianego traktu i zdumiony byÅ‚em wyglÄ…dem tych pokojów. Z wszystkich szpar w podÅ‚odze, z wszystkich gzymsów i framug wystrzelaÅ‚y cienkie pÄ™dy i napeÅ‚niaÅ‚y szare powietrze @@ -1026,14 +1026,14 @@ fontanny koronkowego listowia, bijÄ…ce aż pod malowane niebo sufitu rozpylonym chlorofilem. W przyspieszonym procesie kwitnienia kieÅ‚kowaÅ‚y w tym listowiu ogromne, biaÅ‚e i różowe kwiaty, pÄ…czkowaÅ‚y w oczach, bujaÅ‚y od Å›rodka różowym miąższem i przelewaÅ‚y siÄ™ przez brzegi, gubiÄ…c -pÅ‚atki i rozpadajÄ…c siÄ™ w prÄ™dkim przekwitaniu.--ByÅ‚em szczęśliwy-- -mówiÅ‚ mój ojciec--z tego niespodzianego rozkwitu, który napeÅ‚niÅ‚ +pÅ‚atki i rozpadajÄ…c siÄ™ w prÄ™dkim przekwitaniu. - ByÅ‚em szczęśliwy - +mówiÅ‚ mój ojciec - z tego niespodzianego rozkwitu, który napeÅ‚niÅ‚ powietrze migotliwym szelestem, Å‚agodnym szumem, przesypujÄ…cym siÄ™ jak kolorowe confetti przez cienkie rózgi gałązek. WidziaÅ‚em, jak z drgania powietrza, z fermentacji zbyt bogatej aury wydziela siÄ™ i materializuje to pospieszne kwitnienie, przelewanie siÄ™ i rozpadanie fantastycznych oleandrów, które napeÅ‚niÅ‚y pokój rzadkÄ…, leniwÄ… Å›nieżycÄ… wielkich, -różowych kiÅ›ci kwietnych.--Nim zapadÅ‚ wieczór--koÅ„czyÅ‚ ojciec--nie +różowych kiÅ›ci kwietnych. - Nim zapadÅ‚ wieczór - koÅ„czyÅ‚ ojciec - nie byÅ‚o już Å›ladu tego Å›wietnego rozkwitu. CaÅ‚a zÅ‚udna ta fatamorgana byÅ‚a tylko mistyfikacjÄ…, wypadkiem dziwnej symulacji materii, która podszywa siÄ™ pod pozór życia. Ojciec mój byÅ‚ dnia tego dziwnie ożywiony, @@ -1043,8 +1043,8 @@ odcieni, jakie przybieraÅ‚a wieloksztaÅ‚tna materia. FascynowaÅ‚y go formy graniczne, wÄ…tpliwe i problematyczne, jak ektoplazma somnambulików, pseudomateria, emanacja kataleptyczna mózgu, która w pewnych wypadkach rozrastaÅ‚a siÄ™ z ust uÅ›pionego na caÅ‚y stół, napeÅ‚niaÅ‚a caÅ‚y pokój, jako -bujajÄ…ca, rzadka tkanka, astralne ciasto, na pograniczu ciaÅ‚a i ducha.-- -Kto wie--mówiÅ‚--ile jest cierpiÄ…cych, okaleczonych, fragmentarycznych +bujajÄ…ca, rzadka tkanka, astralne ciasto, na pograniczu ciaÅ‚a i ducha. - +Kto wie - mówiÅ‚ - ile jest cierpiÄ…cych, okaleczonych, fragmentarycznych postaci życia, jak sztucznie sklecone, gwoździami na gwaÅ‚t zbite życie szaf i stołów, ukrzyżowanego drzewa, cichych mÄ™czenników okrutnej pomysÅ‚owoÅ›ci ludzkiej. Straszliwe transplantacje obcych i nienawidzÄ…cych @@ -1056,9 +1056,9 @@ gdy to mówiÅ‚, rozeszÅ‚a siÄ™ zamyÅ›lonÄ… lineaturÄ… zmarszczek, staÅ‚a siÄ™ podobna do sÄ™ków i sÅ‚ojów starej deski, z której zheblowano wszystkie wspomnienia. Przez chwilÄ™ myÅ›leliÅ›my, że ojciec popadnie w stan drÄ™twoty, który nawiedzaÅ‚ go czasem, ale ocknÄ…Å‚ siÄ™ nagle, opamiÄ™taÅ‚ i -tak ciÄ…gnÄ…Å‚ dalej:--Dawne, mistyczne plemiona balsamowaÅ‚y swych +tak ciÄ…gnÄ…Å‚ dalej: - Dawne, mistyczne plemiona balsamowaÅ‚y swych umarÅ‚ych. W Å›ciany ich mieszkaÅ„ byÅ‚y wprawione, wmurowane ciaÅ‚a, twarze: -w salonie staÅ‚ ojciec--wypchany, wygarbowana żona-nieboszczka byÅ‚a +w salonie staÅ‚ ojciec - wypchany, wygarbowana żona-nieboszczka byÅ‚a dywanem pod stoÅ‚em. ZnaÅ‚em pewnego kapitana, który miaÅ‚ w swej kajucie lampÄ™-meluzynÄ™, zrobionÄ… przez malajskich balsamistów z jego zamordowanej kochanki. Na gÅ‚owie miaÅ‚a ogromne rogi jelenie. W ciszy @@ -1068,8 +1068,8 @@ pÄ™kajÄ…ca od cichego szeptu. GÅ‚owonogi, żółwie i ogromne kraby, zawieszone na belkach sufitu jako kandelabry i pajÄ…ki, przebieraÅ‚y w tej ciszy bez koÅ„ca nogami, szÅ‚y i szÅ‚y na miejscu... Twarz mojego ojca przybraÅ‚a naraz wyraz troski i smutku, gdy myÅ›li jego na drogach nie -wiedzieć jakich asocjacji przeszÅ‚y do nowych przykÅ‚adów:--Czy mam -przemilczeć--mówiÅ‚ przyciszonym gÅ‚osem--że brat mój na skutek dÅ‚ugiej +wiedzieć jakich asocjacji przeszÅ‚y do nowych przykÅ‚adów: - Czy mam +przemilczeć - mówiÅ‚ przyciszonym gÅ‚osem - że brat mój na skutek dÅ‚ugiej i nieuleczalnej choroby zamieniÅ‚ siÄ™ stopniowo w zwój kiszek gumowych, że biedna moja kuzynka dniem i nocÄ… nosiÅ‚a go w poduszkach, nucÄ…c nieszczęśliwemu stworzeniu nieskoÅ„czone koÅ‚ysanki nocy zimowych? Czy @@ -1077,8 +1077,8 @@ może być coÅ› smutniejszego niż czÅ‚owiek zamieniony w kiszkÄ™ hegarowÄ…? Co za rozczarowanie dla rodziców, co za dezorientacja dla ich uczuć, co za rozwianie wszystkich nadziei, wiÄ…zanych z obiecujÄ…cym mÅ‚odzieÅ„cem! A jednak wierna miÅ‚ość biednej kuzynki towarzyszyÅ‚a mu i w tej przemianie. -- Ach! nie mogÄ™ już dÅ‚użej, nie mogÄ™ tego sÅ‚uchać!--jÄ™knęła Polda -przechylajÄ…c siÄ™ na krzeÅ›le.--Ucisz go, Adelo... DziewczÄ™ta wstaÅ‚y, +- Ach! nie mogÄ™ już dÅ‚użej, nie mogÄ™ tego sÅ‚uchać! - jÄ™knęła Polda +przechylajÄ…c siÄ™ na krzeÅ›le. - Ucisz go, Adelo... DziewczÄ™ta wstaÅ‚y, Adela podeszÅ‚a do ojca i wyciÄ…gniÄ™tym palcem uczyniÅ‚a ruch zaznaczajÄ…cy Å‚askotanie. Ojciec stropiÅ‚ siÄ™, zamilkÅ‚ i zaczÄ…Å‚, peÅ‚en przerażenia, cofać siÄ™ tyÅ‚em przed kiwajÄ…cym siÄ™ palcem Adeli. Ta szÅ‚a za nim ciÄ…gle, @@ -1095,9 +1095,9 @@ pierwszego wejrzenia zdobyÅ‚a sobie ta kruszynka życia caÅ‚y zachwyt, caÅ‚y entuzjazm chÅ‚opiÄ™cej duszy. Z jakiego nieba spadÅ‚ tak niespodzianie ten ulubieniec bogów, milszy sercu od najpiÄ™kniejszych zabawek? Å»e też stare, zgoÅ‚a nieinteresujÄ…ce pomywaczki wpadajÄ… niekiedy na tak Å›wietne -pomysÅ‚y i przynoszÄ… z przedmieÅ›cia--o caÅ‚kiem wczesnej, -transcendentalnej porannej godzinie--takiego oto pieska do naszej -kuchni! Ach! byÅ‚o siÄ™ jeszcze--niestety--nieobecnym, nieurodzonym z +pomysÅ‚y i przynoszÄ… z przedmieÅ›cia - o caÅ‚kiem wczesnej, +transcendentalnej porannej godzinie - takiego oto pieska do naszej +kuchni! Ach! byÅ‚o siÄ™ jeszcze - niestety - nieobecnym, nieurodzonym z ciemnego Å‚ona snu, a już to szczęście ziÅ›ciÅ‚o siÄ™, już czekaÅ‚o na nas, niedołężnie leżące na chÅ‚odnej podÅ‚odze kuchni, nie docenione przez AdelÄ™ i domowników. Dlaczego nie obudzono mnie wczeÅ›niej! Talerzyk mleka @@ -1131,16 +1131,16 @@ mordkÄ™ z kroplÄ… mleka na brodzie i wycofać siÄ™ niedołężnie z kÄ…pieli mlecznej. Chód jego byÅ‚ niezgrabnym toczeniem siÄ™, bokiem na ukos w niezdecydowanym kierunku, po linii trochÄ™ pijanej i chwiejnej. DominantÄ… jego nastroju byÅ‚a jakaÅ› nieokreÅ›lona i zasadnicza żaÅ‚ość, sieroctwo i -bezradność--niezdolność do zapeÅ‚nienia czymÅ› pustki życia pomiÄ™dzy +bezradność - niezdolność do zapeÅ‚nienia czymÅ› pustki życia pomiÄ™dzy sensacjami posiÅ‚ków. ObjawiaÅ‚o siÄ™ to bezplanowoÅ›ciÄ… i niekonsekwencjÄ… ruchów, irracjonalnymi napadami nostalgii z żaÅ‚osnym skomleniem i niemożnoÅ›ciÄ… znalezienia sobie miejsca. Nawet jeszcze w głębi snu, w którym potrzebÄ™ oparcia siÄ™ i przytulenia zaspokajać musiaÅ‚ używajÄ…c do -tego wÅ‚asnej swej osoby, zwiniÄ™tej w kłębek drżący--towarzyszyÅ‚o mu -poczucie osamotnienia i bezdomnoÅ›ci. Ach, życie--mÅ‚ode i wÄ…tÅ‚e życie, +tego wÅ‚asnej swej osoby, zwiniÄ™tej w kłębek drżący - towarzyszyÅ‚o mu +poczucie osamotnienia i bezdomnoÅ›ci. Ach, życie - mÅ‚ode i wÄ…tÅ‚e życie, wypuszczone z zaufanej ciemnoÅ›ci, z przytulnego ciepÅ‚a Å‚ona macierzystego w wielki i obcy, Å›wietlany Å›wiat, jakże kurczy siÄ™ ono i -cofa, jak wzdraga siÄ™ zaakceptować tÄ™ imprezÄ™, którÄ… mu proponujÄ…-- +cofa, jak wzdraga siÄ™ zaakceptować tÄ™ imprezÄ™, którÄ… mu proponujÄ… - peÅ‚ne awersji i zniechÄ™cenia! Lecz zwolna maÅ‚y Nemrod (otrzymaÅ‚ byÅ‚ to dumne i wojownicze imiÄ™) zaczyna smakować w życiu. Wyłączne opanowanie obrazem macierzystej prajedni ustÄ™puje urokowi wieloÅ›ci. Åšwiat zaczyna @@ -1149,23 +1149,23 @@ czworobok porannego sÅ‚oÅ„ca na podÅ‚odze, na którym tak dobrze jest poÅ‚ożyć siÄ™, ruchy wÅ‚asnych czÅ‚onków, wÅ‚asne Å‚apki, ogonek, figlarnie wyzywajÄ…cy do zabawy z samym sobÄ…, pieszczoty rÄ™ki ludzkiej, pod którymi zwolna dojrzewa pewna swawolność, wesoÅ‚ość rozpierajÄ…ca ciaÅ‚o i rodzÄ…ca -potrzebÄ™ zgoÅ‚a nowych, gwaÅ‚townych i ryzykownych ruchów--wszystko to +potrzebÄ™ zgoÅ‚a nowych, gwaÅ‚townych i ryzykownych ruchów - wszystko to przekupuje, przekonywa i zachÄ™ca do przyjÄ™cia, do pogodzenia siÄ™ z eksperymentem życia. I jeszcze jedno. Nemrod zaczyna rozumieć, że to, co mu siÄ™ tu podsuwa, mimo pozorów nowoÅ›ci jest w gruncie rzeczy czymÅ›, co -już byÅ‚o--byÅ‚o wiele razy--nieskoÅ„czenie wiele razy. Jego ciaÅ‚o +już byÅ‚o - byÅ‚o wiele razy - nieskoÅ„czenie wiele razy. Jego ciaÅ‚o poznaje sytuacje, wrażenia i przedmioty. W gruncie rzeczy to wszystko nie dziwi go zbytnio. W obliczu każdej nowej sytuacji daje nura w swojÄ… -pamięć, w głębokÄ… pamięć ciaÅ‚a, i szuka omackiem, gorÄ…czkowo--i bywa, +pamięć, w głębokÄ… pamięć ciaÅ‚a, i szuka omackiem, gorÄ…czkowo - i bywa, że znajduje w sobie odpowiedniÄ… reakcjÄ™ już gotowÄ…: mÄ…drość pokoleÅ„, zÅ‚ożonÄ… w jego plazmie, w jego nerwach. Znajduje jakieÅ› czyny, decyzje, o których sam nie wiedziaÅ‚, że już w nim dojrzaÅ‚y, że czekaÅ‚y na to, by wyskoczyć. Sceneria jego mÅ‚odego życia, kuchnia z wonnymi cebrami, ze Å›cierkami o skomplikowanej i intrygujÄ…cej woni, z kÅ‚apaniem pantofli -Adeli, z jej haÅ‚aÅ›liwym krzÄ…taniem siÄ™--nie straszy go wiÄ™cej. PrzywykÅ‚ +Adeli, z jej haÅ‚aÅ›liwym krzÄ…taniem siÄ™ - nie straszy go wiÄ™cej. PrzywykÅ‚ uważać jÄ… za swojÄ… domenÄ™, zadomowiÅ‚ siÄ™ w niej i poczÄ…Å‚ rozwijać w stosunku do niej niejasne poczucie przynależnoÅ›ci, ojczyzny. Chyba że -niespodzianie spadaÅ‚ naÅ„ kataklizm w postaci szorowania podÅ‚ogi-- +niespodzianie spadaÅ‚ naÅ„ kataklizm w postaci szorowania podÅ‚ogi - obalenie praw natury, chlusty ciepÅ‚ego Å‚ugu, podmywajÄ…ce wszystkie meble, i groźny szurgot szczotek Adeli. Ale niebezpieczeÅ„stwo mija, szczotka uspokojona i nieruchoma leży cicho w kÄ…cie, schnÄ…ca podÅ‚oga @@ -1191,13 +1191,13 @@ odwiecznym karakonim rytuaÅ‚em. Wszelako uczucia nienawiÅ›ci nie majÄ… jeszcze trwaÅ‚oÅ›ci i mocy w duszy pieska. Nowoobudzona radość życia przeistacza każde uczucie w wesoÅ‚ość. Nemrod szczeka jeszcze, lecz sens tego szczekania zmieniÅ‚ siÄ™ niepostrzeżenie, staÅ‚o siÄ™ ono swojÄ… wÅ‚asnÄ… -parodiÄ…--pragnÄ…c w gruncie rzeczy wysÅ‚owić niewymownÄ… udatność tej +parodiÄ… - pragnÄ…c w gruncie rzeczy wysÅ‚owić niewymownÄ… udatność tej Å›wietnej imprezy życia, peÅ‚nej pikanterii, niespodzianych dreszczyków i point. PAN W kÄ…cie miÄ™dzy tylnymi Å›cianami szop i przybudówek byÅ‚ zauÅ‚ek podwórza, najdalsza, ostatnia odnoga, zamkniÄ™ta miÄ™dzy komorÄ™, wychodek -i tylnÄ… Å›cianÄ™ kurnika--gÅ‚ucha zatoka, poza którÄ… nie byÅ‚o już wyjÅ›cia. +i tylnÄ… Å›cianÄ™ kurnika - gÅ‚ucha zatoka, poza którÄ… nie byÅ‚o już wyjÅ›cia. ByÅ‚ to najdalszy przylÄ…dek, Gibraltar tego podwórza, bijÄ…cy rozpaczliwie gÅ‚owÄ… w Å›lepy parkan z poziomych desek, zamykajÄ…cÄ… i ostatecznÄ… Å›cianÄ™ tego Å›wiata. Spod jego omszonych dyli wyciekaÅ‚a strużka czarnej, @@ -1241,7 +1241,7 @@ chwastem wszelkim, aż w samym koÅ„cu miÄ™dzy Å›cianami, w szerokiej prostokÄ…tnej zatoce traciÅ‚ wszelkÄ… miarÄ™ i wpadaÅ‚ w szaÅ‚. Tam to nie byÅ‚ już sad, tylko paroksyzm szaleÅ„stwa, wybuch wÅ›ciekÅ‚oÅ›ci, cyniczny bezwstyd i rozpusta. Tam, rozbestwione, dajÄ…c upust swej pasji, -panoszyÅ‚y siÄ™ puste, zdziczaÅ‚e kapusty Å‚opuchów--ogromne wiedźmy, +panoszyÅ‚y siÄ™ puste, zdziczaÅ‚e kapusty Å‚opuchów - ogromne wiedźmy, rozdziewajÄ…ce siÄ™ w biaÅ‚y dzieÅ„ ze swych szerokich spódnic, zrzucajÄ…c je z siebie, spódnica za spódnicÄ…, aż ich wzdÄ™te, szelestne, dziurawe Å‚achmany oszalaÅ‚ymi pÅ‚atami grzebaÅ‚y pod sobÄ… kłótliwe to plemiÄ™ @@ -1258,13 +1258,13 @@ w obłęd. O tej godzinie opanowywaÅ‚ mnie szaÅ‚ Å‚owienia motyli, pasja Å›cigania tych migocÄ…cych plamek, tych błędnych, biaÅ‚ych pÅ‚atków, trzÄ™sÄ…cych siÄ™ w rozognionym powietrzu niedołężnym gzygzakiem. I zdarzyÅ‚o siÄ™ wówczas, że któraÅ› z tych jaskrawych plamek rozpadÅ‚a siÄ™ w -locie na dwie, potem na trzy--i ten drgajÄ…cy, oÅ›lepiajÄ…co biaÅ‚y +locie na dwie, potem na trzy - i ten drgajÄ…cy, oÅ›lepiajÄ…co biaÅ‚y trójpunkt wiódÅ‚ mnie, jak błędny ognik, przez szaÅ‚ bodiaków, palÄ…cych siÄ™ w sÅ‚oÅ„cu. Dopiero na granicy Å‚opuchów zatrzymaÅ‚em siÄ™, nie Å›miejÄ…c siÄ™ pogrążyć w to gÅ‚uche zapadlisko. Wtedy nagle ujrzaÅ‚em go. Zanurzony po pachy w Å‚opuchach, kucaÅ‚ przede mnÄ…. WidziaÅ‚em jego grube bary w brudnej koszuli i niechlujny strzÄ™p surduta. Przyczajony jak do skoku, -siedziaÅ‚ tak--z barami jakby wielkim ciężarem zgarbionymi. CiaÅ‚o jego +siedziaÅ‚ tak - z barami jakby wielkim ciężarem zgarbionymi. CiaÅ‚o jego dyszaÅ‚o z natężenia, a z miedzianej, bÅ‚yszczÄ…cej w sÅ‚oÅ„cu twarzy laÅ‚ siÄ™ pot. Nieruchomy, zdawaÅ‚ siÄ™ ciężko pracować, mocować siÄ™ bez ruchu z jakimÅ› ogromnym brzemieniem. StaÅ‚em, przygwożdżony jego wzrokiem, który @@ -1283,7 +1283,7 @@ wybaczaÅ‚ siÄ™ coraz bardziej, aż wyÅ‚amaÅ‚ siÄ™ ryczÄ…cym, charczÄ…cym kaszlem Å›miechu. Do głębi wstrzÄ…Å›niÄ™ty, widziaÅ‚em, jak huczÄ…c Å›miechem z potężnych piersi, dźwignÄ…Å‚ siÄ™ powoli z kucek i zgarbiony jak goryl, z rÄ™koma w opadajÄ…cych Å‚achmanach spodni, uciekaÅ‚, czÅ‚apiÄ…c przez Å‚opocÄ…ce -blachy Å‚opuchów, wielkimi skokami--Pan bez fletu, cofajÄ…cy siÄ™ w +blachy Å‚opuchów, wielkimi skokami - Pan bez fletu, cofajÄ…cy siÄ™ w popÅ‚ochu do swych ojczystych kniei. PAN KAROL Po poÅ‚udniu w sobotÄ™ mój wuj, Karol, wdowiec sÅ‚omiany, @@ -1305,17 +1305,17 @@ siÄ™ o szarym Å›wicie zdyszany, oblany potem, wyrzucony na brzeg tego stosu poÅ›cieli, którego zmóc nie mógÅ‚ w ciężkich zapasach nocnych. Tak na wpół wyrzucony z toni snu, wisiaÅ‚ przez chwilÄ™ nieprzytomny na krawÄ™dzi nocy, chwytajÄ…c piersiami powietrze, a poÅ›ciel rosÅ‚a dokoÅ‚a -niego, puchÅ‚a i nakisaÅ‚a--i zarastaÅ‚a go znowu zwaÅ‚em ciężkiego, +niego, puchÅ‚a i nakisaÅ‚a - i zarastaÅ‚a go znowu zwaÅ‚em ciężkiego, biaÅ‚awego ciasta. SpaÅ‚ tak do późnego przedpoÅ‚udnia, podczas gdy poduszki ukÅ‚adaÅ‚y siÄ™ w wielkÄ…, białą, pÅ‚askÄ… równinÄ™, po której wÄ™drowaÅ‚ uspokojony sen jego. Tymi biaÅ‚ymi goÅ›ciÅ„cami powracaÅ‚ powoli do -siebie, do dnia, do jawy--i wreszcie otwieraÅ‚ oczy, jak Å›piÄ…cy pasażer, +siebie, do dnia, do jawy - i wreszcie otwieraÅ‚ oczy, jak Å›piÄ…cy pasażer, gdy pociÄ…g zatrzymuje siÄ™ na stacji. W pokoju panowaÅ‚ odstaÅ‚y półmrok z osadem wielu dni samotnoÅ›ci i ciszy. Tylko okno kipiaÅ‚o od rannego rojowiska much i story pÅ‚onęły jaskrawo. Pan Karol wyziewaÅ‚ ze swego ciaÅ‚a, z głębi jam cielesnych, resztki dnia wczorajszego. To ziewanie chwytaÅ‚o go tak konwulsyjnie, jak gdyby chciaÅ‚o go odwrócić na nice. Tak -wyrzucaÅ‚ z siebie ten piasek, te ciężary--nie strawione restancje dnia +wyrzucaÅ‚ z siebie ten piasek, te ciężary - nie strawione restancje dnia wczorajszego. Ulżywszy sobie w ten sposób, i swobodniejszy, wciÄ…gaÅ‚ do notesu wydatki, kalkulowaÅ‚, obliczaÅ‚ i marzyÅ‚. Potem leżaÅ‚ dÅ‚ugo nieruchomy, z szklanymi oczyma, które byÅ‚y koloru wody, wypukÅ‚e i @@ -1346,7 +1346,7 @@ otumanieni z tych zatraconych dali powracaÅ‚ znów do siebie i do chwili; widziaÅ‚ swe stopy na dywanie, tÅ‚uste i delikatne jak u kobiety, i powoli wyjmowaÅ‚ zÅ‚ote spinki z mankietów dziennej koszuli. Potem szedÅ‚ do kuchni i znajdowaÅ‚ tam w cienistym kÄ…cie wiaderko z wodÄ…, krążek -cichego, czujnego zwierciadÅ‚a, które naÅ„ tam czekaÅ‚o--jedyna żywa i +cichego, czujnego zwierciadÅ‚a, które naÅ„ tam czekaÅ‚o - jedyna żywa i wiedzÄ…ca istota w tym pustym mieszkaniu. NalewaÅ‚ do miednicy wody i kosztowaÅ‚ skórÄ… jej mÅ‚odej i odstaÅ‚ej, sÅ‚odkawej mokroÅ›ci. DÅ‚ugo i starannie robiÅ‚ toaletÄ™, nie spieszÄ…c siÄ™ i włączajÄ…c pauzy miÄ™dzy @@ -1362,19 +1362,19 @@ toaletÄ™ wÅ›ród tych mebli, które tolerowaÅ‚y go w milczeniu, z nieobecnÄ… minÄ…, i wreszcie byÅ‚ gotów, to stojÄ…c na odejÅ›ciu z kapeluszem w rÄ™ku, czuÅ‚ siÄ™ zażenowany, że i w ostatniej chwili nie mógÅ‚ znaleźć sÅ‚owa, które by rozwiÄ…zaÅ‚o to wrogie milczenie, i odchodziÅ‚ ku drzwiom -zrezygnowany, zwolna, ze spuszczonÄ… gÅ‚owÄ…--gdy w przeciwnÄ… stronÄ™ -oddalaÅ‚ siÄ™ tymczasem bez poÅ›piechu--w głąb zwierciadÅ‚a--ktoÅ› -odwrócony na zawsze plecami--przez pustÄ… amfiladÄ™ pokojów, które nie +zrezygnowany, zwolna, ze spuszczonÄ… gÅ‚owÄ… - gdy w przeciwnÄ… stronÄ™ +oddalaÅ‚ siÄ™ tymczasem bez poÅ›piechu - w głąb zwierciadÅ‚a - ktoÅ› +odwrócony na zawsze plecami - przez pustÄ… amfiladÄ™ pokojów, które nie istniaÅ‚y. SKLEPY CYNAMONOWE W okresie najkrótszych, sennych dni zimowych, ujÄ™tych z obu stron, od poranku i od wieczora, w futrzane krawÄ™dzie zmierzchów, gdy miasto rozgałęziaÅ‚o siÄ™ coraz głębiej w labirynty zimowych nocy, z -trudem przywoÅ‚ywane przez krótki Å›wit do opamiÄ™tania, do powrotu-- +trudem przywoÅ‚ywane przez krótki Å›wit do opamiÄ™tania, do powrotu - ojciec mój byÅ‚ już zatracony, zaprzedany, zaprzysiężony tamtej sferze. Twarz jego i gÅ‚owa zarastaÅ‚y wówczas bujnie i dziko siwym wÅ‚osem, sterczÄ…cym nieregularnie wiechciami, szczecinami, dÅ‚ugimi pÄ™dzlami, -strzelajÄ…cymi z brodawek, z brwi, z dziurek od nosa--co nadawaÅ‚o jego +strzelajÄ…cymi z brodawek, z brwi, z dziurek od nosa - co nadawaÅ‚o jego fizjonomii wyglÄ…d starego, nastroszonego lisa. WÄ™ch jego i sÅ‚uch zaostrzaÅ‚ siÄ™ niepomiernie i znać byÅ‚o po grze jego milczÄ…cej i napiÄ™tej twarzy, że za poÅ›rednictwem tych zmysłów pozostaje on w ciÄ…gÅ‚ym @@ -1470,7 +1470,7 @@ spuszczonymi oczyma, w dyskretnym milczeniu, i peÅ‚ni byli mÄ…droÅ›ci i wyrozumienia dla ich najtajniejszych życzeÅ„. Ale nade wszystko byÅ‚a tam jedna ksiÄ™garnia, w której raz oglÄ…daÅ‚em rzadkie i zakazane druki, publikacje tajnych klubów, zdejmujÄ…c zasÅ‚onÄ™ z tajemnic drÄ™czÄ…cych i -upojnych. Tak rzadko zdarzaÅ‚a siÄ™ sposobność odwiedzania tych sklepów-- +upojnych. Tak rzadko zdarzaÅ‚a siÄ™ sposobność odwiedzania tych sklepów - i w dodatku z małą, lecz wystarczajÄ…cÄ… sumÄ… pieniÄ™dzy w kieszeni. Nie można byÅ‚o pominąć tej okazji mimo ważnoÅ›ci misji powierzonej naszej gorliwoÅ›ci. Trzeba siÄ™ byÅ‚o zapuÅ›cić wedÅ‚ug mego obliczenia w bocznÄ… @@ -1484,7 +1484,7 @@ konfiguracja ulic nie odpowiadaÅ‚a oczekiwanemu obrazowi. Sklepów ani Å›ladu. SzedÅ‚em ulicÄ…, której domy nie miaÅ‚y nigdzie bramy wchodowej, tylko okna szczelnie zamkniÄ™te, Å›lepe odblaskiem księżyca. Po drugiej stronie tych domów musi prowadzić wÅ‚aÅ›ciwa ulica, od której te domy sÄ… -dostÄ™pne--myÅ›laÅ‚em sobie. Z niepokojem przyspieszaÅ‚em kroku, rezygnujÄ…c +dostÄ™pne - myÅ›laÅ‚em sobie. Z niepokojem przyspieszaÅ‚em kroku, rezygnujÄ…c w duchu z myÅ›li zwiedzenia sklepów. Byle tylko wydostać siÄ™ stÄ…d prÄ™dko w znane okolice miasta. ZbliżaÅ‚em siÄ™ do wylotu, peÅ‚en niepokoju, gdzie też ona mnie wyprowadzi. WyszedÅ‚em na szeroki, rzadko zabudowany @@ -1494,7 +1494,7 @@ ozdobne budynki bogaczy. W przerwach miÄ™dzy nimi widniaÅ‚y parki i mury sadów. Obraz przypominaÅ‚ z daleka ulicÄ™ LeszniaÅ„skÄ… w jej dolnych i rzadko zwiedzanych okolicach. ÅšwiatÅ‚o księżyca, rozpuszczone w tysiÄ…cznych barankach, w Å‚uskach srebrnych na niebie, byÅ‚o blade i tak -jasne jak w dzieÅ„--tylko parki i ogrody czerniaÅ‚y w tym srebrnym +jasne jak w dzieÅ„ - tylko parki i ogrody czerniaÅ‚y w tym srebrnym krajobrazie. Przyjrzawszy siÄ™ bacznie jednemu z budynków, doszedÅ‚em do przekonania, że mam przed sobÄ… tylnÄ… i nigdy nie widzianÄ… stronÄ™ gmachu gimnazjalnego. WÅ‚aÅ›nie dochodziÅ‚em do bramy, która ku memu zdziwieniu @@ -1513,7 +1513,7 @@ stawiaÅ‚ zbyt Å›cisÅ‚ych wymagaÅ„. Niektórzy przynosili sobie z domu poduszki i ukÅ‚adali siÄ™ na Å‚awkach do powierzchownej drzemki. I tylko najpilniejsi rysowali pod samÄ… Å›wiecÄ…, w zÅ‚otym krÄ™gu jej blasku. CzekaliÅ›my zazwyczaj dÅ‚ugo na przyjÅ›cie profesora, nudzÄ…c siÄ™ wÅ›ród -sennych rozmów. Wreszcie otwieraÅ‚y siÄ™ drzwi jego pokoju i wchodziÅ‚-- +sennych rozmów. Wreszcie otwieraÅ‚y siÄ™ drzwi jego pokoju i wchodziÅ‚ - maÅ‚y, z piÄ™knÄ… brodÄ…, peÅ‚en ezoterycznych uÅ›miechów, dyskretnych przemilczeÅ„ i aromatu tajemnicy. Szybko zaciskaÅ‚ za sobÄ… drzwi gabinetu, przez które w momencie otworzenia tÅ‚oczyÅ‚a siÄ™ za jego gÅ‚owÄ… ciżba @@ -1521,7 +1521,7 @@ gipsowych cieni, fragmentów klasycznych, bolesnych Niobid, Danaid i Tantalidów, caÅ‚y smutny i jaÅ‚owy Olimp, wiÄ™dnÄ…cy od lat w tym muzeum gipsów. Zmierzch tego pokoju mÄ™tniaÅ‚ i za dnia i przelewaÅ‚ siÄ™ sennie od gipsowych marzeÅ„, pustych spojrzeÅ„, blednÄ…cych owali i zamyÅ›leÅ„ -odchodzÄ…cych w nicość. LubiliÅ›my nieraz podsÅ‚uchiwać pod drzwiami-- +odchodzÄ…cych w nicość. LubiliÅ›my nieraz podsÅ‚uchiwać pod drzwiami - ciszy, peÅ‚nej westchnieÅ„ i szeptów tego kruszejÄ…cego w pajÄ™czynach rumowiska, tego rozkÅ‚adajÄ…cego siÄ™ w nudzie i monotonii zmierzchu bogów. Profesor przechadzaÅ‚ siÄ™ dostojnie, peÅ‚en namaszczenia, wzdÅ‚uż pustych @@ -1587,7 +1587,7 @@ bijÄ…cym sercem, gotów do ucieczki za najlżejszym szmerem. Jakże mógÅ‚bym, przyÅ‚apany, usprawiedliwić to moje nocne szpiegowanie, moje zuchwaÅ‚e wÅ›cibstwo? W którymÅ› z głębokich pluszowych foteli mogÅ‚a, nie dostrzeżona i cicha, siedzieć córeczka dyrektora i podnieść nagle na -mnie oczy znad książki--czarne, sybiliÅ„skie, spokojne oczy, których +mnie oczy znad książki - czarne, sybiliÅ„skie, spokojne oczy, których spojrzenia nikt z nas wytrzymać nie umiaÅ‚. Ale cofnąć siÄ™ w poÅ‚owie drogi, nie dokonawszy powziÄ™tego planu, poczytaÅ‚bym byÅ‚ sobie za tchórzostwo. ZresztÄ… głęboka cisza panowaÅ‚a dookoÅ‚a w peÅ‚nych przepychu @@ -1611,7 +1611,7 @@ jeszcze nieskoÅ„czonÄ… drogÄ™ i, zatopiony w swych zawiÅ‚ych procederach niebieskich, nie myÅ›laÅ‚ o Å›wicie. Na ulicy czerniaÅ‚o kilka dorożek, rozjechanych i rozklekotanych jak kalekie, drzemiÄ…ce kraby czy karakony. Woźnica nachyliÅ‚ siÄ™ z wysokiego kozÅ‚a. MiaÅ‚ twarz drobnÄ…, czerwonÄ… i -dobrodusznÄ….--Pojedziemy, paniczu?--zapytaÅ‚. Powóz zadygotaÅ‚ we +dobrodusznÄ…. - Pojedziemy, paniczu? - zapytaÅ‚. Powóz zadygotaÅ‚ we wszystkich stawach i przegubach swego wieloczÅ‚onkowego ciaÅ‚a i ruszyÅ‚ na lekkich obrÄ™czach. Ale kto w takÄ… noc powierza siÄ™ kaprysom nieobliczalnego dorożkarza? WÅ›ród klekotu szprych, wÅ›ród dudnienia pudÅ‚a @@ -1622,8 +1622,8 @@ kiwajÄ…c naÅ„ przyjaźnie rÄ™kami. OdpowiedziaÅ‚ im coÅ› radoÅ›nie, po czym nie zatrzymujÄ…c pojazdu, rzuciÅ‚ mi lejce na kolana, spuÅ›ciÅ‚ siÄ™ z kozÅ‚a i przyłączyÅ‚ do gromady kolegów. KoÅ„, stary mÄ…dry koÅ„ dorożkarski, oglÄ…dnÄ…Å‚ siÄ™ pobieżnie i pojechaÅ‚ dalej jednostajnym, dorożkarskim -kÅ‚usem. WÅ‚aÅ›ciwie koÅ„ ten budziÅ‚ zaufanie--wydawaÅ‚ siÄ™ mÄ…drzejszy od -woźnicy. Ale powozić nie umiaÅ‚em--trzeba siÄ™ byÅ‚o zdać na jego wolÄ™. +kÅ‚usem. WÅ‚aÅ›ciwie koÅ„ ten budziÅ‚ zaufanie - wydawaÅ‚ siÄ™ mÄ…drzejszy od +woźnicy. Ale powozić nie umiaÅ‚em - trzeba siÄ™ byÅ‚o zdać na jego wolÄ™. WjechaliÅ›my na podmiejskÄ… ulicÄ™ ujÄ™tÄ… z obu stron w ogrody. Ogrody te przechodziÅ‚y zwolna, w miarÄ™ posuwania siÄ™, w parki wielkodrzewne, a te w lasy. Nie zapomnÄ™ nigdy tej jazdy Å›wietlistej w najjaÅ›niejszÄ… noc @@ -1647,8 +1647,8 @@ zbieraÅ‚ siÄ™ waÅ‚ biaÅ‚ej piany Å›nieżnej, coraz wyższy i wyższy. Z trudem przekopywaÅ‚ siÄ™ koÅ„ przez czystÄ… i Å›wieżą jego masÄ™. Wreszcie ustaÅ‚. WyszedÅ‚em z dorożki. DyszaÅ‚ ciężko ze zwieszonÄ… gÅ‚owÄ…. PrzytuliÅ‚em jego Å‚eb do piersi, w jego wielkich czarnych oczach lÅ›niÅ‚y Å‚zy. Wtedy -ujrzaÅ‚em na jego brzuchu okrÄ…głą czarnÄ… ranÄ™.---Dlaczego mi nie -powiedziaÅ‚eÅ›?--szepnÄ…Å‚em ze Å‚zami.--Drogi mój--to dla ciebie--rzekÅ‚ +ujrzaÅ‚em na jego brzuchu okrÄ…głą czarnÄ… ranÄ™. - -Dlaczego mi nie +powiedziaÅ‚eÅ›? - szepnÄ…Å‚em ze Å‚zami. - Drogi mój - to dla ciebie - rzekÅ‚ i staÅ‚ siÄ™ bardzo maÅ‚y, jak konik z drzewa. OpuÅ›ciÅ‚em go. CzuÅ‚em siÄ™ dziwnie lekki i szczęśliwy. ZastanawiaÅ‚em siÄ™, czy czekać na małą kolejkÄ™ lokalnÄ…, która tu zajeżdżaÅ‚a, czy też pieszo wrócić do miasta. @@ -1741,7 +1741,7 @@ intymnoÅ›ci, brudnego zmieszania. Dzielnica ta byÅ‚a eldoradem takich dezerterów moralnych, takich zbiegów spod sztandaru godnoÅ›ci wÅ‚asnej. Wszystko zdawaÅ‚o siÄ™ tam podejrzane i dwuznaczne, wszystko zapraszaÅ‚o sekretnym mrugniÄ™ciem, cynicznie artykuÅ‚owanym gestem, wyraźnie -przymrużonym perskim okiem--do nieczystych nadziei, wszystko wyzwalaÅ‚o +przymrużonym perskim okiem - do nieczystych nadziei, wszystko wyzwalaÅ‚o z pÄ™t niskÄ… naturÄ™. MaÅ‚o kto, nie uprzedzony, spostrzegaÅ‚ dziwnÄ… osobliwość tej dzielnicy: brak barw, jak gdyby w tym tandetnym, w poÅ›piechu wyrosÅ‚ym mieÅ›cie nie można byÅ‚o sobie pozwolić na luksus @@ -1753,11 +1753,11 @@ rubrykach komercjalnych ogÅ‚oszeÅ„, wÅ›ród których zagnieździÅ‚y siÄ™ pasożytniczo podejrzane anonse, drażliwe notatki, wÄ…tpliwe ilustracje; i wÄ™drówki te byÅ‚y równie jaÅ‚owe i bez rezultatu jak ekscytacje fantazji, pÄ™dzonej przez szpalty i kolumny pornograficznych druków. WchodziÅ‚o siÄ™ -do jakiegoÅ› krawca, żeby zamówić ubranie--ubranie o taniej elegancji, +do jakiegoÅ› krawca, żeby zamówić ubranie - ubranie o taniej elegancji, tak charakterystycznej dla tej dzielnicy. Lokal byÅ‚ wielki i pusty, bardzo wysoki i bezbarwny. Ogromne wielopiÄ™trowe półki wznoszÄ… siÄ™ jedne nad drugimi w nie okreÅ›lonÄ… wysokość tej hali. Kondygnacje pustych półek -wyprowadzajÄ… wzrok w górÄ™ aż pod sufit, który może być niebem--lichym, +wyprowadzajÄ… wzrok w górÄ™ aż pod sufit, który może być niebem - lichym, bezbarwnym, odrapanym niebem tej dzielnicy. Natomiast dalsze magazyny, które widać przez otwarte drzwi, peÅ‚ne sÄ… aż pod sufit pudeÅ‚ i kartonów, piÄ™trzÄ…cych siÄ™ ogromnÄ… kartotekÄ…, która rozpada siÄ™ w górze, pod @@ -1888,7 +1888,7 @@ pertraktacje z przekupnymi urzÄ™dnikami linii żelaznej. Zanim te negocjacje siÄ™ koÅ„czÄ…, pociÄ…g rusza, odprowadzany przez wolno sunÄ…cy, rozczarowany tÅ‚um, który odprowadza go daleko, ażeby siÄ™ wreszcie rozproszyć. Ulica, zacieÅ›niona na chwilÄ™ do tego zaimprowizowanego -dworca, peÅ‚nego zmierzchu i tchnienia dalekich dróg--rozwidnia siÄ™ +dworca, peÅ‚nego zmierzchu i tchnienia dalekich dróg - rozwidnia siÄ™ znowu, rozszerza i przepuszcza znów swym korytem beztroski monotonny tÅ‚um spacerowiczów, który wÄ™druje wÅ›ród gwaru rozmów wzdÅ‚uż wystaw sklepowych, tych brudnych, szarych czworoboków, peÅ‚nych tandetnych @@ -1899,14 +1899,14 @@ drapieżnym, posuwistym krokiem i majÄ… w niedobrych, zepsutych twarzach nieznacznÄ… skazÄ™, która je przekreÅ›la: zezujÄ… czarnym, krzywym zezem lub majÄ… usta rozdarte, lub brak im koniuszka nosa. MieszkaÅ„cy miasta dumni sÄ… z tego odoru zepsucia, którym tchnie Ulica Krokodyli. Nie mamy -potrzeby niczego sobie odmawiać--myÅ›lÄ… z dumÄ…--stać nas i na prawdziwÄ… +potrzeby niczego sobie odmawiać - myÅ›lÄ… z dumÄ… - stać nas i na prawdziwÄ… wielkomiejskÄ… rozpustÄ™. TwierdzÄ… oni, że każda kobieta w tej dzielnicy -jest kokotÄ…. W istocie wystarczy zwrócić uwagÄ™ na którÄ…Å›--a natychmiast +jest kokotÄ…. W istocie wystarczy zwrócić uwagÄ™ na którÄ…Å› - a natychmiast spotyka siÄ™ to uporczywe, lepkie spojrzenie, które nas zmraża rozkosznÄ… pewnoÅ›ciÄ…. Nawet dziewczÄ™ta szkolne noszÄ… tu w pewien charakterystyczny sposób kokardy, stawiajÄ… swoistÄ… manierÄ… smukÅ‚e nogi i majÄ… tÄ™ nieczystÄ… skazÄ™ w spojrzeniu, w której leży preformowane przyszÅ‚e zepsucie. A -jednak--a jednak czy mamy zdradzić ostatniÄ… tajemnicÄ™ tej dzielnicy, +jednak - a jednak czy mamy zdradzić ostatniÄ… tajemnicÄ™ tej dzielnicy, troskliwie ukrywany sekret Ulicy Krokodyli? Kilkakrotnie w trakcie naszego sprawozdania stawialiÅ›my pewne znaki ostrzegawcze, dawaliÅ›my w delikatny sposób wyraz naszym zastrzeżeniom. Uważny czytelnik nie bÄ™dzie @@ -1919,7 +1919,7 @@ giÄ™tkość. Powiedzmy bez ogródek: fatalnoÅ›ciÄ… tej dzielnicy jest, że nic w niej nie dochodzi do skutku, nic nie odbiega od swego definitivum, wszystkie ruchy rozpoczÄ™te zawisajÄ… w powietrzu, wszystkie gesty wyczerpujÄ… siÄ™ przedwczeÅ›nie i nie mogÄ… przekroczyć pewnego martwego -punktu. MogliÅ›my już zauważyć wielkÄ… bujność i rozrzutność--w +punktu. MogliÅ›my już zauważyć wielkÄ… bujność i rozrzutność - w intencjach, w projektach i antycypacjach, która cechuje tÄ™ dzielnicÄ™. CaÅ‚a ona nie jest niczym innym jak fermentacjÄ… pragnieÅ„, przedwczeÅ›nie wybujałą i dlatego bezsilnÄ… i pustÄ…. W atmosferze nadmiernej Å‚atwoÅ›ci @@ -1973,11 +1973,11 @@ pierze, które Adela raz w tygodniu wymiataÅ‚a wraz z bezimiennym kurzem pokoju. W wyÅ‚ysiaÅ‚ych miejscach widać byÅ‚o workowe, grube płótno, z którego wyÅ‚aziÅ‚y kÅ‚aki konopne. MiaÅ‚em ukryty żal do matki za Å‚atwość, z jakÄ… przeszÅ‚a do porzÄ…dku dziennego nad stratÄ… ojca. Nigdy go nie -kochaÅ‚a--myÅ›laÅ‚em--a ponieważ ojciec nie byÅ‚ zakorzeniony w sercu +kochaÅ‚a - myÅ›laÅ‚em - a ponieważ ojciec nie byÅ‚ zakorzeniony w sercu żadnej kobiety, przeto nie mógÅ‚ też wróść w żadnÄ… realność i unosiÅ‚ siÄ™ wiecznie na peryferii życia, w półrealnych regionach, na krawÄ™dziach -rzeczywistosci. Nawet na uczciwÄ… obywatelskÄ… Å›mierć nie zasÅ‚użyÅ‚ sobie-- -myÅ›laÅ‚em--wszystko u niego musiaÅ‚o, być dziwaczne i wÄ…tpliwe. +rzeczywistosci. Nawet na uczciwÄ… obywatelskÄ… Å›mierć nie zasÅ‚użyÅ‚ sobie - +myÅ›laÅ‚em - wszystko u niego musiaÅ‚o, być dziwaczne i wÄ…tpliwe. PostanowiÅ‚em w stosownej chwili zaskoczyć matkÄ™ otwartÄ… rozmowÄ…. Owego dnia (byÅ‚ ciężki dzieÅ„ zimowy i od rana już sypaÅ‚ siÄ™ miÄ™kki puch zmierzchu) matka miaÅ‚a migrenÄ™ i leżaÅ‚a na sofie samotnie w salonie. W @@ -1998,21 +1998,21 @@ nie mogÅ‚y siÄ™ powstrzymać, robiÅ‚y perskie oczko, dawaÅ‚y sobie znaki, mówiÅ‚y niemym, kolorowym alfabetem, peÅ‚nym sekretnych znaczeÅ„. IrytowaÅ‚o mnie to szydercze porozumienie, ta migotliwa zmowa poza mymi plecami. Z kolanami przyciÅ›niÄ™tymi do sofy matki, badajÄ…c dwoma palcami, jakby w -zamyÅ›leniu, delikatnÄ… materiÄ™ jej szlafroka, rzekÅ‚em niby mimochodem:-- -ChciaÅ‚em ciÄ™ już od dawna zapytać: prawda, że to jest on?--I chociaż +zamyÅ›leniu, delikatnÄ… materiÄ™ jej szlafroka, rzekÅ‚em niby mimochodem: - +ChciaÅ‚em ciÄ™ już od dawna zapytać: prawda, że to jest on? - I chociaż nie wskazaÅ‚em nawet spojrzeniem na kondora, matka odgadÅ‚a od razu, zmieszaÅ‚a siÄ™ bardzo i spuÅ›ciÅ‚a oczy. DaÅ‚em umyÅ›lnie upÅ‚ynąć chwili, żeby wykosztować jej zmieszanie, po czym z caÅ‚ym spokojem, opanowujÄ…c -wzbierajÄ…cy gniew, spytaÅ‚em:--Jaki sens majÄ… w takim razie te wszystkie +wzbierajÄ…cy gniew, spytaÅ‚em: - Jaki sens majÄ… w takim razie te wszystkie plotki i kÅ‚amstwa, które rozsiewasz o ojcu? Lecz jej rysy, które w pierwszej chwili rozpadÅ‚y siÄ™ byÅ‚y w panice, zaczęły siÄ™ znowu -porzÄ…dkować.--Jakie kÅ‚amstwa?--spytaÅ‚a mrugajÄ…c oczyma, które byÅ‚y -puste, nalane ciemnym błękitem, bez biaÅ‚ka.--Znam je od Adeli--rzekÅ‚em +porzÄ…dkować. - Jakie kÅ‚amstwa? - spytaÅ‚a mrugajÄ…c oczyma, które byÅ‚y +puste, nalane ciemnym błękitem, bez biaÅ‚ka. - Znam je od Adeli - rzekÅ‚em - ale wiem, że pochodzÄ… od ciebie; chcÄ™ wiedzieć prawdÄ™. Usta jej drżaÅ‚y -lekko, źrenice, unikajÄ…c mego wzroku, powÄ™drowaÅ‚y w kÄ…t oka.--Nie -kÅ‚amaÅ‚am--rzekÅ‚a, a usta- jej napÄ™czniaÅ‚y i staÅ‚y siÄ™ maÅ‚e zarazem. -UczuÅ‚em, że mnie kokietuje jak kobieta mężczyznÄ™.--Z tymi karakonami to -prawda--sam przecież pamiÄ™tasz...--ZmieszaÅ‚em siÄ™. PamiÄ™taÅ‚em w +lekko, źrenice, unikajÄ…c mego wzroku, powÄ™drowaÅ‚y w kÄ…t oka. - Nie +kÅ‚amaÅ‚am - rzekÅ‚a, a usta- jej napÄ™czniaÅ‚y i staÅ‚y siÄ™ maÅ‚e zarazem. +UczuÅ‚em, że mnie kokietuje jak kobieta mężczyznÄ™. - Z tymi karakonami to +prawda - sam przecież pamiÄ™tasz... - ZmieszaÅ‚em siÄ™. PamiÄ™taÅ‚em w istocie tÄ™ inwazjÄ™ karakonów, ten zalew czarnego rojowiska, które napeÅ‚niaÅ‚o ciemność nocnÄ…, pajÄ™czÄ… bieganinÄ…. Wszystkie szpary peÅ‚ne byÅ‚y drgajÄ…cych wÄ…sów, każda szczelina mogÅ‚a wystrzelić z nagÅ‚a @@ -2052,18 +2052,18 @@ opÄ™tany fascynacjÄ… awersji, która go wciÄ…gaÅ‚a w głąb swych zawiÅ‚ych dróg. Mój ojciec poruszaÅ‚ siÄ™ wieloczÅ‚onkowym, skomplikowanym ruchem dziwnego rytuaÅ‚u, w którym ze zgrozÄ… poznaÅ‚em imitacjÄ™ ceremoniaÅ‚u karakoniego. Od tego czasu wyrzekliÅ›my siÄ™ ojca. PodobieÅ„stwo do -karakona wystÄ™powaÅ‚o z dniem każdym wyraźniej--mój ojciec zamieniaÅ‚ siÄ™ +karakona wystÄ™powaÅ‚o z dniem każdym wyraźniej - mój ojciec zamieniaÅ‚ siÄ™ w karakona. ZaczÄ™liÅ›my siÄ™ przyzwyczajać do tego. WidywaliÅ›my go coraz -rzadziej, caÅ‚ymi tygodniami znikaÅ‚ gdzieÅ› na swych karakonich drogach-- +rzadziej, caÅ‚ymi tygodniami znikaÅ‚ gdzieÅ› na swych karakonich drogach - przestaliÅ›my go odróżniać, zlaÅ‚ siÄ™ w zupeÅ‚noÅ›ci z tym czarnym niesamowitym plemieniem. Kto mógÅ‚ powiedzieć, czy żyÅ‚ gdzieÅ› jeszcze w jakiejÅ› szparze podÅ‚ogi, czy przebiegaÅ‚ nocami pokoje, zaplÄ…tany w afery karakonie, czy też byÅ‚ może miÄ™dzy tymi martwymi owadami, które Adela co rana znaj-dowaÅ‚a brzuchem do góry leżące i najeżone nogami i które ze -wstrÄ™tem braÅ‚a na Å›mietniczkÄ™ i wyrzucaÅ‚a?--A jednak--powiedziaÅ‚em -zdetonowany--jestem pewny, że ten kondor to on.--Matka spojrzaÅ‚a na -mnie spod rzÄ™s:--Nie drÄ™cz mnie, drogi--mówiÅ‚am ci już przecież, że -ojciec podróżuje jako komiwojażer po kraju--przecież wiesz, że czasem w +wstrÄ™tem braÅ‚a na Å›mietniczkÄ™ i wyrzucaÅ‚a? - A jednak - powiedziaÅ‚em +zdetonowany - jestem pewny, że ten kondor to on. - Matka spojrzaÅ‚a na +mnie spod rzÄ™s: - Nie drÄ™cz mnie, drogi - mówiÅ‚am ci już przecież, że +ojciec podróżuje jako komiwojażer po kraju - przecież wiesz, że czasem w nocy przyjeżdża do domu, ażeby przed Å›witem jeszcze dalej odjechać. WICHURA Tej dÅ‚ugiej i pustej zimy obrodziÅ‚a ciemność w naszym mieÅ›cie @@ -2094,9 +2094,9 @@ doklęły swego. PrzywoÅ‚ane rechotem naczyÅ„, rozplotkowanym od brzegu do brzegu, nadeszÅ‚y wreszcie karawany, nadciÄ…gnęły potężne tabory wichru i stanęły nad nocÄ…. Ogromne obozowisko, czarny ruchomy amfiteatr zstÄ™pować zaczÄ…Å‚ w potężnych krÄ™gach ku miastu. I wybuchÅ‚a ciemność ogromnÄ… -wzburzonÄ… wichurÄ… i szalaÅ‚a przez trzy dni i trzy noce...--Nie -pójdziesz dziÅ› do szkoÅ‚y--rzekÅ‚a rano matka--jest straszna wichura na -dworze.--W pokoju unosiÅ‚ siÄ™ delikatny welon dymu, pachnÄ…cy żywicÄ…. Piec +wzburzonÄ… wichurÄ… i szalaÅ‚a przez trzy dni i trzy noce... - Nie +pójdziesz dziÅ› do szkoÅ‚y - rzekÅ‚a rano matka - jest straszna wichura na +dworze. - W pokoju unosiÅ‚ siÄ™ delikatny welon dymu, pachnÄ…cy żywicÄ…. Piec wyÅ‚ i gwizdaÅ‚, jak gdyby uwiÄ…zana w nim byÅ‚a caÅ‚a sfora psów czy demonów. Wielki bohomaz, wymalowany na jego pÄ™katym brzuchu, wykrzywiaÅ‚ siÄ™ kolorowym grymasem i fantastyczniaÅ‚ wzdÄ™tymi policzkami. PobiegÅ‚em @@ -2141,8 +2141,8 @@ Pokój drżaÅ‚ z lekka, obrazy na Å›cianach brzÄ™czaÅ‚y. Szyby lÅ›niÅ‚y siÄ™ tÅ‚ustym odblaskiem lampy. Firanki na oknie wisiaÅ‚y wzdÄ™te i peÅ‚ne tchnienia tej burzliwej nocy. PrzypomnieliÅ›my sobie, że ojca od rana nie widziano. Wczesnym rankiem, domyÅ›laliÅ›my siÄ™, musiaÅ‚ udać siÄ™ do sklepu, -gdzie go zaskóczyÅ‚a wichura, odcinajÄ…c mu powrót.--CaÅ‚y dzieÅ„ nic nie -jadÅ‚--biadaÅ‚a matka. Starszy subiekt Teodor podjÄ…Å‚ siÄ™ wyprawić w noc i +gdzie go zaskóczyÅ‚a wichura, odcinajÄ…c mu powrót. - CaÅ‚y dzieÅ„ nic nie +jadÅ‚ - biadaÅ‚a matka. Starszy subiekt Teodor podjÄ…Å‚ siÄ™ wyprawić w noc i wichurÄ™, żeby zanieść mu posiÅ‚ek. Brat mój przyłączyÅ‚ siÄ™ do wyprawy. Okutani w wielkie niedźwiedzie futra, obciążyli kieszenie żelazkami i moździerzami, balastem, który miaÅ‚ zapobiec porwaniu ich przez wichurÄ™. @@ -2227,7 +2227,7 @@ grymasy, podnosiÅ‚ wysoko brwi i Å›miaÅ‚ siÄ™ do siebie. NOC WIELKIEGO SEZONU Każdy wie, że w szeregu zwykÅ‚ych, normalnych lat rodzi niekiedy zdziwaczaÅ‚y czas ze swego Å‚ona lata inne, lata osobliwe, -lata wyrodne, którym--jak szósty, maÅ‚y palec u rÄ™ki--wyrasta kÄ™dyÅ› +lata wyrodne, którym - jak szósty, maÅ‚y palec u rÄ™ki - wyrasta kÄ™dyÅ› trzynasty, faÅ‚szywy miesiÄ…c. Mówimy faÅ‚szywy, gdyż rzadko dochodzi on do peÅ‚nego rozwoju. Jak dzieci późno spÅ‚odzone, pozostaje on w tyle ze wzrostem, miesiÄ…c garbusek, odroÅ›l w poÅ‚owie uwiÄ™dÅ‚a i raczej domyÅ›lna @@ -2235,7 +2235,7 @@ niż rzeczywista. Winna jest temu starcza niepowÅ›ciÄ…gliwość lata, jego rozpustna i późna żywotność. Bywa czasem, że sierpieÅ„ minie, a stary gruby pieÅ„ lata rodzi z przyzwyczajenia jeszcze dalej, pÄ™dzi ze swego próchna te dni-dziczki, dni-chwasty, jaÅ‚owe i idiotyczne, dorzuca na -dokÅ‚adkÄ™, za darmo, dni-kaczany, puste i niejadalne--dni biaÅ‚e, +dokÅ‚adkÄ™, za darmo, dni-kaczany, puste i niejadalne - dni biaÅ‚e, zdziwione i niepotrzebne. WyrastajÄ… one, nieregularne i nierówne, nie wyksztaÅ‚cone i zroÅ›niÄ™te z sobÄ…, jak palce potworkowatej rÄ™ki, pÄ…czkujÄ…ce i zwiniÄ™te w figÄ™. Inni porównywajÄ… te dni do apokryfów, @@ -2316,7 +2316,7 @@ jaskrawo w wielkie, gulgocÄ…ce, rozpluskane naroÅ›le albo wykogucić siÄ™ w gÅ‚upiÄ… koguciÄ… maskÄ™, czerwonÄ… i piejÄ…cÄ…, w kolorowe jesienne maszkary fantastyczne i absurdalne. ZdawaÅ‚o siÄ™, że tak nadÄ™te i piejÄ…ce wzniosÄ… siÄ™ w powietrze dÅ‚ugimi kolorowymi Å‚aÅ„cuchami i jak jesienne klucze -ptaków przeciÄ…gać bÄ™dÄ… nad miastem--fantastyczne flotylle z bibuÅ‚ki i +ptaków przeciÄ…gać bÄ™dÄ… nad miastem - fantastyczne flotylle z bibuÅ‚ki i pogody jesiennej. Albo woziÅ‚y siÄ™ wÅ›ród krzyków na maÅ‚ych zgieÅ‚kliwych wózkach, grajÄ…cych kolorowym turkotem kółek, szprych i dyszli. Wózki zjeżdżaÅ‚y naÅ‚adowane ich krzykiem i staczaÅ‚y siÄ™ w dół ulicy aż do nisko @@ -2339,9 +2339,9 @@ cichej zamieszce, w panice prÄ™dkiego rozkÅ‚adu, w górze utrzymywaÅ‚ siÄ™ i rósÅ‚ coraz wyżej milczÄ…cy alarm zorzy, drgajÄ…cy Å›wiergotem miliona cichych dzwonków, wzbierajÄ…cych wzlotem miliona cichych skowronków lecÄ…cych razem w jednÄ… wielkÄ…, srebrnÄ… nieskoÅ„czoność. Potem byÅ‚a już -nagle noc--wielka noc, rosnÄ…ca jeszcze podmuchami wiatru, które jÄ… +nagle noc - wielka noc, rosnÄ…ca jeszcze podmuchami wiatru, które jÄ… rozszerzaÅ‚y. W jej wielokrotnym labiryncie wyÅ‚upane byÅ‚y gniazda jasne: -sklepy--wielkie, kolorowe latarnie, peÅ‚ne spiÄ™trzonego towaru i zgieÅ‚ku +sklepy - wielkie, kolorowe latarnie, peÅ‚ne spiÄ™trzonego towaru i zgieÅ‚ku kupujÄ…cych. Przez jasne szyby tych latani można byÅ‚o Å›ledzić zgieÅ‚kliwy i peÅ‚en dziwacznego ceremoniaÅ‚u obrzÄ™d zakupów jesiennych. Ta wielka, faÅ‚dzista noc jesienna, rosnÄ…ca cieniami, roszerzona wiatrami, kryÅ‚a w @@ -2353,12 +2353,12 @@ tandety, zÅ‚oconych bÅ‚ahostek, cynfolii, trÄ…bek, andrutów i kolorowych miÄ™tówek, byÅ‚y stacjami lekkomyÅ›lnoÅ›ci, grzechotkami beztroski, rozsianymi na wiszarach ogromnej, labiryntowej, rozÅ‚opotanej wiatrami nocy. Wielkie i ciemne tÅ‚umy pÅ‚ynęły w ciemnoÅ›ci, w haÅ‚aÅ›liwym -zmieszaniu, w szurgocie tysiÄ™cy nóg, w gwarze tysiÄ™cy ust--rojna, +zmieszaniu, w szurgocie tysiÄ™cy nóg, w gwarze tysiÄ™cy ust - rojna, splÄ…tana wÄ™drówka, ciÄ…gnÄ…ca arteriami jesiennego miasta. Tak pÅ‚ynęła ta rzeka, peÅ‚na gwaru, ciemnych spojrzeÅ„, chytrych Å‚ypnięć, pokawaÅ‚kowana rozmowÄ…, posiekana gawÄ™dÄ…, wielka miazga plotek, Å›miechów i zgieÅ‚ku. ZdawaÅ‚o siÄ™, że to ruszyÅ‚y tÅ‚umami jesienne, suche makówki sypiÄ…ce -makiem--gÅ‚owygrzechotki, ludzie-koÅ‚atki. Mój ojciec chodziÅ‚ +makiem - gÅ‚owygrzechotki, ludzie-koÅ‚atki. Mój ojciec chodziÅ‚ zdenerwowany i kolorowy od wypieków, z bÅ‚yszczÄ…cymi oczyma, w jasno oÅ›wietlonym sklepie, i nasÅ‚uchiwaÅ‚. Przez szyby wystawy i portalu dochodziÅ‚ tu z daleka szum miasta, stÅ‚umiony gwar pÅ‚ynÄ…cej ciżby. Nad @@ -2407,7 +2407,7 @@ ojciec mój jednym skokiem wspiÄ…Å‚ siÄ™ na półki z suknem i, uwisÅ‚y wysoko nad tÅ‚umem, dÄ…Å‚ z caÅ‚ej siÅ‚y w wielki puzon z rogu i trÄ…biÅ‚ na alarm. Ale sklepienie nie napeÅ‚niÅ‚o siÄ™ szumem aniołów, Å›pieszÄ…cych na pomoc, a zamiast tego każdemu jÄ™kowi trÄ…by odpowiadaÅ‚ wielki, rozeÅ›miany chór -tÅ‚umu.--Jakubie, handlować! Jakubie, sprzedawać!--woÅ‚ali wszyscy, a +tÅ‚umu. - Jakubie, handlować! Jakubie, sprzedawać! - woÅ‚ali wszyscy, a woÅ‚anie to, wciąż powtarzane, rytmizowaÅ‚o siÄ™ w chórze i przechodziÅ‚o powoli w melodiÄ™ refrenu, Å›piewanÄ… przez wszystkie gardÅ‚a. Wtedy mój ojciec daÅ‚ za wygranÄ…, zeskoczyÅ‚ z wysokiego gzymsu i ruszyÅ‚ z krzykiem @@ -2460,7 +2460,7 @@ byÅ‚ bÅ‚ysk uÅ›miechniÄ™tej ironii. WÅ›ród tych grup przewijaÅ‚ siÄ™ pospolity lud, bezpostaciowy tÅ‚um, gawiedź bez twarzy i indywidualnoÅ›ci. WypeÅ‚niaÅ‚ on niejako luki w krajobrazie, wyÅ›cielaÅ‚ tÅ‚o dzwonkami i grzechotkami bezmyÅ›lnego gadania. ByÅ‚ to element bÅ‚azeÅ„ski, roztaÅ„czony tÅ‚um -poliszynelów i arlekinów, który--sam bez poważnych intencyj handlowych +poliszynelów i arlekinów, który - sam bez poważnych intencyj handlowych - doprowadzaÅ‚ do absurdu gdzieniegdzie nawiÄ…zujÄ…ce siÄ™ tansakcje swymi bÅ‚azeÅ„skimi figlami. Stopniowo jednak, znudzony bÅ‚aznowaniem, wesoÅ‚y ten ludek rozpraszaÅ‚ siÄ™ w dalszych okolicach krajobrazu i tam powoli gubiÅ‚ @@ -2475,7 +2475,7 @@ ciemne ich sylwety zaludniaÅ‚y całą tÄ™ pustynnÄ… wyżynÄ™, nad którÄ… zwisÅ‚ ciężkie i ciemne niebo, sfaÅ‚dowane i chmurne, poorane w dÅ‚ugie równolegÅ‚e bruzdy, w srebrne i biaÅ‚e skiby, ukazujÄ…ce w głębi coraz dalsze pokÅ‚ady swego uwarstwienia. ÅšwiatÅ‚o lampy stwarzaÅ‚o sztuczny -dzieÅ„ w owej krainie--dzieÅ„ dziwny, dzieÅ„ bez Å›witu i wieczoru. Ojciec +dzieÅ„ w owej krainie - dzieÅ„ dziwny, dzieÅ„ bez Å›witu i wieczoru. Ojciec mój uspokajaÅ‚ siÄ™ powoli. Gniew jego ukÅ‚adaÅ‚ siÄ™ i zastygaÅ‚ w pokÅ‚adach i warstwach krajobrazu. SiedziaÅ‚ teraz na galeriach wysokich półek i patrzyÅ‚ w jesienniejÄ…cy, rozlegÅ‚y kraj. WidziaÅ‚, jak na dalekich @@ -2536,7 +2536,7 @@ wachlarzami, w które niepojÄ™tym sposobem tchniÄ™to jakiÅ› pozór życia. WidziaÅ‚em smutny powrót mego ojca. Sztuczny dzieÅ„ zabarwiaÅ‚ siÄ™ już powoli kolorami zwyczajnego poranka. W spustoszaÅ‚ym sklepie najwyższe półki syciÅ‚y siÄ™ barwami rannego nieba. WÅ›ród fragmentów zgasÅ‚ego -pejzażu, wÅ›ród zburzonych kulis nocnej scenerii--ojciec widziaÅ‚ +pejzażu, wÅ›ród zburzonych kulis nocnej scenerii - ojciec widziaÅ‚ wstajÄ…cych ze snu subiektów. Podnosili siÄ™ spomiÄ™dzy bali sukna i ziewali do sÅ‚oÅ„ca. W kuchni, na piÄ™trze, Adela, ciepÅ‚a od snu i ze zmierzwionymi wÅ‚osami, mełła kawÄ™ na mÅ‚ynku, przyciskajÄ…c go do biaÅ‚ej @@ -2552,7 +2552,7 @@ EOT; Corrected EDITIONS of our eBooks get a new NUMBER, sklep11.txt VERSIONS based on separate sources get new LETTER, sklep10a.txt - Produced by Pawel Sobkowiak--Scanned and proofread by + Produced by Pawel Sobkowiak - Scanned and proofread by Polska Biblioteka Internetowa Project Gutenberg eBooks are often created from several printed diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Address.php index 2f3593f5..68b6df07 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Address.php @@ -24,6 +24,12 @@ class Address extends \Faker\Provider\Address 'MG', 'PA', 'PB', 'PR', 'PE', 'PI', 'RJ', 'RN', 'RS', 'RO', 'RR', 'SC', 'SP', 'SE', 'TO' ); + protected static $region = array( + 'Centro-Oeste', 'Nordeste', 'Norte', 'Sudeste', 'Sul' + ); + protected static $regionAbbr = array( + 'CO', 'N', 'NE', 'SE', 'S' + ); protected static $country = array( 'Afeganistão', 'Ãfrica do Sul', 'Albânia', 'Alemanha', 'Andorra', 'Angola', 'Antigua e Barbuda', 'Arabia Saudita', 'Argélia', @@ -129,4 +135,20 @@ class Address extends \Faker\Provider\Address { return static::randomElement(static::$stateAbbr); } + + /** + * @example 'Nordeste' + */ + public static function region() + { + return static::randomElement(static::$region); + } + + /** + * @example 'NE' + */ + public static function regionAbbr() + { + return static::randomElement(static::$regionAbbr); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Company.php index 79592aeb..74f3567f 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Company.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Company.php @@ -10,11 +10,11 @@ class Company extends \Faker\Provider\Company '{{lastName}} {{companySuffix}}', '{{lastName}}-{{lastName}}', '{{lastName}} e {{lastName}}', - '{{lastName}} de {{lastName}}', - '{{lastName}}, {{lastName}} e {{lastName}}' + '{{lastName}} e {{lastName}} {{companySuffix}}', + '{{lastName}} Comercial Ltda.' ); - protected static $companySuffix = array('e Filho', 'e Filha', 'e Filhos', 'e Associados', 'e Flia.', 'SRL', 'SA', 'S. de H.'); + protected static $companySuffix = array('e Filhos', 'e Associados', 'Ltda.', 'S.A.'); /** * A random CNPJ number. diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Payment.php index 51b909fb..1a525613 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Payment.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Payment.php @@ -4,6 +4,59 @@ namespace Faker\Provider\pt_BR; class Payment extends \Faker\Provider\Payment { + protected static $cardVendors = array( + 'Visa', 'Visa', 'Visa', 'Visa', 'Visa', + 'MasterCard', 'MasterCard', 'MasterCard', 'MasterCard', 'MasterCard', + 'American Express', 'Discover Card', 'Diners', 'Elo', 'Hipercard' + ); + + // see https://gist.github.com/erikhenrique/5931368 / http://pt.stackoverflow.com/q/3715/26461 + protected static $cardParams = array( + 'Visa' => array( + "4##############" + ), + 'MasterCard' => array( + "5##############" + ), + 'American Express' => array( + "34############", + "37############" + ), + 'Discover Card' => array( + "6011###########", + "622############", + "64#############", + "65#############" + ), + 'Diners' => array( + "301############", + "301##########", + "305############", + "305##########", + "36#############", + "36###########", + "38#############", + "38###########", + ), + 'Elo' => array( + "636368#########", + "438935#########", + "504175#########", + "451416#########", + "636297#########", + "5067###########", + "4576###########", + "4011###########", + ), + 'Hipercard' => array( + "38#############", + "60#############", + ), + "Aura" => array( + "50#############" + ) + ); + /** * International Bank Account Number (IBAN) * @link http://en.wikipedia.org/wiki/International_Bank_Account_Number @@ -16,4 +69,78 @@ class Payment extends \Faker\Provider\Payment { return static::iban($countryCode, $prefix, $length); } + + + /** + * @see list of Brazilians banks (2018-02-15), source: https://pt.wikipedia.org/wiki/Lista_de_bancos_do_Brasil + */ + protected static $banks = array( + 'BADESUL Desenvolvimento S.A. – Agência de Fomento/RS', + 'Banco Central do Brasil', + 'Banco da Amazônia', + 'Banco de Brasília', + 'Banco de Desenvolvimento de Minas Gerais', + 'Banco de Desenvolvimento do Espírito Santo', + 'Banco de Desenvolvimento do Paraná', + 'Banco do Brasil', + 'Banco do Estado de Sergipe Banese Estadual', + 'Banco do Estado do Espírito Santo Banestes', + 'Banco do Estado do Pará', + 'Banco do Estado do Rio Grande do Sul', + 'Banco do Nordeste do Brasil', + 'Banco Nacional de Desenvolvimento Econômico e Social', + 'Banco Regional de Desenvolvimento do Extremo Sul', + 'Caixa Econômica Federal', + 'Banco ABN Amro S.A.', + 'Banco Alfa', + 'Banco Banif', + 'Banco BBM', + 'Banco BMG', + 'Banco Bonsucesso', + 'Banco BTG Pactual', + 'Banco Cacique', + 'Banco Caixa Geral - Brasil', + 'Banco Citibank', + 'Banco Credibel', + 'Banco Credit Suisse', + 'Góis Monteiro & Co', + 'Banco Fator', + 'Banco Fibra', + 'Agibank', + 'Banco Guanabara', + 'Banco Industrial do Brasil', + 'Banco Industrial e Comercial', + 'Banco Indusval', + 'Banco Inter', + 'Banco Itaú BBA', + 'Banco ItaúBank', + 'Banco Itaucred Financiamentos', + 'Banco Mercantil do Brasil', + 'Banco Modal Modal', + 'Banco Morada', + 'Banco Pan', + 'Banco Paulista', + 'Banco Pine', + 'Banco Renner', + 'Banco Ribeirão Preto', + 'Banco Safra', + 'Banco Santander', + 'Banco Sofisa', + 'Banco Topázio', + 'Banco Votorantim', + 'Bradesco Bradesco', + 'Itaú Unibanco', + 'Banco Original', + 'Banco Neon', + 'Nu Pagamentos S.A', + 'XP Investimentos Corretora de Câmbio Títulos e Valores Mobiliários S.A', + ); + + /** + * @example 'Banco Neon' + */ + public static function bank() + { + return static::randomElement(static::$banks); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/PhoneNumber.php index c66b0096..4949eef3 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/PhoneNumber.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/PhoneNumber.php @@ -4,46 +4,42 @@ namespace Faker\Provider\pt_BR; class PhoneNumber extends \Faker\Provider\PhoneNumber { - - protected static $landlineFormats = array('2###-####', '3###-####'); - - protected static $cellphoneFormats = array('7###-####', '8###-####', '9###-####'); + protected static $landlineFormats = array('2###-####', '3###-####', '4###-####'); /** - * Extracted from http://portal.embratel.com.br/embratel/9-digito/ (point 11) - */ - protected static $ninthDigitAreaCodes = array( - 11, 12, 13, 14, 15, 16, 17, 18, 19, - 21, 22, 24, 27, 28, - 91, 92, 93, 94, 95, 96, 97, 98, 99, - //31, 32, 33, 34, 35, 37, 38, 71, 73, 74, 75, 77, 79, 81, 82, 83, 84, 85, 86, 87, 88, 89, //by dec/2015 - //41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 53, 54, 55, 61,62, 63, 64, 65, 66, 67, 68, 69 //by dec/2016 - ); + * Since december 2016 all mobile phone numbers in brazil begin with 9 and landlines 2, 3 or 4. + * @link http://www.anatel.gov.br/Portal/exibirPortalPaginaEspecial.do?org.apache.struts.taglib.html.TOKEN=9594e1d11fbc996d52bda44e608bb744&codItemCanal=1794&pastaSelecionada=2984 + */ + protected static $cellphoneFormats = array('9####-####'); /** * Generates a 2-digit area code not composed by zeroes. + * @link http://www.anatel.gov.br/legislacao/resolucoes/16-2001/383-resolucao-263. * @return string */ public static function areaCode() { - return static::randomDigitNotNull().static::randomDigitNotNull(); + $areaCodes = array( + '11', '12', '13', '14', '15', '16', '17', '18', '19', '21', '22', '24', + '27', '28', '31', '32', '33', '34', '35', '37', '38', '41', '42', '43', + '44', '45', '46', '47', '48', '49', '51', '53', '54', '55', '61', '62', + '63', '64', '65', '66', '67', '68', '69', '71', '73', '74', '75', '77', + '79', '81', '82', '83', '84', '85', '86', '87', '88', '89', '91', '92', + '93', '94', '95', '96', '97', '98', '99' + ); + + return self::randomElement($areaCodes); } /** - * Generates a 8/9-digit cellphone number without formatting characters. + * Generates a 9-digit cellphone number without formatting characters. * @param bool $formatted [def: true] If it should return a formatted number or not. - * @param bool $ninth [def: false] If the number should have a nine in the beginning or not. - * If the generated number begins with 7 this is ignored. * @return string */ - public static function cellphone($formatted = true, $ninth = false) + public static function cellphone($formatted = true) { $number = static::numerify(static::randomElement(static::$cellphoneFormats)); - if ($ninth && $number[0] != 7) { - $number = "9$number"; - } - if (!$formatted) { $number = strtr($number, array('-' => '')); } @@ -52,7 +48,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber } /** - * Generates an 8-digit landline number without formatting characters. + * Generates an 9-digit landline number without formatting characters. * @param bool $formatted [def: true] If it should return a formatted number or not. * @return string */ @@ -93,15 +89,14 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber { $area = static::areaCode(); $number = ($type == 'cellphone')? - static::cellphone($formatted, in_array($area, static::$ninthDigitAreaCodes)) : + static::cellphone($formatted) : static::landline($formatted); return $formatted? "($area) $number" : $area.$number; } /** - * Concatenates {@link areaCode} and {@link cellphone} into a national cellphone number. The ninth digit is - * derived from the area code. + * Concatenates {@link areaCode} and {@link cellphone} into a national cellphone number. * @param bool $formatted [def: true] If it should return a formatted number or not. * @return string */ @@ -124,7 +119,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber * Randomizes between complete cellphone and landline numbers. * @return mixed */ - public static function phoneNumber() + public function phoneNumber() { $method = static::randomElement(array('cellphoneNumber', 'landlineNumber')); return call_user_func("static::$method", true); diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Address.php index 4de0e93d..d804ff2c 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Address.php @@ -4,7 +4,7 @@ namespace Faker\Provider\pt_PT; class Address extends \Faker\Provider\Address { - protected static $streetPrefix = array('Av.', 'Avenida', 'R.', 'Rua', 'Travessa', 'Largo'); + protected static $streetPrefix = array('Av.', 'Avenida', 'R.', 'Rua', 'Tv.', 'Travessa', 'Lg.', 'Largo'); protected static $streetNameFormats = array( '{{streetPrefix}} {{lastName}}', @@ -22,7 +22,7 @@ class Address extends \Faker\Provider\Address /** @link http://www.univ-ab.pt/PINTAC/carta_normas.htm address example in letters **/ protected static $addressFormats = array( - "{{streetAddress}}\n{{postcode}} {{city}}", + "{{streetAddress}} {{postcode}} {{city}}", ); /** @link http://www.mapadeportugal.net/indicecidades.asp **/ diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Company.php new file mode 100644 index 00000000..971d18f5 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Company.php @@ -0,0 +1,16 @@ +getDateOfBirth($dateOfBirth); + + if (is_null($county)) { $countyCode = static::randomElement(array_values(static::$cnpCountyCodes)); + } elseif (!array_key_exists($county, static::$cnpCountyCodes)) { + throw new \InvalidArgumentException("Invalid county code '{$county}' received"); } else { $countyCode = static::$cnpCountyCodes[$county]; } - $cnp = (string) static::cnpFirstDigit($gender, $century) - . static::numerify('##') - . sprintf('%02d', $this->generator->month()) - . sprintf('%02d', $this->generator->dayOfMonth()) - . $countyCode - . static::numerify('##%') + $cnp = (string)$this->getGenderDigit($date, $gender, $isResident) + . $date->format('ymd') + . $countyCode + . static::numerify('##%') ; - $cnp = static::cnpAddChecksum($cnp); + $checksum = $this->getChecksumDigit($cnp); - return $cnp; + return $cnp.$checksum; } /** - * Calculates the first digit for the Personal Numerical Code (CNP) based on - * the gender and century - * - * @param string $gender Valid values: m, f, 1, 2 - * @param integer $century Valid values: 1800, 1900, 2000, 1, 2, 3, 4, 5, 6 - * @return integer + * @param $dateOfBirth + * @return \DateTime */ - protected static function cnpFirstDigit($gender = null, $century = null) + protected function getDateOfBirth($dateOfBirth) { - switch ($century) { - case 1800: + if (empty($dateOfBirth)) { + $dateOfBirthParts = array(static::numberBetween(1800, 2099)); + } else { + $dateOfBirthParts = explode('-', $dateOfBirth); + } + $baseDate = \Faker\Provider\DateTime::dateTimeBetween("first day of {$dateOfBirthParts[0]}", "last day of {$dateOfBirthParts[0]}"); + + switch (count($dateOfBirthParts)) { + case 1: + $dateOfBirthParts[] = $baseDate->format('m'); + //don't break, we need the day also + case 2: + $dateOfBirthParts[] = $baseDate->format('d'); + //don't break, next line will case 3: - case 4: - $centuryCode = 2; - break; - case 1900: - case 1: - case 2: - $centuryCode = 0; - break; - case 2000: - case 5: - case 6: - $centuryCode = 4; break; default: - $centuryCode = static::randomElement(array(0, 2, 4, 6, 9)); + throw new \InvalidArgumentException("Invalid date of birth - must be null or in the 'Y-m-d', 'Y-m', 'Y' format"); } - switch (strtolower($gender)) { - case 'm': - case 1: - $genderCode = 1; - break; - case 'f': - case 2: - $genderCode = 2; - break; - default: - $genderCode = static::randomElement(array(1, 2)); + if ($dateOfBirthParts[0] < 1800 || $dateOfBirthParts[0] > 2099) { + throw new \InvalidArgumentException("Invalid date of birth - year must be between 1900 and 2099, '{$dateOfBirthParts[0]}' received"); } - $firstDigit = $centuryCode + $genderCode; + $dateOfBirthFinal = implode('-', $dateOfBirthParts); + $date = \DateTime::createFromFormat('Y-m-d', $dateOfBirthFinal); + //a full (invalid) date might have been supplied, check if it converts + if ($date->format('Y-m-d') !== $dateOfBirthFinal) { + throw new \InvalidArgumentException("Invalid date of birth - '{$date->format('Y-m-d')}' generated based on '{$dateOfBirth}' received"); + } - return ($firstDigit > 9) ? 9 : $firstDigit; + return $date; + } + + /** + * + * https://ro.wikipedia.org/wiki/Cod_numeric_personal#S + * + * @param \DateTime $dateOfBirth + * @param bool $isResident + * @param string $gender + * @return int + */ + protected static function getGenderDigit(\DateTime $dateOfBirth, $gender, $isResident) + { + if (!$isResident) { + return 9; + } + + if ($dateOfBirth->format('Y') < 1900) { + if ($gender == Person::GENDER_MALE) { + return 3; + } + return 4; + } + + if ($dateOfBirth->format('Y') < 2000) { + if ($gender == Person::GENDER_MALE) { + return 1; + } + return 2; + } + + if ($gender == Person::GENDER_MALE) { + return 5; + } + return 6; } /** * Calculates a checksum for the Personal Numerical Code (CNP). * - * @param string $cnp Randomly generated CNP - * @return string CNP with the last digit altered to a proper checksum + * @param string $value 12 digit CNP + * @return int checksum digit */ - protected static function cnpAddChecksum($cnp) + protected function getChecksumDigit($value) { $checkNumber = 279146358279; $checksum = 0; foreach (range(0, 11) as $digit) { - $checksum += substr($cnp, $digit, 1) * substr($checkNumber, $digit, 1); + $checksum += (int)substr($value, $digit, 1) * (int)substr($checkNumber, $digit, 1); } $checksum = $checksum % 11; - return substr($cnp, 0, 12) . ($checksum == 10 ? 1 : $checksum); + return $checksum == 10 ? 1 : $checksum; } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/PhoneNumber.php index 9e3c07fe..377e2245 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/PhoneNumber.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/PhoneNumber.php @@ -43,12 +43,11 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber /** * @link http://en.wikipedia.org/wiki/Telephone_numbers_in_Romania#Last_years */ - public static function phoneNumber() + public function phoneNumber() { $type = static::randomElement(array_keys(static::$normalFormats)); - $number = static::numerify(static::randomElement(static::$normalFormats[$type])); - return $number; + return static::numerify(static::randomElement(static::$normalFormats[$type])); } public static function tollFreePhoneNumber() diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/Text.php new file mode 100644 index 00000000..410c6f9b --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/Text.php @@ -0,0 +1,154 @@ +middleNameMale(); + } elseif ($gender === static::GENDER_FEMALE) { + return $this->middleNameFemale(); + } + + return $this->middleName(static::randomElement(array( + static::GENDER_MALE, + static::GENDER_FEMALE, + ))); + } + + /** + * Return last name for the specified gender. + * + * @param string|null $gender A gender of the last name should be generated + * for. If the argument is skipped a random gender will be used. + * @return string Last name + */ + public function lastName($gender = null) + { + $lastName = static::randomElement(static::$lastName); + + if (static::GENDER_FEMALE === $gender) { + return $lastName . 'a'; + } elseif (static::GENDER_MALE === $gender) { + return $lastName; + } + + return $lastName . static::randomElement(static::$lastNameSuffix); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ru_RU/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/ru_RU/Text.php index 871f7a13..7a989c28 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/ru_RU/Text.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/ru_RU/Text.php @@ -4,6 +4,13 @@ namespace Faker\Provider\ru_RU; class Text extends \Faker\Provider\Text { + public function realText($maxNbChars = 200, $indexSize = 2) + { + $realText = parent::realText($maxNbChars, $indexSize); + + return iconv('UTF-8', 'UTF-8//IGNORE', $realText); + } + /** * From ru.wikisource.org * @@ -21,7 +28,6 @@ class Text extends \Faker\Provider\Text * * Language: Russian * - * @licence Creative Commons Attribution-ShareAlike https://creativecommons.org/licenses/by-sa/3.0/deed.ru * @see https://wikimediafoundation.org/wiki/Terms_of_Use/ * @link http://ru.wikisource.org/wiki/%D0%9C%D1%91%D1%80%D1%82%D0%B2%D1%8B%D0%B5_%D0%B4%D1%83%D1%88%D0%B8_(%D0%93%D0%BE%D0%B3%D0%BE%D0%BB%D1%8C)/%D0%A2%D0%BE%D0%BC_I/%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_I * @var string diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Company.php index 1f5fad2e..53091d55 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Company.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Company.php @@ -46,7 +46,7 @@ class Company extends \Faker\Provider\Company $result[] = static::randomElement($word); } - return join($result, ' '); + return join(' ', $result); } /** @@ -59,6 +59,6 @@ class Company extends \Faker\Provider\Company $result[] = static::randomElement($word); } - return join($result, ' '); + return join(' ', $result); } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Person.php index 2a3e658c..2ed758ac 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Person.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Person.php @@ -74,9 +74,9 @@ class Person extends \Faker\Provider\Person 'Cyprich', 'Cíger', 'Dacej', 'Danko', 'Debnár', 'Dej', 'Dekýš', 'Doležal', 'Dostál', 'DoÄolomanský', 'Drajna', 'Droppa', 'Dubovský', 'Dudek', 'Dula', 'Dulla', 'Dusík', 'DvonÄ', 'Dzurjanin', 'Dávid', 'Fabian', 'Fabián', 'Fajnor', 'FarkaÅ¡ovský', 'Feldek', 'Fico', 'Filc', 'Filip', 'Finka', 'Ftorek', 'Galis', 'Gallo', 'GaÅ¡par', 'GaÅ¡paroviÄ', 'Gocník', 'Golonka', 'GreguÅ¡', 'Grznár', 'Hablák', 'HabÅ¡uda', - 'HaluÅ¡ka', 'Halák', 'Hanko', 'Hanzal', 'Hanzel', 'Hanzel', 'HaÅ¡Äák', 'Heretik', 'HeÄko', 'HeÄková', 'HlaváÄek', 'Hlinka', 'Hochschorner', + 'HaluÅ¡ka', 'Halák', 'Hanko', 'Hanzal', 'Hanzel', 'Hanzel', 'HaÅ¡Äák', 'Heretik', 'HeÄko', 'HlaváÄek', 'Hlinka', 'Hochschorner', 'Holub', 'Holuby', 'Horváth', 'Hossa', 'HraÅ¡ko', 'Hric', 'Hrmo', 'HruÅ¡ovský', 'Huba', 'HudáÄek', 'Hála', 'IhnaÄák', 'JanoÅ¡ka', 'JantoÅ¡oviÄ', - 'Janík', 'Jonata', 'Jurina', 'Jurinová', 'Jurík', 'Jáni', 'Jánošík', 'Kaliský', 'Karul', 'KarvaÅ¡', 'Keníž', 'Klapka', 'Klaus', 'Kolník', + 'Janík', 'Jonata', 'Jurina', 'Jurík', 'Jáni', 'Jánošík', 'Kaliský', 'Karul', 'KarvaÅ¡', 'Keníž', 'Klapka', 'Klaus', 'Kolník', 'Konstantinidis', 'Korec', 'Kostrec', 'KováÄ', 'KováÄik', 'Koza', 'Kubík', 'KuÄera', 'Labuda', 'LangoÅ¡', 'Lepšík', 'Lexa', 'Lintner', 'Lubina', 'LukáÄ', 'Lupták', 'Líška', 'Majeský', 'Malachovský', 'Malíšek', 'Marián', 'Masaryk', 'Maslo', 'MatiaÅ¡ko', 'MedveÄ', 'Menyhért', 'MeÄiar', 'MeÄíř', 'MikloÅ¡ko', 'Mikulík', 'MikuÅ¡', 'Mikúš', 'Mišík', 'MojžiÅ¡', 'MokroÅ¡', 'Molnár', 'MoravÄík', 'Musil', 'Mydlo', 'Nagy', diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/sl_SI/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/sl_SI/Address.php old mode 100755 new mode 100644 diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/sl_SI/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/sl_SI/Company.php new file mode 100644 index 00000000..0e899bfe --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/sl_SI/Company.php @@ -0,0 +1,14 @@ +middleNameMale(); + } elseif ($gender === static::GENDER_FEMALE) { + return $this->middleNameFemale(); + } + + return $this->middleName(static::randomElement(array( + static::GENDER_MALE, + static::GENDER_FEMALE, + ))); } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/PhoneNumber.php index b18a9b53..24187f33 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/PhoneNumber.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/PhoneNumber.php @@ -4,26 +4,48 @@ namespace Faker\Provider\uk_UA; class PhoneNumber extends \Faker\Provider\PhoneNumber { + /** + * @see list of Ukraine mobile formats (2017-08-08), source: https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BB%D0%B5%D1%84%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BB%D0%B0%D0%BD_%D0%BD%D1%83%D0%BC%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D0%A3%D0%BA%D1%80%D0%B0%D0%B8%D0%BD%D1%8B + */ protected static $formats = array( // International format (mobile) '+38050#######', + '+38066#######', + '+38068#######', '+38096#######', '+38067#######', + '+38091#######', + '+38092#######', '+38093#######', + '+38094#######', + '+38095#######', + '+38096#######', + '+38097#######', + '+38098#######', '+38063#######', '+38099#######', // Internal country format (mobile) '050#######', + '066#######', + '068#######', '096#######', '067#######', + '091#######', + '092#######', '093#######', + '094#######', + '095#######', + '096#######', + '097#######', + '098#######', '063#######', '099#######', // More generic formats '+38(0##)#######', - '+38(0###)######' + '+38(0###)######', + '+38(0####)#####' ); } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/Text.php index 38f686bf..337df3e5 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/Text.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/Text.php @@ -21,7 +21,6 @@ class Text extends \Faker\Provider\Text * * Language: Ukrainian * - * @licence Creative Commons Attribution-ShareAlike https://creativecommons.org/licenses/by-sa/3.0/deed.ru * @see https://wikimediafoundation.org/wiki/Terms_of_Use/ * @link http://uk.wikisource.org/wiki/%D0%97%D0%B0%D1%85%D0%B0%D1%80_%D0%91%D0%B5%D1%80%D0%BA%D1%83%D1%82 * @var string diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/Address.php index a520dcef..47414f1f 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/Address.php @@ -104,7 +104,7 @@ class Address extends \Faker\Provider\Address 'Macao', 'Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands', 'Martinique', 'Mauritania', 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', 'Moldova', 'Monaco', 'Mongolia', 'Montenegro', 'Montserrat', 'Morocco', 'Mozambique', 'Myanmar', 'Namibia', 'Nauru', 'Nepal', 'Netherlands Antilles', 'Netherlands', 'New Caledonia', 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Norfolk Island', 'Northern Mariana Islands', 'Norway', 'Oman', - 'Pakistan', 'Palau', 'Palestinian Territory', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico', + 'Pakistan', 'Palau', 'Palestinian Territories', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico', 'Qatar', 'Reunion', 'Romania', 'Russian Federation', 'Rwanda', 'Saint Barthelemy', 'Saint Helena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Martin', 'Saint Pierre and Miquelon', 'Saint Vincent and the Grenadines', 'Samoa', 'San Marino', 'Sao Tome and Principe', 'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovakia (Slovak Republic)', 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa', 'South Georgia and the South Sandwich Islands', 'Spain', 'Sri Lanka', 'Sudan', 'Suriname', 'Svalbard & Jan Mayen Islands', 'Swaziland', 'Sweden', 'Switzerland', 'Syrian Arab Republic', diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/PhoneNumber.php index 694e3951..5f9f60a1 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/PhoneNumber.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/PhoneNumber.php @@ -46,7 +46,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber ), ); - public static function phoneNumber() + public function phoneNumber() { $areaCode = static::randomElement(static::$areaCodes); $areaCodeLength = strlen($areaCode); diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Address.php index f36a49a6..19d1c941 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Address.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Address.php @@ -5,12 +5,108 @@ namespace Faker\Provider\zh_CN; class Address extends \Faker\Provider\Address { - protected static $cites = array('北京', '上海', '天津', 'é‡åº†', '哈尔滨', '长春', '沈阳', '呼和浩特', '石家庄', 'ä¹Œé²æœ¨é½', 'å…°å·ž', '西å®', '西安', 'é“¶å·', '郑州', '济å—', '太原', 'åˆè‚¥', '武汉', 'é•¿æ²™', 'å—京', 'æˆéƒ½', '贵阳', '昆明', 'å—å®', '拉è¨', 'æ­å·ž', 'å—æ˜Œ', '广州', 'ç¦å·ž', 'æµ·å£', '香港', '澳门'); + protected static $cites = array( + '北京', '上海', '天津', 'é‡åº†', + '哈尔滨', '长春', '沈阳', '呼和浩特', + '石家庄', 'ä¹Œé²æœ¨é½', 'å…°å·ž', '西å®', + '西安', 'é“¶å·', '郑州', '济å—', + '太原', 'åˆè‚¥', '武汉', 'é•¿æ²™', + 'å—京', 'æˆéƒ½', '贵阳', '昆明', + 'å—å®', '拉è¨', 'æ­å·ž', 'å—æ˜Œ', + '广州', 'ç¦å·ž', 'æµ·å£', + '香港', '澳门' + ); - protected static $areas = array('西å¤åŒº', 'æ°¸å·åŒº', '秀英区', '高港区', '清城区', '兴山区', '锡山区', '清河区', '龙潭区', 'åŽé¾™åŒº', '海陵区', '滨城区', '东丽区', '高åªåŒº', '沙湾区', '平山区', '城北区', '海港区', '沙市区', 'åŒæ»¦åŒº', '长寿区', '山亭区', 'å—æ¹–区', '浔阳区', 'å—长区', 'å‹å¥½åŒº', '安次区', '翔安区', '沈河区', 'é­éƒ½åŒº', '西峰区', 'è§å±±åŒº', '金平区', '沈北新区', 'å­å—区', '上街区', '城东区', '牧野区', '大东区', '白云区', '花溪区', 'å‰åˆ©åŒº', '新城区', '怀柔区', 'å…­æžç‰¹åŒº', '涪城区', '清浦区', 'å—æºªåŒº', 'æ·„å·åŒº', '高明区'); + protected static $states = array( + '北京市', '天津市', '河北çœ', '山西çœ', + '内蒙å¤è‡ªæ²»åŒº', 'è¾½å®çœ', '剿ž—çœ', + '黑龙江çœ', '上海市', '江è‹çœ', + '浙江çœ', '安徽çœ', 'ç¦å»ºçœ', '江西çœ', + '山东çœ', 'æ²³å—çœ', '湖北çœ', 'æ¹–å—çœ', + '广东çœ', '广西壮æ—自治区', 'æµ·å—çœ', + 'é‡åº†å¸‚', 'å››å·çœ', '贵州çœ', '云å—çœ', + '西è—自治区', '陕西çœ', '甘肃çœ', 'é’æµ·çœ', + 'å®å¤å›žæ—自治区', '新疆维å¾å°”自治区', + '香港特别行政区', '澳门特别行政区', 'å°æ¹¾çœ' + ); + + protected static $stateAbbr = array( + '京', 'çš–', 'æ¸', 'é—½', + '甘', '粤', 'æ¡‚', 'é»”', + 'ç¼', '冀', '豫', '黑', + 'é„‚', '湘', 'å‰', 'è‹', + 'èµ£', 'è¾½', 'è’™', 'å®', + 'é’', 'é²', '晋', '陕', + '沪', 'å·', 'æ´¥', 'è—', + 'æ–°', '滇', 'æµ™', '港', + 'æ¾³', 'å°' + ); + + protected static $areas = array( + '西å¤åŒº', 'æ°¸å·åŒº', '秀英区', '高港区', + '清城区', '兴山区', '锡山区', '清河区', + '龙潭区', 'åŽé¾™åŒº', '海陵区', '滨城区', + '东丽区', '高åªåŒº', '沙湾区', '平山区', + '城北区', '海港区', '沙市区', 'åŒæ»¦åŒº', + '长寿区', '山亭区', 'å—æ¹–区', '浔阳区', + 'å—长区', 'å‹å¥½åŒº', '安次区', '翔安区', + '沈河区', 'é­éƒ½åŒº', '西峰区', 'è§å±±åŒº', + '金平区', '沈北新区', 'å­å—区', '上街区', + '城东区', '牧野区', '大东区', '白云区', + '花溪区', 'å‰åˆ©åŒº', '新城区', '怀柔区', + 'å…­æžç‰¹åŒº', '涪城区', '清浦区', 'å—æºªåŒº', + 'æ·„å·åŒº', '高明区', '金水区', '中原区', + '高新开å‘区', 'ç»æµŽå¼€å‘新区', '新区' + ); protected static $country = array( - '阿富汗', '阿拉斯加', '阿尔巴尼亚', '阿尔åŠåˆ©äºš', '安é“å°”', '安哥拉', '安圭拉岛英', '安æç“œå’Œå·´å¸ƒè¾¾', '阿根廷', '亚美尼亚', '阿é²å·´å²›', '阿森æ¾', '澳大利亚', '奥地利', '阿塞拜疆', 'å·´æž—', '孟加拉国', '巴巴多斯', '白俄罗斯', '比利时', '伯利兹', 'è´å®', '百慕大群岛', 'ä¸ä¸¹', '玻利维亚', '波斯尼亚和黑塞哥维那', 'åšèŒ¨ç“¦çº³', '巴西', 'ä¿åŠ åˆ©äºš', '布基纳法索', '布隆迪', '喀麦隆', '加拿大', '加那利群岛', '佛得角', '开曼群岛', '中éž', 'ä¹å¾—', '智利', '圣诞岛', '科科斯岛', '哥伦比亚', '巴哈马国', '多米尼克国', 'ç§‘æ‘©ç½—', '刚果', '科克群岛', '哥斯达黎加', '克罗地亚', 'å¤å·´', '塞浦路斯', 'æ·å…‹', '丹麦', '迪戈加西亚岛', 'å‰å¸ƒæ', '多米尼加共和国', '厄瓜多尔', '埃åŠ', 'è¨å°”瓦多', '赤é“几内亚', '厄立特里亚', '爱沙尼亚', '埃塞俄比亚', 'ç¦å…‹å…°ç¾¤å²›', '法罗群岛', 'æ–æµŽ', '芬兰', '法国', '法属圭亚那', '法属波里尼西亚', '加蓬', '冈比亚', 'æ ¼é²å‰äºš', '德国', '加纳', '直布罗陀', '希腊', '格陵兰岛', '格林纳达', '瓜德罗普岛', '关岛', 'å±åœ°é©¬æ‹‰', '几内亚', '几内亚比ç»', '圭亚那', '海地', 'å¤å¨å¤·', '洪都拉斯', '匈牙利', '冰岛', 'å°åº¦', 'å°åº¦å°¼è¥¿äºš', '伊郎', '伊拉克', '爱尔兰', '以色列', 'æ„大利', '科特迪瓦', '牙买加', '日本', '约旦', '柬埔塞', '哈è¨å…‹æ–¯å¦', '肯尼亚', '基里巴斯', 'æœé²œ', '韩国', 'ç§‘å¨ç‰¹', 'å‰å°”剿–¯æ–¯å¦', 'è€æŒ', '拉脱维亚', '黎巴嫩', '莱索托', '利比里亚', '利比亚', '列支敦士登', 'ç«‹é™¶å®›', '墿£®å ¡', '马其顿', '马达加斯加', '马拉维', '马æ¥è¥¿äºš', '马尔代夫', '马里', '马耳他', '马里亚纳群岛', '马ç»å°”群岛', '马æå°¼å…‹', '毛里塔尼亚', '毛里求斯', '马约特岛', '墨西哥', '密克罗尼西亚', '中途岛', '摩尔多瓦', '摩纳哥', 'è’™å¤', '蒙特塞拉特岛', '摩洛哥', '莫桑比克', '缅甸', '纳米比亚', 'ç‘™é²', '尼泊尔', 'è·å…°', 'è·å±žå®‰çš„列斯群岛', '新喀里多尼亚群岛', '新西兰', '尼加拉瓜', '尼日尔', '尼日利亚', '纽埃岛', '诺ç¦å…‹å²›', '挪å¨', '阿曼', '帕劳', '巴拿马', '巴布亚新几内亚', '巴拉圭', '秘é²', 'è²å¾‹å®¾', '波兰', 'è‘¡è„牙', '巴基斯å¦', '波多黎å„', 'å¡å¡”å°”', '留尼汪岛', '罗马尼亚', 'ä¿„ç½—æ–¯', '墿—ºè¾¾', 'ä¸œè¨æ‘©äºš', 'è¥¿è¨æ‘©äºš', '圣马力诺', '圣皮埃尔岛åŠå¯†å…‹éš†å²›', '圣多美和普林西比', '沙特阿拉伯', '塞内加尔', '塞舌尔', '新加å¡', '斯洛ä¼å…‹', '斯洛文尼亚', '所罗门群岛', '索马里', 'å—éž', '西ç­ç‰™', '斯里兰å¡', '圣克里斯托弗和尼维斯', '圣赫勒拿', '圣å¢è¥¿äºš', '圣文森特岛', 'è‹ä¸¹', 'è‹é‡Œå—', 'æ–¯å¨å£«å…°', '瑞典', '瑞士', 'å™åˆ©äºš', 'å¡”å‰å…‹æ–¯å¦', '妿¡‘尼亚', '泰国', '阿拉伯è”åˆé…‹é•¿å›½', '多哥', '托克劳群岛', '汤加', '特立尼达和多巴哥', 'çªå°¼æ–¯', '土耳其', '土库曼斯å¦', '特克斯和凯科斯群岛(', '图瓦å¢', '美国', '乌干达', '乌克兰', '英国', '乌拉圭', '乌兹别克斯å¦', '瓦努阿图', '梵蒂冈', '委内瑞拉', 'è¶Šå—', '维尔京群岛', '维尔京群岛和圣罗克伊', 'å¨å…‹å²›', '瓦里斯和富士那群岛', '西撒哈拉', '也门', 'å—æ–¯æ‹‰å¤«', '扎伊尔', '赞比亚', '桑给巴尔', '津巴布韦', '中åŽäººæ°‘共和国', '中国' + '阿富汗', '阿拉斯加', '阿尔巴尼亚', '阿尔åŠåˆ©äºš', + '安é“å°”', '安哥拉', '安圭拉岛英', '安æç“œå’Œå·´å¸ƒè¾¾', + '阿根廷', '亚美尼亚', '阿é²å·´å²›', '阿森æ¾', '澳大利亚', + '奥地利', '阿塞拜疆', 'å·´æž—', '孟加拉国', '巴巴多斯', + '白俄罗斯', '比利时', '伯利兹', 'è´å®', '百慕大群岛', + 'ä¸ä¸¹', '玻利维亚', '波斯尼亚和黑塞哥维那', 'åšèŒ¨ç“¦çº³', + '巴西', 'ä¿åŠ åˆ©äºš', '布基纳法索', '布隆迪', '喀麦隆', + '加拿大', '加那利群岛', '佛得角', '开曼群岛', '中éž', + 'ä¹å¾—', '智利', '圣诞岛', '科科斯岛', '哥伦比亚', + '巴哈马国', '多米尼克国', 'ç§‘æ‘©ç½—', '刚果', '科克群岛', + '哥斯达黎加', '克罗地亚', 'å¤å·´', '塞浦路斯', 'æ·å…‹', + '丹麦', '迪戈加西亚岛', 'å‰å¸ƒæ', '多米尼加共和国', + '厄瓜多尔', '埃åŠ', 'è¨å°”瓦多', '赤é“几内亚', + '厄立特里亚', '爱沙尼亚', '埃塞俄比亚', 'ç¦å…‹å…°ç¾¤å²›', + '法罗群岛', 'æ–æµŽ', '芬兰', '法国', '法属圭亚那', + '法属波里尼西亚', '加蓬', '冈比亚', 'æ ¼é²å‰äºš', '德国', + '加纳', '直布罗陀', '希腊', '格陵兰岛', '格林纳达', + '瓜德罗普岛', '关岛', 'å±åœ°é©¬æ‹‰', '几内亚', '几内亚比ç»', + '圭亚那', '海地', 'å¤å¨å¤·', '洪都拉斯', '匈牙利', '冰岛', + 'å°åº¦', 'å°åº¦å°¼è¥¿äºš', '伊郎', '伊拉克', '爱尔兰', '以色列', + 'æ„大利', '科特迪瓦', '牙买加', '日本', '约旦', '柬埔塞', + '哈è¨å…‹æ–¯å¦', '肯尼亚', '基里巴斯', 'æœé²œ', '韩国', 'ç§‘å¨ç‰¹', + 'å‰å°”剿–¯æ–¯å¦', 'è€æŒ', '拉脱维亚', '黎巴嫩', '莱索托', + '利比里亚', '利比亚', '列支敦士登', 'ç«‹é™¶å®›', '墿£®å ¡', + '马其顿', '马达加斯加', '马拉维', '马æ¥è¥¿äºš', '马尔代夫', + '马里', '马耳他', '马里亚纳群岛', '马ç»å°”群岛', '马æå°¼å…‹', + '毛里塔尼亚', '毛里求斯', '马约特岛', '墨西哥', '密克罗尼西亚', + '中途岛', '摩尔多瓦', '摩纳哥', 'è’™å¤', '蒙特塞拉特岛', + '摩洛哥', '莫桑比克', '缅甸', '纳米比亚', 'ç‘™é²', '尼泊尔', + 'è·å…°', 'è·å±žå®‰çš„列斯群岛', '新喀里多尼亚群岛', '新西兰', + '尼加拉瓜', '尼日尔', '尼日利亚', '纽埃岛', '诺ç¦å…‹å²›', + '挪å¨', '阿曼', '帕劳', '巴拿马', '巴布亚新几内亚', '巴拉圭', + '秘é²', 'è²å¾‹å®¾', '波兰', 'è‘¡è„牙', '巴基斯å¦', '波多黎å„', + 'å¡å¡”å°”', '留尼汪岛', '罗马尼亚', 'ä¿„ç½—æ–¯', '墿—ºè¾¾', + 'ä¸œè¨æ‘©äºš', 'è¥¿è¨æ‘©äºš', '圣马力诺', '圣皮埃尔岛åŠå¯†å…‹éš†å²›', + '圣多美和普林西比', '沙特阿拉伯', '塞内加尔', '塞舌尔', + '新加å¡', '斯洛ä¼å…‹', '斯洛文尼亚', '所罗门群岛', '索马里', + 'å—éž', '西ç­ç‰™', '斯里兰å¡', '圣克里斯托弗和尼维斯', + '圣赫勒拿', '圣å¢è¥¿äºš', '圣文森特岛', 'è‹ä¸¹', 'è‹é‡Œå—', + 'æ–¯å¨å£«å…°', '瑞典', '瑞士', 'å™åˆ©äºš', 'å¡”å‰å…‹æ–¯å¦', '妿¡‘尼亚', + '泰国', '阿拉伯è”åˆé…‹é•¿å›½', '多哥', '托克劳群岛', '汤加', + '特立尼达和多巴哥', 'çªå°¼æ–¯', '土耳其', '土库曼斯å¦', + '特克斯和凯科斯群岛(', '图瓦å¢', '美国', '乌干达', '乌克兰', + '英国', '乌拉圭', '乌兹别克斯å¦', '瓦努阿图', '梵蒂冈', + '委内瑞拉', 'è¶Šå—', '维尔京群岛', '维尔京群岛和圣罗克伊', + 'å¨å…‹å²›', '瓦里斯和富士那群岛', '西撒哈拉', '也门', 'å—æ–¯æ‹‰å¤«', + '扎伊尔', '赞比亚', '桑给巴尔', '津巴布韦', '中åŽäººæ°‘共和国', '中国' ); public function city() @@ -18,6 +114,16 @@ class Address extends \Faker\Provider\Address return static::randomElement(static::$cites); } + public function state() + { + return static::randomElement(static::$states); + } + + public function stateAbbr() + { + return static::randomElement(static::$stateAbbr); + } + public static function area() { return static::randomElement(static::$areas); diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Color.php b/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Color.php new file mode 100644 index 00000000..12d29e32 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Color.php @@ -0,0 +1,66 @@ +format('a') === 'am' ? '上åˆ' : '下åˆ'; + } + + public static function dayOfWeek($max = 'now') + { + $map = array( + 'Sunday' => '星期日', + 'Monday' => '星期一', + 'Tuesday' => '星期二', + 'Wednesday' => '星期三', + 'Thursday' => '星期四', + 'Friday' => '星期五', + 'Saturday' => '星期六', + ); + $week = static::dateTime($max)->format('l'); + return isset($map[$week]) ? $map[$week] : $week; + } + + public static function monthName($max = 'now') + { + $map = array( + 'January' => '一月', + 'February' => '二月', + 'March' => '三月', + 'April' => '四月', + 'May' => '五月', + 'June' => '六月', + 'July' => '七月', + 'August' => '八月', + 'September' => '乿œˆ', + 'October' => 'åæœˆ', + 'November' => 'å一月', + 'December' => 'å二月', + ); + $month = static::dateTime($max)->format('F'); + return isset($map[$month]) ? $map[$month] : $month; + } +} diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Internet.php b/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Internet.php index 10251dd2..ca10822c 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Internet.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Internet.php @@ -4,8 +4,13 @@ namespace Faker\Provider\zh_CN; class Internet extends \Faker\Provider\Internet { - protected static $freeEmailDomain = array('gmail.com', 'yahoo.com', 'hotmail.com'); - protected static $tld = array('com', 'com', 'com', 'com', 'com', 'com', 'biz', 'info', 'net', 'org'); + protected static $freeEmailDomain = array( + 'gmail.com', 'yahoo.com', 'hotmail.com', '126.com', '163.com', 'qq.com', 'sohu.com', 'sina.com' + ); + protected static $tld = array( + 'com', 'com', 'com', 'com', 'com', 'com', 'biz', 'info', 'net', 'org', 'cn', + 'com.cn', 'edu.cn', 'net.cn', 'biz.cn', 'gov.cn', 'org.cn' + ); protected static $userNameFormats = array( '{{word}}.{{word}}', diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Payment.php new file mode 100644 index 00000000..183fff13 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Payment.php @@ -0,0 +1,41 @@ + array( - '桃園市', '中壢市', '大溪鎮', '楊梅鎮', '蘆竹鄉', - '大園鄉', '龜山鄉', '八德市', '龿½­é„‰', '平鎮市', - '新屋鄉', '觀音鄉', '復興鄉', + '桃園市' => array( + '桃園å€', '中壢å€', '大溪å€', '楊梅å€', '蘆竹å€', + '大園å€', '龜山å€', 'å…«å¾·å€', '龿½­å€', '平鎮å€', + '新屋å€', '觀音å€', '復興å€', ), '新竹縣' => array( '竹北市', '竹æ±éŽ®', '新埔鎮', '關西鎮', 'æ¹–å£é„‰', diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Company.php index 2cefdcb4..26704ab5 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Company.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Company.php @@ -250,4 +250,16 @@ class Company extends \Faker\Provider\Company } return $result; } + + /** + * return standard VAT / Tax ID / Uniform Serial Number + * + * @example 28263822 + * + * @return int + */ + public function VAT() + { + return static::randomNumber(8, true); + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Person.php index 71f248b3..e0071bef 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Person.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Person.php @@ -4,6 +4,39 @@ namespace Faker\Provider\zh_TW; class Person extends \Faker\Provider\Person { + /** + * @see https://zh.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E6%B0%91%E5%9C%8B%E5%9C%8B%E6%B0%91%E8%BA%AB%E5%88%86%E8%AD%89 + */ + public static $idBirthplaceCode = array( + 'A' => 10, + 'B' => 11, + 'C' => 12, + 'D' => 13, + 'E' => 14, + 'F' => 15, + 'G' => 16, + 'H' => 17, + 'I' => 34, + 'J' => 18, + 'K' => 19, + 'M' => 21, + 'N' => 22, + 'O' => 35, + 'P' => 23, + 'Q' => 24, + 'T' => 27, + 'U' => 28, + 'V' => 29, + 'W' => 32, + 'X' => 30, + 'Z' => 33 + ); + + /** + * @see https://zh.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E6%B0%91%E5%9C%8B%E5%9C%8B%E6%B0%91%E8%BA%AB%E5%88%86%E8%AD%89 + */ + public static $idDigitValidator = array(1, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1); + protected static $maleNameFormats = array( '{{lastName}}{{firstNameMale}}', ); @@ -129,4 +162,40 @@ class Person extends \Faker\Provider\Person { return ''; } + + /** + * @param string $gender Person::GENDER_MALE || Person::GENDER_FEMALE + * + * @see https://en.wikipedia.org/wiki/National_Identification_Card_(Republic_of_China) + * + * @return string Length 10 alphanumeric characters, begins with 1 latin character (birthplace), + * 1 number (gender) and then 8 numbers (the last one is check digit). + */ + public function personalIdentityNumber($gender = null) + { + $birthPlace = self::randomKey(self::$idBirthplaceCode); + $birthPlaceCode = self::$idBirthplaceCode[$birthPlace]; + + $gender = ($gender != null) ? $gender : self::randomElement(array(self::GENDER_FEMALE, self::GENDER_MALE)); + $genderCode = ($gender === self::GENDER_MALE) ? 1 : 2; + + $randomNumberCode = self::randomNumber(7, true); + + $codes = str_split($birthPlaceCode . $genderCode . $randomNumberCode); + $total = 0; + + foreach ($codes as $key => $code) { + $total += $code * self::$idDigitValidator[$key]; + } + + $checkSumDigit = 10 - ($total % 10); + + if ($checkSumDigit == 10) { + $checkSumDigit = 0; + } + + $id = $birthPlace . $genderCode . $randomNumberCode . $checkSumDigit; + + return $id; + } } diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Text.php index b35903f6..887d12bb 100644 --- a/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Text.php +++ b/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Text.php @@ -15,110 +15,884 @@ class Text extends \Faker\Provider\Text protected static $notBeginPunct = array('ã€', '。', 'ã€', 'ã€', 'ï¼', '?', 'ー', ',', ':', 'ï¼›'); /** - * Title: 三國演義 Romance of the Three Kingdoms - * Author: 羅貫中 Luo Guanzhong - * Language: Chinese - * - * @see http://www.gutenberg.org/cache/epub/11/pg11.txt + * Title: å¶å–Š Call to Arms (1922) + * Author: 魯迅 Lu Xun + * Language: Traditional Chinese + * @see https://zh.wikisource.org/wiki/%E5%90%B6%E5%96%8A * @var string */ protected static $baseText = <<<'EOT' -第一回:宴桃園豪傑三çµç¾©ï¼Œæ–¬é»ƒå·¾è‹±é›„首立功 +æˆ‘åœ¨å¹´é’æ™‚候也曾經åšéŽè¨±å¤šå¤¢ï¼Œå¾Œä¾†å¤§åŠå¿˜å»äº†ï¼Œä½†è‡ªå·±ä¹Ÿä¸¦ä¸ä»¥çˆ²å¯æƒœã€‚所謂回憶者,雖說å¯ä»¥ä½¿äººæ­¡æ¬£ï¼Œæœ‰æ™‚也ä¸å…使人寂寞,使精神的絲縷還牽著已é€çš„å¯‚å¯žçš„æ™‚å…‰ï¼Œåˆæœ‰ä»€éº¼æ„味呢,而我å苦于ä¸èƒ½å…¨å¿˜å»ï¼Œé€™ä¸èƒ½å…¨å¿˜çš„一部分,到ç¾åœ¨ä¾¿æˆäº†ã€Šå¶å–Šã€‹çš„來由。 +我有四年多,曾經常常,——幾乎是æ¯å¤©ï¼Œå‡ºå…¥äºŽè³ªé‹ªå’Œè—¥åº—è£ï¼Œå¹´ç´€å¯æ˜¯å¿˜å»äº†ï¼Œç¸½ä¹‹æ˜¯è—¥åº—的櫃臺正和我一樣高,質鋪的是比我高一å€ï¼Œæˆ‘從一å€é«˜çš„æ«ƒè‡ºå¤–é€ä¸Šè¡£æœæˆ–首飾去,在侮蔑裡接了錢,å†åˆ°ä¸€æ¨£é«˜çš„æ«ƒè‡ºä¸Šçµ¦æˆ‘久病的父親去買藥。回家之後,åˆé ˆå¿™åˆ¥çš„事了,因爲開方的醫生是最有å的,以此所用的藥引也奇特:冬天的蘆根,經霜三年的甘蔗,蟋蟀è¦åŽŸå°çš„,çµå­çš„å¹³åœ°æœ¨ï¼Œâ€¦â€¦å¤šä¸æ˜¯å®¹æ˜“辦到的æ±è¥¿ã€‚然而我的父親終于日é‡ä¸€æ—¥çš„亡故了。 +有誰從å°åº·äººå®¶è€Œå¢œå…¥å›°é “的麼,我以爲在這途路中,大概å¯ä»¥çœ‹è¦‹ä¸–人的真é¢ç›®ï¼›æˆ‘è¦åˆ°N進K學堂去了,仿佛是想走異路,逃異地,去尋求別樣的人們。我的æ¯è¦ªæ²’有法,辦了八元的å·è³‡ï¼Œèªªæ˜¯ç”±æˆ‘的自便;然而伊哭了,這正是情ç†ä¸­çš„事,因爲那時讀書應試是正路,所謂學洋務,社會上便以爲是一種走投無路的人,åªå¾—å°‡éˆé­‚賣給鬼å­ï¼Œè¦åŠ å€çš„奚è½è€Œä¸”排斥的,而æ³ä¼Šåˆçœ‹ä¸è¦‹è‡ªå·±çš„å…’å­äº†ã€‚然而我也顧ä¸å¾—這些事,終于到N去進了K學堂了,在這學堂è£ï¼Œæˆ‘纔知é“世上還有所謂格致,算學,地ç†ï¼Œæ­·å²ï¼Œç¹ªåœ–和體æ“。生ç†å­¸ä¸¦ä¸æ•™ï¼Œä½†æˆ‘們å»çœ‹åˆ°äº›æœ¨ç‰ˆçš„《全體新論》和《化學衛生論》之類了。我還記得先å‰çš„醫生的議論和方藥,和ç¾åœ¨æ‰€çŸ¥é“的比較起來,便漸漸的悟得中醫ä¸éŽæ˜¯ä¸€ç¨®æœ‰æ„的或無æ„的騙å­ï¼ŒåŒæ™‚åˆå¾ˆèµ·äº†å°äºŽè¢«é¨™çš„病人和他的家æ—çš„åŒæƒ…;而且從譯出的歷å²ä¸Šï¼ŒåˆçŸ¥é“了日本維新是大åŠç™¼ç«¯äºŽè¥¿æ–¹é†«å­¸çš„事實。 +因爲這些幼稚的知識,後來便使我的學ç±åˆ—在日本一個鄉間的醫學專門學校è£äº†ã€‚我的夢很美滿,é å‚™å’æ¥­å›žä¾†ï¼Œæ•‘æ²»åƒæˆ‘父親似的被誤的病人的疾苦,戰爭時候便去當è»é†«ï¼Œä¸€é¢åˆä¿ƒé€²äº†åœ‹äººå°äºŽç¶­æ–°çš„信仰。我已ä¸çŸ¥é“教授微生物學的方法,ç¾åœ¨åˆæœ‰äº†æ€Žæ¨£çš„進步了,總之那時是用了電影,來顯示微生物的形狀的,因此有時講義的一段è½å·²å®Œï¼Œè€Œæ™‚間還沒有到,教師便映些風景或時事的畫片給學生看,以用去這多餘的光陰。其時正當日俄戰爭的時候,關于戰事的畫片自然也就比較的多了,我在這一個講堂中,便須常常隨喜我那åŒå­¸å€‘çš„æ‹æ‰‹å’Œå–采。有一回,我竟在畫片上忽然會見我久é•的許多中國人了,一個ç¶åœ¨ä¸­é–“,許多站在左å³ï¼Œä¸€æ¨£æ˜¯å¼·å£¯çš„體格,而顯出麻木的神情。據解說,則ç¶è‘—的是替俄國åšäº†è»äº‹ä¸Šçš„åµæŽ¢ï¼Œæ­£è¦è¢«æ—¥è»ç ä¸‹é ­é¡±ä¾†ç¤ºè¡†ï¼Œè€Œåœè‘—的便是來賞鑑這示衆的盛舉的人們。 +這一學年沒有完畢,我已經到了æ±äº¬äº†ï¼Œå› çˆ²å¾žé‚£ä¸€å›žä»¥å¾Œï¼Œæˆ‘便覺得醫學並éžä¸€ä»¶ç·Šè¦äº‹ï¼Œå‡¡æ˜¯æ„šå¼±çš„國民,å½ä½¿é«”格如何å¥å…¨ï¼Œå¦‚何èŒå£¯ï¼Œä¹Ÿåªèƒ½åšæ¯«ç„¡æ„ç¾©çš„ç¤ºè¡†çš„ææ–™å’Œçœ‹å®¢ï¼Œç—…死多少是ä¸å¿…以爲ä¸å¹¸çš„。所以我們的第一è¦è‘—ï¼Œæ˜¯åœ¨æ”¹è®Šä»–å€‘çš„ç²¾ç¥žï¼Œè€Œå–„äºŽæ”¹è®Šç²¾ç¥žçš„æ˜¯ï¼Œæˆ‘é‚£æ™‚ä»¥çˆ²ç•¶ç„¶è¦æŽ¨æ–‡è—,于是想æå€¡æ–‡è—é‹å‹•了。在æ±äº¬çš„留學生很有學法政ç†åŒ–ä»¥è‡³è­¦å¯Ÿå·¥æ¥­çš„ï¼Œä½†æ²’æœ‰äººæ²»æ–‡å­¸å’Œç¾Žè¡“ï¼›å¯æ˜¯åœ¨å†·æ·¡çš„空氣中,也幸而尋到幾個åŒå¿—了,此外åˆé‚€é›†äº†å¿…須的幾個人,商é‡ä¹‹å¾Œï¼Œç¬¬ä¸€æ­¥ç•¶ç„¶æ˜¯å‡ºé›œèªŒï¼Œå目是å–“新的生命â€çš„æ„æ€ï¼Œå› çˆ²æˆ‘們那時大抵帶些復å¤çš„傾å‘,所以åªè¬‚之《新生》。 +《新生》的出版之期接近了,但最先就隱去了若干擔當文字的人,接ç€åˆé€ƒèµ°äº†è³‡æœ¬ï¼Œçµæžœåªå‰©ä¸‹ä¸å一錢的三個人。創始時候旣已背時,失敗時候當然無å¯å¿èªžï¼Œè€Œå…¶å¾Œå»é€£é€™ä¸‰å€‹äººä¹Ÿéƒ½çˆ²å„自的é‹å‘½æ‰€é©…策,ä¸èƒ½åœ¨ä¸€è™•縱談將來的好夢了,這就是我們的並未產生的《新生》的çµå±€ã€‚ +我感到未嘗經驗的無èŠï¼Œæ˜¯è‡ªæ­¤ä»¥å¾Œçš„äº‹ã€‚æˆ‘ç•¶åˆæ˜¯ä¸çŸ¥å…¶æ‰€ä»¥ç„¶çš„;後來想,凡有一人的主張,得了贊和,是促其å‰é€²çš„,得了åå°ï¼Œæ˜¯ä¿ƒå…¶å¥®é¬­çš„ï¼Œç¨æœ‰å«å–ŠäºŽç”Ÿäººä¸­ï¼Œè€Œç”Ÿäººä¸¦ç„¡å應,既éžè´ŠåŒï¼Œä¹Ÿç„¡åå°ï¼Œå¦‚置身毫無邊際的è’åŽŸï¼Œç„¡å¯æŽªæ‰‹çš„äº†ï¼Œé€™æ˜¯æ€Žæ¨£çš„æ‚²å“€å‘µï¼Œæˆ‘äºŽæ˜¯ä»¥æˆ‘æ‰€æ„Ÿåˆ°è€…çˆ²å¯‚å¯žã€‚ +這寂寞åˆä¸€å¤©ä¸€å¤©çš„長大起來,如大毒蛇,çºä½äº†æˆ‘çš„éˆé­‚了。 +然而我雖然自有無端的悲哀,å»ä¹Ÿä¸¦ä¸æ†¤æ‡£ï¼Œå› çˆ²é€™ç¶“驗使我åçœï¼Œçœ‹è¦‹è‡ªå·±äº†ï¼šå°±æ˜¯æˆ‘æ±ºä¸æ˜¯ä¸€å€‹æŒ¯è‡‚一呼應者雲集的英雄。 +åªæ˜¯æˆ‘自己的寂寞是ä¸å¯ä¸é©…除的,因爲這于我太痛苦。我于是用了種種法,來麻醉自己的éˆé­‚,使我沈入于國民中,使我回到å¤ä»£åŽ»ï¼Œå¾Œä¾†ä¹Ÿè¦ªæ­·æˆ–æ—è§€éŽå¹¾æ¨£æ›´å¯‚寞更悲哀的事,都爲我所ä¸é¡˜è¿½æ‡·ï¼Œç”˜å¿ƒä½¿ä»–å€‘å’Œæˆ‘çš„è…¦ä¸€åŒæ¶ˆæ»…在泥土è£çš„,但我的麻醉法å»ä¹Ÿä¼¼ä¹Žå·²ç¶“å¥äº†åŠŸï¼Œå†æ²’有é’å¹´æ™‚å€™çš„æ…·æ…¨æ¿€æ˜‚çš„æ„æ€äº†ã€‚ +Sæœƒé¤¨è£æœ‰ä¸‰é–“屋,相傳是往昔曾在院å­è£çš„æ§æ¨¹ä¸Šç¸Šæ­»éŽä¸€å€‹å¥³äººçš„,ç¾åœ¨æ§æ¨¹å·²ç¶“高ä¸å¯æ”€äº†ï¼Œè€Œé€™å±‹é‚„沒有人ä½ï¼›è¨±å¤šå¹´ï¼Œæˆ‘便寓在這屋è£éˆ”å¤ç¢‘。客中少有人來,å¤ç¢‘中也é‡ä¸åˆ°ä»€éº¼å•題和主義,而我的生命å»å±…然暗暗的消去了,這也就是我惟一的願望。å¤å¤œï¼ŒèšŠå­å¤šäº†ï¼Œä¾¿æ–著蒲扇ååœ¨æ§æ¨¹ä¸‹ï¼Œå¾žå¯†è‘‰ç¸«è£¡çœ‹é‚£ä¸€é»žä¸€é»žçš„é’天,晚出的æ§è ¶åˆæ¯æ¯å†°å†·çš„è½åœ¨é ­é ¸ä¸Šã€‚ +é‚£æ™‚å¶æˆ–ä¾†è«‡çš„æ˜¯ä¸€å€‹è€æœ‹å‹é‡‘心異,將手æçš„大皮夾放在破桌上,脫下長衫,å°é¢å下了,因爲怕狗,似乎心房還在怦怦的跳動。 +â€œä½ éˆ”äº†é€™äº›æœ‰ä»€éº¼ç”¨ï¼Ÿâ€æœ‰ä¸€å¤œï¼Œä»–翻著我那å¤ç¢‘的鈔本,發了研究的質å•了。“沒有什麼用。â€â€œé‚£éº¼ï¼Œä½ éˆ”ä»–æ˜¯ä»€éº¼æ„æ€å‘¢ï¼Ÿâ€â€œæ²’æœ‰ä»€éº¼æ„æ€ã€‚â€â€œæˆ‘想,你å¯ä»¥åšé»žæ–‡ç« â€¦â€¦â€ +æˆ‘æ‡‚å¾—ä»–çš„æ„æ€äº†ï¼Œä»–們正辦《新é’年》,然而那時仿佛ä¸ç‰¹æ²’有人來贊åŒï¼Œä¸¦ä¸”也還沒有人來åå°ï¼Œæˆ‘想,他們許是感到寂寞了,但是說: +“å‡å¦‚一間éµå±‹å­ï¼Œæ˜¯çµ•無窗戶而è¬é›£ç ´æ¯€çš„,è£é¢æœ‰è¨±å¤šç†Ÿç¡çš„人們,ä¸ä¹…éƒ½è¦æ‚¶æ­»äº†ï¼Œç„¶è€Œæ˜¯å¾žæ˜ç¡å…¥æ­»æ»…ï¼Œä¸¦ä¸æ„Ÿåˆ°å°±æ­»çš„æ‚²å“€ã€‚ç¾åœ¨ä½ å¤§åš·èµ·ä¾†ï¼Œé©šèµ·äº†è¼ƒçˆ²æ¸…醒的幾個人,使這ä¸å¹¸çš„少數者來å—ç„¡å¯æŒ½æ•‘的臨終的苦楚,你倒以爲å°å¾—起他們麼?†+“然而幾個人旣然起來,你ä¸èƒ½èªªæ±ºæ²’有毀壞這éµå±‹çš„希望。†+æ˜¯çš„ï¼Œæˆ‘é›–ç„¶è‡ªæœ‰æˆ‘çš„ç¢ºä¿¡ï¼Œç„¶è€Œèªªåˆ°å¸Œæœ›ï¼Œå»æ˜¯ä¸èƒ½æŠ¹æ®ºçš„,因爲希望是在于將來,決ä¸èƒ½ä»¥æˆ‘之必無的證明,來折æœäº†ä»–ä¹‹æ‰€è¬‚å¯æœ‰ï¼ŒäºŽæ˜¯æˆ‘çµ‚äºŽç­”æ‡‰ä»–ä¹Ÿåšæ–‡ç« äº†ï¼Œé€™ä¾¿æ˜¯æœ€åˆçš„一篇《狂人日記》。從此以後,便一發而ä¸å¯æ”¶ï¼Œæ¯å¯«äº›å°èªªæ¨¡æ¨£çš„æ–‡ç« ï¼Œä»¥æ•·è¡æœ‹å‹å€‘的囑托,ç©ä¹…就有了å餘篇。 +在我自己,本以爲ç¾åœ¨æ˜¯å·²ç¶“並éžä¸€å€‹åˆ‡è¿«è€Œä¸èƒ½å·²äºŽè¨€çš„人了,但或者也還未能忘懷于當日自己的寂寞的悲哀罷,所以有時候ä»ä¸å…å¶å–Šå¹¾è²ï¼ŒèŠä»¥æ…°è—‰é‚£åœ¨å¯‚寞è£å¥”é¦³çš„çŒ›å£«ï¼Œä½¿ä»–ä¸æ†šäºŽå‰é©…ã€‚è‡³äºŽæˆ‘çš„å–Šè²æ˜¯å‹‡çŒ›æˆ–æ˜¯æ‚²å“€ï¼Œæ˜¯å¯æ†Žæˆ–是å¯ç¬‘ï¼Œé‚£å€’æ˜¯ä¸æš‡é¡§åŠçš„;但旣然是å¶å–Šï¼Œå‰‡ç•¶ç„¶é ˆè½å°‡ä»¤çš„äº†ï¼Œæ‰€ä»¥æˆ‘å¾€å¾€ä¸æ¤ç”¨äº†æ›²ç­†ï¼Œåœ¨ã€Šè—¥ã€‹çš„瑜兒的墳上平空添上一個花環,在《明天》è£ä¹Ÿä¸æ•單四嫂å­ç«Ÿæ²’有åšåˆ°çœ‹è¦‹å…’å­çš„夢,因爲那時的主將是ä¸ä¸»å¼µæ¶ˆæ¥µçš„。至于自己,å»ä¹Ÿä¸¦ä¸é¡˜å°‡è‡ªä»¥çˆ²è‹¦çš„寂寞,å†ä¾†å‚³æŸ“çµ¦ä¹Ÿå¦‚æˆ‘é‚£å¹´é’æ™‚候似的正åšè‘—好夢的é’年。 +這樣說來,我的å°èªªå’Œè—è¡“çš„è·é›¢ä¹‹é ï¼Œä¹Ÿå°±å¯æƒ³è€ŒçŸ¥äº†ï¼Œç„¶è€Œåˆ°ä»Šæ—¥é‚„能蒙ç€å°èªªçš„å,甚而至于且有æˆé›†çš„æ©Ÿæœƒï¼Œç„¡è«–如何總ä¸èƒ½ä¸èªªæ˜¯ä¸€ä»¶å¾¼å¹¸çš„事,但徼幸雖使我ä¸å®‰äºŽå¿ƒï¼Œè€Œæ‡¸æ£äººé–“暫時還有讀者,則究竟也ä»ç„¶æ˜¯é«˜èˆˆçš„。 +所以我竟將我的短篇å°èªªçµé›†èµ·ä¾†ï¼Œè€Œä¸”付å°äº†ï¼Œåˆå› çˆ²ä¸Šé¢æ‰€èªªçš„緣由,便稱之爲《å¶å–Šã€‹ã€‚ +魯鎭的酒店的格局,是和別處ä¸åŒçš„:都是當街一個曲尺形的大櫃臺,櫃è£é¢è±«å‚™ç€ç†±æ°´ï¼Œå¯ä»¥éš¨æ™‚溫酒。åšå·¥çš„人,å‚åˆå‚æ™šæ•£äº†å·¥ï¼Œæ¯æ¯èŠ±å››æ–‡éŠ…éŒ¢ï¼Œè²·ä¸€ç¢—é…’ï¼Œâ€”â€”é€™æ˜¯äºŒå多年å‰çš„事,ç¾åœ¨æ¯ç¢—è¦æ¼²åˆ°åæ–‡ï¼Œâ€”â€”é æ«ƒå¤–ç«™ç€ï¼Œç†±ç†±çš„å–了休æ¯ï¼›å€˜è‚¯å¤šèŠ±ä¸€æ–‡ï¼Œä¾¿å¯ä»¥è²·ä¸€ç¢Ÿé¹½ç…®ç­ï¼Œæˆ–者茴香豆,åšä¸‹é…’物了,如果出到å幾文,那就能買一樣葷èœï¼Œä½†é€™äº›é¡§å®¢ï¼Œå¤šæ˜¯çŸ­è¡£å¹«ï¼Œå¤§æŠµæ²’æœ‰é€™æ¨£é—Šç¶½ã€‚åªæœ‰ç©¿é•·è¡«çš„,纔踱進店é¢éš”å£çš„æˆ¿å­è£ï¼Œè¦é…’è¦èœï¼Œæ…¢æ…¢åœ°åå–。 +我從å二歲起,便在鎭å£çš„咸亨酒店è£ç•¶å¤¥è¨ˆï¼ŒæŽŒæ«ƒèªªï¼Œæ¨£å­å¤ªå‚»ï¼Œæ€•ä¾å€™ä¸äº†é•·è¡«ä¸»é¡§ï¼Œå°±åœ¨å¤–é¢åšé»žäº‹ç½·ã€‚外é¢çš„短衣主顧,雖然容易說話,但嘮嘮å¨å¨çºå¤¾ä¸æ¸…的也很ä¸å°‘。他們往往è¦è¦ªçœ¼çœ‹ç€é»ƒé…’從罎å­è£èˆ€å‡ºï¼Œçœ‹éŽå£ºå­åº•è£æœ‰æ°´æ²’有,åˆè¦ªçœ‹å°‡å£ºå­æ”¾åœ¨ç†±æ°´è£ï¼Œç„¶å¾Œæ”¾å¿ƒï¼šåœ¨é€™åš´é‡ç›£ç£ä¸‹ï¼Œç¾¼æ°´ä¹Ÿå¾ˆçˆ²é›£ã€‚所以éŽäº†å¹¾å¤©ï¼ŒæŽŒæ«ƒåˆèªªæˆ‘å¹¹ä¸äº†é€™äº‹ã€‚幸虧薦頭的情é¢å¤§ï¼Œè¾­é€€ä¸å¾—,便改爲專管溫酒的一種無èŠè·å‹™äº†ã€‚ +我從此便整天的站在櫃臺è£ï¼Œå°ˆç®¡æˆ‘çš„è·å‹™ã€‚雖然沒有什麼失è·ï¼Œä½†ç¸½è¦ºå¾—有些單調,有些無èŠã€‚æŽŒæ«ƒæ˜¯ä¸€å‰¯å‡¶è‡‰å­”ï¼Œä¸»é¡§ä¹Ÿæ²’æœ‰å¥½è²æ°£ï¼Œæ•™äººæ´»æ½‘ä¸å¾—ï¼›åªæœ‰å­”乙己到店,纔å¯ä»¥ç¬‘å¹¾è²ï¼Œæ‰€ä»¥è‡³ä»Šé‚„記得。 +孔乙己是站ç€å–酒而穿長衫的唯一的人。他身æå¾ˆé«˜å¤§ï¼›é’白臉色,皺紋間時常夾些傷痕;一部亂蓬蓬的花白的é¬å­ã€‚ç©¿çš„é›–ç„¶æ˜¯é•·è¡«ï¼Œå¯æ˜¯åˆé«’åˆç ´ï¼Œä¼¼ä¹Žå多年沒有補,也沒有洗。他å°äººèªªè©±ï¼Œç¸½æ˜¯æ»¿å£ä¹‹ä¹Žè€…ä¹Ÿï¼Œæ•™äººåŠæ‡‚䏿‡‚的。因爲他姓孔,別人便從æç´…紙上的「上大人孔乙己ã€é€™åŠæ‡‚䏿‡‚的話è£ï¼Œæ›¿ä»–å–下一個綽號,å«ä½œå­”乙己。孔乙己一到店,所有å–酒的人便都看ç€ä»–笑,有的å«é“ï¼Œã€Œå­”ä¹™å·±ï¼Œä½ è‡‰ä¸Šåˆæ·»ä¸Šæ–°å‚·ç–¤äº†ï¼ã€ä»–ä¸å›žç­”ï¼Œå°æ«ƒè£èªªï¼Œã€Œæº«å…©ç¢—酒,è¦ä¸€ç¢ŸèŒ´é¦™è±†ã€‚ã€ä¾¿æŽ’å‡ºä¹æ–‡å¤§éŒ¢ã€‚ä»–å€‘åˆæ•…æ„的高è²åš·é“,「你一定åˆå·äº†äººå®¶çš„æ±è¥¿äº†ï¼ã€å­”乙己çœå¤§çœ¼ç›èªªï¼Œã€Œä½ æ€Žéº¼é€™æ¨£æ†‘空汚人清白……ã€ã€Œä»€éº¼æ¸…白?我å‰å¤©è¦ªçœ¼è¦‹ä½ å·äº†ä½•å®¶çš„æ›¸ï¼Œå¼”ç€æ‰“。ã€å­”乙己便漲紅了臉,é¡ä¸Šçš„é’ç­‹æ¢æ¢ç¶»å‡ºï¼Œçˆ­è¾¯é“,「竊書ä¸èƒ½ç®—å·â€¦â€¦ç«Šæ›¸ï¼â€¦â€¦è®€æ›¸äººçš„事,能算å·éº¼ï¼Ÿã€æŽ¥é€£ä¾¿æ˜¯é›£æ‡‚的話,什麼「å›å­å›ºçª®ã€ï¼Œä»€éº¼ã€Œè€…乎ã€ä¹‹é¡žï¼Œå¼•得衆人都哄笑起來:店內外充滿了快活的空氣。 +è½äººå®¶èƒŒåœ°è£è«‡è«–ï¼Œå­”ä¹™å·±åŽŸä¾†ä¹Ÿè®€éŽæ›¸ï¼Œä½†çµ‚于沒有進學,åˆä¸æœƒç‡Ÿç”Ÿï¼›äºŽæ˜¯æ„ˆéŽæ„ˆçª®ï¼Œå¼„到將è¦è¨Žé£¯äº†ã€‚幸而寫得一筆好字,便替人家鈔鈔書,æ›ä¸€ç¢—é£¯å–«ã€‚å¯æƒœä»–åˆæœ‰ä¸€æ¨£å£žè„¾æ°£ï¼Œä¾¿æ˜¯å¥½å–嬾åšã€‚åä¸åˆ°å¹¾å¤©ï¼Œä¾¿é€£äººå’Œæ›¸ç±ç´™å¼µç­†ç¡¯ï¼Œä¸€é½Šå¤±è¹¤ã€‚如是幾次,å«ä»–鈔書的人也沒有了。孔乙己沒有法,便å…ä¸äº†å¶ç„¶åšäº›å·ç«Šçš„事。但他在我們店è£ï¼Œå“è¡Œå»æ¯”åˆ¥äººéƒ½å¥½ï¼Œå°±æ˜¯å¾žä¸æ‹–欠;雖然間或沒有ç¾éŒ¢ï¼Œæš«æ™‚記在粉æ¿ä¸Šï¼Œä½†ä¸å‡ºä¸€æœˆï¼Œå®šç„¶é‚„清,從粉æ¿ä¸Šæ‹­åŽ»äº†å­”ä¹™å·±çš„å字。 +孔乙己å–éŽåŠç¢—酒,漲紅的臉色漸漸復了原,æ—人便åˆå•é“,「孔乙己,你當眞èªè­˜å­—麼?ã€å­”乙己看ç€å•他的人,顯出ä¸å±‘置辯的神氣。他們便接ç€èªªé“,「你怎的連åŠå€‹ç§€æ‰ä¹Ÿæ’ˆä¸åˆ°å‘¢ï¼Ÿã€å­”乙己立刻顯出頹å”ä¸å®‰æ¨¡æ¨£ï¼Œè‡‰ä¸Šç± ä¸Šäº†ä¸€å±¤ç°è‰²ï¼Œå˜´è£èªªäº›è©±ï¼›é€™å›žå¯æ˜¯å…¨æ˜¯ä¹‹ä¹Žè€…ä¹Ÿä¹‹é¡žï¼Œä¸€äº›ä¸æ‡‚了。在這時候,衆人也都哄笑起來:店內外充滿了快活的空氣。 +在這些時候,我å¯ä»¥é™„å’Œç€ç¬‘,掌櫃是決ä¸è²¬å‚™çš„ã€‚è€Œä¸”æŽŒæ«ƒè¦‹äº†å­”ä¹™å·±ï¼Œä¹Ÿæ¯æ¯é€™æ¨£å•他,引人發笑。孔乙己自己知é“ä¸èƒ½å’Œä»–們談天,便åªå¥½å‘å­©å­èªªè©±ã€‚æœ‰ä¸€å›žå°æˆ‘說é“ï¼Œã€Œä½ è®€éŽæ›¸éº¼ï¼Ÿã€æˆ‘ç•¥ç•¥é»žä¸€é»žé ­ã€‚ä»–èªªï¼Œã€Œè®€éŽæ›¸ï¼Œâ€¦â€¦æˆ‘ä¾¿è€ƒä½ ä¸€è€ƒã€‚èŒ´é¦™è±†çš„èŒ´å­—ï¼Œæ€Žæ¨£å¯«çš„ï¼Ÿã€æˆ‘想,討飯一樣的人,也é…考我麼?便回éŽè‡‰åŽ»ï¼Œä¸å†ç†æœƒã€‚孔乙己等了許久,很懇切的說é“,「ä¸èƒ½å¯«ç½·ï¼Ÿâ€¦â€¦æˆ‘教給你,記ç€ï¼é€™äº›å­—應該記ç€ã€‚å°‡ä¾†åšæŽŒæ«ƒçš„æ™‚å€™ï¼Œå¯«è³¬è¦ç”¨ã€‚ã€æˆ‘暗想我和掌櫃的等級還很é å‘¢ï¼Œè€Œä¸”我們掌櫃也從ä¸å°‡èŒ´é¦™è±†ä¸Šè³¬ï¼›åˆå¥½ç¬‘,åˆä¸è€ç…©ï¼Œå¬¾å¬¾çš„答他é“,「誰è¦ä½ æ•™ï¼Œä¸æ˜¯è‰é ­åº•下一個來回的回字麼?ã€å­”乙己顯出極高興的樣å­ï¼Œå°‡å…©å€‹æŒ‡é ­çš„é•·æŒ‡ç”²æ•²ç€æ«ƒè‡ºï¼Œé»žé ­èªªï¼Œã€Œå°å‘€å°å‘€ï¼â€¦â€¦å›žå­—有四樣寫法,你知é“éº¼ï¼Ÿã€æˆ‘愈ä¸è€ç…©äº†ï¼ŒåŠªç€å˜´èµ°é ã€‚孔乙己剛用指甲蘸了酒,想在櫃上寫字,見我毫ä¸ç†±å¿ƒï¼Œä¾¿åˆæ­Žä¸€å£æ°£ï¼Œé¡¯å‡ºæ¥µæƒ‹æƒœçš„æ¨£å­ã€‚ +有幾回,鄰èˆå­©å­è½å¾—笑è²ï¼Œä¹Ÿè¶•熱鬧,åœä½äº†å­”乙己。他便給他們茴香豆喫,一人一顆。孩å­å–«å®Œè±†ï¼Œä»ç„¶ä¸æ•£ï¼Œçœ¼ç›éƒ½æœ›ç€ç¢Ÿå­ã€‚孔乙己ç€äº†æ…Œï¼Œä¼¸é–‹äº”指將碟å­ç½©ä½ï¼Œå½Žè…°ä¸‹åŽ»èªªé“,「ä¸å¤šäº†ï¼Œæˆ‘已經ä¸å¤šäº†ã€‚ã€ç›´èµ·èº«åˆçœ‹ä¸€çœ‹è±†ï¼Œè‡ªå·±æ–頭說,「ä¸å¤šä¸å¤šï¼å¤šä¹Žå“‰ï¼Ÿä¸å¤šä¹Ÿã€‚ã€æ–¼æ˜¯é€™ä¸€ç¾£å­©å­éƒ½åœ¨ç¬‘è²è£èµ°æ•£äº†ã€‚ +å­”ä¹™å·±æ˜¯é€™æ¨£çš„ä½¿äººå¿«æ´»ï¼Œå¯æ˜¯æ²’有他,別人也便這麼éŽã€‚ +有一天,大約是中秋å‰çš„兩三天,掌櫃正在慢慢的çµè³¬ï¼Œå–下粉æ¿ï¼Œå¿½ç„¶èªªï¼Œã€Œå­”乙己長久沒有來了。還欠åä¹å€‹éŒ¢å‘¢ï¼ã€æˆ‘纔也覺得他的確長久沒有來了。一個å–酒的人說é“ï¼Œã€Œä»–æ€Žéº¼æœƒä¾†ï¼Ÿâ€¦â€¦ä»–æ‰“æŠ˜äº†è…¿äº†ã€‚ã€æŽŒæ«ƒèªªï¼Œã€Œå“¦ï¼ã€ã€Œä»–總ä»èˆŠæ˜¯å·ã€‚這一回,是自己發æ˜ï¼Œç«Ÿå·åˆ°ä¸èˆ‰äººå®¶è£åŽ»äº†ã€‚ä»–å®¶çš„æ±è¥¿ï¼Œå·å¾—的麼?ã€ã€Œå¾Œä¾†æ€Žéº¼æ¨£ï¼Ÿã€ã€Œæ€Žéº¼æ¨£ï¼Ÿå…ˆå¯«æœè¾¯ï¼Œå¾Œä¾†æ˜¯æ‰“,打了大åŠå¤œï¼Œå†æ‰“折了腿。ã€ã€Œå¾Œä¾†å‘¢ï¼Ÿã€ã€Œå¾Œä¾†æ‰“折了腿了。ã€ã€Œæ‰“折了怎樣呢?ã€ã€Œæ€Žæ¨£ï¼Ÿâ€¦â€¦èª°æ›‰å¾—ï¼Ÿè¨±æ˜¯æ­»äº†ã€‚ã€æŽŒæ«ƒä¹Ÿä¸å†å•,ä»ç„¶æ…¢æ…¢çš„算他的賬。 +中秋之後,秋風是一天涼比一天,看看將近åˆå†¬ï¼›æˆ‘整天的é ç€ç«ï¼Œä¹Ÿé ˆç©¿ä¸Šæ£‰è¥–了。一天的下åŠå¤©ï¼Œæ²’有一個顧客,我正åˆäº†çœ¼åç€ã€‚忽然間è½å¾—一個è²éŸ³ï¼Œã€Œæº«ä¸€ç¢—酒。ã€é€™è²éŸ³é›–然極低,å»å¾ˆè€³ç†Ÿã€‚看時åˆå…¨æ²’有人。站起來å‘外一望,那孔乙己便在櫃臺下å°äº†é–€æª»åç€ã€‚ä»–è‡‰ä¸Šé»‘è€Œä¸”ç˜¦ï¼Œå·²ç¶“ä¸æˆæ¨£å­ï¼›ç©¿ä¸€ä»¶ç ´å¤¾è¥–,盤ç€å…©è…¿ï¼Œä¸‹é¢å¢Šä¸€å€‹è’²åŒ…,用è‰ç¹©åœ¨è‚©ä¸ŠæŽ›ä½ï¼›è¦‹äº†æˆ‘,åˆèªªé“ï¼Œã€Œæº«ä¸€ç¢—é…’ã€‚ã€æŽŒæ«ƒä¹Ÿä¼¸å‡ºé ­åŽ»ï¼Œä¸€é¢èªªï¼Œã€Œå­”乙己麼?你還欠åä¹å€‹éŒ¢å‘¢ï¼ã€å­”乙己很頹å”的仰é¢ç­”é“,「這……下回還清罷。這一回是ç¾éŒ¢ï¼Œé…’è¦å¥½ã€‚ã€æŽŒæ«ƒä»ç„¶åŒå¹³å¸¸ä¸€æ¨£ï¼Œç¬‘ç€å°ä»–說,「孔乙己,你åˆå·äº†æ±è¥¿äº†ï¼ã€ä½†ä»–這回å»ä¸å分分辯,單說了一å¥ã€Œä¸è¦å–笑ï¼ã€ã€Œå–ç¬‘ï¼Ÿè¦æ˜¯ä¸å·ï¼Œæ€Žéº¼æœƒæ‰“斷腿?ã€å­”乙己低è²èªªé“,「跌斷,跌,跌……ã€ä»–çš„çœ¼è‰²ï¼Œå¾ˆåƒæ‡‡æ±‚掌櫃,ä¸è¦å†æã€‚此時已經èšé›†äº†å¹¾å€‹äººï¼Œä¾¿å’ŒæŽŒæ«ƒéƒ½ç¬‘äº†ã€‚æˆ‘æº«äº†é…’ï¼Œç«¯å‡ºåŽ»ï¼Œæ”¾åœ¨é–€æª»ä¸Šã€‚ä»–å¾žç ´è¡£è¢‹è£æ‘¸å‡ºå››æ–‡å¤§éŒ¢ï¼Œæ”¾åœ¨æˆ‘手è£ï¼Œè¦‹ä»–滿手是泥,原來他便用這手走來的。ä¸ä¸€æœƒï¼Œä»–å–完酒,便åˆåœ¨æ—人的說笑è²ä¸­ï¼Œåç€ç”¨é€™æ‰‹æ…¢æ…¢èµ°åŽ»äº†ã€‚ +自此以後,åˆé•·ä¹…沒有看見孔乙己。到了年關,掌櫃å–下粉æ¿èªªï¼Œã€Œå­”乙己還欠åä¹å€‹éŒ¢å‘¢ï¼ã€åˆ°ç¬¬äºŒå¹´çš„端åˆï¼Œåˆèªªã€Œå­”乙己還欠åä¹å€‹éŒ¢å‘¢ï¼ã€åˆ°ä¸­ç§‹å¯æ˜¯æ²’有說,å†åˆ°å¹´é—œä¹Ÿæ²’有看見他。 +我到ç¾åœ¨çµ‚于沒有見——大約孔乙己的確死了。 +秋天的後åŠå¤œï¼Œæœˆäº®ä¸‹åŽ»äº†ï¼Œå¤ªé™½é‚„æ²’æœ‰å‡ºï¼Œåªå‰©ä¸‹ä¸€ç‰‡çƒè—的天;除了夜éŠçš„æ±è¥¿ï¼Œä»€éº½éƒ½ç¡è‘—。è¯è€æ “忽然å起身,擦ç€ç«æŸ´ï¼Œé»žä¸Šé身油膩的燈盞,茶館的兩間屋å­è£ï¼Œä¾¿å½Œæ»¿äº†é’白的光。 +ã€Œå°æ “çš„çˆ¹ï¼Œä½ å°±åŽ»éº½ï¼Ÿã€æ˜¯ä¸€å€‹è€å¥³äººçš„è²éŸ³ã€‚è£é‚Šçš„å°å±‹å­è£ï¼Œä¹Ÿç™¼å‡ºä¸€é™£å’³å—½ã€‚「唔。ã€è€æ “一é¢è½ï¼Œä¸€é¢æ‡‰ï¼Œä¸€é¢æ‰£ä¸Šè¡£æœï¼›ä¼¸æ‰‹éŽåŽ»èªªï¼Œã€Œä½ çµ¦æˆ‘ç½·ã€‚ã€ +è¯å¤§åª½åœ¨æž•頭底下æŽäº†åŠå¤©ï¼ŒæŽå‡ºä¸€åŒ…æ´‹éŒ¢ï¼Œäº¤çµ¦è€æ “ï¼Œè€æ “接了,抖抖的è£å…¥è¡£è¢‹ï¼Œåˆåœ¨å¤–颿Œ‰äº†å…©ä¸‹ï¼›ä¾¿é»žä¸Šç‡ˆç± ï¼Œå¹ç†„燈盞,走å‘è£å±‹å­åŽ»äº†ã€‚é‚£å±‹å­è£é¢ï¼Œæ­£åœ¨çª¸çª¸çª£çª£çš„éŸ¿ï¼ŒæŽ¥è‘—ä¾¿æ˜¯ä¸€é€šå’³å—½ã€‚è€æ “候他平éœä¸‹åŽ»ï¼Œæ‰ä½Žä½Žçš„å«é“ï¼Œã€Œå°æ “……你ä¸è¦èµ·ä¾†ã€‚……店麽?你娘會安排的。〠+è€æ “è½å¾—å…’å­ä¸å†èªªè©±ï¼Œæ–™ä»–安心ç¡äº†ï¼›ä¾¿å‡ºäº†é–€ï¼Œèµ°åˆ°è¡—ä¸Šã€‚è¡—ä¸Šé»‘æ²ˆæ²ˆçš„ä¸€ç„¡æ‰€æœ‰ï¼Œåªæœ‰ä¸€æ¢ç°ç™½çš„路,看得分明。燈光照ç€ä»–的兩腳,一å‰ä¸€å¾Œçš„走。有時也é‡åˆ°å¹¾éš»ç‹—ï¼Œå¯æ˜¯ä¸€éš»ä¹Ÿæ²’有å«ã€‚天氣比屋å­è£å†·å¤šäº†ï¼›è€æ “倒覺爽快,彷彿一旦變了少年,得了神通,有給人生命的本領似的,跨步格外高é ã€‚而且路也愈走愈分明,天也愈走愈亮了。 +è€æ “正在專心走路,忽然åƒäº†ä¸€é©šï¼Œé é è£çœ‹è¦‹ä¸€æ¢ä¸å­—街,明明白白橫著。他便退了幾步,尋到一家關ç€é–€çš„鋪å­ï¼Œè¹©é€²ç°·ä¸‹ï¼Œé é–€ç«‹ä½äº†ã€‚好一會,身上覺得有些發冷。「哼,è€é ­å­ã€‚ã€ã€Œå€’高興……。〠+è€æ “åˆå–«ä¸€é©šï¼Œçœçœ¼çœ‹æ™‚,幾個人從他é¢å‰éŽåŽ»äº†ã€‚ä¸€å€‹é‚„å›žé ­çœ‹ä»–ï¼Œæ¨£å­ä¸ç”šåˆ†æ˜Žï¼Œä½†å¾ˆåƒä¹…餓的人見了食物一般,眼è£é–ƒå‡ºä¸€ç¨®æ”«å–çš„å…‰ã€‚è€æ “看看燈籠,已經熄了。按一按衣袋,硬硬的還在。仰起頭兩é¢ä¸€æœ›ï¼Œåªè¦‹è¨±å¤šå¤æ€ªçš„人,三三兩兩,鬼似的在那è£å¾˜å¾Šï¼›å®šç›å†çœ‹ï¼Œå»ä¹Ÿçœ‹ä¸å‡ºä»€éº¼åˆ¥çš„奇怪。 +沒有多久,åˆè¦‹å¹¾å€‹å…µï¼Œåœ¨é‚£é‚Šèµ°å‹•;衣æœå‰å¾Œçš„一個大白圓圈,é åœ°è£ä¹Ÿçœ‹å¾—清楚,走éŽé¢å‰çš„,並且看出號衣上暗紅的鑲邊。——一陣腳步è²éŸ¿ï¼Œä¸€çœ¨çœ¼ï¼Œå·²ç¶“æ“éŽäº†ä¸€å¤§ç°‡äººã€‚那三三兩兩的人,也忽然åˆä½œä¸€å †ï¼Œæ½®ä¸€èˆ¬å‘å‰è¶•;將到ä¸å­—è¡—å£ï¼Œä¾¿çªç„¶ç«‹ä½ï¼Œç°‡æˆä¸€å€‹åŠåœ“。 +è€æ “也å‘那邊看,å»åªè¦‹ä¸€å †äººçš„後背;頸項都伸得很長,彷彿許多鴨,被無形的手æ‘ä½äº†çš„,å‘上æç€ã€‚éœäº†ä¸€æœƒï¼Œä¼¼ä¹Žæœ‰é»žè²éŸ³ï¼Œä¾¿åˆå‹•æ–起來,轟的一è²ï¼Œéƒ½å‘å¾Œé€€ï¼›ä¸€ç›´æ•£åˆ°è€æ “ç«‹ç€çš„地方,幾乎將他擠倒了。 +「喂ï¼ä¸€æ‰‹äº¤éŒ¢ï¼Œä¸€æ‰‹äº¤è²¨ï¼ã€ä¸€å€‹æ¸¾èº«é»‘è‰²çš„äººï¼Œç«™åœ¨è€æ “é¢å‰ï¼Œçœ¼å…‰æ­£åƒå…©æŠŠåˆ€ï¼Œåˆºå¾—è€æ “縮å°äº†ä¸€åŠã€‚那人一隻大手,å‘他攤ç€ï¼›ä¸€é𻿉‹å»æ’®ç€ä¸€å€‹é®®ç´…的饅頭,那紅的還是一點一點的往下滴。 +è€æ “慌忙摸出洋錢,抖抖的想交給他,å»åˆä¸æ•¢åŽ»æŽ¥ä»–çš„æ±è¥¿ã€‚那人便焦急起來,嚷é“ï¼Œã€Œæ€•ä»€éº¼ï¼Ÿæ€Žçš„ä¸æ‹¿ï¼ã€è€æ “還躊躇ç€ï¼›é»‘的人便æ¶éŽç‡ˆç± ï¼Œä¸€æŠŠæ‰¯ä¸‹ç´™ç½©ï¼Œè£¹äº†é¥…é ­ï¼Œå¡žèˆ‡è€æ “ï¼›ä¸€æ‰‹æŠ“éŽæ´‹éŒ¢ï¼Œæ‘一æ‘,轉身去了。嘴è£å“¼ç€èªªï¼Œã€Œé€™è€æ±è¥¿â€¦â€¦ã€‚〠+「這給誰治病的呀?ã€è€æ “也似乎è½å¾—有人å•他,但他並ä¸ç­”應;他的精神,ç¾åœ¨åªåœ¨ä¸€å€‹åŒ…上,彷彿抱ç€ä¸€å€‹å世單傳的嬰兒,別的事情,都已置之度外了。他ç¾åœ¨è¦å°‡é€™åŒ…è£çš„æ–°çš„生命,移æ¤åˆ°ä»–å®¶è£ï¼Œæ”¶ç©«è¨±å¤šå¹¸ç¦ã€‚太陽也出來了;在他é¢å‰ï¼Œé¡¯å‡ºä¸€æ¢å¤§é“,直到他家中,後é¢ä¹Ÿç…§è¦‹ä¸å­—街頭破匾上「å¤å£äº­å£ã€é€™å››å€‹é»¯æ·¡çš„金字。 +è€æ “èµ°åˆ°å®¶ï¼Œåº—é¢æ—©ç¶“æ”¶æ‹¾ä¹¾æ·¨ï¼Œä¸€æŽ’ä¸€æŽ’çš„èŒ¶æ¡Œï¼Œæ»‘æºœæºœçš„ç™¼å…‰ã€‚ä½†æ˜¯æ²’æœ‰å®¢äººï¼›åªæœ‰å°æ “ååœ¨è£æŽ’çš„æ¡Œå‰åƒé£¯ï¼Œå¤§ç²’的汗,從é¡ä¸Šæ»¾ä¸‹ï¼Œå¤¾è¥–也帖ä½äº†è„Šå¿ƒï¼Œå…©å¡Šè‚©èƒ›éª¨é«˜é«˜å‡¸å‡ºï¼Œå°æˆä¸€å€‹é™½æ–‡çš„「八字ã€ã€‚è€æ “見這樣å­ï¼Œä¸å…皺一皺展開的眉心。他的女人,從竈下急急走出,çœç€çœ¼ç›ï¼Œå˜´å”‡æœ‰äº›ç™¼æŠ–。「得了麼?ã€ã€Œå¾—了。〠+兩個人一齊走進竈下,商é‡äº†ä¸€æœƒï¼›è¯å¤§åª½ä¾¿å‡ºåŽ»äº†ï¼Œä¸å¤šæ™‚,æ‹ç€ä¸€ç‰‡è€è·è‘‰å›žä¾†ï¼Œæ”¤åœ¨æ¡Œä¸Šã€‚è€æ “也打開燈籠罩,用è·è‘‰é‡æ–°åŒ…äº†é‚£ç´…çš„é¥…é ­ã€‚å°æ “也åƒå®Œé£¯ï¼Œä»–çš„æ¯è¦ªæ…Œå¿™èªªï¼šã€Œå°æ “——你åç€ï¼Œä¸è¦åˆ°é€™è£ä¾†ã€‚ã€ä¸€é¢æ•´é “了竈ç«ï¼Œè€æ “便把一個碧綠的包,一個紅紅白白的破燈籠,一åŒå¡žåœ¨ç«ˆè£ï¼›ä¸€é™£ç´…黑的ç«ç„°éŽåŽ»æ™‚ï¼Œåº—å±‹è£æ•£æ»¿äº†ä¸€ç¨®å¥‡æ€ªçš„香味。 +「好香ï¼ä½ å€‘åƒä»€éº¼é»žå¿ƒå‘€ï¼Ÿã€é€™æ˜¯é§èƒŒäº”少爺到了。這人æ¯å¤©ç¸½åœ¨èŒ¶é¤¨è£éŽæ—¥ï¼Œä¾†å¾—最早,去得最é²ï¼Œæ­¤æ™‚æ°æ°è¹©åˆ°è‡¨è¡—çš„å£è§’的桌邊,便å下å•話,然而沒有人答應他。「炒米粥麽?ã€ä»ç„¶æ²’æœ‰äººæ‡‰ã€‚è€æ “匆匆走出,給他泡上茶。 +ã€Œå°æ “進來罷ï¼ã€è¯å¤§åª½å«å°æ “進了è£é¢çš„屋å­ï¼Œä¸­é–“放好一æ¢å‡³ï¼Œå°æ “å了。他的æ¯è¦ªç«¯éŽä¸€ç¢Ÿçƒé»‘的圓æ±è¥¿ï¼Œè¼•輕說:——「喫下去罷,——病便好了。〠+å°æ “撮起這黑æ±è¥¿ï¼Œçœ‹äº†ä¸€æœƒï¼Œä¼¼ä¹Žæ‹ç€è‡ªå·±çš„æ€§å‘½ä¸€èˆ¬ï¼Œå¿ƒè£èªªä¸å‡ºçš„奇怪。å分å°å¿ƒçš„æ‹—開了,焦皮è£é¢ç«„出一é“白氣,白氣散了,是兩åŠå€‹ç™½éºµçš„饅頭。——ä¸å¤šå·¥å¤«ï¼Œå·²ç¶“全在肚è£äº†ï¼Œå»å…¨å¿˜äº†ä»€éº¼å‘³ï¼›é¢å‰åªå‰©ä¸‹ä¸€å¼µç©ºç›¤ã€‚ä»–çš„æ—邊,一é¢ç«‹ç€ä»–的父親,一é¢ç«‹ç€ä»–çš„æ¯è¦ªï¼Œå…©äººçš„眼光,都彷彿è¦åœ¨ä»–èº«è£æ³¨é€²ä»€éº½åˆè¦å–出什麽似的;便ç¦ä¸ä½å¿ƒè·³èµ·ä¾†ï¼ŒæŒ‰ç€èƒ¸è†›ï¼Œåˆæ˜¯ä¸€é™£å’³å—½ã€‚ +「ç¡ä¸€æœƒç½·ï¼Œâ€”—便好了。〠+å°æ “ä¾ä»–æ¯è¦ªçš„話,咳ç€ç¡äº†ã€‚è¯å¤§åª½å€™ä»–喘氣平éœï¼Œæ‰è¼•輕的給他蓋上了滿幅補釘的夾被。 +店è£åç€è¨±å¤šäººï¼Œè€æ “也忙了,æç€å¤§éŠ…å£ºï¼Œä¸€è¶Ÿä¸€è¶Ÿçš„çµ¦å®¢äººæ²–èŒ¶ï¼›å…©å€‹çœ¼çœ¶ï¼Œéƒ½åœç€ä¸€åœˆé»‘線。 +ã€Œè€æ “,你有些ä¸èˆ’æœéº½ï¼Ÿâ€”—你生病麽?ã€ä¸€å€‹èŠ±ç™½é¬å­çš„人說。「沒有。〠+「沒有?——我想笑嘻嘻的,原也ä¸åƒâ€¦â€¦ã€èŠ±ç™½é¬å­ä¾¿å–消了自己的話。 +ã€Œè€æ “åªæ˜¯å¿™ã€‚è¦æ˜¯ä»–的兒å­â€¦â€¦ã€é§èƒŒäº”少爺話還未完,çªç„¶é—–進了一個滿臉橫肉的人,披一件玄色布衫,散ç€ç´æ‰£ï¼Œç”¨å¾ˆå¯¬çš„玄色腰帶,胡亂æ†åœ¨è…°é–“。剛進門,便å°è€æ “åš·é“: +「åƒäº†éº½ï¼Ÿå¥½äº†éº½ï¼Ÿè€æ “ï¼Œå°±æ˜¯é‹æ°£äº†ä½ ï¼ä½ é‹æ°£ï¼Œè¦ä¸æ˜¯æˆ‘ä¿¡æ¯éˆâ€¦â€¦ã€‚〠+è€æ “一手æäº†èŒ¶å£ºï¼Œä¸€æ‰‹æ­æ­æ•¬æ•¬çš„åž‚ç€ï¼›ç¬‘嘻嘻的è½ã€‚æ»¿åº§çš„äººï¼Œä¹Ÿéƒ½æ­æ­æ•¬æ•¬çš„è½ã€‚è¯å¤§åª½ä¹Ÿé»‘ç€çœ¼çœ¶ï¼Œç¬‘嘻嘻的é€å‡ºèŒ¶ç¢—èŒ¶è‘‰ä¾†ï¼ŒåŠ ä¸Šä¸€å€‹æ©„æ¬–ï¼Œè€æ “便去沖了水。 +「這是包好ï¼é€™æ˜¯èˆ‡çœ¾ä¸åŒçš„。你想,è¶ç†±çš„æ‹ä¾†ï¼Œè¶ç†±åƒä¸‹ã€‚ã€æ©«è‚‰çš„äººåªæ˜¯åš·ã€‚ +ã€ŒçœŸçš„å‘¢ï¼Œè¦æ²’有康大å”照顧,怎麽會這樣……ã€è¯å¤§åª½ä¹Ÿå¾ˆæ„Ÿæ¿€çš„è¬ä»–。 +「包好,包好ï¼é€™æ¨£çš„è¶ç†±åƒä¸‹ã€‚這樣的人血饅頭,什麽癆病都包好ï¼ã€ +è¯å¤§åª½è½åˆ°ã€Œç™†ç—…ã€é€™å…©å€‹å­—,變了一點臉色,似乎有些ä¸é«˜èˆˆï¼›ä½†åˆç«‹åˆ»å †ä¸Šç¬‘,æ­è¨•ç€èµ°é–‹äº†ã€‚這康大å”廿²’有覺察,ä»ç„¶æé«˜äº†å–‰åš¨åªæ˜¯åš·ï¼Œåš·å¾—è£é¢ç¡ç€çš„å°æ “也åˆå¤¥å’³å—½èµ·ä¾†ã€‚ +ã€ŒåŽŸä¾†ä½ å®¶å°æ “ç¢°åˆ°äº†é€™æ¨£çš„å¥½é‹æ°£äº†ã€‚這病自然一定全好;怪ä¸å¾—è€æ “整天的笑ç€å‘¢ã€‚ã€èŠ±ç™½é¬å­ä¸€é¢èªªï¼Œä¸€é¢èµ°åˆ°åº·å¤§å”é¢å‰ï¼Œä½Žè²ä¸‹æ°£çš„å•é“,「康大å”——è½èªªä»Šå¤©çµæžœçš„一個犯人,便是å¤å®¶çš„å­©å­ï¼Œé‚£æ˜¯èª°çš„å­©å­ï¼Ÿç©¶ç«Ÿæ˜¯ä»€éº¼äº‹ï¼Ÿã€ +「誰的?ä¸å°±æ˜¯å¤å››å¥¶å¥¶çš„å…’å­éº½ï¼Ÿé‚£å€‹å°å‚¢ä¼™ï¼ã€åº·å¤§å”見眾人都è³èµ·è€³æœµè½ä»–,便格外高興,橫肉塊塊飽綻,越發大è²èªªï¼Œã€Œé€™å°æ±è¥¿ä¸è¦å‘½ï¼Œä¸è¦å°±æ˜¯äº†ã€‚æˆ‘å¯æ˜¯é€™ä¸€å›žä¸€é»žæ²’有得到好處;連å‰ä¸‹ä¾†çš„è¡£æœï¼Œéƒ½çµ¦ç®¡ç‰¢çš„紅眼ç›é˜¿ç¾©æ‹åŽ»äº†ã€‚â€”â€”ç¬¬ä¸€è¦ç®—我們栓å”鋿°£ï¼›ç¬¬äºŒæ˜¯å¤ä¸‰çˆºè³žäº†äºŒå五兩雪白的銀å­ï¼Œç¨è‡ªè½è…°åŒ…,一文ä¸èŠ±ã€‚ã€ +å°æ “慢慢的從å°å±‹å­è£èµ°å‡ºï¼Œå…©æ‰‹æŒ‰äº†èƒ¸å£ï¼Œä¸ä½çš„咳嗽;走到竈下,盛出一碗冷飯,泡上熱水,å下便åƒã€‚è¯å¤§åª½è·Ÿç€ä»–走,輕輕的å•é“ï¼Œã€Œå°æ “,你好些麽?——你ä»èˆŠåªæ˜¯è‚šé¤“?……〠+「包好,包好ï¼ã€åº·å¤§å”çž¥äº†å°æ “一眼,ä»ç„¶å›žéŽè‡‰ï¼Œå°çœ¾äººèªªï¼Œã€Œå¤ä¸‰çˆºçœŸæ˜¯ä¹–è§’å…’ï¼Œè¦æ˜¯ä»–ä¸å…ˆå‘Šå®˜ï¼Œé€£ä»–滿門抄斬。ç¾åœ¨æ€Žæ¨£ï¼ŸéŠ€å­ï¼â€”â€”é€™å°æ±è¥¿ä¹ŸçœŸä¸æˆæ±è¥¿ï¼é—œåœ¨ç‰¢è£ï¼Œé‚„è¦å‹¸ç‰¢é ­é€ å。〠+「阿呀,那還了得。ã€å在後排的一個二å多歲的人,很ç¾å‡ºæ°£æ†¤æ¨¡æ¨£ã€‚ +ã€Œä½ è¦æ›‰å¾—紅眼ç›é˜¿ç¾©æ˜¯åŽ»ç›¤ç›¤åº•ç´°çš„ï¼Œä»–å»å’Œä»–攀談了。他說:這大清的天下是我們大家的。你想:這是人話麽?紅眼ç›åŽŸçŸ¥é“ä»–å®¶è£åªæœ‰ä¸€å€‹è€å¨˜ï¼Œå¯æ˜¯æ²’有料到他竟會那麽窮,æ¾ä¸å‡ºä¸€é»žæ²¹æ°´ï¼Œå·²ç¶“氣破肚皮了。他還è¦è€è™Žé ­ä¸Šæ”癢,便給他兩個嘴巴ï¼ã€ +「義哥是一手好拳棒,這兩下,一定夠他å—用了。ã€å£è§’çš„é§èƒŒå¿½ç„¶é«˜èˆˆèµ·ä¾†ã€‚ +ã€Œä»–é€™è³¤éª¨é ­æ‰“ä¸æ€•,還è¦èªªå¯æ†å¯æ†å“©ã€‚〠+花白é¬å­çš„人說,「打了這種æ±è¥¿ï¼Œæœ‰ä»€éº½å¯æ†å‘¢ï¼Ÿã€ +康大å”顯出看他ä¸ä¸Šçš„æ¨£å­ï¼Œå†·ç¬‘ç€èªªï¼Œã€Œä½ æ²’æœ‰è½æ¸…æˆ‘çš„è©±ï¼›çœ‹ä»–ç¥žæ°£ï¼Œæ˜¯èªªé˜¿ç¾©å¯æ†å“©ï¼ã€ +è½ç€çš„äººçš„çœ¼å…‰ï¼Œå¿½ç„¶æœ‰äº›æ¿æ»¯ï¼›è©±ä¹Ÿåœé “äº†ã€‚å°æ “已經åƒå®Œé£¯ï¼Œåƒå¾—æ»¿èº«æµæ±—,頭上都冒出蒸氣來。 +ã€Œé˜¿ç¾©å¯æ†â€”—瘋話,簡直是發了瘋了。ã€èŠ±ç™½é¬å­æç„¶å¤§æ‚Ÿä¼¼çš„說。 +「發了瘋了。ã€äºŒå多歲的人也æç„¶å¤§æ‚Ÿçš„說。 +店è£çš„å客,便åˆç¾å‡ºæ´»æ°£ï¼Œè«‡ç¬‘èµ·ä¾†ã€‚å°æ “也è¶ç€ç†±é¬§ï¼Œæ‹šå‘½å’³å—½ï¼›åº·å¤§å”走上å‰ï¼Œæ‹ä»–肩膀說: +「包好ï¼å°æ “——你ä¸è¦é€™éº¼å’³ã€‚包好ï¼ã€ +「瘋了。ã€é§èƒŒäº”少爺點ç€é ­èªªã€‚ +西關外é ç€åŸŽæ ¹çš„地é¢ï¼Œæœ¬æ˜¯ä¸€å¡Šå®˜åœ°ï¼›ä¸­é–“歪歪斜斜一æ¢ç´°è·¯ï¼Œæ˜¯è²ªèµ°ä¾¿é“的人,用鞋底造æˆçš„ï¼Œä½†å»æˆäº†è‡ªç„¶çš„界é™ã€‚è·¯çš„å·¦é‚Šï¼Œéƒ½åŸ‹ç€æ­»åˆ‘å’Œç˜æ–ƒçš„人,å³é‚Šæ˜¯çª®äººçš„å¢å¡šã€‚å…©é¢éƒ½å·²åŸ‹åˆ°å±¤å±¤ç–Šç–Šï¼Œå®›ç„¶é—Šäººå®¶è£ç¥å£½æ™‚候的饅頭。 +這一年的清明,分外寒冷;楊柳æ‰å出åŠç²’米大的新芽。天明未久,è¯å¤§åª½å·²åœ¨å³é‚Šçš„䏀忖°å¢³å‰é¢ï¼ŒæŽ’出四碟èœï¼Œä¸€ç¢—飯,哭了一場。化éŽç´™ï¼Œå‘†å‘†çš„å在地上;彷彿等候什麽似的,但自己也說ä¸å‡ºç­‰å€™ä»€éº½ã€‚微風起來,å¹å‹•他短髮,確乎比去年白得多了。 +å°è·¯ä¸Šåˆä¾†äº†ä¸€å€‹å¥³äººï¼Œä¹Ÿæ˜¯åŠç™½é ­é«®ï¼Œè¥¤è¤¸çš„衣裙;æä¸€å€‹ç ´èˆŠçš„æœ±æ¼†åœ“籃,外掛一串紙錠,三步一歇的走。忽然見è¯å¤§åª½å在地上看他,便有些躊躇,慘白的臉上,ç¾å‡ºäº›ç¾žæ„§çš„é¡è‰²ï¼›ä½†çµ‚於硬ç€é ­çš®ï¼Œèµ°åˆ°å·¦é‚Šçš„一å墳å‰ï¼Œæ”¾ä¸‹äº†ç±ƒå­ã€‚ +é‚£å¢³èˆ‡å°æ “的墳,一字兒排ç€ï¼Œä¸­é–“åªéš”一æ¢å°è·¯ã€‚è¯å¤§åª½çœ‹ä»–排好四碟èœï¼Œä¸€ç¢—飯,立ç€å“­äº†ä¸€é€šï¼ŒåŒ–éŽç´™éŒ ï¼›å¿ƒè£æš—暗地想,「這墳è£çš„也是兒å­äº†ã€‚ã€é‚£è€å¥³äººå¾˜å¾Šè§€æœ›äº†ä¸€å›žï¼Œå¿½ç„¶æ‰‹è…³æœ‰äº›ç™¼æŠ–,蹌蹌踉踉退下幾步,瞪ç€çœ¼åªæ˜¯ç™¼æ€”。 +è¯å¤§åª½è¦‹é€™æ¨£å­ï¼Œç”Ÿæ€•他傷心到快è¦ç™¼ç‹‚了;便å¿ä¸ä½ç«‹èµ·èº«ï¼Œè·¨éŽå°è·¯ï¼Œä½Žè²å°ä»–說,「你這ä½è€å¥¶å¥¶ä¸è¦å‚·å¿ƒäº†ï¼Œâ€”—我們還是回去罷。〠+那人點一點頭,眼ç›ä»ç„¶å‘上瞪ç€ï¼›ä¹Ÿä½Žè²åƒåƒçš„說é“,「你看,——看這是什麽呢?〠+è¯å¤§åª½è·Ÿäº†ä»–指頭看去,眼光便到了å‰é¢çš„å¢³ï¼Œé€™å¢³ä¸Šè‰æ ¹é‚„沒有全åˆï¼Œéœ²å‡ºä¸€å¡Šä¸€å¡Šçš„黃土,煞是難看。å†å¾€ä¸Šä»”細看時,å»ä¸è¦ºä¹Ÿåƒä¸€é©šï¼›â€”—分明有一圈紅白的花,åœç€é‚£å°–圓的墳頂。 +他們的眼ç›éƒ½å·²è€èŠ±å¤šå¹´äº†ï¼Œä½†æœ›é€™ç´…ç™½çš„èŠ±ï¼Œå»é‚„能明白看見。花也ä¸å¾ˆå¤šï¼Œåœ“圓的排æˆä¸€å€‹åœˆï¼Œä¸å¾ˆç²¾ç¥žï¼Œå€’也整齊。è¯å¤§åª½å¿™çœ‹ä»–å…’å­å’Œåˆ¥äººçš„墳,å»åªæœ‰ä¸æ€•冷的幾點é’白å°èŠ±ï¼Œé›¶æ˜Ÿé–‹ç€ï¼›ä¾¿è¦ºå¾—心è£å¿½ç„¶æ„Ÿåˆ°ä¸€ç¨®ä¸è¶³å’Œç©ºè™›ï¼Œä¸é¡˜æ„根究。那è€å¥³äººåˆèµ°è¿‘幾步,細看了一é,自言自語的說,「這沒有根,ä¸åƒè‡ªå·±é–‹çš„。——這地方有誰來呢?孩å­ä¸æœƒä¾†çŽ©ï¼›â€”â€”è¦ªæˆšæœ¬å®¶æ—©ä¸ä¾†äº†ã€‚——這是怎麼一回事呢?ã€ä»–æƒ³äº†åˆæƒ³ï¼Œå¿½åˆæµä¸‹æ·šä¾†ï¼Œå¤§è²èªªé“: +「瑜兒,他們都冤枉了你,你還是忘ä¸äº†ï¼Œå‚·å¿ƒä¸éŽï¼Œä»Šå¤©ç‰¹æ„顯點éˆï¼Œè¦æˆ‘知é“麽?ã€ä»–å››é¢ä¸€çœ‹ï¼Œåªè¦‹ä¸€éš»çƒé´‰ï¼Œç«™åœ¨ä¸€æ ªæ²’有葉的樹上,便接ç€èªªï¼Œã€Œæˆ‘知é“äº†ã€‚â€”â€”ç‘œå…’ï¼Œå¯æ†ä»–們å‘了你,他們將來總有報應,天都知é“;你閉了眼ç›å°±æ˜¯äº†ã€‚——你如果真在這è£ï¼Œè½åˆ°æˆ‘的話,——便教這çƒé´‰é£›ä¸Šä½ çš„墳頂,給我看罷。〠+å¾®é¢¨æ—©ç¶“åœæ¯äº†ï¼›æž¯è‰æ”¯æ”¯ç›´ç«‹ï¼Œæœ‰å¦‚銅絲。一絲發抖的è²éŸ³ï¼Œåœ¨ç©ºæ°£ä¸­æ„ˆé¡«æ„ˆç´°ï¼Œç´°åˆ°æ²’有,周åœä¾¿éƒ½æ˜¯æ­»ä¸€èˆ¬éœã€‚兩人站在枯è‰å¢è£ï¼Œä»°é¢çœ‹é‚£çƒé´‰ï¼›é‚£çƒé´‰ä¹Ÿåœ¨ç­†ç›´çš„æ¨¹æžé–“,縮ç€é ­ï¼Œéµé‘„一般站著。 +許多的工夫éŽåŽ»äº†ï¼›ä¸Šå¢³çš„äººæ¼¸æ¼¸å¢žå¤šï¼Œå¹¾å€‹è€çš„å°çš„,在土墳間出沒。 +è¯å¤§åª½ä¸çŸ¥æ€Žçš„,似乎å¸ä¸‹äº†ä¸€æŒ‘釿“”,便想到è¦èµ°ï¼›ä¸€é¢å‹¸ç€èªªï¼Œã€Œæˆ‘們還是回去罷。〠+é‚£è€å¥³äººå˜†ä¸€å£æ°£ï¼Œç„¡ç²¾æ‰“采的收起飯èœï¼›åˆé²ç–‘了一刻,終於慢慢地走了。嘴è£è‡ªè¨€è‡ªèªžçš„說,「這是怎麼一回事呢?……〠+他們走ä¸ä¸ŠäºŒä¸‰åæ­¥é ï¼Œå¿½è½å¾—背後「啞——ã€çš„一è²å¤§å«ï¼›å…©å€‹äººéƒ½ç«¦ç„¶çš„回éŽé ­ï¼Œåªè¦‹é‚£çƒé´‰å¼µé–‹å…©ç¿…,一挫身,直å‘ç€é è™•的天空,箭也似的飛去了。 +ä½åœ¨æˆ‘們後進院å­è£çš„三太太,在å¤é–“買了一å°ç™½å…”,是給伊的孩å­å€‘看的。 +這一å°ç™½å…”,似乎離娘並ä¸ä¹…,雖然是異類,也å¯ä»¥çœ‹å‡ºä»–們的天真爛熳來。但也豎直了å°å°çš„通紅的長耳朵,動著鼻å­ï¼Œçœ¼ç›è£é —ç¾äº›é©šç–‘的神色,大約究竟覺得人地生ç–,沒有在è€å®¶æ™‚候的安心了。這種æ±è¥¿ï¼Œå€˜åˆ°å»Ÿæœƒæ—¥æœŸè‡ªå·±å‡ºåŽ»è²·ï¼Œæ¯å€‹è‡³å¤šä¸éŽå…©å¼”錢,而三太太å»èŠ±äº†ä¸€å…ƒï¼Œå› ç‚ºæ˜¯å«å°ä½¿ä¸Šåº—買來的。 +å­©å­å€‘自然大得æ„了,嚷著åœä½äº†çœ‹ï¼›å¤§äººä¹Ÿéƒ½åœè‘—看;還有一匹å°ç‹—åå«S的也跑來,闖éŽåŽ»ä¸€å—…ï¼Œæ‰“äº†ä¸€å€‹å™´åšï¼Œé€€äº†å¹¾æ­¥ã€‚三太太å†å–é“,「S,è½è‘—,ä¸å‡†ä½ å’¬ä»–ï¼ã€æ–¼æ˜¯åœ¨ä»–頭上打了一拳,S便退開了,從此並ä¸å’¬ã€‚ +這一å°å…”總是關在後窗後é¢çš„å°é™¢å­è£çš„æ™‚候多,è½èªªæ˜¯å› ç‚ºå¤ªå–œæ­¡æ’•å£ç´™ï¼Œä¹Ÿå¸¸å¸¸å•ƒæœ¨å™¨è…³ã€‚這å°é™¢å­è£æœ‰ä¸€æ ªé‡Žæ¡‘樹,桑å­è½åœ°ï¼Œä»–們最愛åƒï¼Œä¾¿é€£å–‚他們的è èœä¹Ÿä¸åƒäº†ã€‚çƒé´‰å–œéµ²æƒ³è¦ä¸‹ä¾†æ™‚,他們便躬著身å­ç”¨å¾Œè…³åœ¨åœ°ä¸Šä½¿å‹çš„一彈,砉的一è²ç›´è·³ä¸Šä¾†ï¼Œåƒé£›èµ·äº†ä¸€åœ˜é›ªï¼Œé´‰éµ²åš‡å¾—趕緊走,這樣的幾回,å†ä¹Ÿä¸æ•¢è¿‘ä¾†äº†ã€‚ä¸‰å¤ªå¤ªèªªï¼Œé´‰éµ²åˆ°ä¸æ‰“緊,至多也ä¸éŽæ¶åƒä¸€é»žé£Ÿæ–™ï¼Œå¯æƒ¡çš„æ˜¯ä¸€åŒ¹å¤§é»‘貓,常在矮牆上惡狠狠的看,這å»è¦é˜²çš„,幸而S和貓是å°é ­ï¼Œæˆ–者還ä¸è‡³æ–¼æœ‰ä»€éº¼ç½·ã€‚ +å­©å­å€‘時時æ‰ä»–們來玩è€ï¼›ä»–們很和氣,豎起耳朵,動著鼻å­ï¼Œé¦´è‰¯çš„ç«™åœ¨å°æ‰‹çš„圈å­è£ï¼Œä½†ä¸€æœ‰ç©ºï¼Œå»ä¹Ÿå°±æºœé–‹åŽ»äº†ã€‚ä»–å€‘å¤œè£çš„è‡¥æ¦»æ˜¯ä¸€å€‹å°æœ¨ç®±ï¼Œè£é¢é‹ªäº›ç¨»è‰ï¼Œå°±åœ¨å¾Œçª—的房æªä¸‹ã€‚ +這樣的幾個月之後,他們忽而自己掘土了,掘得éžå¸¸å¿«ï¼Œå‰è…³ä¸€æŠ“,後腳一踢,ä¸åˆ°åŠå¤©ï¼Œå·²ç¶“掘æˆä¸€å€‹æ·±æ´žã€‚å¤§å®¶éƒ½å¥‡æ€ªï¼Œå¾Œä¾†ä»”ç´°çœ‹æ™‚ï¼ŒåŽŸä¾†ä¸€å€‹çš„è‚šå­æ¯”別一個的大得多了。他們第二天便將乾è‰å’Œæ¨¹è‘‰éŠœé€²æ´žè£åŽ»ï¼Œå¿™äº†å¤§åŠå¤©ã€‚ +å¤§å®¶éƒ½é«˜èˆˆï¼Œèªªåˆæœ‰å°å…”å¯çœ‹äº†ï¼›ä¸‰å¤ªå¤ªä¾¿å°å­©å­å€‘下了戒嚴令,從此ä¸è¨±å†åŽ»æ‰ã€‚我的æ¯è¦ªä¹Ÿå¾ˆå–œæ­¡ä»–們家æ—çš„ç¹æ¦®ï¼Œé‚„說待生下來的離了乳,也è¦åŽ»è¨Žå…©åŒ¹ä¾†é¤Šåœ¨è‡ªå·±çš„çª—å¤–é¢ã€‚ +他們從此便ä½åœ¨è‡ªé€ çš„æ´žåºœè£ï¼Œæœ‰æ™‚也出來åƒäº›é£Ÿï¼Œå¾Œä¾†ä¸è¦‹äº†ï¼Œå¯ä¸çŸ¥é“他們是é å…ˆé‹ç³§å­˜åœ¨è£é¢å‘¢é‚„是竟ä¸åƒã€‚éŽäº†åå¤šå¤©ï¼Œä¸‰å¤ªå¤ªå°æˆ‘說,那兩匹åˆå‡ºä¾†äº†ï¼Œå¤§ç´„å°å…”是生下來åˆéƒ½æ­»æŽ‰äº†ï¼Œå› ç‚ºé›Œçš„一匹的奶éžå¸¸å¤šï¼Œå»ä¸¦ä¸è¦‹æœ‰é€²åŽ»å“ºé¤Šå­©å­çš„形跡。伊言語之間頗氣憤,然而也沒有法。 +有一天,太陽很溫暖,也沒有風,樹葉都ä¸å‹•,我忽è½å¾—許多人在那è£ç¬‘,尋è²çœ‹æ™‚,å»è¦‹è¨±å¤šäººéƒ½é è‘—三太太的後窗看:原來有一個å°å…”,在院å­è£è·³èºäº†ã€‚這比他的父æ¯è²·ä¾†çš„æ™‚候還å°å¾—é ï¼Œä½†ä¹Ÿå·²ç¶“能用後腳一彈地,迸跳起來了。孩å­å€‘爭著告訴我說,還看見一個å°å…”到洞å£ä¾†æŽ¢ä¸€æŽ¢é ­ï¼Œä½†æ˜¯å³åˆ»ä¾¿ç¸®å›žåŽ»äº†ï¼Œé‚£è©²æ˜¯ä»–çš„å¼Ÿå¼Ÿç½·ã€‚ +é‚£å°çš„也撿些è‰è‘‰åƒï¼Œç„¶è€Œå¤§çš„似乎ä¸è¨±ä»–,往往夾å£çš„æ¶åŽ»äº†ï¼Œè€Œè‡ªå·±ä¸¦ä¸åƒã€‚å­©å­å€‘笑得響,那å°çš„終於åƒé©šäº†ï¼Œä¾¿è·³è‘—鑽進洞è£åŽ»ï¼›å¤§çš„ä¹Ÿè·Ÿåˆ°æ´žé–€å£ï¼Œç”¨å‰è…³æŽ¨è‘—他的孩å­çš„脊樑,推進之後,åˆçˆ¬é–‹æ³¥åœŸä¾†å°äº†æ´žã€‚ +從此å°é™¢å­è£æ›´ç†±é¬§ï¼Œçª—å£ä¹Ÿæ™‚時有人窺探了。 +然而竟åˆå…¨ä¸è¦‹äº†é‚£å°çš„å’Œå¤§çš„ã€‚é€™æ™‚æ˜¯é€£æ—¥çš„é™°å¤©ï¼Œä¸‰å¤ªå¤ªåˆæ…®åˆ°é­äº†é‚£å¤§é»‘貓的毒手的事去。我說ä¸ç„¶ï¼Œé‚£æ˜¯å¤©æ°£å†·ï¼Œç•¶ç„¶éƒ½èº²è‘—,太陽一齣,一定出來的。 +太陽出來了,他們å»éƒ½ä¸è¦‹ã€‚於是大家就忘å»äº†ã€‚ +惟有三太太是常在那è£å–‚他們è èœçš„,所以常想到。伊有一回走進窗後的å°é™¢å­åŽ»ï¼Œå¿½ç„¶åœ¨ç‰†è§’ç™¼è¦‹äº†ä¸€å€‹åˆ¥çš„æ´žï¼Œå†çœ‹èˆŠæ´žå£ï¼Œå»ä¾ç¨€çš„é‚„è¦‹æœ‰è¨±å¤šçˆªç—•ã€‚é€™çˆªç—•å€˜èªªæ˜¯å¤§å…”çš„ï¼Œçˆªè©²ä¸æœƒæœ‰é€™æ¨£å¤§ï¼Œä¼Šåˆç–‘心到那常在牆上的大黑貓去了,伊於是也就ä¸èƒ½ä¸å®šä¸‹ç™¼æŽ˜çš„æ±ºå¿ƒäº†ã€‚伊終於出來å–了鋤å­ï¼Œä¸€è·¯æŽ˜ä¸‹åŽ»ï¼Œé›–ç„¶ç–‘å¿ƒï¼Œå»ä¹Ÿå¸Œæœ›è‘—æ„外的見了å°ç™½å…”的,但是待到底,å»åªè¦‹ä¸€å †çˆ›è‰å¤¾äº›å…”æ¯›ï¼Œæ€•é‚„æ˜¯è‡¨è“æ™‚候所鋪的罷,此外是冷清清的,全沒有什麼雪白的å°å…”的蹤跡,以åŠä»–那隻一探頭未出洞外的弟弟了。 +氣憤和失望和淒涼,使伊ä¸èƒ½ä¸å†æŽ˜é‚£ç‰†è§’上的新洞了。一動手,那大的兩匹便先竄出洞外é¢ã€‚伊以為他們æ¬äº†å®¶äº†ï¼Œå¾ˆé«˜èˆˆï¼Œç„¶è€Œä»ç„¶æŽ˜ï¼Œå¾…見底,那è£é¢ä¹Ÿé‹ªè‘—è‰è‘‰å’Œå…”毛,而上é¢å»ç¡è‘—七個很å°çš„兔,é身肉紅色,細看時,眼ç›å…¨éƒ½æ²’有開。 +一切都明白了,三太太先å‰çš„é æ–™æžœä¸éŒ¯ã€‚伊為é é˜²å±éšªèµ·è¦‹ï¼Œä¾¿å°‡ä¸ƒå€‹å°çš„都è£åœ¨æœ¨ç®±ä¸­ï¼Œæ¬é€²è‡ªå·±çš„æˆ¿è£ï¼Œåˆå°‡å¤§çš„也æºé€²ç®±è£é¢ï¼Œå‹’令伊去哺乳。 +三太太從此ä¸ä½†æ·±æ¨é»‘貓,而且頗ä¸ä»¥å¤§å…”為然了。據說當åˆé‚£å…©å€‹è¢«å®³ä¹‹å…ˆï¼Œæ­»æŽ‰çš„該還有,因為他們生一回,決ä¸è‡³æ–¼åªå…©å€‹ï¼Œä½†ç‚ºäº†å“ºä¹³ä¸å‹»ï¼Œä¸èƒ½çˆ­é£Ÿçš„就先死了。這大概也ä¸éŒ¯çš„,ç¾åœ¨ä¸ƒå€‹ä¹‹ä¸­ï¼Œå°±æœ‰å…©å€‹å¾ˆç˜¦å¼±ã€‚所以三太太一有閑空,便æ‰ä½æ¯å…”,將å°å…”一個一個輪æµçš„æ“ºåœ¨è‚šå­ä¸Šä¾†å–奶,ä¸å‡†æœ‰å¤šå°‘。 +æ¯è¦ªå°æˆ‘說,那樣麻煩的養兔法,伊歷來連è½ä¹Ÿæœªæ›¾è½åˆ°éŽï¼Œææ€•是å¯ä»¥æ”¶å…¥ã€Šç„¡é›™è­œã€‹çš„。 +ç™½å…”çš„å®¶æ—æ›´ç¹æ¦®ï¼›å¤§å®¶ä¹Ÿåˆéƒ½é«˜èˆˆäº†ã€‚ +但自此之後,我總覺得淒涼。夜åŠåœ¨ç‡ˆä¸‹å著想,那兩æ¢å°æ€§å‘½ï¼Œç«Ÿæ˜¯äººä¸çŸ¥é¬¼ä¸è¦ºçš„æ—©åœ¨ä¸çŸ¥ä»€éº¼æ™‚候喪失了,生物å²ä¸Šä¸è‘—一些痕跡,並S也ä¸å«ä¸€è²ã€‚æˆ‘æ–¼æ˜¯è¨˜èµ·èˆŠäº‹ä¾†ï¼Œå…ˆå‰æˆ‘ä½åœ¨æœƒé¤¨è£ï¼Œæ¸…早起身,åªè¦‹å¤§æ§æ¨¹ä¸‹ä¸€ç‰‡æ•£äº‚çš„é´¿å­æ¯›ï¼Œé€™æ˜Žæ˜Žæ˜¯è†æ–¼é·¹å»çš„了,上åˆé•·ç­ä¾†ä¸€æ‰“掃,便什麼都ä¸è¦‹ï¼Œèª°çŸ¥é“曾有一個生命斷é€åœ¨é€™è£å‘¢ï¼Ÿæˆ‘åˆæ›¾è·¯éŽè¥¿å››ç‰Œæ¨“,看見一匹å°ç‹—被馬車軋得快死,待回來時,什麼也ä¸è¦‹äº†ï¼Œæ¬æŽ‰äº†ç½·ï¼ŒéŽå¾€è¡Œäººæ†§æ†§çš„èµ°è‘—ï¼Œèª°çŸ¥é“æ›¾æœ‰ä¸€å€‹ç”Ÿå‘½æ–·é€åœ¨é€™è£å‘¢ï¼Ÿå¤å¤œï¼Œçª—外é¢ï¼Œå¸¸è½åˆ°è’¼è …的悠長的å±å±çš„å«è²ï¼Œé€™ä¸€å®šæ˜¯çµ¦è …虎咬ä½äº†ï¼Œç„¶è€Œæˆ‘å‘來無所容心於其間,而別人並且ä¸è½åˆ°â€¦â€¦ +å‡ä½¿é€ ç‰©ä¹Ÿå¯ä»¥è²¬å‚™ï¼Œé‚£éº¼ï¼Œæˆ‘以為他實在將生命造得太濫了,毀得太濫了。 +嗥的一è²ï¼Œåˆæ˜¯å…©æ¢è²“在窗外打起架來。「迅兒ï¼ä½ åˆåœ¨é‚£è£æ‰“貓了?ã€ã€Œä¸ï¼Œä»–å€‘è‡ªå·±å’¬ã€‚ä»–é‚£è£æœƒçµ¦æˆ‘打呢。〠+我的æ¯è¦ªæ˜¯ç´ ä¾†å¾ˆä¸ä»¥æˆ‘çš„è™å¾…貓為然的,ç¾åœ¨å¤§ç´„ç–‘å¿ƒæˆ‘è¦æ›¿å°å…”抱ä¸å¹³ï¼Œä¸‹ä»€éº¼è¾£æ‰‹ï¼Œä¾¿èµ·ä¾†æŽ¢å•了。而我在全家的å£ç¢‘上,å»çš„確算一個貓敵。我曾經害éŽè²“,平時也常打貓,尤其是在他們é…åˆçš„æ™‚候。但我之所以打的原因並éžå› ç‚ºä»–們é…åˆï¼Œæ˜¯å› ç‚ºä»–們嚷,嚷到使我ç¡ä¸è‘—,我以為é…åˆæ˜¯ä¸å¿…這樣大嚷而特嚷的。 +æ³ä¸”黑貓害了å°å…”,我更是「師出有åã€çš„了。我覺得æ¯è¦ªå¯¦åœ¨å¤ªä¿®å–„,於是ä¸ç”±çš„就說出模棱的近乎ä¸ä»¥ç‚ºç„¶çš„答話來。 +造物太胡鬧,我ä¸èƒ½ä¸å抗他了,雖然也許是倒是幫他的忙…… +那黑貓是ä¸èƒ½ä¹…在矮牆上高視闊步的了,我決定的想,於是åˆä¸ç”±çš„一瞥那è—在書箱è£çš„一瓶é’酸鉀。 +我在倒數上去的二å年中,åªçœ‹éŽå…©å›žä¸­åœ‹æˆ²ï¼Œå‰å年是絕ä¸çœ‹ï¼Œå› ç‚ºæ²’æœ‰çœ‹æˆ²çš„æ„æ€å’Œæ©Ÿæœƒï¼Œé‚£å…©å›žå…¨åœ¨å¾Œå年,然而都沒有看出什麼來就走了。 +第一回是民國元年我åˆåˆ°åŒ—京的時候,當時一個朋å‹å°æˆ‘說,北京戲最好,你ä¸åŽ»è¦‹è¦‹ä¸–é¢éº½ï¼Ÿæˆ‘想,看戲是有味的,而æ³åœ¨åŒ—京呢。於是都興緻勃勃的跑到什麼園,戲文已經開場了,在外é¢ä¹Ÿæ—©è½åˆ°é¼•鼕地響。我們挨進門,幾個紅的綠的在我的眼å‰ä¸€é–ƒçˆï¼Œä¾¿åˆçœ‹è¦‹æˆ²è‡ºä¸‹æ»¿æ˜¯è¨±å¤šé ­ï¼Œå†å®šç¥žå››é¢çœ‹ï¼Œå»è¦‹ä¸­é–“也還有幾個空座,擠éŽåŽ»è¦åæ™‚ï¼Œåˆæœ‰äººå°æˆ‘發議論,我因為耳朵已經喤的響著了,用了心,纔è½åˆ°ä»–是說「有人,ä¸è¡Œï¼ã€ã€‚ +我們退到後é¢ï¼Œä¸€å€‹è¾®å­å¾ˆå…‰çš„å»ä¾†é ˜æˆ‘們到了å´é¢ï¼ŒæŒ‡å‡ºä¸€å€‹åœ°ä½ä¾†ã€‚這所謂地ä½è€…,原來是一æ¢é•·å‡³ï¼Œç„¶è€Œä»–é‚£åæ¿æ¯”æˆ‘çš„ä¸Šè…¿è¦ç‹¹åˆ°å››åˆ†ä¹‹ä¸‰ï¼Œä»–的腳比我的下腿è¦é•·éŽä¸‰åˆ†ä¹‹äºŒã€‚æˆ‘å…ˆæ˜¯æ²’æœ‰çˆ¬ä¸ŠåŽ»çš„å‹‡æ°£ï¼ŒæŽ¥è‘—ä¾¿è¯æƒ³åˆ°ç§åˆ‘拷打的刑具,ä¸ç”±çš„æ¯›éª¨æ‚šç„¶çš„走出了。 +走了許多路,忽è½å¾—我的朋å‹çš„è²éŸ³é“ï¼Œã€Œç©¶ç«Ÿæ€Žçš„ï¼Ÿã€æˆ‘回éŽè‡‰åŽ»ï¼ŒåŽŸä¾†ä»–ä¹Ÿè¢«æˆ‘å¸¶å‡ºä¾†äº†ã€‚ä»–å¾ˆè©«ç•°çš„èªªï¼Œã€Œæ€Žéº¼ç¸½æ˜¯èµ°ï¼Œä¸ç­”æ‡‰ï¼Ÿã€æˆ‘說,「朋å‹ï¼Œå°ä¸èµ·ï¼Œæˆ‘耳朵åªåœ¨é¼•鼕喤喤的響,並沒有è½åˆ°ä½ çš„話。〠+後來我æ¯ä¸€æƒ³åˆ°ï¼Œä¾¿å¾ˆä»¥ç‚ºå¥‡æ€ªï¼Œä¼¼ä¹Žé€™æˆ²å¤ªä¸å¥½ï¼Œâ€”—å¦å‰‡ä¾¿æ˜¯æˆ‘近來在戲臺下ä¸é©æ–¼ç”Ÿå­˜äº†ã€‚ +ç¬¬äºŒå›žå¿˜è¨˜äº†é‚£ä¸€å¹´ï¼Œç¸½ä¹‹æ˜¯å‹Ÿé›†æ¹–åŒ—æ°´ç½æè€Œè­šå«å¤©é‚„æ²’æœ‰æ­»ã€‚ææ³•是兩元錢買一張戲票,å¯ä»¥åˆ°ç¬¬ä¸€èˆžè‡ºåŽ»çœ‹æˆ²ï¼Œæ‰®æ¼”çš„å¤šæ˜¯å角,其一就是å°å«å¤©ã€‚æˆ‘è²·äº†ä¸€å¼µç¥¨ï¼Œæœ¬æ˜¯å°æ–¼å‹¸å‹ŸäººèŠä»¥å¡žè²¬çš„ï¼Œç„¶è€Œä¼¼ä¹Žåˆæœ‰å¥½äº‹å®¶ä¹˜æ©Ÿå°æˆ‘說了些å«å¤©ä¸å¯ä¸çœ‹çš„大法è¦äº†ã€‚我於是忘了å‰å¹¾å¹´çš„鼕鼕喤喤之ç½ï¼Œç«Ÿåˆ°ç¬¬ä¸€èˆžè‡ºåŽ»äº†ï¼Œä½†å¤§ç´„ä¸€åŠä¹Ÿå› ç‚ºé‡åƒ¹è³¼ä¾†çš„寶票,總得使用了纔舒æœã€‚我打è½å¾—å«å¤©å‡ºè‡ºæ˜¯é²çš„ï¼Œè€Œç¬¬ä¸€èˆžè‡ºå»æ˜¯æ–°å¼æ§‹é€ ï¼Œç”¨ä¸è‘—爭座ä½ï¼Œä¾¿æ”¾äº†å¿ƒï¼Œå»¶å®•到ä¹é»žé˜çº”去,誰料照例,人都滿了,連立足也難,我åªå¾—擠在é è™•的人å¢ä¸­çœ‹ä¸€å€‹è€æ—¦åœ¨è‡ºä¸Šå”±ã€‚é‚£è€æ—¦å˜´é‚Šæ’著兩個點ç«çš„紙撚å­ï¼Œæ—邊有一個鬼å’,我費盡æ€é‡ï¼Œçº”疑心他或者是目連的æ¯è¦ªï¼Œå› ç‚ºå¾Œä¾†åˆå‡ºä¾†äº†ä¸€å€‹å’Œå°šã€‚然而我åˆä¸çŸ¥é“é‚£åè§’æ˜¯èª°ï¼Œå°±åŽ»å•æ“ å°åœ¨æˆ‘的左邊的一ä½èƒ–紳士。他很看ä¸èµ·ä¼¼çš„æ–œçž¥äº†æˆ‘一眼,說é“, 「龔雲甫ï¼ã€æˆ‘深愧淺陋而且粗ç–ï¼Œè‡‰ä¸Šä¸€ç†±ï¼ŒåŒæ™‚腦裡也制出了決ä¸å†å•çš„å®šç« ï¼Œæ–¼æ˜¯çœ‹å°æ—¦å”±ï¼Œçœ‹èŠ±æ—¦å”±ï¼Œçœ‹è€ç”Ÿå”±ï¼Œçœ‹ä¸çŸ¥ä»€éº¼è§’色唱,看一大ç­äººäº‚打,看兩三個人互打,從ä¹é»žå¤šåˆ°å點,從å點到å一點,從å一點到å一點åŠï¼Œå¾žå一點åŠåˆ°å二點,——然而å«å¤©ç«Ÿé‚„沒有來。 +我å‘來沒有這樣å¿è€çš„等待éŽä»€éº¼äº‹ç‰©ï¼Œè€Œæ³é€™èº«é‚Šçš„胖紳士的åå的喘氣,這臺上的鼕鼕喤喤的敲打,紅紅綠綠的晃蕩,加之以å二點,忽而使我çœèª¤åˆ°åœ¨é€™è£¡ä¸é©æ–¼ç”Ÿå­˜äº†ã€‚æˆ‘åŒæ™‚便機械的擰轉身å­ï¼Œç”¨åЛ往外åªä¸€æ“ ï¼Œè¦ºå¾—背後便已滿滿的,大約那彈性的胖紳士早在我的空處胖開了他的å³åŠèº«äº†ã€‚æˆ‘å¾Œç„¡è¿´è·¯ï¼Œè‡ªç„¶æ“ è€Œåˆæ“ ï¼Œçµ‚於出了大門。街上除了專等看客的車輛之外,幾乎沒有什麼行人了,大門å£å»é‚„有å幾個人昂著頭看戲目,別有一堆人站著並ä¸çœ‹ä»€éº¼ï¼Œæˆ‘想:他們大概是看散戲之後出來的女人們的,而å«å¤©å»é‚„沒有來…… +然而夜氣很清爽,真所謂「æ²äººå¿ƒè„¾ã€ï¼Œæˆ‘在北京é‡è‘—這樣的好空氣,仿佛這是第一é­äº†ã€‚ +é€™ä¸€å¤œï¼Œå°±æ˜¯æˆ‘å°æ–¼ä¸­åœ‹æˆ²å‘Šäº†åˆ¥çš„ä¸€å¤œï¼Œæ­¤å¾Œå†æ²’有想到他,å³ä½¿å¶è€Œç¶“éŽæˆ²åœ’,我們也漠ä¸ç›¸é—œï¼Œç²¾ç¥žä¸Šæ—©å·²ä¸€åœ¨å¤©ä¹‹å—一在地之北了。 +但是å‰å¹¾å¤©ï¼Œæˆ‘忽在無æ„ä¹‹ä¸­çœ‹åˆ°ä¸€æœ¬æ—¥æœ¬æ–‡çš„æ›¸ï¼Œå¯æƒœå¿˜è¨˜äº†æ›¸å和著者,總之是關於中國戲的。其中有一篇,大æ„仿佛說,中國戲是大敲,大å«ï¼Œå¤§è·³ï¼Œä½¿çœ‹å®¢é ­æ˜è…¦çœ©ï¼Œå¾ˆä¸é©æ–¼åŠ‡å ´ï¼Œä½†è‹¥åœ¨é‡Žå¤–æ•£æ¼«çš„æ‰€åœ¨ï¼Œé é çš„看起來,也自有他的風致。我當時覺著這正是說了在我æ„中而未曾想到的話,因為我確記得在野外看éŽå¾ˆå¥½çš„æˆ²ï¼Œåˆ°åŒ—京以後的連進兩回戲園去,也許還是å—äº†é‚£æ™‚çš„å½±éŸ¿å“©ã€‚å¯æƒœæˆ‘ä¸çŸ¥é“怎麼一來,竟將書å忘å»äº†ã€‚ +至於我看好戲的時候,å»å¯¦åœ¨å·²ç¶“是「é å“‰é™é™ã€çš„äº†ï¼Œå…¶æ™‚ææ€•我還ä¸éŽå一二歲。我們魯鎮的習慣,本來是凡有出å«çš„女兒,倘自己還未當家,å¤é–“便大抵回到æ¯å®¶åŽ»æ¶ˆå¤ã€‚那時我的祖æ¯é›–然還康建,但æ¯è¦ªä¹Ÿå·²åˆ†æ“”äº†äº›å®¶å‹™ï¼Œæ‰€ä»¥å¤æœŸä¾¿ä¸èƒ½å¤šæ—¥çš„æ­¸çœäº†ï¼Œåªå¾—在掃墓完畢之後,抽空去ä½å¹¾å¤©ï¼Œé€™æ™‚我便æ¯å¹´è·Ÿäº†æˆ‘çš„æ¯è¦ªä½åœ¨å¤–祖æ¯çš„家裡。那地方å«å¹³æ©‹æ‘,是一個離海邊ä¸é ï¼Œæ¥µååƒ»çš„ï¼Œè‡¨æ²³çš„å°æ‘èŽŠï¼›ä½æˆ¶ä¸æ»¿ä¸‰åå®¶ï¼Œéƒ½ç¨®ç”°ï¼Œæ‰“é­šï¼Œåªæœ‰ä¸€å®¶å¾ˆå°çš„雜貨店。但在我是樂土:因為我在這裡ä¸ä½†å¾—到優待,åˆå¯ä»¥å…念「秩秩斯乾幽幽å—å±±ã€äº†ã€‚ +和我一åŒçŽ©çš„æ˜¯è¨±å¤šå°æœ‹å‹ï¼Œå› ç‚ºæœ‰äº†é å®¢ï¼Œä»–們也都從父æ¯é‚£è£¡å¾—了減少工作的許å¯ï¼Œä¼´æˆ‘ä¾†éŠæˆ²ã€‚åœ¨å°æ‘裡,一家的客,幾乎也就是公共的。我們年紀都相仿,但論起行輩來,å»è‡³å°‘是å”å­ï¼Œæœ‰å¹¾å€‹é‚„æ˜¯å¤ªå…¬ï¼Œå› ç‚ºä»–å€‘åˆæ‘都åŒå§“,是本家。然而我們是朋å‹ï¼Œå³ä½¿å¶è€Œåµé¬§èµ·ä¾†ï¼Œæ‰“了太公,一æ‘çš„è€è€å°‘少,也決沒有一個會想出「犯上ã€é€™å…©å€‹å­—來,而他們也百分之ä¹åä¹ä¸è­˜å­—。 +我們æ¯å¤©çš„事情大概是掘蚯蚓,掘來穿在銅絲åšçš„å°é‰¤ä¸Šï¼Œä¼åœ¨æ²³æ²¿ä¸Šå޻釣è¦ã€‚è¦æ˜¯æ°´ä¸–界裡的呆å­ï¼Œæ±ºä¸æ†šç”¨äº†è‡ªå·±çš„兩個鉗æ§è‘—鉤尖é€åˆ°å˜´è£¡åŽ»çš„ï¼Œæ‰€ä»¥ä¸åŠå¤©ä¾¿å¯ä»¥é‡£åˆ°ä¸€å¤§ç¢—。這è¦ç…§ä¾‹æ˜¯æ­¸æˆ‘åƒçš„。其次便是一åŒåŽ»æ”¾ç‰›ï¼Œä½†æˆ–è€…å› ç‚ºé«˜ç­‰å‹•ç‰©äº†çš„ç·£æ•…ç½·ï¼Œé»ƒç‰›æ°´ç‰›éƒ½æ¬ºç”Ÿï¼Œæ•¢æ–¼æ¬ºä¾®æˆ‘ï¼Œå› æ­¤æˆ‘ä¹Ÿç¸½ä¸æ•¢èµ°è¿‘身,åªå¥½é é åœ°è·Ÿè‘—ï¼Œç«™è‘—ã€‚é€™æ™‚å€™ï¼Œå°æœ‹å‹å€‘便ä¸å†åŽŸè«’æˆ‘æœƒè®€ã€Œç§©ç§©æ–¯å¹²ã€ï¼Œå»å…¨éƒ½å˜²ç¬‘起來了。 +至於我在那裡所第一盼望的,å»åœ¨åˆ°è¶™èŽŠåŽ»çœ‹æˆ²ã€‚è¶™èŽŠæ˜¯é›¢å¹³æ©‹æ‘五里的較大的æ‘莊;平橋æ‘太å°ï¼Œè‡ªå·±æ¼”ä¸èµ·æˆ²ï¼Œæ¯å¹´ç¸½ä»˜çµ¦è¶™èŽŠå¤šå°‘éŒ¢ï¼Œç®—ä½œåˆåšçš„ã€‚ç•¶æ™‚æˆ‘ä¸¦ä¸æƒ³åˆ°ä»–å€‘ç‚ºä»€éº¼å¹´å¹´è¦æ¼”戲。ç¾åœ¨æƒ³ï¼Œé‚£æˆ–者是春賽,是社戲了。 +就在我åä¸€äºŒæ­²æ™‚å€™çš„é€™ä¸€å¹´ï¼Œé€™æ—¥æœŸä¹Ÿçœ‹çœ‹ç­‰åˆ°äº†ã€‚ä¸æ–™é€™ä¸€å¹´çœŸå¯æƒœï¼Œåœ¨æ—©ä¸Šå°±å«ä¸åˆ°èˆ¹ã€‚平橋æ‘åªæœ‰ä¸€é𻿗©å‡ºæ™šæ­¸çš„航船是大船,決沒有留用的é“ç†ã€‚其餘的都是å°èˆ¹ï¼Œä¸åˆç”¨ï¼›å¤®äººåˆ°é„°æ‘去å•,也沒有,早都給別人定下了。外祖æ¯å¾ˆæ°£æƒ±ï¼Œæ€ªå®¶è£¡çš„äººä¸æ—©å®šï¼Œçµ®å¨èµ·ä¾†ã€‚æ¯è¦ªä¾¿å¯¬æ…°ä¼Šï¼Œèªªæˆ‘å€‘é­¯éŽ®çš„æˆ²æ¯”å°æ‘è£¡çš„å¥½å¾—å¤šï¼Œä¸€å¹´çœ‹å¹¾å›žï¼Œä»Šå¤©å°±ç®—äº†ã€‚åªæœ‰æˆ‘急得è¦å“­ï¼Œæ¯è¦ªå»ç«­åŠ›çš„å›‘å’æˆ‘,說è¬ä¸èƒ½è£æ¨¡è£æ¨£ï¼Œæ€•åˆæ‹›å¤–祖æ¯ç”Ÿæ°£ï¼Œåˆä¸å‡†å’Œåˆ¥äººä¸€åŒåŽ»ï¼Œèªªæ˜¯æ€•å¤–ç¥–æ¯è¦æ“”心。 +總之,是完了。到下åˆï¼Œæˆ‘的朋å‹éƒ½åŽ»äº†ï¼Œæˆ²å·²ç¶“é–‹å ´äº†ï¼Œæˆ‘ä¼¼ä¹Žè½åˆ°é‘¼é¼“çš„è²éŸ³ï¼Œè€Œä¸”知é“他們在戲臺下買豆漿å–。 +這一天我ä¸é‡£è¦ï¼Œæ±è¥¿ä¹Ÿå°‘åƒã€‚æ¯è¦ªå¾ˆç‚ºé›£ï¼Œæ²’æœ‰æ³•å­æƒ³ã€‚到晚飯時候,外祖æ¯ä¹Ÿçµ‚於覺察了,並且說我應當ä¸é«˜èˆˆï¼Œä»–們太怠慢,是待客的禮數裡從來沒有的。åƒé£¯ä¹‹å¾Œï¼Œçœ‹éŽæˆ²çš„å°‘å¹´å€‘ä¹Ÿéƒ½èšæ”ä¾†äº†ï¼Œé«˜é«˜èˆˆèˆˆçš„ä¾†è¬›æˆ²ã€‚åªæœ‰æˆ‘ä¸é–‹å£ï¼›ä»–們都嘆æ¯è€Œä¸”è¡¨åŒæƒ…ã€‚å¿½ç„¶é–“ï¼Œä¸€å€‹æœ€è°æ˜Žçš„雙喜大悟似的æè­°äº†ï¼Œä»–說,「大船?八å”çš„èˆªèˆ¹ä¸æ˜¯å›žä¾†äº†éº½ï¼Ÿã€å幾個別的少年也大悟,立刻攛掇起來,說å¯ä»¥å了這航船和我一åŒåŽ»ã€‚æˆ‘é«˜èˆˆäº†ã€‚ç„¶è€Œå¤–ç¥–æ¯åˆæ€•都是孩å­ï¼Œä¸å¯é ï¼›æ¯è¦ªåˆèªªæ˜¯è‹¥å«å¤§äººä¸€åŒåŽ»ï¼Œä»–å€‘ç™½å¤©å…¨æœ‰å·¥ä½œï¼Œè¦ä»–熬夜,是ä¸åˆæƒ…ç†çš„。在這é²ç–‘之中,雙喜å¯åˆçœ‹å‡ºåº•細來了,便åˆå¤§è²çš„說é“,「我寫包票ï¼èˆ¹åˆå¤§ï¼›è¿…哥兒å‘來ä¸äº‚跑;我們åˆéƒ½æ˜¯è­˜æ°´æ€§çš„ï¼ã€ +誠然ï¼é€™åå¤šå€‹å°‘å¹´ï¼Œå§”å¯¦æ²’æœ‰ä¸€å€‹ä¸æœƒé³§æ°´çš„,而且兩三個還是弄潮的好手。 +外祖æ¯å’Œæ¯è¦ªä¹Ÿç›¸ä¿¡ï¼Œä¾¿ä¸å†é§å›žï¼Œéƒ½å¾®ç¬‘了。我們立刻一哄的出了門。 +我的很é‡çš„心忽而輕鬆了,身體也似乎舒展到說ä¸å‡ºçš„大。一出門,便望見月下的平橋內泊著一隻白篷的航船,大家跳下船,雙喜拔å‰ç¯™ï¼Œé˜¿ç™¼æ‹”後篙,年幼的都陪我å在艙中,較大的èšåœ¨èˆ¹å°¾ã€‚æ¯è¦ªé€å‡ºä¾†å©å’「è¦å°å¿ƒã€çš„æ™‚候,我們已經點開船,在橋石上一磕,退後幾尺,å³åˆä¸Šå‰å‡ºäº†æ©‹ã€‚於是架起兩支櫓,一支兩人,一里一æ›ï¼Œæœ‰èªªç¬‘的,有嚷的,夾著潺潺的船頭激水的è²éŸ³ï¼Œåœ¨å·¦å³éƒ½æ˜¯ç¢§ç¶ çš„豆麥田地的河æµä¸­ï¼Œé£›ä¸€èˆ¬å¾‘å‘趙莊å‰é€²äº†ã€‚ +å…©å²¸çš„è±†éº¥å’Œæ²³åº•çš„æ°´è‰æ‰€ç™¼æ•£å‡ºä¾†çš„æ¸…香,夾雜在水氣中撲é¢çš„å¹ä¾†ï¼›æœˆè‰²ä¾¿æœ¦æœ§åœ¨é€™æ°´æ°£è£¡ã€‚淡黑的起ä¼çš„連山,仿佛是踴èºçš„éµçš„ç¸è„Šä¼¼çš„,都é é çš„å‘船尾跑去了,但我å»é‚„以為船慢。他們æ›äº†å››å›žæ‰‹ï¼Œæ¼¸æœ›è¦‹ä¾ç¨€çš„趙莊,而且似乎è½åˆ°æ­Œå¹äº†ï¼Œé‚„有幾點ç«ï¼Œæ–™æƒ³ä¾¿æ˜¯æˆ²è‡ºï¼Œä½†æˆ–者也許是æ¼ç«ã€‚ +é‚£è²éŸ³å¤§æ¦‚是橫笛,宛轉,悠æšï¼Œä½¿æˆ‘的心也沉éœï¼Œç„¶è€Œåˆè‡ªå¤±èµ·ä¾†ï¼Œè¦ºå¾—è¦å’Œä»–彌散在å«è‘—豆麥蘊藻之香的夜氣裡。 +é‚£ç«æŽ¥è¿‘äº†ï¼Œæžœç„¶æ˜¯æ¼ç«ï¼›æˆ‘çº”è¨˜å¾—å…ˆå‰æœ›è¦‹çš„ä¹Ÿä¸æ˜¯è¶™èŽŠã€‚é‚£æ˜¯æ­£å°èˆ¹é ­çš„䏀墿¾æŸæž—,我去年也曾經去éŠçŽ©éŽï¼Œé‚„看見破的石馬倒在地下,一個石羊蹲在è‰è£¡å‘¢ã€‚éŽäº†é‚£æž—ï¼Œèˆ¹ä¾¿å½Žé€²äº†å‰æ¸¯ï¼Œæ–¼æ˜¯è¶™èŽŠä¾¿çœŸåœ¨çœ¼å‰äº†ã€‚ +最惹眼的是屹立在莊外臨河的空地上的一座戲臺,模胡在é è™•的月夜中,和空間幾乎分ä¸å‡ºç•Œé™ï¼Œæˆ‘疑心畫上見éŽçš„仙境,就在這裡出ç¾äº†ã€‚這時船走得更快,ä¸å¤šæ™‚,在臺上顯出人物來,紅紅綠綠的動,近臺的河裡一望çƒé»‘的是看戲的人家的船篷。 +「近臺沒有什麼空了,我們é é çš„看罷。ã€é˜¿ç™¼èªªã€‚ +這時船慢了,ä¸ä¹…就到,果然近ä¸å¾—å°æ—,大家åªèƒ½ä¸‹äº†ç¯™ï¼Œæ¯”é‚£æ­£å°æˆ²è‡ºçš„神棚還è¦é ã€‚其實我們這白篷的航船,本也ä¸é¡˜æ„å’Œçƒç¯·çš„èˆ¹åœ¨ä¸€è™•ï¼Œè€Œæ³æ²’有空地呢…… +在åœèˆ¹çš„匆忙中,看見臺上有一個黑的長é¬å­çš„背上æ’著四張旗,æè‘—é•·æ§ï¼Œå’Œä¸€ç¾¤èµ¤è†Šçš„人正打仗。雙喜說,那就是有åçš„éµé ­è€ç”Ÿï¼Œèƒ½é€£ç¿»å…«å四個筋斗,他日裡親自數éŽçš„。 +我們便都擠在船頭上看打仗,但那éµé ­è€ç”Ÿå»åˆä¸¦ä¸ç¿»ç­‹æ–—ï¼Œåªæœ‰å¹¾å€‹èµ¤è†Šçš„äººç¿»ï¼Œç¿»äº†ä¸€é™£ï¼Œéƒ½é€²åŽ»äº†ï¼ŒæŽ¥è‘—èµ°å‡ºä¸€å€‹å°æ—¦ä¾†ï¼Œå’¿å’¿å‘€å‘€çš„唱。雙喜說,「晚上看客少,éµé ­è€ç”Ÿä¹Ÿæ‡ˆäº†ï¼Œèª°è‚¯é¡¯æœ¬é ˜çµ¦ç™½åœ°çœ‹å‘¢ï¼Ÿã€æˆ‘相信這話å°ï¼Œå› ç‚ºå…¶æ™‚臺下已經ä¸å¾ˆæœ‰äººï¼Œé„‰ä¸‹äººç‚ºäº†æ˜Žå¤©çš„工作,熬ä¸å¾—夜,早都ç¡è¦ºåŽ»äº†ï¼Œç–ç–æœ—朗的站著的ä¸éŽæ˜¯å¹¾å個本æ‘和鄰æ‘的閑漢。çƒç¯·èˆ¹è£¡çš„那些土財主的家眷固然在,然而他們也ä¸åœ¨ä¹Žçœ‹æˆ²ï¼Œå¤šåŠæ˜¯å°ˆåˆ°æˆ²è‡ºä¸‹ä¾†åƒç³•餅水果和瓜å­çš„。所以簡直å¯ä»¥ç®—白地。 +ç„¶è€Œæˆ‘çš„æ„æ€å»ä¹Ÿä¸¦ä¸åœ¨ä¹Žçœ‹ç¿»ç­‹æ–—。我最願æ„看的是一個人蒙了白布,兩手在頭上æ§è‘—一支棒似的蛇頭的蛇精,其次是套了黃布衣跳è€è™Žã€‚但是等了許多時都ä¸è¦‹ï¼Œå°æ—¦é›–然進去了,立刻åˆå‡ºä¾†äº†ä¸€å€‹å¾ˆè€çš„å°ç”Ÿã€‚我有些疲倦了,託桂生買豆漿去。他去了一刻,回來說,「沒有。賣豆漿的è¾å­ä¹Ÿå›žåŽ»äº†ã€‚æ—¥è£¡å€’æœ‰ï¼Œæˆ‘é‚„å–了兩碗呢。ç¾åœ¨åŽ»èˆ€ä¸€ç“¢æ°´ä¾†çµ¦ä½ å–罷。〠+我ä¸å–水,支æ’è‘—ä»ç„¶çœ‹ï¼Œä¹Ÿèªªä¸å‡ºè¦‹äº†äº›ä»€éº¼ï¼Œåªè¦ºå¾—戲å­çš„è‡‰éƒ½æ¼¸æ¼¸çš„æœ‰äº›ç¨€å¥‡äº†ï¼Œé‚£äº”å®˜æ¼¸ä¸æ˜Žé¡¯ï¼Œä¼¼ä¹Žèžæˆä¸€ç‰‡çš„冿²’有什麼高低。年紀å°çš„幾個多打呵欠了,大的也å„管自己談話。忽而一個紅衫的å°ä¸‘被ç¶åœ¨è‡ºæŸ±å­ä¸Šï¼Œçµ¦ä¸€å€‹èŠ±ç™½é¬å­çš„ç”¨é¦¬éž­æ‰“èµ·ä¾†äº†ï¼Œå¤§å®¶çº”åˆæŒ¯ä½œç²¾ç¥žçš„笑著看。在這一夜裡,我以為這實在è¦ç®—是最好的一折。 +ç„¶è€Œè€æ—¦çµ‚æ–¼å‡ºè‡ºäº†ã€‚è€æ—¦æœ¬ä¾†æ˜¯æˆ‘所最怕的æ±è¥¿ï¼Œå°¤å…¶æ˜¯æ€•ä»–å下了唱。這時候,看見大家也都很掃興,纔知é“他們的æ„è¦‹æ˜¯å’Œæˆ‘ä¸€è‡´çš„ã€‚é‚£è€æ—¦ç•¶åˆé‚„åªæ˜¯è¸±ä¾†è¸±åŽ»çš„å”±ï¼Œå¾Œä¾†ç«Ÿåœ¨ä¸­é–“çš„ä¸€æŠŠäº¤æ¤…ä¸Šå下了。我很擔心;雙喜他們å»å°±ç ´å£å–ƒå–ƒçš„罵。我å¿è€çš„等著,許多工夫,åªè¦‹é‚£è€æ—¦å°‡æ‰‹ä¸€æŠ¬ï¼Œæˆ‘以為就è¦ç«™èµ·ä¾†äº†ï¼Œä¸æ–™ä»–å»åˆæ…¢æ…¢çš„æ”¾ä¸‹åœ¨åŽŸåœ°æ–¹ï¼Œä»èˆŠå”±ã€‚全船裡幾個人ä¸ä½çš„åæ°£ï¼Œå…¶é¤˜çš„也打起哈欠來。雙喜終於熬ä¸ä½äº†ï¼Œèªªé“,怕他會唱到天明還ä¸å®Œï¼Œé‚„是我們走的好罷。大家立刻都贊æˆï¼Œå’Œé–‹èˆ¹æ™‚候一樣踴èºï¼Œä¸‰å››äººå¾‘å¥”èˆ¹å°¾ï¼Œæ‹”äº†ç¯™ï¼Œé»žé€€å¹¾ä¸ˆï¼Œè¿´è½‰èˆ¹é ­ï¼Œé§•èµ·æ«“ï¼Œç½µè‘—è€æ—¦ï¼Œåˆå‘é‚£æ¾æŸæž—å‰é€²äº†ã€‚ +月還沒有è½ï¼Œä»¿ä½›çœ‹æˆ²ä¹Ÿä¸¦ä¸å¾ˆä¹…似的,而一離趙莊,月光åˆé¡¯å¾—格外的皎潔。回望戲臺在燈ç«å…‰ä¸­ï¼Œå»åˆå¦‚åˆä¾†æœªåˆ°æ™‚å€™ä¸€èˆ¬ï¼Œåˆæ¼‚渺得åƒä¸€åº§ä»™å±±æ¨“閣,滿被紅霞罩著了。å¹åˆ°è€³é‚Šä¾†çš„åˆæ˜¯æ©«ç¬›ï¼Œå¾ˆæ‚ æšï¼›æˆ‘ç–‘å¿ƒè€æ—¦å·²ç¶“進去了,但也ä¸å¥½æ„æ€èªªå†å›žåŽ»çœ‹ã€‚ +ä¸å¤šä¹…ï¼Œæ¾æŸæž—æ—©åœ¨èˆ¹å¾Œäº†ï¼Œèˆ¹è¡Œä¹Ÿä¸¦ä¸æ…¢ï¼Œä½†å‘¨åœçš„é»‘æš—åªæ˜¯æ¿ƒï¼Œå¯çŸ¥å·²ç¶“到了深夜。他們一é¢è­°è«–著戲å­ï¼Œæˆ–罵,或笑,一é¢åŠ ç·Šçš„æ–èˆ¹ã€‚é€™ä¸€æ¬¡èˆ¹é ­çš„æ¿€æ°´è²æ›´å…¶éŸ¿äº®äº†ï¼Œé‚£èˆªèˆ¹ï¼Œå°±åƒä¸€æ¢å¤§ç™½é­šèƒŒè‘—一群孩å­åœ¨æµªèŠ±è£¡èº¥ï¼Œé€£å¤œæ¼çš„å¹¾å€‹è€æ¼çˆ¶ï¼Œä¹Ÿåœäº†è‰‡å­çœ‹è‘—å–采起來。 +離平橋æ‘é‚„æœ‰ä¸€é‡Œæ¨¡æ¨£ï¼Œèˆ¹è¡Œå»æ…¢äº†ï¼Œæ–船的都說很疲ä¹ï¼Œå› ç‚ºå¤ªç”¨åŠ›ï¼Œè€Œä¸”è¨±ä¹…æ²’æœ‰æ±è¥¿åƒã€‚這回想出來的是桂生,說是羅漢豆正旺相,柴ç«åˆç¾æˆï¼Œæˆ‘們å¯ä»¥å·ä¸€é»žä¾†ç…®åƒã€‚大家都贊æˆï¼Œç«‹åˆ»è¿‘岸åœäº†èˆ¹ï¼›å²¸ä¸Šçš„ç”°è£¡ï¼Œçƒæ²¹æ²¹çš„都是çµå¯¦çš„羅漢豆。 +「阿阿,阿發,這邊是你家的,這邊是è€å…­ä¸€å®¶çš„,我們å·é‚£ä¸€é‚Šçš„呢?ã€é›™å–œå…ˆè·³ä¸‹åŽ»äº†ï¼Œåœ¨å²¸ä¸Šèªªã€‚ +我們也都跳上岸。阿發一é¢è·³ï¼Œä¸€é¢èªªé“,「且慢,讓我來看一看罷,ã€ä»–於是往來的摸了一回,直起身來說é“ï¼Œã€Œå·æˆ‘們的罷,我們的大得多呢。ã€ä¸€è²ç­”æ‡‰ï¼Œå¤§å®¶ä¾¿æ•£é–‹åœ¨é˜¿ç™¼å®¶çš„è±†ç”°è£¡ï¼Œå„æ‘˜äº†ä¸€å¤§æ§ï¼Œæ‹‹å…¥èˆ¹è‰™ä¸­ã€‚雙喜以為å†å¤šå·ï¼Œå€˜çµ¦é˜¿ç™¼çš„å¨˜çŸ¥é“æ˜¯è¦å“­ç½µçš„,於是å„人便到六一公公的田裡åˆå„å·äº†ä¸€å¤§æ§ã€‚ +我們中間幾個年長的ä»ç„¶æ…¢æ…¢çš„æ–è‘—èˆ¹ï¼Œå¹¾å€‹åˆ°å¾Œè‰™åŽ»ç”Ÿç«ï¼Œå¹´å¹¼çš„和我都å‰è±†ã€‚ä¸ä¹…豆熟了,便任憑航船浮在水é¢ä¸Šï¼Œéƒ½åœèµ·ä¾†ç”¨æ‰‹æ’®è‘—åƒã€‚åƒå®Œè±†ï¼Œåˆé–‹èˆ¹ï¼Œä¸€é¢æ´—器具,豆莢豆殼全拋在河水裡,什麼痕跡也沒有了。雙喜所慮的是用了八公公船上的鹽和柴,這è€é ­å­å¾ˆç´°å¿ƒï¼Œä¸€å®šè¦çŸ¥é“ï¼Œæœƒç½µçš„ã€‚ç„¶è€Œå¤§å®¶è­°è«–ä¹‹å¾Œï¼Œæ­¸çµæ˜¯ä¸æ€•。他如果罵,我們便è¦ä»–æ­¸é‚„åŽ»å¹´åœ¨å²¸é‚Šæ‹¾åŽ»çš„ä¸€æžæž¯æ¡•樹,而且當é¢å«ä»–「八癩å­ã€ã€‚ +「都回來了ï¼é‚£è£¡æœƒéŒ¯ã€‚我原說éŽå¯«åŒ…票的ï¼ã€é›™å–œåœ¨èˆ¹é ­ä¸Šå¿½è€Œå¤§è²çš„說。 +我å‘船頭一望,å‰é¢å·²ç¶“æ˜¯å¹³æ©‹ã€‚æ©‹è…³ä¸Šç«™è‘—ä¸€å€‹äººï¼Œå»æ˜¯æˆ‘çš„æ¯è¦ªï¼Œé›™å–œä¾¿æ˜¯å°ä¼Šèªªè‘—話。我走出å‰è‰™åŽ»ï¼Œèˆ¹ä¹Ÿå°±é€²äº†å¹³æ©‹äº†ï¼Œåœäº†èˆ¹ï¼Œæˆ‘們紛紛都上岸。æ¯è¦ªé —有些生氣,說是éŽäº†ä¸‰æ›´äº†ï¼Œæ€Žéº¼å›žä¾†å¾—這樣é²ï¼Œä½†ä¹Ÿå°±é«˜èˆˆäº†ï¼Œç¬‘著邀大家去åƒç‚’米。 +大家都說已經åƒäº†é»žå¿ƒï¼Œåˆæ¸´ç¡ï¼Œä¸å¦‚åŠæ—©ç¡çš„好,å„自回去了。 +第二天,我å‘åˆçº”起來,並沒有è½åˆ°ä»€éº¼é—œä¿‚八公公鹽柴事件的糾葛,下åˆä»ç„¶å޻釣è¦ã€‚ +「雙喜,你們這ç­å°é¬¼ï¼Œæ˜¨å¤©å·äº†æˆ‘的豆了罷?åˆä¸è‚¯å¥½å¥½çš„æ‘˜ï¼Œè¹‹å£žäº†ä¸å°‘。〠我抬頭看時,是六一公公棹著å°èˆ¹ï¼Œè³£äº†è±†å›žä¾†äº†ï¼Œèˆ¹è‚šè£¡é‚„有剩下的一堆豆。 +「是的。我們請客。我們當åˆé‚„ä¸è¦ä½ çš„呢。你看,你把我的è¦åš‡è·‘了ï¼ã€é›™å–œèªªã€‚ +六一公公看見我,便åœäº†æ¥«ï¼Œç¬‘é“ï¼Œã€Œè«‹å®¢ï¼Ÿâ€”â€”é€™æ˜¯æ‡‰è©²çš„ã€‚ã€æ–¼æ˜¯å°æˆ‘說, 「迅哥兒,昨天的戲å¯å¥½éº½ï¼Ÿã€ +我點一點頭,說é“,「好。ã€ã€Œè±†å¯ä¸­åƒå‘¢ï¼Ÿã€æˆ‘åˆé»žä¸€é»žé ­ï¼Œèªªé“,「很好。〠+䏿–™å…­ä¸€å…¬å…¬ç«Ÿéžå¸¸æ„Ÿæ¿€èµ·ä¾†ï¼Œå°‡å¤§æ‹‡æŒ‡ä¸€ç¿¹ï¼Œå¾—æ„的說é“ï¼Œã€Œé€™çœŸæ˜¯å¤§å¸‚éŽ®è£¡å‡ºä¾†çš„è®€éŽæ›¸çš„äººçº”è­˜è²¨ï¼æˆ‘的豆種是粒粒挑é¸éŽçš„,鄉下人ä¸è­˜å¥½æ­¹ï¼Œé‚„說我的豆比ä¸ä¸Šåˆ¥äººçš„呢。我今天也è¦é€äº›çµ¦æˆ‘們的姑奶奶嘗嘗去……ã€ä»–於是打著楫å­éŽåŽ»äº†ã€‚ +待到æ¯è¦ªå«æˆ‘å›žåŽ»åƒæ™šé£¯çš„æ™‚候,桌上便有一大碗煮熟了的羅漢豆,就是六一公公é€çµ¦æ¯è¦ªå’Œæˆ‘åƒçš„。è½èªªä»–é‚„å°æ¯è¦ªæ¥µå£èª‡çŽæˆ‘,說「å°å°å¹´ç´€ä¾¿æœ‰è¦‹è­˜ï¼Œå°‡ä¾†ä¸€å®šè¦ä¸­ç‹€å…ƒã€‚å§‘å¥¶å¥¶ï¼Œä½ çš„ç¦æ°£æ˜¯å¯ä»¥å¯«åŒ…票的了。ã€ä½†æˆ‘åƒäº†è±†ï¼Œå»ä¸¦æ²’有昨夜的豆那麼好。 +真的,一直到ç¾åœ¨ï¼Œæˆ‘å¯¦åœ¨å†æ²’有åƒåˆ°é‚£å¤œä¼¼çš„好豆,——也ä¸å†çœ‹åˆ°é‚£å¤œä¼¼çš„好戲了。 +方玄綽近來愛說「差ä¸å¤šã€é€™ä¸€å¥è©±ï¼Œå¹¾ä¹Žæˆäº†ã€Œå£é ­ç¦ªã€ä¼¼çš„;而且ä¸ä½†èªªï¼Œçš„確也盤據在他腦è£äº†ã€‚他最åˆèªªçš„æ˜¯ã€Œéƒ½ä¸€æ¨£ã€ï¼Œå¾Œä¾†å¤§ç´„覺得欠穩當了,便改為「差ä¸å¤šã€ï¼Œä¸€ç›´ä½¿ç”¨åˆ°ç¾åœ¨ã€‚ +他自從發見了這一å¥å¹³å‡¡çš„è­¦å¥ä»¥å¾Œï¼Œé›–然引起了ä¸å°‘çš„æ–°æ„Ÿæ…¨ï¼ŒåŒæ™‚å»ä¹Ÿåˆ°è¨±å¤šæ–°æ…°å®‰ã€‚譬如看見è€è¼©å¨å£“é’å¹´ï¼Œåœ¨å…ˆæ˜¯è¦æ†¤æ†¤çš„,但ç¾åœ¨å»å°±è½‰å¿µé“ï¼Œå°‡ä¾†é€™å°‘å¹´æœ‰äº†å…’å­«æ™‚ï¼Œå¤§æŠµä¹Ÿè¦æ“ºé€™æž¶å­çš„ç½·ï¼Œä¾¿å†æ²’有什麼ä¸å¹³äº†ã€‚åˆå¦‚çœ‹è¦‹å…µå£«æ‰“è»Šå¤«ï¼Œåœ¨å…ˆä¹Ÿè¦æ†¤æ†¤çš„,但ç¾åœ¨ä¹Ÿå°±è½‰å¿µé“,倘使這車夫當了兵,這兵拉了車,大抵也就這麼打,便å†ä¹Ÿä¸æ”¾åœ¨å¿ƒä¸Šäº†ã€‚他這樣想著的時候,有時也疑心是因為自己沒有和惡社會奮鬥的勇氣,所以瞞心昧己的故æ„造出來的一æ¢é€ƒè·¯ï¼Œå¾ˆè¿‘於「無是éžä¹‹å¿ƒã€ï¼Œé ä¸å¦‚改正了好。然而這æ„見總å而在他腦è£ç”Ÿé•·èµ·ä¾†ã€‚ +他將這「差ä¸å¤šèªªã€æœ€åˆå…¬è¡¨çš„æ™‚候是在北京首善學校的講堂上,其時大概是æèµ·é—œæ–¼æ­·å²ä¸Šçš„事情來,於是說到「å¤ä»Šäººä¸ç›¸é ã€ï¼Œèªªåˆ°å„色人等的「性相近ã€ï¼Œçµ‚於牽扯到學生和官僚身上,大發其議論é“: +「ç¾åœ¨ç¤¾æœƒä¸Šæ™‚é«¦çš„éƒ½é€šè¡Œç½µå®˜åƒšï¼Œè€Œå­¸ç”Ÿç½µå¾—å°¤åˆ©å®³ã€‚ç„¶è€Œå®˜åƒšä¸¦ä¸æ˜¯å¤©ç”Ÿçš„特別種æ—,就是平民變就的。ç¾åœ¨å­¸ç”Ÿå‡ºèº«çš„官僚就ä¸å°‘,和è€å®˜åƒšæœ‰ä»€éº¼å…©æ¨£å‘¢ï¼Ÿã€Žæ˜“地則皆然ã€ï¼Œæ€æƒ³è¨€è«–舉動è±é‡‡éƒ½æ²’有什麼大å€åˆ¥â€¦â€¦ä¾¿æ˜¯å­¸ç”Ÿåœ˜é«”æ–°è¾¦çš„è¨±å¤šäº‹æ¥­ï¼Œä¸æ˜¯ä¹Ÿå·²ç¶“難å…出弊病,大åŠç…™æ¶ˆç«æ»…了麽?差ä¸å¤šçš„ã€‚ä½†ä¸­åœ‹å°‡ä¾†ä¹‹å¯æ…®å°±åœ¨æ­¤â€¦â€¦ã€ +æ•£å在講堂è£çš„二å多個è½è¬›è€…,有的悵然了,或者是以為這話å°ï¼›æœ‰çš„勃然了,大約是以為侮辱了神è–çš„é’年;有幾個å»å°ä»–微笑了,大約以為這是他替自己的辯解:因為方玄綽就是兼åšå®˜åƒšçš„。 +è€Œå…¶å¯¦å»æ˜¯éƒ½éŒ¯èª¤ã€‚這ä¸éŽæ˜¯ä»–的一種新ä¸å¹³ï¼›é›–說ä¸å¹³ï¼Œåˆåªæ˜¯ä»–的一種安分的空論。他自己雖然ä¸çŸ¥é“是因為懶,還是因為無用,總之覺得是一個ä¸è‚¯é‹å‹•,å分安分守己的人。總長冤他有神經病,åªè¦åœ°ä½é‚„ä¸è‡³æ–¼å‹•æ–,他決ä¸é–‹ä¸€é–‹å£ï¼›æ•™å“¡çš„薪水欠到大åŠå¹´äº†ï¼Œåªè¦åˆ¥æœ‰å®˜ä¿¸æ”¯æŒï¼Œä»–也決ä¸é–‹ä¸€é–‹å£ã€‚ä¸ä½†ä¸é–‹å£ï¼Œç•¶æ•™å“¡è¯åˆç´¢è–ªçš„æ™‚候,他還暗地è£ä»¥ç‚ºæ¬ æ–Ÿé…Œï¼Œå¤ªåš·åš·ï¼›ç›´åˆ°è½å¾—åŒå¯®éŽåˆ†çš„奚è½ä»–å€‘äº†ï¼Œé€™çº”ç•¥æœ‰äº›å°æ„Ÿæ…¨ï¼Œå¾Œä¾†ä¸€è½‰å¿µï¼Œé€™æˆ–者因為自己正缺錢,而別的官並ä¸å…¼åšæ•™å“¡çš„ç·£æ•…ç½·ï¼Œæ–¼æ˜¯å°±é‡‹ç„¶äº†ã€‚ +ä»–é›–ç„¶ä¹Ÿç¼ºéŒ¢ï¼Œä½†å¾žæ²’æœ‰åŠ å…¥æ•™å“¡çš„åœ˜é«”å…§ï¼Œå¤§å®¶è­°æ±ºç½·èª²ï¼Œå¯æ˜¯ä¸åŽ»ä¸Šèª²äº†ã€‚æ”¿åºœèªªã€Œä¸Šäº†èª²çº”çµ¦éŒ¢ã€ï¼Œä»–纔略æ¨ä»–們的類乎用果å­è€çŒ´å­ï¼›ä¸€å€‹å¤§æ•™è‚²å®¶èªªé“「教員一手挾書包一手è¦éŒ¢ä¸é«˜å°šã€ï¼Œä»–çº”å°æ–¼ä»–的太太正å¼çš„發牢騷了。 +ã€Œå–‚ï¼Œæ€Žéº¼åªæœ‰å…©ç›¤ï¼Ÿã€è½äº†ã€Œä¸é«˜å°šèªªã€é€™ä¸€æ—¥çš„æ™šé¤æ™‚候,他看著èœè”¬èªªã€‚ +他們是沒有å—éŽæ–°æ•™è‚²çš„ï¼Œå¤ªå¤ªä¸¦ç„¡å­¸åæˆ–雅號,所以也就沒有什麼稱呼了,照è€ä¾‹é›–然也å¯ä»¥å«ã€Œå¤ªå¤ªã€ä½†ä»–åˆä¸é¡˜æ„太守舊,於是就發明瞭一個「喂ã€å­—。太太å°ä»–å»é€£ã€Œå–‚ã€å­—也沒有,åªè¦è‡‰å‘è‘—ä»–èªªè©±ï¼Œä¾æ“šç¿’慣法,他就知é“這話是å°ä»–而發的。 +ã€Œå¯æ˜¯ä¸Šæœˆé ˜ä¾†çš„一æˆåŠéƒ½å®Œäº†â€¦â€¦æ˜¨å¤©çš„米,也還是好容易纔賒來的呢。ã€ä¼Šç«™åœ¨æ¡Œæ—臉å°è‘—他說。 +「你看,還說教書的è¦è–ªæ°´æ˜¯å‘鄙哩。這種æ±è¥¿ä¼¼ä¹Žé€£äººè¦åƒé£¯ï¼Œé£¯è¦ç±³åšï¼Œç±³è¦éŒ¢è²·é€™ä¸€é»žç²—淺事情都ä¸çŸ¥é“……〠+「å°å•¦ã€‚沒有錢怎麼買米,沒有米怎麼煮……〠+他兩頰都鼓起來了,仿佛氣惱這答案正和他的議論「差ä¸å¤šã€ï¼Œè¿‘乎隨è²é™„和模樣;接著便將頭轉å‘別一é¢åŽ»äº†ï¼Œä¾æ“šç¿’慣法,這是宣告討論中止的表示。 +å¾…åˆ°æ·’é¢¨å†·é›¨é€™ä¸€å¤©ï¼Œæ•™å“¡å€‘å› ç‚ºå‘æ”¿åºœåŽ»ç´¢æ¬ è–ªï¼Œåœ¨æ–°è¯é–€å‰çˆ›æ³¥è£è¢«åœ‹è»æ‰“得頭破血出之後,倒居然也發了一點薪水。方玄綽ä¸è²»èˆ‰æ‰‹ä¹‹å‹žçš„領了錢,酌還些舊債,å»é‚„ç¼ºä¸€å¤§ç­†æ¬¾ï¼Œé€™æ˜¯å› ç‚ºå®˜ä¿¸ä¹Ÿé —æœ‰äº›æ‹–æ¬ äº†ã€‚ç•¶æ˜¯æ™‚ï¼Œä¾¿æ˜¯å»‰åæ¸…官們也漸以為薪之ä¸å¯ä¸ç´¢ï¼Œè€Œæ³å…¼åšæ•™å“¡çš„æ–¹çŽ„ç¶½ï¼Œè‡ªç„¶æ›´è¡¨åŒæƒ…æ–¼å­¸ç•Œèµ·ä¾†ï¼Œæ‰€ä»¥å¤§å®¶ä¸»å¼µç¹¼çºŒç½·èª²çš„æ™‚å€™ï¼Œä»–é›–ç„¶ä»æœªåˆ°å ´ï¼Œäº‹å¾Œå»å°¤å…¶å¿ƒæ‚…誠æœçš„確守了公共的決議。 +然而政府竟åˆä»˜éŒ¢ï¼Œå­¸æ ¡ä¹Ÿå°±é–‹èª²äº†ã€‚但在å‰å¹¾å¤©ï¼Œå»æœ‰å­¸ç”Ÿç¸½æœƒä¸Šä¸€å€‹å‘ˆæ–‡çµ¦æ”¿åºœï¼Œèªªã€Œæ•™å“¡å€˜è‹¥ä¸ä¸Šèª²ï¼Œä¾¿è¦ä»˜æ¬ è–ªã€‚ã€é€™é›–然並無效,而方玄綽å»å¿½è€Œè¨˜èµ·å‰å›žæ”¿åºœæ‰€èªªçš„「上了課纔給錢ã€çš„話來,「差ä¸å¤šã€é€™ä¸€å€‹å½±å­åœ¨ä»–眼å‰åˆä¸€å¹Œï¼Œè€Œä¸”䏦䏿¶ˆæ»…,於是他便在講堂上公表了。 +準此,å¯è¦‹å¦‚果將「差ä¸å¤šèªªã€é›ç…‰ç¾…織起來,自然也å¯ä»¥åˆ¤ä½œä¸€ç¨®æŒ¾å¸¶ç§å¿ƒçš„ä¸å¹³ï¼Œä½†ç¸½ä¸èƒ½èªªæ˜¯å°ˆç‚ºè‡ªå·±åšå®˜çš„è¾¯è§£ã€‚åªæ˜¯æ¯åˆ°é€™äº›æ™‚,他åˆå¸¸å¸¸å–œæ­¡æ‹‰ä¸Šä¸­åœ‹å°‡ä¾†çš„命é‹ä¹‹é¡žçš„å•題,一ä¸å°å¿ƒï¼Œä¾¿é€£è‡ªå·±ä¹Ÿä»¥ç‚ºæ˜¯ä¸€å€‹æ†‚國的志士;人們是æ¯è‹¦æ–¼æ²’有「自知之明ã€çš„。 +但是「差ä¸å¤šã€çš„事實åˆç™¼ç”Ÿäº†ï¼Œæ”¿åºœç•¶åˆé›–åªä¸ç†é‚£äº›æ‹›äººé ­ç—›çš„æ•™å“¡ï¼Œå¾Œä¾†ç«Ÿä¸ç†åˆ°ç„¡é—œç—›ç™¢çš„官åï¼Œæ¬ è€Œåˆæ¬ ï¼Œçµ‚於逼得先å‰é„™è–„教員è¦éŒ¢çš„好官,也很有幾員化為索薪大會è£çš„é©å°‡äº†ã€‚惟有幾種日報上å»å¾ˆç™¼äº†äº›é„™è–„è­ç¬‘他們的文字。方玄綽也毫ä¸ç‚ºå¥‡ï¼Œæ¯«ä¸ä»‹æ„,因為他根據了他的「差ä¸å¤šèªªã€ï¼ŒçŸ¥é“這是新èžè¨˜è€…還未缺少潤筆的緣故,è¬ä¸€æ”¿åºœæˆ–是闊人åœäº†æ´¥è²¼ï¼Œä»–們多åŠä¹Ÿè¦é–‹å¤§æœƒçš„。 +ä»–æ—¢å·²è¡¨åŒæƒ…於教員的索薪,自然也贊æˆåŒå¯®çš„索俸,然而他ä»å®‰å在衙門中,照例的並ä¸ä¸€åŒåŽ»è¨Žå‚µã€‚è‡³æ–¼æœ‰äººç–‘å¿ƒä»–å­¤é«˜ï¼Œé‚£å¯ä¹Ÿä¸éŽæ˜¯ä¸€ç¨®èª¤è§£ç½·äº†ã€‚ä»–è‡ªå·±èªªï¼Œä»–æ˜¯è‡ªå¾žå‡ºä¸–ä»¥ä¾†ï¼Œåªæœ‰äººå‘他來è¦å‚µï¼Œä»–從沒有å‘人去討éŽå‚µï¼Œæ‰€ä»¥é€™ä¸€ç«¯æ˜¯ã€Œéžå…¶æ‰€é•·ã€ã€‚è€Œä¸”ä»–æ˜¯ä¸æ•¢è¦‹æ‰‹æ¡ç¶“經濟之權的人物,這種人待到失了權勢之後,æ§è‘—一本《大乘起信論》講佛學的時候,固然也很是「藹然å¯è¦ªã€çš„了,但還在寶座上時,å»ç¸½æ˜¯ä¸€å‰¯é–»çŽ‹è‡‰ï¼Œå°‡åˆ¥äººéƒ½ç•¶å¥´æ‰çœ‹è‡ªä»¥ç‚ºæ‰‹æ“著你們這些窮å°å­å€‘çš„ç”Ÿæ®ºä¹‹æ¬Šã€‚ä»–å› æ­¤ä¸æ•¢è¦‹ï¼Œä¹Ÿä¸é¡˜è¦‹ä»–å€‘ã€‚é€™ç¨®è„¾æ°£ï¼Œé›–ç„¶æœ‰æ™‚é€£è‡ªå·±ä¹Ÿè¦ºå¾—æ˜¯å­¤é«˜ï¼Œä½†å¾€å¾€åŒæ™‚也疑心這其實是沒本領。 +大家左索å³ç´¢ï¼Œç¸½è‡ªä¸€ç¯€ä¸€ç¯€çš„æŒ¨éŽåŽ»äº†ï¼Œä½†æ¯”èµ·å…ˆå‰ä¾†ï¼Œæ–¹çŽ„ç¶½ç©¶ç«Ÿæ˜¯è¬åˆ†çš„æ‹®æ®ï¼Œæ‰€ä»¥ä½¿ç”¨çš„å°å»å’Œäº¤æ˜“çš„åº—å®¶ä¸æ¶ˆèªªï¼Œä¾¿æ˜¯æ–¹å¤ªå¤ªå°æ–¼ä»–也漸漸的缺了敬æ„,åªè¦çœ‹ä¼Šè¿‘來ä¸å¾ˆé™„和,而且常常æå‡ºç¨å‰µçš„æ„è¦‹ï¼Œæœ‰äº›å”çªçš„舉動,也就å¯ä»¥çž­ç„¶äº†ã€‚到了陰曆五月åˆå››çš„åˆå‰ï¼Œä»–一回來,伊便將一疊賬單塞在他的鼻å­è·Ÿå‰ï¼Œé€™ä¹Ÿæ˜¯å¾€å¸¸æ‰€æ²’有的。 +「一總總得一百八å塊錢纔夠開消……發了麽?ã€ä¼Šä¸¦ä¸å°è‘—他看的說。 +「哼,我明天ä¸åšå®˜äº†ã€‚éŒ¢çš„æ”¯ç¥¨æ˜¯é ˜ä¾†çš„äº†ï¼Œå¯æ˜¯ç´¢è–ªå¤§æœƒçš„代表ä¸ç™¼æ”¾ï¼Œå…ˆèªªæ˜¯æ²’有åŒåŽ»çš„äººéƒ½ä¸ç™¼ï¼Œå¾Œä¾†åˆèªªæ˜¯è¦åˆ°ä»–們跟å‰åŽ»è¦ªé ˜ã€‚ä»–å€‘ä»Šå¤©å–®æè‘—支票,就變了閻王臉了,我實在怕看見……我錢也ä¸è¦äº†ï¼Œå®˜ä¹Ÿä¸åšäº†ï¼Œé€™æ¨£ç„¡é™é‡çš„å‘屈……〠+方太太見了這少見的義憤,倒有些愕然了,但也就沉éœä¸‹ä¾†ã€‚ +「我想,還ä¸å¦‚去親領罷,這算什麼呢。ã€ä¼Šçœ‹è‘—他的臉說。 +「我ä¸åŽ»ï¼é€™æ˜¯å®˜ä¿¸ï¼Œä¸æ˜¯è³žéŒ¢ï¼Œç…§ä¾‹æ‡‰è©²ç”±æœƒè¨ˆç§‘é€ä¾†çš„。〠+ã€Œå¯æ˜¯ä¸é€ä¾†åˆæ€Žéº¼å¥½å‘¢â€¦â€¦å“¦ï¼Œæ˜¨å¤œå¿˜è¨˜èªªäº†ï¼Œå­©å­å€‘說那學費,學校è£å·²ç¶“催éŽå¥½å¹¾æ¬¡äº†ï¼Œèªªæ˜¯å€˜è‹¥å†ä¸ç¹³â€¦â€¦ã€ +「胡說ï¼åšè€å­çš„辦事教書都ä¸çµ¦éŒ¢ï¼Œå…’å­åŽ»å¿µå¹¾å¥æ›¸å€’è¦éŒ¢ï¼Ÿã€ +伊覺得他已經ä¸å¾ˆé¡§å¿Œé“ç†ï¼Œä¼¼ä¹Žå°±è¦å°‡è‡ªå·±ç•¶ä½œæ ¡é•·ä¾†å‡ºæ°£ï¼ŒçНä¸ä¸Šï¼Œä¾¿ä¸å†è¨€èªžäº†ã€‚ +兩個默默的åƒäº†åˆé£¯ã€‚ä»–æƒ³äº†ä¸€æœƒï¼Œåˆæ‡Šæƒ±çš„出去了。 +照舊例,近年是æ¯é€¢ç¯€æ ¹æˆ–年關的å‰ä¸€å¤©ï¼Œä»–一定須在夜è£çš„å二點é˜çº”回家,一é¢èµ°ï¼Œä¸€é¢æŽè‘—懷中,一é¢å¤§è²çš„å«é“,「喂,領來了ï¼ã€æ–¼æ˜¯éžçµ¦ä¼Šä¸€ç–Šç°‡æ–°çš„中交票,臉上很有些得æ„的形色。誰知é“åˆå››é€™ä¸€å¤©å»ç ´äº†ä¾‹ï¼Œä»–ä¸åˆ°ä¸ƒé»žé˜ä¾¿å›žå®¶ä¾†ã€‚方太太很驚疑,以為他竟已辭了è·äº†ï¼Œä½†æš—暗地察看他臉上,å»ä¹Ÿä¸¦ä¸è¦‹æœ‰ä»€éº¼æ ¼å¤–倒é‹çš„神情。「怎麼了?……這樣早?……ã€ä¼Šçœ‹å®šäº†ä»–說。「發ä¸åŠäº†ï¼Œé ˜ä¸å‡ºäº†ï¼ŒéŠ€è¡Œå·²ç¶“é—œäº†é–€ï¼Œå¾—ç­‰åˆå…«ã€‚ã€ã€Œè¦ªé ˜ï¼Ÿâ€¦â€¦ã€ä¼Šæƒ´æƒ´çš„å•。 +ã€Œè¦ªé ˜é€™ä¸€å±¤ä¹Ÿå·²ç¶“å–æ¶ˆäº†ï¼Œè½èªªä»èˆŠç”±æœƒè¨ˆç§‘分é€ã€‚坿˜¯éŠ€è¡Œä»Šå¤©å·²ç¶“é—œäº†é–€ï¼Œä¼‘æ¯ä¸‰å¤©ï¼Œå¾—等到åˆå…«çš„上åˆã€‚ã€ä»–å下,眼ç›çœ‹è‘—地é¢äº†ï¼Œå–éŽä¸€å£èŒ¶ï¼Œçº”åˆæ…¢æ…¢çš„é–‹å£èªªï¼Œã€Œå¹¸è€Œè¡™é–€è£ä¹Ÿæ²’有什麼å•題了,大約到åˆå…«å°±æº–有錢……å‘ä¸ç›¸å¹²çš„親戚朋å‹åŽ»å€ŸéŒ¢ï¼Œå¯¦åœ¨æ˜¯ä¸€ä»¶ç…©é›£äº‹ã€‚æˆ‘åˆå¾Œç¡¬è‘—頭皮去尋金永生,談了一會,他先æ­ç¶­æˆ‘ä¸åŽ»ç´¢è–ªï¼Œä¸è‚¯è¦ªé ˜ï¼Œéžå¸¸ä¹‹æ¸…高,一個人正應該這樣åšï¼›å¾…åˆ°çŸ¥é“æˆ‘想è¦å‘他通èžäº”åå…ƒï¼Œå°±åƒæˆ‘在他嘴è£å¡žäº†ä¸€å¤§æŠŠé¹½ä¼¼çš„,凡有臉上å¯ä»¥æ‰“皺的地迫都打起皺來,說房租怎樣的收ä¸èµ·ï¼Œè²·è³£æ€Žæ¨£çš„賠本,在åŒäº‹é¢å‰è¦ªèº«é ˜æ¬¾ï¼Œä¹Ÿä¸ç®—什麼的,å³åˆ»å°‡æˆ‘支使出來了。〠+ã€Œé€™æ¨£ç·Šæ€¥çš„ç¯€æ ¹ï¼Œèª°é‚„è‚¯å€Ÿå‡ºéŒ¢åŽ»å‘¢ã€‚ã€æ–¹å¤ªå¤ªå»åªæ·¡æ·¡çš„說,並沒有什麼慨然。 +方玄綽低下頭來了,覺得這也無怪其然的,æ³ä¸”自己和金永生本來很ç–é ã€‚他接著就記起去年年關的事來,那時有一個åŒé„‰ä¾†å€Ÿå塊錢,他其時明明已經收到了衙門的領款憑單的了,因為死怕這人將來未必會還錢,便è£äº†å‰¯ç‚ºé›£çš„神色,說é“è¡™é–€è£æ—¢ç„¶é ˜ä¸åˆ°ä¿¸éŒ¢ï¼Œå­¸æ ¡è£åˆä¸ç™¼è–ªæ°´ï¼Œå¯¦åœ¨ã€Œæ„›èŽ«èƒ½åŠ©ã€ï¼Œå°‡ä»–空手é€èµ°äº†ã€‚他雖然自已並ä¸çœ‹è¦‹è£äº†æ€Žæ¨£çš„臉,但此時å»è¦ºå¾—å¾ˆå±€ä¿ƒï¼Œå˜´å”‡å¾®å¾®ä¸€å‹•ï¼Œåˆæ–一æ–頭。 +然而ä¸å¤šä¹…,他忽而æç„¶å¤§æ‚Ÿä¼¼çš„發命令了:å«å°å»å³åˆ»ä¸Šè¡—去賒一瓶蓮花白。他知é“åº—å®¶å¸Œåœ–æ˜Žå¤©å¤šé‚„å¸³ï¼Œå¤§æŠµæ˜¯ä¸æ•¢ä¸è³’的,å‡å¦‚ä¸è³’,則明天分文ä¸é‚„,正是他們應得的懲罰。蓮花白竟賒來了,他å–了兩æ¯ï¼Œé’白色的臉上泛了紅,åƒå®Œé£¯ï¼Œåˆé —有些高興了,他點上一æžå¤§è™Ÿå“ˆå¾·é–€é¦™ç…™ï¼Œå¾žæ¡Œä¸ŠæŠ“起一本《嘗試集》來,躺在床上就è¦çœ‹ã€‚ +「那麼明天怎麼å°ä»˜åº—å®¶å‘¢ï¼Ÿã€æ–¹å¤ªå¤ªè¿½ä¸ŠåŽ»ï¼Œç«™åœ¨åºŠé¢å‰çœ‹è‘—他的臉說。「店家?……教他們åˆå…«çš„下åŠå¤©ä¾†ã€‚ã€ã€Œæˆ‘å¯ä¸èƒ½é€™éº¼èªªã€‚他們ä¸ç›¸ä¿¡ï¼Œä¸ç­”應的。ã€ã€Œæœ‰ä»€éº¼ä¸ç›¸ä¿¡ã€‚他們å¯ä»¥å•去,全衙門è£ä»€éº¼äººä¹Ÿæ²’有領到,都得åˆå…«ï¼ã€ä»–戟著第二個指頭在帳å­è£çš„空中畫了一個åŠåœ“,方太太跟著指頭也看了一個åŠåœ“,åªè¦‹é€™æ‰‹ä¾¿åŽ»ç¿»é–‹äº†ã€Šå˜—è©¦é›†ã€‹ã€‚ +方太太見他強橫到出乎情ç†ä¹‹å¤–了,也暫時開ä¸å¾—å£ã€‚ +「我想,這模樣是鬧ä¸ä¸‹åŽ»çš„ï¼Œå°‡ä¾†ç¸½å¾—æƒ³é»žæ³•ï¼Œåšé»žä»€éº¼åˆ¥çš„事……ã€ä¼Šçµ‚於尋到了別的路,說。「什麼法呢?我『文ä¸åƒè¬„錄生,武ä¸åƒæ•‘ç«å…µã€ï¼Œåˆ¥çš„åšä»€éº¼ï¼Ÿã€ã€Œä½ ä¸æ˜¯çµ¦ä¸Šæµ·çš„æ›¸é‹ªå­åšéŽæ–‡ç« éº½ï¼Ÿã€ +「上海的書鋪å­ï¼Ÿè²·ç¨¿è¦ä¸€å€‹ä¸€å€‹çš„算字,空格ä¸ç®—數。你看我åšåœ¨é‚£è£çš„白話詩去,空白有多少,怕åªå€¼ä¸‰ç™¾å¤§éŒ¢ä¸€æœ¬ç½·ã€‚收版權稅åˆåŠå¹´å…­æœˆæ²’消æ¯ï¼Œã€Žé æ°´æ•‘ä¸å¾—è¿‘ç«ã€ï¼Œèª°è€ç…©ã€‚ã€ã€Œé‚£éº¼ï¼Œçµ¦é€™è£çš„報館è£â€¦â€¦ã€ +「給報館è£ï¼Ÿä¾¿åœ¨é€™è£å¾ˆå¤§çš„報館è£ï¼Œæˆ‘é è‘—一個學生在那è£åšç·¨è¼¯çš„大情é¢ï¼Œä¸€åƒå­—也就是這幾個錢,å³ä½¿ä¸€æ—©åšåˆ°å¤œï¼Œèƒ½å¤ é¤Šæ´»ä½ å€‘麽?æ³ä¸”我肚å­è£ä¹Ÿæ²’有這許多文章。〠+「那麼,éŽäº†ç¯€æ€Žéº¼è¾¦å‘¢ï¼Ÿã€ã€ŒéŽäº†ç¯€éº½ï¼Ÿâ€”—ä»èˆŠåšå®˜â€¦â€¦æ˜Žå¤©åº—家來è¦éŒ¢ï¼Œä½ åªè¦èªªåˆå…«çš„下åˆã€‚〠+ä»–åˆè¦çœ‹ã€Šå˜—試集》了。方太太怕失了機會,連忙åžåžåå的說:「我想,éŽäº†ç¯€ï¼Œåˆ°äº†åˆå…«ï¼Œæˆ‘們……倒ä¸å¦‚去買一張彩票……ã€ã€Œèƒ¡èªªï¼æœƒèªªå‡ºé€™æ¨£ç„¡æ•™è‚²çš„……〠+這時候,他忽而åˆè¨˜èµ·è¢«é‡‘永生支使出來以後的事了。那時他惘惘的走éŽç¨»é¦™æ‘,看店門å£è±Žè‘—許多斗大的字的廣告é“「頭彩幾è¬å…ƒã€ï¼Œä»¿ä½›è¨˜å¾—心è£ä¹Ÿä¸€å‹•,或者也許放慢了腳步的罷,但似乎因為æ¨ä¸å¾—皮夾è£åƒ…存的六角錢,所以竟也毅然決然的走é äº†ã€‚他臉色一變,方太太料想他是在惱著伊的無教育,便趕緊退開,沒有說完話。方玄綽也沒有說完話,將腰一伸,咿咿嗚嗚的就念《嘗試集》。 +我冒了嚴寒,回到相隔二åƒé¤˜é‡Œï¼Œåˆ¥äº†äºŒå餘年的故鄉去。 +時候既然是深冬;漸近故鄉時,天氣åˆé™°æ™¦äº†ï¼Œå†·é¢¨å¹é€²èˆ¹è‰™ä¸­ï¼Œå—šå—šçš„響,從蓬隙å‘外一望,蒼黃的天底下,é è¿‘æ©«è‘—å¹¾å€‹è•­ç´¢çš„è’æ‘,沒有一些活氣。我的心ç¦ä¸ä½æ‚²æ¶¼èµ·ä¾†äº†ã€‚ +阿ï¼é€™ä¸æ˜¯æˆ‘二å年來時時記得的故鄉? +我所記得的故鄉全ä¸å¦‚æ­¤ã€‚æˆ‘çš„æ•…é„‰å¥½å¾—å¤šäº†ã€‚ä½†è¦æˆ‘記起他的美麗,說出他的佳處來,å»åˆæ²’有影åƒï¼Œæ²’æœ‰è¨€è¾­äº†ã€‚ä»¿ä½›ä¹Ÿå°±å¦‚æ­¤ã€‚æ–¼æ˜¯æˆ‘è‡ªå·±è§£é‡‹èªªï¼šæ•…é„‰æœ¬ä¹Ÿå¦‚æ­¤ï¼Œâ€”â€”é›–ç„¶æ²’æœ‰é€²æ­¥ï¼Œä¹Ÿæœªå¿…æœ‰å¦‚æˆ‘æ‰€æ„Ÿçš„æ‚²æ¶¼ï¼Œé€™åªæ˜¯æˆ‘自己心情的改變罷了,因為我這次回鄉,本沒有什麼好心緒。 +æˆ‘é€™æ¬¡æ˜¯å°ˆç‚ºäº†åˆ¥ä»–è€Œä¾†çš„ã€‚æˆ‘å€‘å¤šå¹´èšæ—而居的è€å±‹ï¼Œå·²ç¶“å…¬åŒè³£çµ¦åˆ¥å§“了,交屋的期é™ï¼Œåªåœ¨æœ¬å¹´ï¼Œæ‰€ä»¥å¿…須趕在正月åˆä¸€ä»¥å‰ï¼Œæ°¸åˆ¥äº†ç†Ÿè­˜çš„è€å±‹ï¼Œè€Œä¸”é é›¢äº†ç†Ÿè­˜çš„æ•…鄉,æ¬å®¶åˆ°æˆ‘在謀食的異地去。 +第二日清早晨我到了我家的門å£äº†ã€‚瓦楞上許多枯è‰çš„æ–·èŽ–ç•¶é¢¨æŠ–è‘—ï¼Œæ­£åœ¨èªªæ˜Žé€™è€å±‹é›£å…易主的原因。幾房的本家大約已經æ¬èµ°äº†ï¼Œæ‰€ä»¥å¾ˆå¯‚éœã€‚我到了自家的房外,我的æ¯è¦ªæ—©å·²è¿Žè‘—出來了,接著便飛出了八歲的侄兒å®å…’。 +我的æ¯è¦ªå¾ˆé«˜èˆˆï¼Œä½†ä¹Ÿè—著許多淒涼的神情,教我å下,歇æ¯ï¼Œå–茶,且ä¸è«‡æ¬å®¶çš„事。å®å…’æ²’æœ‰è¦‹éŽæˆ‘,é é çš„å°é¢ç«™è‘—åªæ˜¯çœ‹ã€‚ +但我們終於談到æ¬å®¶çš„事。我說外間的寓所已經租定了,åˆè²·äº†å¹¾ä»¶å‚¢å…·ï¼Œæ­¤å¤–須將家裡所有的木器賣去,å†åŽ»å¢žæ·»ã€‚æ¯è¦ªä¹Ÿèªªå¥½ï¼Œè€Œä¸”行æŽä¹Ÿç•¥å·²é½Šé›†ï¼Œæœ¨å™¨ä¸ä¾¿æ¬é‹çš„,也å°åŠè³£åŽ»äº†ï¼Œåªæ˜¯æ”¶ä¸èµ·éŒ¢ä¾†ã€‚ +「你休æ¯ä¸€å…©å¤©ï¼ŒåŽ»æ‹œæœ›è¦ªæˆšæœ¬å®¶ä¸€å›žï¼Œæˆ‘å€‘ä¾¿å¯ä»¥èµ°äº†ã€‚ã€æ¯è¦ªèªªã€‚ +「是的。〠+「還有é–土,他æ¯åˆ°æˆ‘家來時,總å•起你,很想見你一回é¢ã€‚我已經將你到家的大約日期通知他,他也許就è¦ä¾†äº†ã€‚〠+這時候,我的腦裡忽然閃出一幅神異的圖畫來:深è—的天空中掛著一輪金黃的圓月,下麵是海邊的沙地,都種著一望無際的碧綠的西瓜,其間有一個å一二歲的少年,項帶銀圈,手æä¸€æŸ„鋼å‰ï¼Œå‘一匹猹盡力的刺去,那猹å»å°‡èº«ä¸€æ‰­ï¼Œå從他的胯下逃走了。 +這少年便是é–土。我èªè­˜ä»–時,也ä¸éŽå多歲,離ç¾åœ¨å°‡æœ‰ä¸‰å年了;那時我的父親還在世,家景也好,我正是一個少爺。那一年,我家是一件大祭祀的值年。這祭祀,說是三å多年æ‰èƒ½è¼ªåˆ°ä¸€å›žï¼Œæ‰€ä»¥å¾ˆé„­é‡ï¼›æ­£æœˆè£¡ä¾›ç¥–åƒï¼Œä¾›å“很多,祭器很講究,拜的人也很多,祭器也很è¦é˜²å·åŽ»ã€‚æˆ‘å®¶åªæœ‰ä¸€å€‹å¿™æœˆï¼ˆæˆ‘們這裡給人åšå·¥çš„分三種:整年給一定人家åšå·¥çš„å«é•·å·¥ï¼›æŒ‰æ—¥çµ¦äººåšå·¥çš„å«çŸ­å·¥ï¼›è‡ªå·±ä¹Ÿç¨®åœ°ï¼Œåªåœ¨éŽå¹´éŽç¯€ä»¥åŠæ”¶ç§Ÿæ™‚候來給一定人家åšå·¥çš„稱忙月),忙ä¸éŽä¾†ï¼Œä»–便å°çˆ¶è¦ªèªªï¼Œå¯ä»¥å«ä»–的兒å­é–土來管祭器的。 +我的父親å…許了;我也很高興,因為我早è½åˆ°é–土這å字,而且知é“ä»–å’Œæˆ‘ä»¿ä½›å¹´ç´€ï¼Œé–æœˆç”Ÿçš„,五行缺土,所以他的父親å«ä»–é–土。他是能è£å¼¶æ‰å°é³¥é›€çš„。 +我於是日日盼望新年,新年到,é–土也就到了。好容易到了年末,有一日,æ¯è¦ªå‘Šè¨´æˆ‘,é–åœŸä¾†äº†ï¼Œæˆ‘ä¾¿é£›è·‘çš„åŽ»çœ‹ã€‚ä»–æ­£åœ¨å»šæˆ¿è£¡ï¼Œç´«è‰²çš„åœ“è‡‰ï¼Œé ­æˆ´ä¸€é ‚å°æ°ˆå¸½ï¼Œé ¸ä¸Šå¥—一個明晃晃的銀項圈,這å¯è¦‹ä»–的父親å分愛他,怕他死去,所以在神佛é¢å‰è¨±ä¸‹é¡˜å¿ƒï¼Œç”¨åœˆå­å°‡ä»–套ä½äº†ã€‚ä»–è¦‹äººå¾ˆæ€•ç¾žï¼Œåªæ˜¯ä¸æ€•我,沒有æ—人的時候,便和我說話,於是ä¸åˆ°åŠæ—¥ï¼Œæˆ‘們便熟識了。 +我們那時候ä¸çŸ¥é“談些什麼,åªè¨˜å¾—é–土很高興,說是上城之後,見了許多沒有見éŽçš„æ±è¥¿ã€‚ +第二日,我便è¦ä»–æ•鳥。他說: +"這ä¸èƒ½ã€‚須大雪下了æ‰å¥½ã€‚æˆ‘å€‘æ²™åœ°ä¸Šï¼Œä¸‹äº†é›ªï¼Œæˆ‘æŽƒå‡ºä¸€å¡Šç©ºåœ°ä¾†ï¼Œç”¨çŸ­æ£’æ”¯èµ·ä¸€å€‹å¤§ç«¹åŒ¾ï¼Œæ’’ä¸‹ç§•ç©€ï¼Œçœ‹é³¥é›€ä¾†åƒæ™‚,我é é åœ°å°‡ç¸›åœ¨æ£’上的繩å­åªä¸€æ‹‰ï¼Œé‚£é³¥é›€å°±ç½©åœ¨ç«¹åŒ¾ä¸‹äº†ã€‚什麼都有:稻雞,角雞,鵓鴣,è—背……" +我於是åˆå¾ˆç›¼æœ›ä¸‹é›ªã€‚ +é–土åˆå°æˆ‘說: +"ç¾åœ¨å¤ªå†·ï¼Œä½ å¤å¤©åˆ°æˆ‘å€‘é€™è£¡ä¾†ã€‚æˆ‘å€‘æ—¥è£¡åˆ°æµ·é‚Šæ’¿è²æ®¼åŽ»ï¼Œç´…çš„ç¶ çš„éƒ½æœ‰ï¼Œé¬¼è¦‹æ€•ä¹Ÿæœ‰ï¼Œè§€éŸ³æ‰‹ä¹Ÿæœ‰ã€‚æ™šä¸Šæˆ‘å’Œçˆ¹ç®¡è¥¿ç“œåŽ»ï¼Œä½ ä¹ŸåŽ»ã€‚" +"管賊麽?" +"䏿˜¯ã€‚èµ°è·¯çš„äººå£æ¸´äº†æ‘˜ä¸€å€‹ç“œåƒï¼Œæˆ‘們這裡是ä¸ç®—å·çš„。è¦ç®¡çš„æ˜¯ç¾è±¬ï¼ŒåˆºèŸï¼ŒçŒ¹ã€‚月亮底下,你è½ï¼Œå•¦å•¦çš„響了,猹在咬瓜了。你便æäº†èƒ¡å‰ï¼Œè¼•輕地走去……" +我那時並ä¸çŸ¥é“這所謂猹的是怎麼一件æ±è¥¿â€”—便是ç¾åœ¨ä¹Ÿæ²’有知é“â€”â€”åªæ˜¯ç„¡ç«¯çš„覺得狀如å°ç‹—而很兇猛。 +"ä»–ä¸äººéº½ï¼Ÿ" +"有胡å‰å‘¢ã€‚走到了,看見猹了,你便刺。這畜生很伶ä¿ï¼Œå€’å‘你奔來,å從胯下竄了。他的皮毛是油一般的滑……" +我素ä¸çŸ¥é“å¤©ä¸‹æœ‰é€™è¨±å¤šæ–°é®®äº‹ï¼šæµ·é‚Šæœ‰å¦‚è¨±äº”è‰²çš„è²æ®¼ï¼›è¥¿ç“œæœ‰é€™æ¨£å±éšªçš„經歷,我先å‰å–®çŸ¥é“他在水果店裡出賣罷了。 +"我們沙地裡,潮汛è¦ä¾†çš„æ™‚å€™ï¼Œå°±æœ‰è¨±å¤šè·³é­šå…’åªæ˜¯è·³ï¼Œéƒ½æœ‰é’蛙似的兩個腳……" +阿ï¼é–åœŸçš„å¿ƒè£¡æœ‰ç„¡çª®ç„¡ç›¡çš„å¸Œå¥‡çš„äº‹ï¼Œéƒ½æ˜¯æˆ‘å¾€å¸¸çš„æœ‹å‹æ‰€ä¸çŸ¥é“的。他們ä¸çŸ¥é“一些事,é–土在海邊時,他們都和我一樣åªçœ‹è¦‹é™¢å­è£¡é«˜ç‰†ä¸Šçš„四角的天空。 +坿ƒœæ­£æœˆéŽåŽ»äº†ï¼Œé–土須回家裡去,我急得大哭,他也躲到廚房裡,哭著ä¸è‚¯å‡ºé–€ï¼Œä½†çµ‚æ–¼è¢«ä»–çˆ¶è¦ªå¸¶èµ°äº†ã€‚ä»–å¾Œä¾†é‚„æ‰˜ä»–çš„çˆ¶è¦ªå¸¶çµ¦æˆ‘ä¸€åŒ…è²æ®¼å’Œå¹¾æ”¯å¾ˆå¥½çœ‹çš„鳥毛,我也曾é€ä»–一兩次æ±è¥¿ï¼Œä½†å¾žæ­¤æ²’有å†è¦‹é¢ã€‚ +ç¾åœ¨æˆ‘çš„æ¯è¦ªæèµ·äº†ä»–,我這兒時的記憶,忽而全都閃電似的蘇生éŽä¾†ï¼Œä¼¼ä¹Žçœ‹åˆ°äº†æˆ‘的美麗的故鄉了。我應è²èªªï¼š +"這好極ï¼ä»–,——怎樣?……" +"他?……他景æ³ä¹Ÿå¾ˆä¸å¦‚æ„……"æ¯è¦ªèªªè‘—ï¼Œä¾¿å‘æˆ¿å¤–看,"這些人åˆä¾†äº†ã€‚說是買木器,順手也就隨便拿走的,我得去看看。" +æ¯è¦ªç«™èµ·èº«ï¼Œå‡ºåŽ»äº†ã€‚é–€å¤–æœ‰å¹¾å€‹å¥³äººçš„è²éŸ³ã€‚我便招å®å…’èµ°è¿‘é¢å‰ï¼Œå’Œä»–閑話:å•他坿œƒå¯«å­—,å¯é¡˜æ„出門。 +"我們åç«è»ŠåŽ»éº½ï¼Ÿ" +"我們åç«è»ŠåŽ»ã€‚" +"船呢?" +"å…ˆå船,……" +"哈ï¼é€™æ¨¡æ¨£äº†ï¼é¬å­é€™éº¼é•·äº†ï¼"一種尖利的怪è²çªç„¶å¤§å«èµ·ä¾†ã€‚ +我åƒäº†ä¸€åš‡ï¼Œè¶•忙抬起頭,å»è¦‹ä¸€å€‹å‡¸é¡´éª¨ï¼Œè–„å˜´å”‡ï¼Œäº”åæ­²ä¸Šä¸‹çš„女人站在我é¢å‰ï¼Œå…©æ‰‹æ­åœ¨é«€é–“,沒有系裙,張著兩腳,正åƒä¸€å€‹ç•«åœ–儀器裡細腳伶仃的圓è¦ã€‚ +我愕然了。 +"ä¸èªè­˜äº†éº½ï¼Ÿæˆ‘還抱éŽä½ å’§ï¼" +我愈加愕然了。幸而我的æ¯è¦ªä¹Ÿå°±é€²ä¾†ï¼Œå¾žæ—說: +"他多年出門,統忘å»äº†ã€‚你該記得罷,"便å‘著我說,"這是斜å°é–€çš„æ¥ŠäºŒå«‚,……開豆è…店的。" +å“¦ï¼Œæˆ‘è¨˜å¾—äº†ã€‚æˆ‘å­©å­æ™‚候,在斜å°é–€çš„豆è…店裡確乎終日å著一個楊二嫂,人都å«ä¼Š"豆è…西施"⑹。但是擦著白粉,顴骨沒有這麼高,嘴唇也沒有這麼薄,而且終日å著,我也從沒有見éŽé€™åœ“è¦å¼çš„姿勢。那時人說:因為伊,這豆è…店的買賣éžå¸¸å¥½ã€‚但這大約因為年齡的關係,我å»ä¸¦æœªè’™è‘—一毫感化,所以竟完全忘å»äº†ã€‚然而圓è¦å¾ˆä¸å¹³ï¼Œé¡¯å‡ºé„™å¤·çš„神色,仿佛嗤笑法國人ä¸çŸ¥é“拿破侖,美國人ä¸çŸ¥é“è¯ç››é “似的,冷笑說: +"忘了?這真是貴人眼高……" +"那有這事……我……"我惶æè‘—,站起來說。 +"那麼,我å°ä½ èªªã€‚迅哥兒,你闊了,æ¬å‹•åˆç¬¨é‡ï¼Œä½ é‚„è¦ä»€éº¼é€™äº›ç ´çˆ›æœ¨å™¨ï¼Œè®“æˆ‘æ‹¿åŽ»ç½·ã€‚æˆ‘å€‘å°æˆ¶äººå®¶ï¼Œç”¨å¾—著。" +"我並有闊哩。我須賣了這些,å†åŽ»â€¦â€¦" +"阿呀呀,你放了é“å°äº†ï¼Œé‚„說ä¸é—Šï¼Ÿä½ ç¾åœ¨æœ‰ä¸‰æˆ¿å§¨å¤ªå¤ªï¼›å‡ºé–€ä¾¿æ˜¯å…«æŠ¬çš„大轎,還說ä¸é—Šï¼Ÿåš‡ï¼Œä»€éº¼éƒ½çžžä¸éŽæˆ‘。" +我知é“無話å¯èªªäº†ï¼Œä¾¿é–‰äº†å£ï¼Œé»˜é»˜çš„站著。 +"阿呀阿呀,真是愈有錢,便愈是一毫ä¸è‚¯æ”¾é¬†ï¼Œæ„ˆæ˜¯ä¸€æ¯«ä¸è‚¯æ”¾é¬†ï¼Œä¾¿æ„ˆæœ‰éŒ¢â€¦â€¦"圓è¦ä¸€é¢æ†¤æ†¤çš„迴轉身,一é¢çµ®çµ®çš„說,慢慢å‘外走,順便將我æ¯è¦ªçš„一副手套塞在褲腰裡,出去了。 +æ­¤å¾Œåˆæœ‰è¿‘è™•çš„æœ¬å®¶å’Œè¦ªæˆšä¾†è¨ªå•æˆ‘ã€‚æˆ‘ä¸€é¢æ‡‰é…¬ï¼Œå·ç©ºä¾¿æ”¶æ‹¾äº›è¡ŒæŽï¼Œé€™æ¨£çš„éŽäº†ä¸‰å››å¤©ã€‚ +一日是天氣很冷的åˆå¾Œï¼Œæˆ‘åƒéŽåˆé£¯ï¼Œåè‘—å–èŒ¶ï¼Œè¦ºå¾—å¤–é¢æœ‰äººé€²ä¾†äº†ï¼Œä¾¿å›žé ­åŽ»çœ‹ã€‚æˆ‘çœ‹æ™‚ï¼Œä¸ç”±çš„éžå¸¸å‡ºé©šï¼Œæ…Œå¿™ç«™èµ·èº«ï¼Œè¿Žè‘—走去。 +這來的便是é–åœŸã€‚é›–ç„¶æˆ‘ä¸€è¦‹ä¾¿çŸ¥é“æ˜¯é–土,但åˆä¸æ˜¯æˆ‘這記憶上的é–土了。他身æå¢žåŠ äº†ä¸€å€ï¼›å…ˆå‰çš„紫色的圓臉,已經變作ç°é»ƒï¼Œè€Œä¸”加上了很深的皺紋;眼ç›ä¹Ÿåƒä»–父親一樣,周åœéƒ½è…«å¾—通紅,這我知é“,在海邊種地的人,終日å¹è‘—海風,大抵是這樣的。他頭上是一頂破氈帽,身上åªä¸€ä»¶æ¥µè–„的棉衣,渾身瑟索著;手裡æè‘—ä¸€å€‹ç´™åŒ…å’Œä¸€æ”¯é•·ç…™ç®¡ï¼Œé‚£æ‰‹ä¹Ÿä¸æ˜¯æˆ‘所記得的紅活圓實的手,å»åˆç²—åˆç¬¨è€Œä¸”é–‹è£‚ï¼Œåƒæ˜¯æ¾æ¨¹çš®äº†ã€‚ +我這時很興奮,但ä¸çŸ¥é“怎麼說æ‰å¥½ï¼Œåªæ˜¯èªªï¼š -詞曰:滾滾長江æ±é€æ°´ï¼ŒæµªèŠ±æ·˜ç›¡è‹±é›„ã€‚æ˜¯éžæˆæ•—轉頭空:é’å±±ä¾èˆŠåœ¨ï¼Œå¹¾åº¦å¤•é™½ç´…ã€‚ç™½é«®æ¼æ¨µæ±Ÿæ¸šä¸Šï¼Œæ…£çœ‹ç§‹æœˆæ˜¥é¢¨ã€‚一壺æ¿é…’喜相逢:å¤ä»Šå¤šå°‘事,都付笑談中。 +"阿ï¼é–土哥,——你來了?……" -話說天下大勢,分久必åˆï¼Œåˆä¹…必分:周末七國分爭,并入於秦。åŠç§¦æ»…ä¹‹å¾Œï¼Œæ¥šã€æ¼¢åˆ†çˆ­ï¼Œåˆå¹¶å…¥æ–¼æ¼¢ã€‚æ¼¢æœè‡ªé«˜ç¥–斬白蛇而起義,一統天下。後來光武中興,傳至ç»å¸ï¼Œé‚分為三國。推其致亂之由,殆始於桓ã€éˆäºŒå¸ã€‚æ¡“å¸ç¦éŒ®å–„é¡žï¼Œå´‡ä¿¡å®¦å®˜ã€‚åŠæ¡“å¸å´©ï¼Œéˆå¸å³ä½ï¼Œå¤§å°‡è»ç«‡æ­¦ã€å¤ªå‚…陳蕃,共相輔ä½ã€‚時有宦官曹節等弄權,竇武ã€é™³è•ƒè¬€èª…之,作事ä¸å¯†ï¼Œå為所害。中涓自此愈橫。 +我接著便有許多話,想è¦é€£ç ä¸€èˆ¬æ¹§å‡ºï¼šè§’é›žï¼Œè·³é­šå…’ï¼Œè²æ®¼ï¼ŒçŒ¹ï¼Œâ€¦â€¦ä½†åˆç¸½è¦ºå¾—被什麼擋著似的,單在腦裡é¢è¿´æ—‹ï¼Œåä¸å‡ºå£å¤–去。 -建寧二年四月望日,å¸å¾¡æº«å¾·æ®¿ã€‚方陞座,殿角狂風驟起,åªè¦‹ä¸€æ¢å¤§é’蛇,從æ¢ä¸Šé£›å°‡ä¸‹ä¾†ï¼ŒèŸ æ–¼æ¤…上。å¸é©šå€’ï¼Œå·¦å³æ€¥æ•‘入宮,百官俱奔é¿ã€‚須臾,蛇ä¸è¦‹äº†ã€‚忽然大雷大雨,加以冰雹,è½åˆ°åŠå¤œæ–¹æ­¢ï¼Œå£žå»æˆ¿å±‹ç„¡æ•¸ã€‚å»ºå¯§å››å¹´äºŒæœˆï¼Œæ´›é™½åœ°éœ‡ï¼›åˆæµ·æ°´æ³›æº¢ï¼Œæ²¿æµ·å±…民,盡被大浪æ²å…¥æµ·ä¸­ã€‚光和元年,雌雞化雄。六月朔,黑氣å餘丈,飛入溫德殿中。秋七月,有虹見於玉堂;五原山岸,盡皆崩裂。種種ä¸ç¥¥ï¼Œéžæ­¢ä¸€ç«¯ã€‚ - -å¸ä¸‹è©”å•群臣以ç½ç•°ä¹‹ç”±ï¼Œè­°éƒŽè”¡é‚•上ç–,以為蜺墮雞化,乃婦寺干政之所致,言頗切直。å¸è¦½å¥æ­Žæ¯ï¼Œå› èµ·æ›´è¡£ã€‚曹節在後竊視,悉宣告左å³ï¼Œé‚以他事陷邕於罪,放歸田里。後張讓,趙忠,å°è«ï¼Œæ®µçªï¼Œæ›¹ç¯€ï¼Œå€™è¦½ï¼Œè¹‡ç¢©ï¼Œç¨‹æ› ï¼Œå¤æƒ²ï¼Œéƒ­å‹å人朋比為奸,號為「å常ä¾ã€ã€‚å¸å°Šä¿¡å¼µè®“,呼為「阿父ã€ï¼Œæœæ”¿æ—¥éžï¼Œä»¥è‡´å¤©ä¸‹äººå¿ƒæ€äº‚,盜賊蜂起。 - -時鉅鹿郡有兄弟三人:一å張角,一å張寶,一åå¼µæ¢ã€‚那張角本是個ä¸ç¬¬ç§€æ‰ã€‚因入山採藥,é‡ä¸€è€äººï¼Œç¢§çœ¼ç«¥é¡ï¼Œæ‰‹åŸ·è—œæ–ï¼Œå–šè§’è‡³ä¸€æ´žä¸­ï¼Œä»¥å¤©æ›¸ä¸‰å·æŽˆä¹‹ï¼Œæ›°ï¼šã€Œæ­¤å太平è¦è¡“。æ±å¾—之,當代天宣化,普救世人;若èŒç•°å¿ƒï¼Œå¿…ç²æƒ¡å ±ã€‚ã€è§’拜å•å§“å。è€äººæ›°ï¼šã€Œå¾ä¹ƒå—è¯è€ä»™ä¹Ÿã€‚ã€è¨€è¨–,化陣清風而去。 - -角得此書,曉夜攻習,能呼風喚雨,號為太平é“人。中平元年正月內,疫氣æµè¡Œï¼Œå¼µè§’散施符水,為人治病,自稱大賢良師。角有徒弟五百餘人,雲游四方,皆能書符念咒。次後徒眾日多,角乃立三å六方,ー大方è¬é¤˜äººï¼Œå°æ–¹å…­ä¸ƒåƒãƒ¼ï¼Œå„立渠帥,稱為將è»ã€‚訛言「蒼天已死,黃天當立。ã€åˆäº‘「歲在甲å­ï¼Œå¤©ä¸‹å¤§å‰ã€‚ã€ä»¤äººå„以白土,書「甲å­ã€äºŒå­—於家中大門上。é’ã€å¹½ã€å¾ã€å†€ã€èŠã€æšã€å…—ã€è±«å…«å·žä¹‹äººï¼Œå®¶å®¶ä¾å¥‰å¤§è³¢è‰¯å¸«å¼µè§’å字。角é£å…¶é»¨é¦¬å…ƒç¾©ï¼Œæš—齎金帛,çµäº¤ä¸­æ¶“å°è«ï¼Œä»¥ç‚ºå…§æ‡‰ã€‚角與二弟商議曰:「至難得者,民心也。今民心已順,若ä¸ä¹˜å‹¢å–å¤©ä¸‹ï¼Œèª ç‚ºå¯æƒœã€‚ã€é‚一é¢ç§é€ é»ƒæ——,約期舉事;一é¢ä½¿å¼Ÿå­å”州,馳書報å°è«ã€‚å”州乃逕赴çœä¸­å‘Šè®Šã€‚å¸å¬å¤§å°‡è»ä½•進調兵擒馬元義,斬之;次收å°è«ç­‰ä¸€å¹²äººä¸‹ç„。 - -張角èžçŸ¥äº‹éœ²ï¼Œæ˜Ÿå¤œèˆ‰å…µï¼Œè‡ªç¨±å¤©å…¬å°‡è»ï¼Œãƒ¼å¼µå¯¶ç¨±åœ°å…¬å°‡è»ï¼Œå¼µæ¢ç¨±äººå…¬å°‡è»ãƒ¼ã€‚申言於眾曰:「今漢é‹å°‡çµ‚,大è–人出;æ±ç­‰çš†å®œé †å¾žå¤©æ„,以槳太平。ã€å››æ–¹ç™¾å§“,裹黃巾從張角å者,四五åè¬ã€‚è³Šå‹¢æµ©å¤§ï¼Œå®˜è»æœ›é¢¨è€Œé¡ã€‚何進å¥å¸ç«é€Ÿé™è©”,令å„處備禦,討賊立功;一é¢é£ä¸­éƒŽå°‡ç›§æ¤ï¼Œçš‡ç”«åµ©ï¼Œæœ±é›‹ï¼Œå„引精兵,分三路討之。 - -且說張角一è»ï¼Œå‰çŠ¯å¹½å·žç•Œåˆ†ã€‚å¹½å·žå¤ªå®ˆåŠ‰ç„‰ï¼Œä¹ƒæ±Ÿå¤ç«Ÿé™µäººæ°ï¼Œæ¼¢é­¯æ­çŽ‹ä¹‹å¾Œä¹Ÿï¼›ç•¶æ™‚èžå¾—è³Šå…µå°‡è‡³ï¼Œå¬æ ¡å°‰é„’é–è¨ˆè­°ã€‚é–æ›°ï¼šã€Œè³Šå…µçœ¾ï¼Œæˆ‘å…µå¯¡ï¼Œæ˜Žå…¬å®œä½œé€Ÿæ‹›è»æ‡‰æ•µã€‚ã€åŠ‰ç„‰ç„¶å…¶èªªï¼Œéš¨å³å‡ºæ¦œæ‹›å‹Ÿç¾©å…µã€‚榜文行到涿縣,乃引出涿縣中一個英雄。 - -那人ä¸ç”šå¥½è®€æ›¸ï¼›æ€§å¯¬å’Œï¼Œå¯¡è¨€èªžï¼Œå–œæ€’ä¸å½¢æ–¼è‰²ï¼›ç´ æœ‰å¤§å¿—,專好çµäº¤å¤©ä¸‹è±ªå‚‘;生得身長七尺五寸,兩耳垂肩,雙手éŽè†ï¼Œç›®èƒ½è‡ªé¡§å…¶è€³ï¼Œé¢å¦‚冠玉,脣若塗脂;中山é–王劉å‹ä¹‹å¾Œï¼Œæ¼¢æ™¯å¸é–£ä¸‹çŽ„å­«ï¼›å§“åŠ‰ï¼Œå備,字玄德。昔劉å‹ä¹‹å­åŠ‰è²žï¼Œæ¼¢æ­¦æ™‚å°æ¶¿é¹¿äº­ä¾¯ï¼Œå¾Œå酬金失侯,因此éºé€™ä¸€æžåœ¨æ¶¿ç¸£ã€‚玄德祖劉雄,父劉弘。弘曾舉å­å»‰ï¼Œäº¦å˜—作å,早喪。玄德幼孤,事æ¯è‡³å­ï¼›å®¶è²§ï¼Œè²©å±¨ç¹”è“†ç‚ºæ¥­ã€‚å®¶ä½æœ¬ç¸£æ¨“æ¡‘æ‘。其家之æ±å—ï¼Œæœ‰ä¸€å¤§æ¡‘æ¨¹ï¼Œé«˜äº”ä¸ˆé¤˜ï¼Œé™æœ›ä¹‹ï¼Œç«¥ç«¥å¦‚車蓋。相者云:「此家必出貴人。〠- -玄德幼時,與鄉中å°å…’戲於樹下,曰:「我為天å­ï¼Œç•¶ä¹˜æ­¤è»Šè“‹ã€‚ã€å”父劉元起奇其言,曰:「此兒éžå¸¸äººä¹Ÿï¼ã€å› è¦‹çŽ„å¾·å®¶è²§ï¼Œå¸¸è³‡çµ¦ä¹‹ã€‚å¹´å五歲,æ¯ä½¿æ¸¸å­¸ï¼Œå˜—師事鄭玄ã€ç›§æ¤ï¼›èˆ‡å…¬å­«ç“šç­‰ç‚ºå‹ã€‚åŠåŠ‰ç„‰ç™¼æ¦œæ‹›è»æ™‚,玄德年己二å八歲矣。當日見了榜文,慨然長歎。隨後一人厲è²è¨€æ›°ï¼šã€Œå¤§ä¸ˆå¤«ä¸èˆ‡åœ‹å®¶å‡ºåŠ›ï¼Œä½•æ•…é•·æ­Žï¼Ÿã€ - -玄德回視其人:身長八尺,豹頭環眼,燕頷虎鬚,è²è‹¥å·¨é›·ï¼Œå‹¢å¦‚奔馬。玄德見他形貌異常,å•å…¶å§“å。其人曰:「æŸå§“張,å飛,字翼德。世居涿郡,頗有莊田,賣酒屠豬,專好çµäº¤å¤©ä¸‹è±ªå‚‘。é©çº”見公看榜而歎,故此相å•。ã€çŽ„å¾·æ›°ï¼šã€Œæˆ‘æœ¬æ¼¢å®¤å®—è¦ªï¼Œå§“åŠ‰ï¼Œå備。今èžé»ƒå·¾å€¡äº‚,有志欲破賊安民;æ¨åŠ›ä¸èƒ½ï¼Œæ•…長歎耳。ã€é£›æ›°ï¼šã€Œå¾é —有資財,當招募鄉勇,與公åŒèˆ‰å¤§äº‹ï¼Œå¦‚何?ã€çŽ„å¾·ç”šå–œï¼Œé‚與åŒå…¥æ‘店中飲酒。 - -正飲間,見一大漢,推著一輛車å­ï¼Œåˆ°åº—門首歇了;入店å下,便喚酒ä¿ï¼šã€Œå¿«æ–Ÿé…’來åƒï¼Œæˆ‘待趕入城去投è»ã€‚ã€çŽ„å¾·çœ‹å…¶äººï¼šèº«é•·ä¹å°ºï¼Œé«¯é•·äºŒå°ºï¼šé¢å¦‚釿£—,脣若塗脂;丹鳳眼,臥蠶眉:相貌堂堂,å¨é¢¨å‡œå‡œã€‚玄德就邀他åŒå,å©å…¶å§“å。其人曰:「å¾å§“關,å羽,字壽長,後改雲長,河æ±è§£è‰¯äººä¹Ÿã€‚å› æœ¬è™•å‹¢è±ªï¼Œå€šå‹¢å‡Œäººï¼Œè¢«å¾æ®ºäº†ï¼›é€ƒé›£æ±Ÿæ¹–ï¼Œäº”å…­å¹´çŸ£ã€‚ä»Šèžæ­¤è™•æ‹›è»ç ´è³Šï¼Œç‰¹ä¾†æ‡‰å‹Ÿã€‚ã€çބ德é‚以己志告之。雲長大喜。åŒåˆ°å¼µé£›èŽŠä¸Šï¼Œå…±è­°å¤§äº‹ã€‚ - -飛曰:「å¾èŽŠå¾Œæœ‰ä¸€æ¡ƒåœ’ï¼ŒèŠ±é–‹æ­£ç››ï¼›æ˜Žæ—¥ç•¶æ–¼åœ’ä¸­ç¥­å‘Šå¤©åœ°ï¼Œæˆ‘ä¸‰äººçµç‚ºå…„弟,å”力åŒå¿ƒï¼Œç„¶å¾Œå¯åœ–大事。ã€çބ德ã€é›²é•·ã€é½Šè²æ‡‰æ›°ï¼šã€Œå¦‚æ­¤ç”šå¥½ã€‚ã€æ¬¡æ—¥ï¼Œæ–¼æ¡ƒåœ’中,備下çƒç‰›ç™½é¦¬ç¥­ç¦®ç­‰é …ï¼Œä¸‰äººç„šé¦™ï¼Œå†æ‹œè€Œèªªèª“曰:「念劉備ã€é—œç¾½ã€å¼µé£›ï¼Œé›–然異姓,既çµç‚ºå…„弟,則åŒå¿ƒå”力,救困扶å±ï¼›ä¸Šå ±åœ‹å®¶ï¼Œä¸‹å®‰é»Žåº¶ï¼›ä¸æ±‚åŒå¹´åŒæœˆåŒæ—¥ç”Ÿï¼Œä½†é¡˜åŒå¹´åŒæœˆåŒæ—¥æ­»ã€‚皇天åŽåœŸï¼Œå¯¦é‘’此心。背義忘æ©ï¼Œå¤©äººå…±æˆ®ã€‚ã€èª“畢,拜玄德為兄,關羽次之,張飛為弟。祭罷天地,復宰牛設酒,èšé„‰ä¸­å‹‡å£«ï¼Œå¾—三百餘人,就桃園中痛飲一醉。來日收拾è»å™¨ï¼Œä½†æ¨ç„¡é¦¬åŒ¹å¯ä¹˜ã€‚ - -æ­£æ€æ…®é–“,人報「有兩個客人,引一夥伴儅,趕一群馬,投莊上來。ã€çŽ„å¾·æ›°ï¼šã€Œæ­¤å¤©ä½‘æˆ‘ä¹Ÿï¼ã€ä¸‰äººå‡ºèŽŠè¿ŽæŽ¥ã€‚åŽŸä¾†äºŒå®¢ä¹ƒä¸­å±±å¤§å•†ï¼šä¸€å張世平,一å蘇雙,æ¯å¹´å¾€åŒ—販馬,近因寇發而回。玄德請二人到莊,置酒管待,訴說欲討賊安民之æ„。二客大喜,願將良馬五å匹相é€ï¼›åˆè´ˆé‡‘銀五百兩,鑌éµä¸€åƒæ–¤ï¼Œä»¥è³‡å™¨ç”¨ã€‚玄德è¬åˆ¥äºŒå®¢ï¼Œä¾¿å‘½è‰¯åŒ æ‰“造雙股åŠã€‚雲長造é’é¾åƒæœˆåˆ€ï¼Œåˆå冷豔鋸,é‡å…«å二斤。張飛造丈八點鋼矛。å„置全身鎧甲。共èšé„‰å‹‡äº”百餘人,來見鄒é–。鄒é–引見太守劉焉。三人åƒè¦‹ç•¢ï¼Œå„通姓å。玄德說起宗派,劉焉大喜,é‚èªçŽ„å¾·ç‚ºå§ªã€‚ - -䏿•¸æ—¥ï¼Œäººå ±é»ƒå·¾è³Šå°‡ç¨‹é å¿—統兵五è¬ä¾†çŠ¯æ¶¿éƒ¡ã€‚åŠ‰ç„‰ä»¤é„’é–引玄德等三人,統兵五百,å‰åŽ»ç ´æ•µã€‚çŽ„å¾·ç­‰æ¬£ç„¶é ˜è»å‰é€²ï¼Œç›´è‡³å¤§èˆˆå±±ä¸‹ï¼Œèˆ‡è³Šç›¸è¦‹ã€‚賊眾皆披髮,以黃巾抹é¡ã€‚當下兩è»ç›¸å°ï¼ŒçŽ„å¾·å‡ºé¦¬ï¼Œãƒ¼å·¦æœ‰é›²é•·ï¼Œå³æœ‰ç¿¼å¾·ãƒ¼ï¼Œæšéž­å¤§ç½µï¼šã€Œååœ‹é€†è³Šï¼Œä½•ä¸æ—©é™ï¼ã€ - -程é å¿—大怒,é£å‰¯å°‡é„§èŒ‚出戰。張飛挺丈八蛇矛直出,手起處,刺中鄧茂心窩,翻身è½é¦¬ã€‚程é å¿—見折了鄧茂,æ‹é¦¬èˆžåˆ€ï¼Œç›´å–張飛。雲長舞動大刀,縱馬飛迎。程é å¿—見了,早åƒä¸€é©šï¼›æŽªæ‰‹ä¸åŠï¼Œè¢«é›²é•·åˆ€èµ·è™•,æ®ç‚ºå…©æ®µã€‚後人有詩讚二人曰: - -英雄發穎在今æœï¼Œä¸€è©¦çŸ›å…®ä¸€è©¦åˆ€ã€‚åˆå‡ºä¾¿å°‡å¨åŠ›å±•ï¼Œä¸‰åˆ†å¥½æŠŠå§“åæ¨™ã€‚ - -眾賊見程é å¿—被斬,皆倒戈而走。玄德æ®è»è¿½è¶•,投é™è€…ä¸è¨ˆå…¶æ•¸ï¼Œå¤§å‹è€Œå›žã€‚劉焉親自迎接,賞勞è»å£«ã€‚次日,接得é’州太守龔景牒文,言黃巾賊åœåŸŽå°‡é™·ï¼Œä¹žè³œæ•‘æ´ã€‚劉焉與玄德商議。玄德曰:「備願往救之。ã€åŠ‰ç„‰ä»¤é„’é–將兵五åƒï¼ŒåŒçŽ„å¾·ï¼Œé—œï¼Œå¼µï¼ŒæŠ•é’州來。賊眾見救è»è‡³ï¼Œåˆ†å…µæ··æˆ°ã€‚玄德兵寡ä¸å‹ï¼Œé€€ä¸‰å里下寨。玄德謂關ã€å¼µæ›°ã€ã€Œè³Šçœ¾æˆ‘寡,必出奇兵,方å¯å–å‹ã€‚ã€ä¹ƒåˆ†é—œå…¬å¼•一åƒè»ä¼å±±å·¦ï¼Œå¼µé£›å¼•一åƒè»ä¼å±±å³ï¼Œé³´é‡‘為號,齊出接應。 - -次日,玄德與鄒é–,引è»é¼“譟而進。賊眾迎戰,玄德引è»ä¾¿é€€ã€‚賊眾乘勢追趕,方éŽå±±å¶ºï¼Œçބ德è»ä¸­ä¸€é½Šé³´é‡‘,左å³å…©è»é½Šå‡ºï¼ŒçŽ„å¾·éº¾è»å›žèº«å¾©æ®ºã€‚三路夾攻,賊眾大潰。直趕至é’州城下,太守龔景亦率民兵出城助戰。賊勢大敗,剿戮極多,é‚è§£é’州之åœã€‚後人有詩讚玄德曰: - -é‹ç±Œæ±ºç®—有神功,二虎還須éœä¸€é¾ã€‚åˆå‡ºä¾¿èƒ½åž‚å‰ç¸¾ï¼Œè‡ªæ‡‰åˆ†é¼Žåœ¨å­¤çª®ã€‚ - -龔景犒è»ç•¢ï¼Œé„’é–æ¬²å›žã€‚玄德曰:「近èžä¸­éƒŽå°‡ç›§æ¤èˆ‡è³Šé¦–張角戰於廣宗,備昔曾師事盧æ¤ï¼Œæ¬²å¾€åŠ©ä¹‹ã€‚ã€æ–¼æ˜¯é„’é–引è»è‡ªå›žï¼ŒçŽ„å¾·èˆ‡é—œã€å¼µå¼•本部五百人投廣宗來。至盧æ¤è»ä¸­ï¼Œå…¥å¸³æ–½ç¦®ï¼Œå…·é“來æ„。盧æ¤å¤§å–œï¼Œç•™åœ¨å¸³å‰è½èª¿ã€‚ - -時張角賊眾å五è¬ï¼Œæ¤å…µäº”è¬ï¼Œç›¸æ‹’於廣宗,未見å‹è² ã€‚æ¤è¬‚玄德曰:「我今åœè³Šåœ¨æ­¤ï¼Œè³Šå¼Ÿå¼µæ¢ï¼Œå¼µå¯¶åœ¨æ½å·ï¼Œèˆ‡çš‡ç”«åµ©ã€æœ±é›‹å°å£˜ã€‚æ±å¯å¼•本部人馬,我更助æ±ä¸€åƒå®˜è»ï¼Œå‰åŽ»æ½å·æ‰“探消æ¯ï¼Œç´„期剿æ•。ã€çŽ„å¾·é ˜å‘½ï¼Œå¼•è»æ˜Ÿå¤œæŠ•æ½å·ä¾†ã€‚æ™‚çš‡ç”«åµ©ã€æœ±é›‹é ˜è»æ‹’賊,賊戰ä¸åˆ©ï¼Œé€€å…¥é•·ç¤¾ï¼Œä¾è‰çµç‡Ÿã€‚嵩與雋計曰:「賊ä¾è‰çµç‡Ÿï¼Œç•¶ç”¨ç«æ”»ä¹‹ã€‚ã€é‚令è»å£«ï¼Œæ¯äººæŸè‰ä¸€æŠŠï¼Œæš—地埋ä¼ã€‚其夜大風忽起。二更以後,一齊縱ç«ï¼Œåµ©èˆ‡é›‹å„引兵攻擊賊寨,ç«ç‡„張天,賊眾驚慌,馬ä¸åŠéžï¼Œäººä¸åŠç”²ï¼Œå››æ•£å¥”走。殺到天明,張æ¢ã€å¼µå¯¶å¼•敗殘è»å£«ï¼Œå¥ªè·¯è€Œèµ°ã€‚ - -忽見一彪è»é¦¬ï¼Œç›¡æ‰“ç´…æ——ï¼Œç•¶é ­ä¾†åˆ°ï¼Œæˆªå¾€åŽ»è·¯ã€‚ç‚ºé¦–é–ƒå‡ºä¸€å°‡ï¼Œèº«é•·ä¸ƒå°ºï¼Œç´°çœ¼é•·é«¯ï¼›å®˜æ‹œé¨Žéƒ½å°‰ï¼›æ²›åœ‹è­™éƒ¡äººä¹Ÿï¼šå§“æ›¹ï¼Œåæ“ï¼Œå­—å­Ÿå¾·ã€‚æ“父曹嵩,本姓å¤ä¾¯æ°ï¼›å› ç‚ºä¸­å¸¸ä¾æ›¹é¨°ä¹‹é¤Šå­ï¼Œæ•…冒姓曹。曹嵩生æ“,å°å­—阿瞞,一åå‰åˆ©ã€‚æ“幼時,好游çµï¼Œå–œæ­Œèˆžï¼›æœ‰æ¬Šè¬€ï¼Œå¤šæ©Ÿè®Šã€‚æ“æœ‰å”çˆ¶ï¼Œè¦‹æ“æ¸¸è•©ç„¡åº¦ï¼Œå˜—怒之,言於曹嵩。嵩責æ“。æ“忽心生一計:見å”父來,è©å€’於地,作中風之狀。å”çˆ¶é©šå‘Šåµ©ï¼Œåµ©æ€¥è¦–ä¹‹ï¼Œæ“æ•…ç„¡æ™ã€‚嵩曰:「å”言æ±ä¸­é¢¨ï¼Œä»Šå·±æ„ˆä¹Žï¼Ÿã€æ“曰:「兒自來無此病;因失愛於å”父,故見罔耳。ã€åµ©ä¿¡å…¶è¨€ã€‚後å”父但言æ“éŽï¼Œåµ©ä¸¦ä¸è½ã€‚因此,æ“å¾—æ£æ„放蕩。 - -æ™‚äººæœ‰æ©‹çŽ„è€…ï¼Œè¬‚æ“æ›°ï¼šã€Œå¤©ä¸‹å°‡äº‚,éžå‘½ä¸–之æ‰ï¼Œä¸èƒ½æ¿Ÿã€‚能安之者,其在å›ä¹Žï¼Ÿã€å—陽何顒見æ“ï¼Œè¨€ï¼šã€Œæ¼¢å®¤å°‡äº¡ï¼Œå®‰å¤©ä¸‹è€…ï¼Œå¿…æ­¤äººä¹Ÿã€‚ã€æ±å—許劭,有知人之å。æ“å¾€è¦‹ä¹‹ï¼Œå•æ›°ï¼šã€Œæˆ‘何如人?ã€åŠ­ä¸ç­”。åˆå•ï¼ŒåŠ­æ›°ï¼šã€Œå­æ²»ä¸–ä¹‹èƒ½è‡£ï¼Œäº‚ä¸–ä¹‹å¥¸é›„ä¹Ÿã€‚ã€æ“èžè¨€å¤§å–œã€‚年二å,舉å­å»‰ï¼Œç‚ºéƒŽï¼Œé™¤æ´›é™½åŒ—都尉。åˆåˆ°ä»»ï¼Œå³è¨­äº”色棒åé¤˜æ¢æ–¼ç¸£ä¹‹å››é–€ã€‚有犯ç¦è€…,ä¸é¿è±ªè²´ï¼Œçš†è²¬ä¹‹ã€‚中常ä¾è¹‡ç¢©ä¹‹å”,æåˆ€å¤œè¡Œï¼Œæ“巡夜æ‹ä½ï¼Œå°±æ£’責之。由是,內外莫敢犯者,å¨å頗震。後為頓丘令。因黃巾起,拜為騎都尉,引馬步è»äº”åƒï¼Œå‰ä¾†æ½å·åŠ©æˆ°ã€‚æ­£å€¼å¼µæ¢ã€å¼µå¯¶æ•—èµ°ï¼Œæ›¹æ“æ””ä½ï¼Œå¤§æ®ºä¸€é™£ï¼Œæ–¬é¦–è¬é¤˜ç´šï¼Œå¥ªå¾—æ——æ—›ã€é‡‘鼓馬匹極多。張æ¢ã€å¼µå¯¶æ­»æˆ°å¾—脫。æ“見éŽçš‡ç”«åµ©ï¼Œæœ±é›‹ï¼Œéš¨å³å¼•兵追襲張æ¢ã€å¼µå¯¶åŽ»äº†ã€‚ - -å»èªªçŽ„å¾·å¼•é—œã€å¼µä¾†æ½å·ï¼Œè½å¾—喊殺之è²ï¼Œåˆæœ›è¦‹ç«å…‰ç‡­å¤©ï¼Œæ€¥å¼•兵來時,賊已敗散。玄德見皇甫嵩,朱雋,其é“ç›§æ¤ä¹‹æ„。嵩曰:「張æ¢ã€å¼µå¯¶å‹¢çª®åŠ›ä¹ï¼Œå¿…投廣宗去ä¾å¼µè§’。玄德å¯å³æ˜Ÿå¤œå¾€åŠ©ã€‚ã€ - -玄德領命,é‚引兵復回。到得åŠè·¯ï¼Œåªè¦‹ä¸€ç°‡è»é¦¬ï¼Œè­·é€ä¸€è¼›æª»è»Šï¼Œè»Šä¸­ä¹‹å›šï¼Œä¹ƒç›§æ¤ä¹Ÿã€‚玄德大驚,滾éžä¸‹é¦¬ï¼Œå•å…¶ç·£æ•…ã€‚æ¤æ›°ï¼šã€Œæˆ‘åœå¼µè§’,將次å¯ç ´ï¼›å› è§’用妖術,未能å³å‹ã€‚æœå»·å·®é»ƒé–€å·¦è±å‰ä¾†é«”æŽ¢ï¼Œå•æˆ‘ç´¢å–賄賂。我答曰:『è»ç³§å°šç¼ºï¼Œå®‰æœ‰é¤˜éŒ¢å¥‰æ‰¿å¤©ä½¿ï¼Ÿã€å·¦è±æŒ¾æ¨ï¼Œå›žå¥æœå»·ï¼Œèªªæˆ‘é«˜å£˜ä¸æˆ°ï¼Œæƒ°æ…¢è»å¿ƒï¼›å› æ­¤æœå»·éœ‡æ€’,é£ä¸­éƒŽå°‡è‘£å“ä¾†ä»£å°‡æˆ‘å…µï¼Œå–æˆ‘回京å•罪。〠- -張飛è½ç½·ï¼Œå¤§æ€’ï¼Œè¦æ–¬è­·é€è»äººï¼Œä»¥æ•‘ç›§æ¤ã€‚玄德急止之曰:「æœå»·è‡ªæœ‰å…¬è«–,æ±è±ˆå¯é€ æ¬¡ï¼Ÿã€è»å£«ç°‡æ“ç›§æ¤åŽ»äº†ã€‚é—œå…¬æ›°ï¼šã€Œç›§ä¸­éƒŽå·²è¢«é€®ï¼Œåˆ¥äººé ˜å…µï¼Œæˆ‘ç­‰åŽ»ç„¡æ‰€ä¾ï¼Œä¸å¦‚且回涿郡。ã€çŽ„å¾·å¾žå…¶è¨€ï¼Œé‚引è»åŒ—行。 - -行無二日,忽èžå±±å¾Œå–Šè²å¤§éœ‡ã€‚玄德引關ã€å¼µç¸±é¦¬ä¸Šé«˜å²¡æœ›ä¹‹ï¼Œè¦‹æ¼¢è»å¤§æ•—ï¼Œå¾Œé¢æ¼«å±±å¡žé‡Žï¼Œé»ƒå·¾è“‹åœ°è€Œä¾†ï¼Œæ——上大書「天公將è»ã€ã€‚玄德曰:「此張角也ï¼å¯é€Ÿæˆ°ï¼ã€ - -三人飛馬引è»è€Œå‡ºã€‚張角正殺敗董å“,乘勢趕來,忽é‡ä¸‰äººè¡æ®ºï¼Œè§’è»å¤§äº‚,敗走五å餘里。三人救了董å“回寨。å“å•三人ç¾å±…何è·ã€‚玄德曰:「白身。ã€å“甚輕之,ä¸ç‚ºç¦®ã€‚玄德出,張飛大怒曰:「我等親赴血戰,救了這å»ï¼Œä»–å»å¦‚æ­¤ç„¡ç¦®ï¼›è‹¥ä¸æ®ºä¹‹ï¼Œé›£æ¶ˆæˆ‘æ°£ï¼ã€ä¾¿è¦æåˆ€å…¥å¸³ä¾†æ®ºè‘£å“。正是:人情勢利å¤çŒ¶ä»Šï¼Œèª°è­˜è‹±é›„是白身?安得快人如翼德,盡誅世上負心人ï¼ç•¢ç«Ÿè‘£å“性命如何,且看下文分解。 +ä»–ç«™ä½äº†ï¼Œè‡‰ä¸Šç¾å‡ºæ­¡å–œå’Œæ·’æ¶¼çš„ç¥žæƒ…ï¼›å‹•è‘—å˜´å”‡ï¼Œå»æ²’有作è²ã€‚ä»–çš„æ…‹åº¦çµ‚æ–¼æ­æ•¬èµ·ä¾†äº†ï¼Œåˆ†æ˜Žçš„å«é“: +"è€çˆºï¼â€¦â€¦" +我似乎打了一個寒噤;我就知é“ï¼Œæˆ‘å€‘ä¹‹é–“å·²ç¶“éš”äº†ä¸€å±¤å¯æ‚²çš„厚障å£äº†ã€‚我也說ä¸å‡ºè©±ã€‚ +他回éŽé ­åŽ»èªªï¼Œ"水生,給è€çˆºç£•頭。"便拖出躲在背後的孩å­ä¾†ï¼Œé€™æ­£æ˜¯ä¸€å€‹å»¿å¹´å‰çš„é–åœŸï¼Œåªæ˜¯é»ƒç˜¦äº›ï¼Œé ¸å­ä¸Šæ²’有銀圈罷了。"這是第五個孩å­ï¼Œæ²’有見éŽä¸–é¢ï¼Œèº²èº²é–ƒé–ƒâ€¦â€¦" +æ¯è¦ªå’Œå®å…’樓來了,他們大約也è½åˆ°äº†è²éŸ³ã€‚ +"è€å¤ªå¤ªã€‚信是早收到了。我實在喜歡的ä¸å¾—了,知é“è€çˆºå›žä¾†â€¦â€¦"é–土說。 +"阿,你怎的這樣客氣起來。你們先å‰ä¸æ˜¯å“¥å¼Ÿç¨±å‘¼éº½ï¼Ÿé‚„是照舊:迅哥兒。"æ¯è¦ªé«˜èˆˆçš„說。 +"阿呀,è€å¤ªå¤ªçœŸæ˜¯â€¦â€¦é€™æˆä»€éº¼è¦çŸ©ã€‚那時是孩å­ï¼Œä¸æ‡‚事……"é–土說著,åˆå«æ°´ç”Ÿä¸Šä¾†æ‰“拱,那孩å­å»å®³ç¾žï¼Œç·Šç·Šçš„åªè²¼åœ¨ä»–背後。 +"他就是水生?第五個?都是生人,怕生也難怪的;還是å®å…’和他去走走。"æ¯è¦ªèªªã€‚ +å®å…’è½å¾—這話,便來招水生,水生å»é¬†é¬†çˆ½çˆ½åŒä»–一路出去了。æ¯è¦ªå«é–土å,他é²ç–‘了一回,終於就了å,將長煙管é åœ¨æ¡Œæ—,éžéŽç´™åŒ…來,說: +"冬天沒什麼æ±è¥¿äº†ã€‚這一點乾é’豆倒是自家曬在那裡的,請è€çˆºâ€¦â€¦" +我å•å•他的景æ³ã€‚ä»–åªæ˜¯æ–頭。 +"éžå¸¸é›£ã€‚第六個孩å­ä¹Ÿæœƒå¹«å¿™äº†ï¼Œå»ç¸½æ˜¯åƒä¸å¤ â€¦â€¦åˆä¸å¤ªå¹³â€¦â€¦ä»€éº¼åœ°æ–¹éƒ½è¦éŒ¢ï¼Œæ²’有è¦å®šâ€¦â€¦æ”¶æˆåˆå£žã€‚種出æ±è¥¿ä¾†ï¼ŒæŒ‘åŽ»è³£ï¼Œç¸½è¦æå¹¾å›žéŒ¢ï¼ŒæŠ˜äº†æœ¬ï¼›ä¸åŽ»è³£ï¼Œåˆåªèƒ½çˆ›æŽ‰â€¦â€¦" +ä»–åªæ˜¯æ–頭;臉上雖然刻著許多皺紋,å»å…¨ç„¶ä¸å‹•,仿佛石åƒä¸€èˆ¬ã€‚ä»–å¤§ç´„åªæ˜¯è¦ºå¾—苦,å»åˆå½¢å®¹ä¸å‡ºï¼Œæ²‰é»˜äº†ç‰‡æ™‚,便拿起煙管來默默的å¸ç…™äº†ã€‚ +æ¯è¦ªå•他,知é“ä»–çš„å®¶è£¡äº‹å‹™å¿™ï¼Œæ˜Žå¤©ä¾¿å¾—å›žåŽ»ï¼›åˆæ²’有åƒéŽåˆé£¯ï¼Œä¾¿å«ä»–自己到廚下炒飯åƒåŽ»ã€‚ +他出去了;æ¯è¦ªå’Œæˆ‘都嘆æ¯ä»–的景æ³ï¼šå¤šå­ï¼Œé¥‘è’,苛稅,兵,匪,官,紳,都苦得他åƒä¸€å€‹æœ¨å¶äººäº†ã€‚æ¯è¦ªå°æˆ‘說,凡是ä¸å¿…æ¬èµ°çš„æ±è¥¿ï¼Œç›¡å¯ä»¥é€ä»–,å¯ä»¥è½ä»–è‡ªå·±åŽ»æ€æ“‡ã€‚ +下åˆï¼Œä»–æ€å¥½äº†å¹¾ä»¶æ±è¥¿ï¼šå…©æ¢é•·æ¡Œï¼Œå››å€‹æ¤…å­ï¼Œä¸€å‰¯é¦™çˆå’Œç‡­è‡ºï¼Œä¸€æ¡¿æŠ¬ç§¤ã€‚ä»–åˆè¦æ‰€æœ‰çš„è‰ç°ï¼ˆæˆ‘們這裡煮飯是燒稻è‰çš„,那ç°ï¼Œå¯ä»¥åšæ²™åœ°çš„è‚¥æ–™ï¼‰ï¼Œå¾…æˆ‘å€‘å•Ÿç¨‹çš„æ™‚å€™ï¼Œä»–ç”¨èˆ¹ä¾†è¼‰åŽ»ã€‚ +夜間,我們åˆè«‡äº›é–‘天,都是無關緊è¦çš„話;第二天早晨,他就領了水生回去了。 +åˆéŽäº†ä¹æ—¥ï¼Œæ˜¯æˆ‘們啟程的日期。é–土早晨便到了,水生沒有åŒä¾†ï¼Œå»åªå¸¶è‘—ä¸€å€‹äº”æ­²çš„å¥³å…’ç®¡èˆ¹éš»ã€‚æˆ‘å€‘çµ‚æ—¥å¾ˆå¿™ç¢Œï¼Œå†æ²’有談天的工夫。來客也ä¸å°‘,有é€è¡Œçš„,有拿æ±è¥¿çš„,有é€è¡Œå…¼æ‹¿æ±è¥¿çš„ã€‚å¾…åˆ°å‚æ™šæˆ‘們上船的時候,這è€å±‹è£¡çš„æ‰€æœ‰ç ´èˆŠå¤§å°ç²—ç´°æ±è¥¿ï¼Œå·²ç¶“一掃而空了。 +我們的船å‘å‰èµ°ï¼Œå…©å²¸çš„é’山在黃æ˜ä¸­ï¼Œéƒ½è£æˆäº†æ·±é»›é¡è‰²ï¼Œé€£è‘—退å‘船後梢去。 +å®å…’和我é è‘—船窗,åŒçœ‹å¤–颿¨¡ç³Šçš„風景,他忽然å•é“: +"å¤§ä¼¯ï¼æˆ‘們什麼時候回來?" +"回來?你怎麼還沒有走就想回來了。" +"坿˜¯ï¼Œæ°´ç”Ÿç´„我到他家玩去咧……"ä»–çœè‘—大的黑眼ç›ï¼Œç™¡ç™¡çš„æƒ³ã€‚ +我和æ¯è¦ªä¹Ÿéƒ½æœ‰äº›æƒ˜ç„¶ï¼Œæ–¼æ˜¯åˆæèµ·é–土來。æ¯è¦ªèªªï¼Œé‚£è±†è…西施的楊二嫂,自從我家收拾行æŽä»¥ä¾†ï¼Œæœ¬æ˜¯æ¯æ—¥å¿…到的,å‰å¤©ä¼Šåœ¨ç°å †è£¡ï¼ŒæŽå‡ºå多個碗碟來,議論之後,便定說是é–土埋著的,他å¯ä»¥åœ¨é‹ç°çš„æ™‚候,一齊æ¬å›žå®¶è£¡åŽ»ï¼›æ¥ŠäºŒå«‚ç™¼è¦‹äº†é€™ä»¶äº‹ï¼Œè‡ªå·±å¾ˆä»¥ç‚ºåŠŸï¼Œä¾¿æ‹¿äº†é‚£ç‹—æ°£æ®ºï¼ˆé€™æ˜¯æˆ‘å€‘é€™è£¡é¤Šé›žçš„å™¨å…·ï¼Œæœ¨ç›¤ä¸Šé¢æœ‰è‘—柵欄,內盛食料,雞å¯ä»¥ä¼¸é€²é ¸å­åŽ»å•„ï¼Œç‹—å»ä¸èƒ½ï¼Œåªèƒ½çœ‹è‘—氣死),飛也似的跑了,虧伊è£è‘—這麼高低的å°è…³ï¼Œç«Ÿè·‘得這樣快。 +è€å±‹é›¢æˆ‘愈é äº†ï¼›æ•…鄉的山水也都漸漸é é›¢äº†æˆ‘,但我å»ä¸¦ä¸æ„Ÿåˆ°æ€Žæ¨£çš„留戀。我åªè¦ºå¾—æˆ‘å››é¢æœ‰çœ‹ä¸è¦‹çš„高牆,將我隔æˆå­¤èº«ï¼Œä½¿æˆ‘éžå¸¸æ°£æ‚¶ï¼›é‚£è¥¿ç“œåœ°ä¸Šçš„銀項圈的å°è‹±é›„的影åƒï¼Œæˆ‘本來å分清楚,ç¾åœ¨å»å¿½åœ°æ¨¡ç³Šäº†ï¼Œåˆä½¿æˆ‘éžå¸¸çš„æ‚²å“€ã€‚ +æ¯è¦ªå’Œå®å…’都ç¡è‘—了。 +我躺著,è½èˆ¹åº•潺潺的水è²ï¼ŒçŸ¥é“我在走我的路。我想:我竟與é–土隔絕到這地步了,但我們的後輩還是一氣,å®å…’䏿˜¯æ­£åœ¨æƒ³å¿µæ°´ç”Ÿéº½ã€‚我希望他們ä¸å†åƒæˆ‘,åˆå¤§å®¶éš”膜起來……然而我åˆä¸é¡˜æ„他們因為è¦ä¸€æ°£ï¼Œéƒ½å¦‚我的辛苦展轉而生活,也ä¸é¡˜æ„他們都如é–土的辛苦麻木而生活,也ä¸é¡˜æ„都如別人的辛苦æ£ç¢è€Œç”Ÿæ´»ã€‚他們應該有新的生活,為我們所未經生活éŽçš„。 +我想到希望,忽然害怕起來了。é–土è¦é¦™çˆå’Œç‡­è‡ºçš„æ™‚候,我還暗地裡笑他,以為他總是崇拜å¶åƒï¼Œä»€éº¼æ™‚候都ä¸å¿˜å»ã€‚ç¾åœ¨æˆ‘所謂希望,ä¸ä¹Ÿæ˜¯æˆ‘自己手製的å¶åƒéº½ï¼Ÿåªæ˜¯ä»–的願望切近,我的願望茫é ç½·äº†ã€‚ +我在朦朧中,眼å‰å±•é–‹ä¸€ç‰‡æµ·é‚Šç¢§ç¶ çš„æ²™åœ°ä¾†ï¼Œä¸Šé¢æ·±è—的天空中掛著一輪金黃的圓月。我想:希望本是無所謂有,無所謂無的。這正如地上的路;其實地上本沒有路,走的人多了,也便æˆäº†è·¯ã€‚ +è‡¨æ²³çš„åœŸå ´ä¸Šï¼Œå¤ªé™½æ¼¸æ¼¸çš„æ”¶äº†ä»–é€šé»ƒçš„å…‰ç·šäº†ã€‚å ´é‚Šé æ²³çš„çƒæ¡•æ¨¹è‘‰ï¼Œä¹¾å·´å·´çš„çº”å–˜éŽæ°£ä¾†ï¼Œå¹¾å€‹èŠ±è…³èšŠå­åœ¨ä¸‹é¢å“¼è‘—é£›èˆžã€‚é¢æ²³çš„農家的煙çªè£ï¼Œé€æ¼¸æ¸›å°‘了炊煙,女人孩å­å€‘都在自己門å£çš„åœŸå ´ä¸Šæ³¢äº›æ°´ï¼Œæ”¾ä¸‹å°æ¡Œå­å’ŒçŸ®å‡³ï¼›äººçŸ¥é“,這已經是晚飯的時候了。 +è€äººç”·äººå在矮凳上,æ–著大芭蕉扇閑談,孩å­é£›ä¹Ÿä¼¼çš„è·‘ï¼Œæˆ–è€…è¹²åœ¨çƒæ¡•樹下賭玩石å­ã€‚女人端出çƒé»‘的蒸乾èœå’Œæ¾èŠ±é»ƒçš„ç±³é£¯ï¼Œç†±è“¬è“¬å†’ç…™ã€‚æ²³è£é§›éŽæ–‡äººçš„酒船,文豪見了,大發詩興,說:「無æ€ç„¡æ…®ï¼Œé€™çœŸæ˜¯ç”°å®¶æ¨‚呵ï¼ã€ +但文豪的話有些ä¸åˆäº‹å¯¦ï¼Œå°±å› ç‚ºä»–們沒有è½åˆ°ä¹æ–¤è€å¤ªçš„è©±ã€‚é€™æ™‚å€™ï¼Œä¹æ–¤è€å¤ªæ­£åœ¨å¤§æ€’,拿破芭蕉扇敲著凳腳說: +「我活到七å乿­²äº†ï¼Œæ´»å¤ äº†ï¼Œä¸é¡˜æ„眼見這些敗家相,——還是死的好。立刻就è¦å–«é£¯äº†ï¼Œé‚„喫炒豆å­ï¼Œå–«çª®äº†ä¸€å®¶å­ï¼ã€ +伊的曾孫女兒六斤æè‘—一把豆,正從å°é¢è·‘來,見這情形,便直奔河邊,è—åœ¨çƒæ¡•樹後,伸出雙丫角的å°é ­ï¼Œå¤§è²èªªï¼Œã€Œé€™è€ä¸æ­»çš„ï¼ã€ +乿–¤è€å¤ªé›–然高壽,耳朵å»é‚„ä¸å¾ˆè¾ï¼Œä½†ä¹Ÿæ²’有è½åˆ°å­©å­çš„話,ä»èˆŠè‡ªå·±èªªï¼Œã€Œé€™çœŸæ˜¯ä¸€ä»£ä¸å¦‚一代ï¼ã€ +這æ‘莊的習慣有點特別,女人生下孩å­ï¼Œå¤šå–œæ­¡ç”¨ç§¤ç¨±äº†è¼•é‡ï¼Œä¾¿ç”¨æ–¤æ•¸ç•¶ä½œå°åã€‚ä¹æ–¤è€å¤ªè‡ªå¾žæ…¶ç¥äº†äº”å大壽以後,便漸漸的變了ä¸å¹³å®¶ï¼Œå¸¸èªªä¼Šå¹´é’的時候,天氣沒有ç¾åœ¨é€™èˆ¬ç†±ï¼Œè±†å­ä¹Ÿæ²’有ç¾åœ¨é€™èˆ¬ç¡¬ï¼›ç¸½ä¹‹ç¾åœ¨çš„æ™‚世是ä¸å°äº†ã€‚何æ³å…­æ–¤æ¯”伊的曾祖,少了三斤,比伊父親七斤,åˆå°‘了一斤,這真是一æ¢é¡›æ’²ä¸ç ´çš„實例。所以伊åˆç”¨å‹èªªï¼Œã€Œé€™çœŸæ˜¯ä¸€ä»£ä¸å¦‚一代ï¼ã€ +ä¼Šçš„å…’åª³ä¸ƒæ–¤å«‚å­æ­£æ§è‘—飯籃走到桌邊,便將飯籃在桌上一摔,憤憤的說,「你è€äººå®¶åˆé€™éº¼èªªäº†ã€‚å…­æ–¤ç”Ÿä¸‹ä¾†çš„æ™‚å€™ï¼Œä¸æ˜¯å…­æ–¤äº”å…©éº½ï¼Ÿä½ å®¶çš„ç§¤åˆæ˜¯ç§ç§¤ï¼ŒåŠ é‡ç¨±ï¼Œå八兩秤;用了準å六,我們的六斤該有七斤多哩。我想便是太公和公公,也ä¸è¦‹å¾—æ­£æ˜¯ä¹æ–¤å…«æ–¤å足,用的秤也許是å四兩……〠+「一代ä¸å¦‚一代ï¼ã€ +七斤嫂還沒有答話,忽然看見七斤從å°å··å£è½‰å‡ºï¼Œä¾¿ç§»äº†æ–¹å‘,å°ä»–åš·é“ï¼Œã€Œä½ é€™æ­»å±æ€Žéº¼é€™æ™‚候纔回來,死到那è£åŽ»äº†ï¼ä¸ç®¡äººå®¶ç­‰è‘—你開飯ï¼ã€ +七斤雖然ä½åœ¨è¾²æ‘ï¼Œå»æ—©æœ‰äº›é£›é»ƒé¨°é”çš„æ„æ€ã€‚å¾žä»–çš„ç¥–çˆ¶åˆ°ä»–ï¼Œä¸‰ä»£ä¸æé‹¤é ­æŸ„äº†ï¼›ä»–ä¹Ÿç…§ä¾‹çš„å¹«äººæ’è‘—èˆªèˆ¹ï¼Œæ¯æ—¥ä¸€å›žï¼Œæ—©æ™¨å¾žé­¯éŽ®é€²åŸŽï¼Œå‚æ™šåˆå›žåˆ°é­¯éŽ®ï¼Œå› æ­¤å¾ˆçŸ¥é“些時事:例如什麼地方,雷公劈死了蜈蚣精;什麼地方,閨女生了一個夜å‰ä¹‹é¡žã€‚他在æ‘人è£é¢ï¼Œçš„確已經是一å出場人物了。但å¤å¤©å–«é£¯ä¸é»žç‡ˆï¼Œå»é‚„守著農家習慣,所以回家太é²ï¼Œæ˜¯è©²ç½µçš„。 +七斤一手æè‘—象牙嘴白銅斗六尺多長的湘妃竹煙管,低著頭,慢慢地走來,å在矮凳上。六斤也è¶å‹¢æºœå‡ºï¼Œå在他身邊,å«ä»–爹爹。七斤沒有應。 +「一代ä¸å¦‚一代ï¼ã€ä¹æ–¤è€å¤ªèªªã€‚ +ä¸ƒæ–¤æ…¢æ…¢åœ°æŠ¬èµ·é ­ä¾†ï¼Œå˜†ä¸€å£æ°£èªªï¼Œã€Œçš‡å¸å了é¾åº­äº†ã€‚〠+七斤嫂呆了一刻,忽而æç„¶å¤§æ‚Ÿçš„é“,「這å¯å¥½äº†ï¼Œé€™ä¸æ˜¯åˆè¦çš‡æ©å¤§èµ¦äº†éº½ï¼ã€ +七斤åˆå˜†ä¸€å£æ°£ï¼Œèªªï¼Œã€Œæˆ‘沒有辮å­ã€‚〠+「皇å¸è¦è¾®å­éº½ï¼Ÿã€ +「皇å¸è¦è¾®å­ã€‚〠+「你怎麼知é“呢?ã€ä¸ƒæ–¤å«‚有些著急,趕忙的å•。 +「咸亨酒店è£çš„人,都說è¦çš„。〠+七斤嫂這時從直覺上覺得事情似乎有些ä¸å¦™äº†ï¼Œå› ç‚ºå’¸äº¨é…’店是消æ¯éˆé€šçš„æ‰€åœ¨ã€‚伊一轉眼瞥見七斤的光頭,便å¿ä¸ä½å‹•怒,怪他æ¨ä»–怨他;忽然åˆçµ•望起來,è£å¥½ä¸€ç¢—飯,æ¡åœ¨ä¸ƒæ–¤çš„é¢å‰é“,「還是趕快喫你的飯罷ï¼å“­å–ªè‘—臉,就會長出辮å­ä¾†éº½ï¼Ÿã€ +å¤ªé™½æ”¶ç›¡äº†ä»–æœ€æœ«çš„å…‰ç·šäº†ï¼Œæ°´é¢æš—æš—åœ°å›žè¦†éŽæ¶¼æ°£ä¾†ï¼›åœŸå ´ä¸Šä¸€ç‰‡ç¢—ç­·è²éŸ¿ï¼Œäººäººçš„脊樑上åˆéƒ½å出汗粒。七斤嫂喫完三碗飯,å¶ç„¶æŠ¬èµ·é ­ï¼Œå¿ƒåŽè£ä¾¿ç¦ä¸ä½çªçªåœ°ç™¼è·³ã€‚伊é€éŽçƒæ¡•葉,看見åˆçŸ®åˆèƒ–çš„è¶™ä¸ƒçˆºæ­£å¾žç¨æœ¨æ©‹ä¸Šèµ°ä¾†ï¼Œè€Œä¸”穿著寶è—色竹布的長衫。 +趙七爺是鄰æ‘茂æºé…’åº—çš„ä¸»äººï¼Œåˆæ˜¯é€™ä¸‰åè£æ–¹åœ“以內的唯一的出色人物兼學å•家;因為有學å•ï¼Œæ‰€ä»¥åˆæœ‰äº›éºè€çš„臭味。他有å多本金è–嘆批評的《三國志》,時常å著一個字一個字的讀;他ä¸ä½†èƒ½èªªå‡ºäº”虎將姓å,甚而至於還知é“黃忠表字漢昇和馬超表字孟起。é©å‘½ä»¥å¾Œï¼Œä»–便將辮å­ç›¤åœ¨é ‚上,åƒé“士一般;常常嘆æ¯èªªï¼Œå€˜è‹¥è¶™å­é¾åœ¨ä¸–ï¼Œå¤©ä¸‹ä¾¿ä¸æœƒäº‚到這地步了。七斤嫂眼ç›å¥½ï¼Œæ—©æœ›è¦‹ä»Šå¤©çš„è¶™ä¸ƒçˆºå·²ç¶“ä¸æ˜¯é“士,å»è®Šæˆå…‰æ»‘頭皮,çƒé»‘髮頂;伊便知é“這一定是皇å¸å了é¾åº­ï¼Œè€Œä¸”一定須有辮å­ï¼Œè€Œä¸”七斤一定是éžå¸¸å±éšªã€‚因為趙七爺的這件竹布長衫,輕易是ä¸å¸¸ç©¿çš„,三年以來,åªç©¿éŽå…©æ¬¡ï¼šä¸€æ¬¡æ˜¯å’Œä»–嘔氣的麻å­é˜¿å››ç—…了的時候,一次是曾經砸爛他酒店的魯大爺死了的時候;ç¾åœ¨æ˜¯ç¬¬ä¸‰æ¬¡äº†ï¼Œé€™ä¸€å®šåˆæ˜¯æ–¼ä»–有慶,於他的仇家有殃了。 +七斤嫂記得,兩年å‰ä¸ƒæ–¤å–醉了酒,曾經罵éŽè¶™ä¸ƒçˆºæ˜¯ã€Œè³¤èƒŽã€ï¼Œæ‰€ä»¥é€™æ™‚便立刻直覺到七斤的å±éšªï¼Œå¿ƒåŽè£çªçªåœ°ç™¼èµ·è·³ä¾†ã€‚ +趙七爺一路走來,å著喫飯的人都站起身,拿筷å­é»žè‘—自己的飯碗說,「七爺,請在我們這è£ç”¨é£¯ï¼ã€ä¸ƒçˆºä¹Ÿä¸€è·¯é»žé ­ï¼Œèªªé“「請請ã€ï¼Œå»ä¸€å¾‘走到七斤家的桌æ—。七斤們連忙招呼,七爺也微笑著說「請請ã€ï¼Œä¸€é¢ç´°ç´°çš„研究他們的飯èœã€‚ +「好香的èœä¹¾ï¼Œâ€”—è½åˆ°äº†é¢¨è²äº†éº½ï¼Ÿã€è¶™ä¸ƒçˆºç«™åœ¨ä¸ƒæ–¤çš„後é¢ä¸ƒæ–¤å«‚çš„å°é¢èªªã€‚ +「皇å¸å了é¾åº­äº†ã€‚ã€ä¸ƒæ–¤èªªã€‚ +七斤嫂看著七爺的臉,竭力陪笑é“,「皇å¸å·²ç¶“å了é¾åº­ï¼Œå¹¾æ™‚皇æ©å¤§èµ¦å‘¢ï¼Ÿã€ +「皇æ©å¤§èµ¦ï¼Ÿâ€”—大赦是慢慢的總è¦å¤§èµ¦ç½·ã€‚ã€ä¸ƒçˆºèªªåˆ°é€™è£ï¼Œè²è‰²å¿½ç„¶åš´åŽ²èµ·ä¾†ï¼Œã€Œä½†æ˜¯ä½ å®¶ä¸ƒæ–¤çš„è¾®å­å‘¢ï¼Œè¾®å­ï¼Ÿé€™å€’是è¦ç·Šçš„事。你們知é“:長毛時候,留髮ä¸ç•™é ­ï¼Œç•™é ­ä¸ç•™é«®ï¼Œâ€¦â€¦ã€ +ä¸ƒæ–¤å’Œä»–çš„å¥³äººæ²’æœ‰è®€éŽæ›¸ï¼Œä¸å¾ˆæ‡‚得這å¤å…¸çš„奧妙,但覺得有學å•的七爺這麼說,事情自然éžå¸¸é‡å¤§ï¼Œç„¡å¯è¼“回,便仿佛å—了死刑宣告似的,耳朵è£å—¡çš„一è²ï¼Œå†ä¹Ÿèªªä¸å‡ºä¸€å¥è©±ã€‚ +「一代ä¸å¦‚一代,——ã€ä¹æ–¤è€å¤ªæ­£åœ¨ä¸å¹³ï¼Œè¶é€™æ©Ÿæœƒï¼Œä¾¿å°è¶™ä¸ƒçˆºèªªï¼Œã€Œç¾åœ¨çš„é•·æ¯›ï¼Œåªæ˜¯å‰ªäººå®¶çš„è¾®å­ï¼Œåƒ§ä¸åƒ§ï¼Œé“ä¸é“的。從å‰çš„長毛,這樣的麽?我活到七å乿­²äº†ï¼Œæ´»å¤ äº†ã€‚從å‰çš„長毛是——整匹的紅緞å­è£¹é ­ï¼Œæ‹–下去,拖下去,一直拖到腳跟;王爺是黃緞å­ï¼Œæ‹–下去,黃緞å­ï¼›ç´…ç·žå­ï¼Œé»ƒç·žå­ï¼Œâ€”— 我活夠了,七å乿­²äº†ã€‚〠+七斤嫂站起身,自言自語的說,「這怎麼好呢?這樣的一ç­è€å°ï¼Œéƒ½é ä»–養活的人,……〠+趙七爺æ–é ­é“,「那也沒法。沒有辮å­ï¼Œè©²ç•¶ä½•罪,書上都一æ¢ä¸€æ¢æ˜Žæ˜Žç™½ç™½å¯«è‘—的。ä¸ç®¡ä»–å®¶è£æœ‰äº›ä»€éº¼äººã€‚〠+七斤嫂è½åˆ°æ›¸ä¸Šå¯«è‘—,å¯çœŸæ˜¯å®Œå…¨çµ•æœ›äº†ï¼›è‡ªå·±æ€¥å¾—æ²’æ³•ï¼Œä¾¿å¿½ç„¶åˆæ¨åˆ°ä¸ƒæ–¤ã€‚ä¼Šç”¨ç­·å­æŒ‡è‘—他的鼻尖說,「這死å±è‡ªä½œè‡ªå—ï¼é€ å的時候,我本來說,ä¸è¦æ’船了,ä¸è¦ä¸ŠåŸŽäº†ã€‚ä»–åè¦æ­»é€²åŸŽåŽ»ï¼Œæ»¾é€²åŸŽåŽ»ï¼Œé€²åŸŽä¾¿è¢«äººå‰ªåŽ»äº†è¾®å­ã€‚å¾žå‰æ˜¯çµ¹å…‰çƒé»‘的辮å­ï¼Œç¾åœ¨å¼„得僧ä¸åƒ§é“ä¸é“的。這囚徒自作自å—ï¼Œå¸¶ç´¯äº†æˆ‘å€‘åˆæ€Žéº¼èªªå‘¢ï¼Ÿé€™æ´»æ­»å±çš„囚徒……〠+æ‘人看見趙七爺到æ‘,都趕緊喫完飯,èšåœ¨ä¸ƒæ–¤å®¶é£¯æ¡Œçš„周åœã€‚ä¸ƒæ–¤è‡ªå·±çŸ¥é“æ˜¯å‡ºå ´äººç‰©ï¼Œè¢«å¥³äººç•¶å¤§çœ¾é€™æ¨£è¾±ç½µï¼Œå¾ˆä¸é›…觀,便åªå¾—抬起頭,慢慢地說é“: +ã€Œä½ ä»Šå¤©èªªç¾æˆè©±ï¼Œé‚£æ™‚你……〠+「你這活死å±çš„囚徒……〠+看客中間,八一嫂是心腸最好的人,抱著伊的兩周歲的éºè…¹å­ï¼Œæ­£åœ¨ä¸ƒæ–¤å«‚èº«é‚Šçœ‹ç†±é¬§ï¼›é€™æ™‚éŽæ„ä¸åŽ»ï¼Œé€£å¿™è§£å‹¸èªªï¼Œã€Œä¸ƒæ–¤å«‚ï¼Œç®—äº†ç½·ã€‚äººä¸æ˜¯ç¥žä»™ï¼Œèª°çŸ¥é“未來事呢?便是七斤嫂,那時ä¸ä¹Ÿèªªï¼Œæ²’有辮å­å€’也沒有什麼醜麽?æ³ä¸”衙門è£çš„大è€çˆºä¹Ÿé‚„沒有告示,……〠+七斤嫂沒有è½å®Œï¼Œå…©å€‹è€³æœµæ—©é€šç´…了;便將筷å­è½‰éŽå‘來,指著八一嫂的鼻å­ï¼Œèªªï¼Œã€Œé˜¿å‘€ï¼Œé€™æ˜¯ä»€éº¼è©±å‘µï¼å…«ä¸€å«‚,我自己看來倒還是一個人,會說出這樣æ˜èª•胡塗話麽?那時我是,整整哭了三天,誰都看見;連六斤這å°é¬¼ä¹Ÿéƒ½å“­ï¼Œâ€¦â€¦ã€å…­æ–¤å‰›å–«å®Œä¸€å¤§ç¢—é£¯ï¼Œæ‹¿äº†ç©ºç¢—ï¼Œä¼¸æ‰‹åŽ»åš·è‘—è¦æ·»ã€‚七斤嫂正沒好氣,便用筷å­åœ¨ä¼Šçš„雙丫角中間,直紮下去,大å–é“,「誰è¦ä½ ä¾†å¤šå˜´ï¼ä½ é€™å·æ¼¢çš„å°å¯¡å©¦ï¼ã€ +撲的一è²ï¼Œå…­æ–¤æ‰‹è£çš„空碗è½åœ¨åœ°ä¸Šäº†ï¼Œæ°å·§åˆç¢°è‘—一塊磚角,立刻破æˆä¸€å€‹å¾ˆå¤§çš„缺å£ã€‚七斤直跳起來,撿起破碗,åˆä¸Šæª¢æŸ¥ä¸€å›žï¼Œä¹Ÿå–é“,「入娘的ï¼ã€ä¸€å·´æŽŒæ‰“å€’äº†å…­æ–¤ã€‚å…­æ–¤èººè‘—å“­ï¼Œä¹æ–¤è€å¤ªæ‹‰äº†ä¼Šçš„æ‰‹ï¼Œé€£èªªè‘—「一代ä¸å¦‚一代ã€ï¼Œä¸€åŒèµ°äº†ã€‚ +八一嫂也發怒,大è²èªªï¼Œã€Œä¸ƒæ–¤å«‚ï¼Œä½ ã€Žæ¨æ£’打人ã€â€¦â€¦ã€ +趙七爺本來是笑著æ—觀的;但自從八一嫂說了「衙門è£çš„大è€çˆºæ²’有告示ã€é€™è©±ä»¥å¾Œï¼Œå»æœ‰äº›ç”Ÿæ°£äº†ã€‚這時他已經繞出桌æ—ï¼ŒæŽ¥è‘—èªªï¼Œã€Œã€Žæ¨æ£’打人ã€ï¼Œç®—什麼呢。大兵是就è¦åˆ°çš„。你å¯çŸ¥é“,這回ä¿é§•的是張大帥,張大帥就是燕人張翼德的後代,他一支丈八蛇矛,就有è¬å¤«ä¸ç•¶ä¹‹å‹‡ï¼Œèª°èƒ½æŠµæ“‹ä»–?ã€ä»–å…©æ‰‹åŒæ™‚æèµ·ç©ºæ‹³ï¼Œä»¿ä½›æ¡è‘—無形的蛇矛模樣,å‘八一嫂æ¶é€²å¹¾æ­¥é“,「你能抵擋他麽ï¼ã€ +八一嫂正氣得抱著孩å­ç™¼æŠ–,忽然見趙七爺滿臉油汗,瞪著眼,準å°ä¼Šè¡éŽä¾†ï¼Œä¾¿ååˆ†å®³æ€•ï¼Œä¸æ•¢èªªå®Œè©±ï¼Œå›žèº«èµ°äº†ã€‚è¶™ä¸ƒçˆºä¹Ÿè·Ÿè‘—èµ°åŽ»ï¼Œçœ¾äººä¸€é¢æ€ªå…«ä¸€å«‚多事,一é¢è®“開路,幾個剪éŽè¾®å­é‡æ–°ç•™èµ·çš„便趕快躲在人å¢å¾Œé¢ï¼Œæ€•他看見。趙七爺也ä¸ç´°å¿ƒå¯Ÿè¨ªï¼Œé€šéŽäººå¢ï¼Œå¿½ç„¶è½‰å…¥çƒæ¡•樹後,說é“「你能抵擋他麽ï¼ã€ è·¨ä¸Šç¨æœ¨æ©‹ï¼Œæšé•·åŽ»äº†ã€‚ +æ‘人們呆呆站著,心è£è¨ˆç®—,都覺得自己確乎抵ä¸ä½å¼µç¿¼å¾·ï¼Œå› æ­¤ä¹Ÿæ±ºå®šä¸ƒæ–¤ä¾¿è¦æ²’有性命。七斤既然犯了皇法,想起他往常å°äººè«‡è«–城中的新èžçš„æ™‚候,就ä¸è©²å«è‘—長煙管顯出那般驕傲模樣,所以å°ä¸ƒæ–¤çš„犯法,也覺得有些暢快。他們也仿佛想發些議論,å»åˆè¦ºå¾—沒有什麼議論å¯ç™¼ã€‚嗡嗡的一陣亂嚷,蚊å­éƒ½æ’žéŽèµ¤è†Šèº«å­ï¼Œé—–åˆ°çƒæ¡•樹下去åšå¸‚;他們也就慢慢地走散回家,關上門去ç¡è¦ºã€‚七斤嫂咕噥著,也收了傢伙和桌å­çŸ®å‡³å›žå®¶ï¼Œé—œä¸Šé–€ç¡è¦ºäº†ã€‚ +七斤將破碗拿回家è£ï¼Œå在門檻上å¸ç…™ï¼›ä½†éžå¸¸æ†‚æ„,忘å»äº†å¸ç…™ï¼Œè±¡ç‰™å˜´å…­å°ºå¤šé•·æ¹˜å¦ƒç«¹ç…™ç®¡çš„白銅鬥è£çš„ç«å…‰ï¼Œæ¼¸æ¼¸ç™¼é»‘了。他心è£ä½†è¦ºå¾—事情似乎ååˆ†å±æ€¥ï¼Œä¹Ÿæƒ³æƒ³äº›æ–¹æ³•,想些計畫,但總是éžå¸¸æ¨¡ç³Šï¼Œè²«ç©¿ä¸å¾—:「辮å­å‘¢è¾®å­ï¼Ÿä¸ˆå…«è›‡çŸ›ã€‚一代ä¸å¦‚一代ï¼çš‡å¸åé¾åº­ã€‚破的碗須得上城去釘好。誰能抵擋他?書上一æ¢ä¸€æ¢å¯«è‘—。入娘的ï¼â€¦â€¦ã€ +第二日清晨,七斤ä¾èˆŠå¾žé­¯éŽ®æ’èˆªèˆ¹é€²åŸŽï¼Œå‚æ™šå›žåˆ°é­¯éŽ®ï¼Œåˆæ‹¿è‘—六尺多長的湘妃竹煙管和一個飯碗回æ‘。他在晚飯席上,å°ä¹æ–¤è€å¤ªèªªï¼Œé€™ç¢—是在城內釘åˆçš„,因為缺å£å¤§ï¼Œæ‰€ä»¥è¦å六個銅釘,三文一個,一總用了四åå…«æ–‡å°éŒ¢ã€‚ +乿–¤è€å¤ªå¾ˆä¸é«˜èˆˆçš„說,「一代ä¸å¦‚一代,我是活夠了。三文錢一個釘;從å‰çš„釘,這樣的麽?從å‰çš„釘是……我活了七å乿­²äº†ï¼Œâ€”—〠+此後七斤雖然是照例日日進城,但家景總有些黯淡,æ‘人大抵迴é¿è‘—,ä¸å†ä¾†è½ä»–從城內得來的新èžã€‚ä¸ƒæ–¤å«‚ä¹Ÿæ²’æœ‰å¥½è²æ°£ï¼Œé‚„時常å«ä»–「囚徒ã€ã€‚ +éŽäº†å多日,七斤從城內回家,看見他的女人éžå¸¸é«˜èˆˆï¼Œå•他說,「你在城è£å¯è½åˆ°äº›ä»€éº¼ï¼Ÿã€ +「沒有è½åˆ°äº›ä»€éº¼ã€‚〠+「皇å¸å了é¾åº­æ²’有呢?〠+「他沒有說。〠+「咸亨酒店è£ä¹Ÿæ²’有人說麽?〠+「也沒人說。〠+「我想皇å¸ä¸€å®šæ˜¯ä¸åé¾åº­äº†ã€‚我今天走éŽè¶™ä¸ƒçˆºçš„店å‰ï¼Œçœ‹è¦‹ä»–åˆå著念書了,辮å­åˆç›¤åœ¨é ‚上了,也沒有穿長衫。〠+「…………〠+「你想,ä¸åé¾åº­äº†ç½·ï¼Ÿã€ +「我想,ä¸å了罷。〠+ç¾åœ¨çš„七斤,是七斤嫂和æ‘人åˆéƒ½æ—©çµ¦ä»–相當的尊敬,相當的待é‡äº†ã€‚到å¤å¤©ï¼Œä»–們ä»èˆŠåœ¨è‡ªå®¶é–€å£çš„åœŸå ´ä¸Šå–«é£¯ï¼›å¤§å®¶è¦‹äº†ï¼Œéƒ½ç¬‘å˜»å˜»çš„æ‹›å‘¼ã€‚ä¹æ–¤è€å¤ªæ—©å·²åšéŽå…«å大壽,ä»ç„¶ä¸å¹³è€Œä¸”å¥åº·ã€‚六斤的雙丫角,已經變æˆä¸€æ”¯å¤§è¾®å­äº†ï¼›ä¼Šé›–然新近裹腳,å»é‚„能幫åŒä¸ƒæ–¤å«‚åšäº‹ï¼Œæ§è‘—å八個銅釘的飯碗,在土場上一瘤一æ‹çš„往來。 +星期日的早晨,我æ­åŽ»ä¸€å¼µéš”å¤œçš„æ—¥æ›†ï¼Œå‘著新的那一張上看了åˆçœ‹çš„說: +â€œå•Šï¼Œåæœˆå日,——今天原來正是雙å節。這è£å»ä¸€é»žæ²’有記載ï¼â€ +我的一ä½å‰è¼©å…ˆç”ŸN,正走到我的寓è£ä¾†è«‡é–‘天,一è½é€™è©±ï¼Œä¾¿å¾ˆä¸é«˜èˆˆçš„å°æˆ‘說: +“他們å°ï¼ä»–們ä¸è¨˜å¾—ï¼Œä½ æ€Žæ¨£ä»–ï¼›ä½ è¨˜å¾—ï¼Œåˆæ€Žæ¨£å‘¢ï¼Ÿâ€ +這ä½N先生本來脾氣有點乖張,時常生些無謂的氣,說些ä¸é€šä¸–故的話。當這時候,我大抵任他自言自語,ä¸è´Šä¸€è¾­ï¼›ä»–ç¨è‡ªç™¼å®Œè­°è«–,也就算了。 +他說: +“我最佩æœåŒ—京雙å節的情形。早晨,員警到門,å©å’é“:『掛旗ï¼ã€ã€Žæ˜¯ï¼ŒæŽ›æ——ï¼ã€â€å„å®¶å¤§åŠæ‡¶æ´‹æ´‹çš„踱出一個國民來,撅起一塊斑é§é™¸é›¢çš„æ´‹å¸ƒã€‚這樣一直到夜,——收了旗關門;幾家å¶ç„¶å¿˜å»çš„,便掛到第二天的上åˆã€‚ +“他們忘å»äº†ç´€å¿µï¼Œç´€å¿µä¹Ÿå¿˜å»äº†ä»–們ï¼â€ +“我也是忘å»äº†ç´€å¿µçš„一個人。倘使紀念起來,那第一個雙å節å‰å¾Œçš„事,便都上我的心頭,使我åç«‹ä¸ç©©äº†ã€‚†+“多少故人的臉,都浮在我眼å‰ã€‚幾個少年辛苦奔走了å多年,暗地è£ä¸€é¡†å½ˆä¸¸è¦äº†ä»–的性命;幾個少年一擊ä¸ä¸­ï¼Œåœ¨ç›£ç‰¢è£èº«å—一個多月的苦刑;幾個少年懷著é å¿—,忽然蹤影全無,連å±é¦–也ä¸çŸ¥é‚£è£åŽ»äº†ã€‚â€”â€”â€ +“他們都在社會的冷笑惡罵迫害傾陷è£éŽäº†ä¸€ç”Ÿï¼›ç¾åœ¨ä»–們的墳墓也早在忘å»è£æ¼¸æ¼¸å¹³å¡Œä¸‹åŽ»äº†ã€‚â€ +“我ä¸å ªç´€å¿µé€™äº›äº‹ã€‚†+“我們還是記起一點得æ„的事來談談å§ã€‚†+N忽然ç¾å‡ºç¬‘容,伸手在自己頭上一摸,高è²èªªï¼š +“我最得æ„的是自從第一個雙å節以後,我在路上走,ä¸å†è¢«äººç¬‘駡了。†+“è€å…„,你å¯çŸ¥é“頭髮是我們中國人的寶è²å’Œå†¤å®¶ï¼Œå¤ä»Šä¾†å¤šå°‘人在這上頭åƒäº›æ¯«ç„¡åƒ¹å€¼çš„苦呵ï¼â€ +“我們的很å¤çš„å¤äººï¼Œå°æ–¼é ­é«®ä¼¼ä¹Žä¹Ÿé‚„看輕。據刑法看來,最è¦ç·Šçš„自然是腦袋,所以大辟是上刑;次è¦ä¾¿æ˜¯ç”Ÿæ®–器了,所以宮刑和幽閉也是一件嚇人的罰;至於髡,那是微乎其微了,然而推想起來,正ä¸çŸ¥é“曾有多少人們因為光著頭皮便被社會è¸è¸äº†ä¸€ç”Ÿä¸–。†+“我們講é©å‘½çš„æ™‚候,大談什麼æšå·žä¸‰æ—¥ï¼Œå˜‰å®šå± åŸŽï¼Œå…¶å¯¦ä¹Ÿä¸éŽä¸€ç¨®æ‰‹æ®µï¼›è€å¯¦èªªï¼šé‚£æ™‚ä¸­åœ‹äººçš„åæŠ—ï¼Œä½•å˜—å› ç‚ºäº¡åœ‹ï¼Œåªæ˜¯å› ç‚ºæ‹–è¾®å­ã€‚†+“頑殺盡了,éºè€éƒ½å£½çµ‚äº†ï¼Œè¾®å­æ—©ç•™å®šäº†ï¼Œæ´ªæ¥Šåˆé¬§èµ·ä¾†äº†ã€‚æˆ‘çš„ç¥–æ¯æ›¾å°æˆ‘說,那時åšç™¾å§“æ‰é›£å“©ï¼Œå…¨ç•™è‘—頭髮的被官兵殺,還是辮å­çš„便被長毛殺ï¼â€ +“我ä¸çŸ¥é“有多少中國人åªå› ç‚ºé€™ä¸ç—›ä¸ç™¢çš„頭髮而åƒè‹¦ï¼Œå—難,滅亡。†+N兩眼望著屋樑,似乎想些事,ä»ç„¶èªªï¼š +“誰知é“頭髮的苦輪到我了。†+“我出去留學,便剪掉了辮å­ï¼Œé€™ä¸¦æ²’有別的奧妙,åªç‚ºä»–ä¸å¤ªä¾¿ç•¶ç½·äº†ã€‚䏿–™æœ‰å¹¾ä½è¾®å­ç›¤åœ¨é ­é ‚上的åŒå­¸å€‘便很厭惡我;監ç£ä¹Ÿå¤§æ€’,說è¦åœäº†æˆ‘的官費,é€å›žä¸­åœ‹åŽ»ã€‚â€ +“ä¸å¹¾å¤©ï¼Œé€™ä½ç›£ç£å»è‡ªå·±è¢«äººå‰ªåŽ»è¾®å­é€ƒèµ°äº†ã€‚去剪的人們è£é¢ï¼Œä¸€å€‹ä¾¿æ˜¯åšã€Šé©å‘½è»ã€‹çš„鄒容,這人也因此ä¸èƒ½å†ç•™å­¸ï¼Œå›žåˆ°ä¸Šæµ·ä¾†ï¼Œå¾Œä¾†æ­»åœ¨è¥¿ç‰¢è£ã€‚你也早忘å»äº†ç½·ï¼Ÿâ€ +“éŽäº†å¹¾å¹´ï¼Œæˆ‘的家景大ä¸å¦‚å‰äº†ï¼Œéžè¬€é»žäº‹åšä¾¿è¦å—餓,åªå¾—也回到中國來。我一到上海,便買定一æ¢å‡è¾®å­ï¼Œé‚£æ™‚是二元的市價,帶著回家。我的æ¯è¦ªå€’也ä¸èªªä»€éº¼ï¼Œç„¶è€Œæ—人一見é¢ï¼Œä¾¿éƒ½é¦–先研究這辮å­ï¼Œå¾…åˆ°çŸ¥é“æ˜¯å‡ï¼Œå°±ä¸€è²å†·ç¬‘,將我擬為殺頭的罪åï¼›æœ‰ä¸€ä½æœ¬å®¶ï¼Œé‚„é å‚™åŽ»å‘Šå®˜ï¼Œä½†å¾Œä¾†å› ç‚ºææ€•é©å‘½é»¨çš„é€ åæˆ–è€…è¦æˆåŠŸï¼Œé€™æ‰ä¸­æ­¢äº†ã€‚†+“我想,å‡çš„ä¸å¦‚真的直截爽快,我便索性廢了å‡è¾®å­ï¼Œç©¿è‘—西è£åœ¨è¡—上走。†+“一路走去,一路便是笑駡的è²éŸ³ï¼Œæœ‰çš„還跟在後é¢ç½µï¼šã€Žé€™å†’失鬼ï¼ã€ã€Žå‡æ´‹é¬¼å­ï¼ã€â€ +“我於是ä¸ç©¿æ´‹æœäº†ï¼Œæ”¹äº†å¤§è¡«ï¼Œä»–們罵得更厲害。†+â€œåœ¨é€™æ—¥æš®é€”çª®çš„æ™‚å€™ï¼Œæˆ‘çš„æ‰‹è£æ‰æ·»å‡ºä¸€æ”¯æ‰‹æ–來,拚命的打了幾回,他們漸漸的ä¸ç½µäº†ã€‚åªæ˜¯èµ°åˆ°æ²’有打éŽçš„生地方還是罵。†+â€œé€™ä»¶äº‹å¾ˆä½¿æˆ‘æ‚²å“€ï¼Œè‡³ä»Šé‚„æ™‚æ™‚è¨˜å¾—å“©ã€‚æˆ‘åœ¨ç•™å­¸çš„æ™‚å€™ï¼Œæ›¾ç¶“çœ‹è¦‹æ—¥å ±ä¸Šç™»è¼‰ä¸€å€‹éŠæ­·å—洋和中國的本多åšå£«çš„事;這ä½åšå£«æ˜¯ä¸æ‡‚中國和馬來語的,人å•ä»–ï¼Œä½ ä¸æ‡‚話,怎麼走路呢?他拿起手æ–ä¾†èªªï¼Œé€™ä¾¿æ˜¯ä»–å€‘çš„è©±ï¼Œä»–å€‘éƒ½æ‡‚ï¼æˆ‘å› æ­¤æ°£æ†¤äº†å¥½å¹¾å¤©ï¼Œèª°çŸ¥é“æˆ‘竟ä¸çŸ¥ä¸è¦ºçš„自己也åšäº†ï¼Œè€Œä¸”那些人都懂了。……†+“宣統åˆå¹´ï¼Œæˆ‘在本地的中學校åšç›£å­¸ï¼ŒåŒäº‹æ˜¯é¿ä¹‹æƒŸæä¸é ï¼Œå®˜åƒšæ˜¯é˜²ä¹‹æƒŸæä¸åš´ï¼Œæˆ‘終日如å在冰窖å­è£ï¼Œå¦‚站在刑場æ—邊,其實並éžåˆ¥çš„,åªå› ç‚ºç¼ºå°‘了一æ¢è¾®å­ï¼â€ +“有一日,幾個學生忽然走到我的房è£ä¾†ï¼Œèªªï¼šã€Žå…ˆç”Ÿï¼Œæˆ‘們è¦å‰ªè¾®å­äº†ã€‚ã€æˆ‘說:『ä¸è¡Œï¼ã€ã€Žæœ‰è¾®å­å¥½å‘¢ï¼Œæ²’有辮å­å¥½å‘¢ï¼Ÿã€ã€Žæ²’有辮å­å¥½â€¦â€¦ã€ã€Žä½ æ€Žéº¼èªªä¸è¡Œå‘¢ï¼Ÿã€ã€ŽçНä¸ä¸Šï¼Œä½ å€‘還是ä¸å‰ªä¸Šç®—,——等一等罷。ã€â€ä»–們ä¸èªªä»€éº¼ï¼Œæ’…著嘴唇走出房去,然而終於剪掉了。 +“呵ï¼ä¸å¾—了了,人言嘖嘖了;我å»åªè£ä½œä¸çŸ¥é“,一任他們光著頭皮,和許多辮å­ä¸€é½Šä¸Šè¬›å ‚。†+“然而這剪辮病傳染了;第三天,師範學堂的學生忽然也剪下了六æ¢è¾®å­ï¼Œæ™šä¸Šä¾¿é–‹é™¤äº†å…­å€‹å­¸ç”Ÿã€‚這六個人,留校ä¸èƒ½ï¼Œå›žå®¶ä¸å¾—,一直挨到第一個雙å節之後åˆä¸€å€‹å¤šæœˆï¼Œæ‰æ¶ˆåŽ»äº†çŠ¯ç½ªçš„ç«çƒ™å°ã€‚†+â€œæˆ‘å‘¢ï¼Ÿä¹Ÿä¸€æ¨£ï¼Œåªæ˜¯å…ƒå¹´å†¬å¤©åˆ°åŒ—京,還被人罵éŽå¹¾æ¬¡ï¼Œå¾Œä¾†ç½µæˆ‘的人也被員警剪去了辮å­ï¼Œæˆ‘å°±ä¸å†è¢«äººè¾±é§¡äº†ï¼›ä½†æˆ‘沒有到鄉間去。â€N顯出éžå¸¸å¾—æ„æ¨¡æ¨£ï¼Œå¿½è€Œåˆæ²‰ä¸‹è‡‰ä¾†ï¼šâ€œç¾åœ¨ä½ å€‘é€™äº›ç†æƒ³å®¶ï¼Œåˆåœ¨é‚£è£åš·ä»€éº¼å¥³å­å‰ªé«®äº†ï¼Œåˆè¦é€ å‡ºè¨±å¤šæ¯«ç„¡æ‰€å¾—而痛苦的人ï¼â€â€œç¾åœ¨ä¸æ˜¯å·²ç¶“有剪掉頭發的女人,因此考ä¸é€²å­¸æ ¡åŽ»ï¼Œæˆ–è€…è¢«å­¸æ ¡é™¤äº†å麼?â€â€œæ”¹é©å˜›ï¼Œæ­¦å™¨åœ¨é‚£è£ï¼Ÿå·¥è®€éº¼ï¼Œå·¥å» åœ¨é‚£è£ï¼Ÿâ€â€œä»ç„¶ç•™èµ·ï¼Œå«çµ¦äººå®¶åšåª³å©¦åŽ»ï¼šå¿˜å»äº†ä¸€åˆ‡é‚„是幸ç¦ï¼Œå€˜ä½¿ä¼Šè¨˜è‘—些平等自由的話,便è¦è‹¦ç—›ä¸€ç”Ÿä¸–ï¼â€â€œæˆ‘è¦å€Ÿäº†é˜¿çˆ¾å¿—è·‹ç¶å¤«çš„話å•你們:『你們將黃金時代的出ç¾è±«ç´„給這些人們的å­å­«äº†ï¼Œä½†æœ‰ä»€éº¼çµ¦é€™äº›äººå€‘自己呢?ã€â€â€œå•Šï¼Œé€ ç‰©çš„çš®éž­æ²’æœ‰åˆ°ä¸­åœ‹çš„è„Šæ¨‘ä¸Šæ™‚ï¼Œä¸­åœ‹ä¾¿æ°¸é æ˜¯é€™ä¸€æ¨£çš„中國,絕ä¸è‚¯è‡ªå·±æ”¹è®Šä¸€é𻿝«æ¯›ï¼â€â€œä½ å€‘çš„å˜´è£æ—¢ç„¶ä¸¦ç„¡æ¯’牙,何以åè¦åœ¨é¡ä¸Šå¸–起『è®è›‡ã€å…©å€‹å¤§å­—,引乞ä¸ä¾†æ‰“殺?……â€N愈說愈離奇了,但一見到我ä¸å¾ˆé¡˜è½çš„神情,便立刻閉了å£ï¼Œç«™èµ·ä¾†å–帽å­ã€‚我說:“回去麼?â€ä»–ç­”é“:“是的,天è¦ä¸‹é›¨äº†ã€‚â€æˆ‘默默的é€ä»–到門å£ã€‚他戴上帽å­èªªï¼šâ€œå†è¦‹ï¼è«‹ä½ æ•æˆ‘æ‰“æ”ªï¼Œå¥½åœ¨æ˜Žå¤©ä¾¿ä¸æ˜¯é›™å節,我們統å¯ä»¥å¿˜å»äº†ã€‚†+我從鄉下跑到京城è£ï¼Œä¸€è½‰çœ¼å·²ç¶“六年了。其間耳èžç›®ç¹çš„æ‰€è¬‚國家大事,算起來也很ä¸å°‘;但在我心è£ï¼Œéƒ½ä¸ç•™ä»€éº¼ç—•è·¡ï¼Œå€˜è¦æˆ‘å°‹å‡ºé€™äº›äº‹çš„å½±éŸ¿ä¾†èªªï¼Œä¾¿åªæ˜¯å¢žé•·äº†æˆ‘的壞脾氣,——è€å¯¦èªªï¼Œä¾¿æ˜¯æ•™æˆ‘一天比一天的看ä¸èµ·äººã€‚ +但有一件å°äº‹ï¼Œå»æ–¼æˆ‘有æ„ç¾©ï¼Œå°‡æˆ‘å¾žå£žè„¾æ°£è£æ‹–開,使我至今忘記ä¸å¾—。 +這是民國六年的冬天,大北風颳得正猛,我因為生計關係,ä¸å¾—ä¸ä¸€æ—©åœ¨è·¯ä¸Šèµ°ã€‚一路幾乎é‡ä¸è¦‹äººï¼Œå¥½å®¹æ˜“æ‰é›‡å®šäº†ä¸€è¼›äººåŠ›è»Šï¼Œæ•™ä»–æ‹‰åˆ°S門去。ä¸ä¸€æœƒï¼ŒåŒ—風å°äº†ï¼Œè·¯ä¸Šæµ®å¡µæ—©å·²åˆ®æ·¨ï¼Œå‰©ä¸‹ä¸€æ¢æ½”白的大é“來,車夫也跑得更快。剛近S門,忽而車把上帶著一個人,慢慢地倒了。 +跌倒的是一個女人,花白頭髮,衣æœéƒ½å¾ˆç ´çˆ›ã€‚伊從馬路上çªç„¶å‘è»Šå‰æ©«æˆªéŽä¾†ï¼›è»Šå¤«å·²ç¶“讓開é“,但伊的破棉背心沒有上扣,微風å¹è‘—,å‘å¤–å±•é–‹ï¼Œæ‰€ä»¥çµ‚æ–¼å…œè‘—è»ŠæŠŠã€‚å¹¸è€Œè»Šå¤«æ—©æœ‰é»žåœæ­¥ï¼Œå¦å‰‡ä¼Šå®šè¦æ ½ä¸€å€‹å¤§æ–¤æ–—,跌到頭破血出了。 +伊ä¼åœ¨åœ°ä¸Šï¼›è»Šå¤«ä¾¿ä¹Ÿç«‹ä½è…³ã€‚我料定這è€å¥³äººä¸¦æ²’æœ‰å‚·ï¼Œåˆæ²’有別人看見,便很怪他多事,è¦è‡ªå·±æƒ¹å‡ºæ˜¯éžï¼Œä¹Ÿèª¤äº†æˆ‘的路。 +我便å°ä»–說,"沒有什麼的。走你的罷ï¼" +車夫毫ä¸ç†æœƒï¼Œâ€”—或者並沒有è½åˆ°ï¼Œâ€”â€”å»æ”¾ä¸‹è»Šå­ï¼Œæ‰¶é‚£è€å¥³äººæ…¢æ…¢èµ·ä¾†ï¼Œæ”™è‘—臂膊立定,å•伊說:"你怎麼啦?""我摔壞了。" +我想,我眼見你慢慢倒地,怎麼會摔壞呢,è£è…”ä½œå‹¢ç½·äº†ï¼Œé€™çœŸå¯æ†Žæƒ¡ã€‚車夫多事,也正是自討苦åƒï¼Œç¾åœ¨ä½ è‡ªå·±æƒ³æ³•去。 +車夫è½äº†é€™è€å¥³äººçš„è©±ï¼Œå»æ¯«ä¸èºŠèº‡ï¼Œä»ç„¶æ”™è‘—伊的臂膊,便一步一步的å‘å‰èµ°ã€‚我有些詫異,忙看å‰é¢ï¼Œæ˜¯ä¸€æ‰€å·¡è­¦åˆ†é§æ‰€ï¼Œå¤§é¢¨ä¹‹å¾Œï¼Œå¤–é¢ä¹Ÿä¸è¦‹äººã€‚這車夫扶著那è€å¥³äººï¼Œä¾¿æ­£æ˜¯å‘那大門走去。 +我這時çªç„¶æ„Ÿåˆ°ä¸€ç¨®ç•°æ¨£çš„æ„Ÿè¦ºï¼Œè¦ºå¾—他滿身ç°å¡µçš„後影,剎時高大了,而且愈走愈大,須仰視æ‰è¦‹ã€‚è€Œä¸”ä»–å°æ–¼æˆ‘,漸漸的åˆå¹¾ä¹Žè®Šæˆä¸€ç¨®å¨å£“ï¼Œç”šè€Œè‡³æ–¼è¦æ¦¨å‡ºçš®è¢ä¸‹é¢è—è‘—çš„"å°"來。 +æˆ‘çš„æ´»åŠ›é€™æ™‚å¤§ç´„æœ‰äº›å‡æ»¯äº†ï¼Œåè‘—æ²’æœ‰å‹•ï¼Œä¹Ÿæ²’æœ‰æƒ³ï¼Œç›´åˆ°çœ‹è¦‹åˆ†é§æ‰€è£èµ°å‡ºä¸€å€‹å·¡è­¦ï¼Œæ‰ä¸‹äº†è»Šã€‚ +巡警走近我說,"你自己雇車罷,他ä¸èƒ½æ‹‰ä½ äº†ã€‚" +我沒有æ€ç´¢çš„å¾žå¤–å¥—è¢‹è£æŠ“å‡ºä¸€å¤§æŠŠéŠ…å…ƒï¼Œäº¤çµ¦å·¡è­¦ï¼Œèªªï¼Œ"請你給他……" +風全ä½äº†ï¼Œè·¯ä¸Šé‚„很éœã€‚æˆ‘èµ°è‘—ï¼Œä¸€é¢æƒ³ï¼Œå¹¾ä¹Žæ€•敢想到自己。以å‰çš„äº‹å§‘ä¸”æ“±èµ·ï¼Œé€™ä¸€å¤§æŠŠéŠ…å…ƒåˆæ˜¯ä»€éº¼æ„æ€ï¼ŸçŽä»–麼?我還能è£åˆ¤è»Šå¤«éº¼ï¼Ÿæˆ‘ä¸èƒ½å›žç­”自己。 +這事到了ç¾åœ¨ï¼Œé‚„æ˜¯æ™‚æ™‚è¨˜èµ·ã€‚æˆ‘å› æ­¤ä¹Ÿæ™‚æ™‚ç…žäº†è‹¦ç—›ï¼ŒåŠªåŠ›çš„è¦æƒ³åˆ°æˆ‘è‡ªå·±ã€‚å¹¾å¹´ä¾†çš„æ–‡æ²»æ­¦åŠ›ï¼Œåœ¨æˆ‘æ—©å¦‚å¹¼å°æ™‚候所讀éŽçš„"å­æ›°è©©äº‘"一般,背ä¸ä¸ŠåŠå¥äº†ã€‚ç¨æœ‰é€™ä¸€ä»¶å°äº‹ï¼Œå»ç¸½æ˜¯æµ®åœ¨æˆ‘眼å‰ï¼Œæœ‰æ™‚åæ›´åˆ†æ˜Žï¼Œæ•™æˆ‘慚愧,催我自新,並且增長我的勇氣和希望。 +「沒有è²éŸ³ï¼Œâ€”â€”å°æ±è¥¿æ€Žäº†ï¼Ÿã€ç´…é¼»å­è€æ‹±æ‰‹è£æ“Žäº†ä¸€ç¢—黃酒,說著,å‘é–“å£åŠªä¸€åŠªå˜´ã€‚è—皮阿五便放下酒碗,在他脊æ¢ä¸Šç”¨æ­»å‹çš„æ‰“了一掌,å«å«ç³Šç³Šåš·é“:「你……你你åˆåœ¨æƒ³å¿ƒæ€ã€‚……〠+原來魯鎮是僻éœåœ°æ–¹ï¼Œé‚„有些å¤é¢¨ï¼šä¸ä¸Šä¸€æ›´ï¼Œå¤§å®¶ä¾¿éƒ½é—œé–€ç¡è¦ºã€‚深更åŠå¤œæ²’有ç¡çš„åªæœ‰å…©å®¶ï¼šä¸€å®¶æ˜¯å’¸äº¨é…’店,幾個酒肉朋å‹åœè‘—櫃臺,åƒå–得正高興;一家便是間å£çš„單四嫂å­ï¼Œä»–自從å‰å¹´å®ˆäº†å¯¡ï¼Œä¾¿é ˆå°ˆé è‘—自己的一雙手紡出綿紗來,養活他自己和他三歲的兒å­ï¼Œæ‰€ä»¥ç¡çš„也é²ã€‚ +這幾天,確鑿沒有紡紗的è²éŸ³äº†ã€‚但夜深沒有ç¡çš„æ—¢ç„¶åªæœ‰å…©å®¶ï¼Œé€™å–®å››å«‚å­å®¶æœ‰è²éŸ³ï¼Œä¾¿è‡ªç„¶åªæœ‰è€æ‹±å€‘è½åˆ°ï¼Œæ²’有è²éŸ³ï¼Œä¹Ÿåªæœ‰è€æ‹±å€‘è½åˆ°ã€‚ +è€æ‹±æŒ¨äº†æ‰“,仿佛很舒æœä¼¼çš„å–了一大å£é…’ï¼Œå—šå—šçš„å”±èµ·å°æ›²ä¾†ã€‚ +é€™æ™‚å€™ï¼Œå–®å››å«‚å­æ­£æŠ±è‘—他的寶兒,å在床沿上,紡車éœéœçš„立在地上。黑沉沉的燈光,照著寶兒的臉,緋紅è£å¸¶ä¸€é»žé’。單四嫂å­å¿ƒè£è¨ˆç®—:神簽也求éŽäº†ï¼Œé¡˜å¿ƒä¹Ÿè¨±éŽäº†ï¼Œå–®æ–¹ä¹ŸåƒéŽäº†ï¼Œè¦æ˜¯é‚„ä¸è¦‹æ•ˆï¼Œæ€Žéº¼å¥½ï¼Ÿâ€”—那隻有去診何å°ä»™äº†ã€‚但寶兒也許是日輕夜é‡ï¼Œåˆ°äº†æ˜Žå¤©ï¼Œå¤ªé™½ä¸€å‡ºï¼Œç†±ä¹Ÿæœƒé€€ï¼Œæ°£å–˜ä¹Ÿæœƒå¹³çš„:這實在是病人常有的事。 +單四嫂孿˜¯ä¸€å€‹ç²—ç¬¨å¥³äººï¼Œä¸æ˜Žç™½é€™ã€Œä½†ã€å­—çš„å¯æ€•:許多壞事固然幸虧有了他æ‰è®Šå¥½ï¼Œè¨±å¤šå¥½äº‹å»ä¹Ÿå› ç‚ºæœ‰äº†ä»–都弄糟。å¤å¤©å¤œçŸ­ï¼Œè€æ‹±å€‘嗚嗚的唱完了ä¸å¤šæ™‚ï¼Œæ±æ–¹å·²ç¶“發白;ä¸ä¸€æœƒï¼Œçª—縫è£é€é€²äº†éŠ€ç™½è‰²çš„æ›™å…‰ã€‚ +單四嫂å­ç­‰å€™å¤©æ˜Žï¼Œå»ä¸åƒåˆ¥äººé€™æ¨£å®¹æ˜“,覺得éžå¸¸ä¹‹æ…¢ï¼Œå¯¶å…’的一呼å¸ï¼Œå¹¾ä¹Žé•·éŽä¸€å¹´ã€‚ç¾åœ¨å±…然明亮了;天的明亮,壓倒了燈光,——看見寶兒的鼻翼,已經一放一收的扇動。 +單四嫂å­çŸ¥é“ä¸å¦™ï¼Œæš—æš—å«ä¸€è²ã€Œé˜¿å‘€ï¼ã€å¿ƒè£è¨ˆç®—ï¼šæ€Žéº¼å¥½ï¼Ÿåªæœ‰åŽ»è¨ºä½•å°ä»™é€™ä¸€æ¢è·¯äº†ã€‚他雖然是粗笨女人,心è£å»æœ‰æ±ºæ–·ï¼Œä¾¿ç«™èµ·èº«ï¼Œå¾žæœ¨æŸœå­é‡ŒæŽå‡ºæ¯å¤©ç¯€çœä¸‹ä¾†çš„å三個å°éŠ€å…ƒå’Œä¸€ç™¾å…«å銅錢,都è£åœ¨è¡£è¢‹é‡Œï¼ŒéŽ–ä¸Šé–€ï¼ŒæŠ±è‘—å¯¶å…’ç›´å‘何家奔éŽåŽ»ã€‚ +天氣還早,何家已經å著四個病人了。他摸出四角銀元,買了號簽,第五個輪到寶兒。何å°ä»™ä¼¸é–‹å…©å€‹æŒ‡é ­æŒ‰è„ˆï¼ŒæŒ‡ç”²è¶³æœ‰å››å¯¸å¤šé•·ï¼Œå–®å››å«‚å­æš—地ç´ç½•,心è£è¨ˆç®—:寶兒該有活命了。但總å…ä¸äº†è‘—急,å¿ä¸ä½è¦å•,便局局促促的說: +「先生,——我家的寶兒什麼病呀?ã€ã€Œä»–中焦塞著。ã€ã€Œä¸å¦¨äº‹éº½ï¼Ÿä»–……ã€ã€Œå…ˆåŽ»åƒå…©å¸–。ã€ã€Œä»–å–˜ä¸éŽæ°£ä¾†ï¼Œé¼»ç¿…å­éƒ½æ‰‡è‘—呢。ã€é€™æ˜¯ç«å…‹é‡‘……〠+何å°ä»™èªªäº†åŠå¥è©±ï¼Œä¾¿é–‰ä¸Šçœ¼ç›ï¼›å–®å››å«‚å­ä¹Ÿä¸å¥½æ„æ€å†å•。在何å°ä»™å°é¢å著的一個三å多歲的人,此時已經開好一張藥方,指著紙角上的幾個字說é“: +「這第一味ä¿å¬°æ´»å‘½ä¸¸ï¼Œé ˆæ˜¯è³ˆå®¶æ¿Ÿä¸–è€åº—æ‰æœ‰ï¼ã€å–®å››å«‚孿ޥéŽè—¥æ–¹ï¼Œä¸€é¢èµ°ï¼Œä¸€é¢æƒ³ã€‚他雖是粗笨女人,å»çŸ¥é“何家與濟世è€åº—與自己的家,正是一個三角點;自然是買了藥回去便宜了。於是åˆå¾‘呿¿Ÿä¸–è€åº—奔éŽåŽ»ã€‚åº—å¤¥ä¹Ÿç¿¹äº†é•·æŒ‡ç”²æ…¢æ…¢çš„çœ‹æ–¹ï¼Œæ…¢æ…¢çš„åŒ…è—¥ã€‚å–®å››å«‚å­æŠ±äº†å¯¶å…’ç­‰è‘—ï¼›å¯¶å…’å¿½ç„¶æ“Žèµ·å°æ‰‹ä¾†ï¼Œç”¨åŠ›æ‹”ä»–æ•£äº‚è‘—çš„ä¸€ç¶¹é ­é«®ï¼Œé€™æ˜¯å¾žä¾†æ²’æœ‰çš„èˆ‰å‹•ï¼Œå–®å››å«‚å­æ€•得發怔。 +å¤ªé™½æ—©å‡ºäº†ã€‚å–®å››å«‚å­æŠ±äº†å­©å­ï¼Œå¸¶è‘—藥包,越走覺得越é‡ï¼›å­©å­åˆä¸ä½çš„æŽ™æ‰Žï¼Œè·¯ä¹Ÿè¦ºå¾—越長。沒奈何å在路æ—一家公館的門檻上,休æ¯äº†ä¸€æœƒï¼Œè¡£æœæ¼¸æ¼¸çš„冰著肌膚,æ‰çŸ¥é“自己出了一身汗;寶兒å»ä»¿ä½›ç¡è‘—了。他å†èµ·ä¾†æ…¢æ…¢åœ°èµ°ï¼Œä»ç„¶æ”¯æ’ä¸å¾—,耳朵邊忽然è½å¾—人說: +「單四嫂å­ï¼Œæˆ‘替你抱勃羅ï¼ã€ä¼¼ä¹Žæ˜¯è—皮阿五的è²éŸ³ã€‚ +他抬頭看時,正是è—皮阿五,ç¡çœ¼æœ¦æœ§çš„跟著他走。 +單四嫂å­åœ¨é€™æ™‚候,雖然很希望é™ä¸‹ä¸€å“¡å¤©å°‡ï¼ŒåŠ©ä»–ä¸€è‡‚ä¹‹åŠ›ï¼Œå»ä¸é¡˜æ˜¯é˜¿äº”。但阿五有些俠氣,無論如何,總是åè¦å¹«å¿™ï¼Œæ‰€ä»¥æŽ¨è®“了一會,終於得了許å¯äº†ã€‚他便伸開臂膊,從單四嫂å­çš„乳房和孩å­ä¹‹é–“,直伸下去,抱去了孩å­ã€‚單四嫂å­ä¾¿è¦ºä¹³æˆ¿ä¸Šç™¼äº†ä¸€æ¢ç†±ï¼Œå‰Žæ™‚間直熱到臉上和耳根。 +他們兩人離開了二尺五寸多地,一åŒèµ°è‘—。阿五說些話,單四嫂å­å»å¤§åŠæ²’有答。走了ä¸å¤šæ™‚候,阿五åˆå°‡å­©å­é‚„給他,說是昨天與朋å‹ç´„定的åƒé£¯æ™‚候到了;單四嫂å­ä¾¿æŽ¥äº†å­©å­ã€‚幸而ä¸é ä¾¿æ˜¯å®¶ï¼Œæ—©çœ‹è¦‹å°é–€çš„王ä¹åª½åœ¨è¡—邊å著,é é åœ°èªªè©±ï¼š +「單四嫂å­ï¼Œå­©å­æ€Žäº†ï¼Ÿâ€”—看éŽå…ˆç”Ÿäº†éº½ï¼Ÿã€ã€Œçœ‹æ˜¯çœ‹äº†ã€‚——王ä¹åª½ï¼Œä½ æœ‰å¹´ç´€ï¼Œè¦‹çš„多,ä¸å¦‚è«‹ä½ è€æ³•眼看一看,怎樣……ã€ã€Œå””……ã€ã€Œæ€Žæ¨£â€¦â€¦ï¼Ÿã€ã€Œå””……ã€çŽ‹ä¹åª½ç«¯è©³äº†ä¸€ç•ªï¼ŒæŠŠé ­é»žäº†å…©é»žï¼Œæ–了兩æ–。 +寶兒åƒä¸‹è—¥ï¼Œå·²ç¶“是åˆå¾Œäº†ã€‚單四嫂å­ç•™å¿ƒçœ‹ä»–神情,似乎仿佛平穩了ä¸å°‘;到得下åˆï¼Œå¿½ç„¶çœé–‹çœ¼å«ä¸€è²ã€Œåª½ï¼ã€åˆä»ç„¶åˆä¸Šçœ¼ï¼Œåƒæ˜¯ç¡åŽ»äº†ã€‚ä»–ç¡äº†ä¸€åˆ»ï¼Œé¡ä¸Šé¼»å°–都æ²å‡ºä¸€ç²’一粒的汗ç ï¼Œå–®å››å«‚å­è¼•輕一摸,膠水般粘著手;慌忙去摸胸å£ï¼Œä¾¿ç¦ä¸ä½å—šå’½èµ·ä¾†ã€‚ +寶兒的呼å¸å¾žå¹³ç©©åˆ°æ²’有,單四嫂å­çš„è²éŸ³ä¹Ÿå°±å¾žå—šå’½è®Šæˆè™Ÿå••。這時èšé›†äº†å¹¾å †äººï¼šé–€å…§æ˜¯çŽ‹ä¹åª½è—çš®é˜¿äº”ä¹‹é¡žï¼Œé–€å¤–æ˜¯å’¸äº¨çš„æŽŒæŸœå’Œç´…é¼»è€æ‹±ä¹‹é¡žã€‚王ä¹åª½ä¾¿ç™¼å‘½ä»¤ï¼Œç‡’了一串紙錢;åˆå°‡å…©æ¢æ¿å‡³å’Œäº”ä»¶è¡£æœä½œæŠµï¼Œæ›¿å–®å››å«‚å­å€Ÿäº†å…©å¡Šæ´‹éŒ¢ï¼Œçµ¦å¹«å¿™çš„人備飯。 +第一個å•題是棺木。單四嫂å­é‚„有一副銀耳環和一支裹金的銀簪,都交給了咸亨的掌柜,托他作一個ä¿ï¼ŒåŠç¾åŠè³’的買一具棺木。è—皮阿五也伸出手來,很願æ„自告奮勇;王ä¹åª½å»ä¸è¨±ä»–,åªå‡†ä»–明天抬棺æçš„差使,阿五罵了一è²ã€Œè€ç•œç”Ÿã€ï¼Œæ€æ€çš„努了嘴站著。掌柜便自去了;晚上回來,說棺木須得ç¾åšï¼Œå¾ŒåŠå¤œæ‰æˆåŠŸã€‚ +掌柜回來的時候,幫忙的人早åƒéŽé£¯ï¼›å› ç‚ºé­¯éŽ®é‚„æœ‰äº›å¤é¢¨ï¼Œæ‰€ä»¥ä¸ä¸Šä¸€æ›´ï¼Œä¾¿éƒ½å›žå®¶ç¡è¦ºäº†ã€‚åªæœ‰é˜¿äº”é‚„é è‘—咸亨的櫃臺å–é…’ï¼Œè€æ‹±ä¹Ÿå—šå—šçš„唱。 +這時候,單四嫂å­å在床沿上哭著,寶兒在床上躺著,紡車éœéœçš„在地上立著。許多工夫,單四嫂å­çš„眼淚宣告完çµäº†ï¼Œçœ¼ç›å¼µå¾—很大,看看四é¢çš„æƒ…å½¢ï¼Œè¦ºå¾—å¥‡æ€ªï¼šæ‰€æœ‰çš„éƒ½æ˜¯ä¸æœƒæœ‰çš„事。他心è£è¨ˆç®—:ä¸éŽæ˜¯å¤¢ç½·äº†ï¼Œé€™äº›äº‹éƒ½æ˜¯å¤¢ã€‚明天醒éŽä¾†ï¼Œè‡ªå·±å¥½å¥½çš„ç¡åœ¨åºŠä¸Šï¼Œå¯¶å…’也好好的ç¡åœ¨è‡ªå·±èº«é‚Šã€‚他也醒éŽä¾†ï¼Œå«ä¸€è²ã€Œåª½ã€ï¼Œç”Ÿé¾æ´»è™Žä¼¼çš„跳去玩了。 +è€æ‹±çš„æ­Œè²æ—©ç¶“寂éœï¼Œå’¸äº¨ä¹Ÿç†„了燈。單四嫂å­å¼µè‘—眼,總ä¸ä¿¡æ‰€æœ‰çš„事。——雞也å«äº†ï¼›æ±æ–¹æ¼¸æ¼¸ç™¼ç™½ï¼Œçª—縫è£é€é€²äº†éŠ€ç™½è‰²çš„æ›™å…‰ã€‚ +éŠ€ç™½çš„æ›™å…‰åˆæ¼¸æ¼¸é¡¯å‡ºç·‹ç´…,太陽光接著照到屋脊。單四嫂å­å¼µè‘—眼,呆呆åè‘—ï¼›è½å¾—打門è²éŸ³ï¼Œæ‰åƒäº†ä¸€åš‡ï¼Œè·‘出去開門。門外一個ä¸èªè­˜çš„人,背了一件æ±è¥¿ï¼›å¾Œé¢ç«™è‘—王ä¹åª½ã€‚ +哦,他們背了棺æä¾†äº†ã€‚ +下åŠå¤©ï¼Œæ£ºæœ¨æ‰åˆä¸Šè“‹ï¼šå› ç‚ºå–®å››å«‚å­å“­ä¸€å›žï¼Œçœ‹ä¸€å›žï¼Œç¸½ä¸è‚¯æ­»å¿ƒå¡Œåœ°çš„蓋上;幸虧王ä¹åª½ç­‰å¾—ä¸è€ç…©ï¼Œæ°£æ†¤æ†¤çš„跑上å‰ï¼Œä¸€æŠŠæ‹–開他,æ‰ä¸ƒæ‰‹å…«è…³çš„蓋上了。 +但單四嫂å­å¾…ä»–çš„å¯¶å…’ï¼Œå¯¦åœ¨å·²ç¶“ç›¡äº†å¿ƒï¼Œå†æ²’有什麼缺陷。昨天燒éŽä¸€ä¸²ç´™éŒ¢ï¼Œä¸Šåˆåˆç‡’了四å乿²ã€Šå¤§æ‚²å’’》;收斂的時候,給他穿上頂新的衣裳,平日喜歡的玩æ„å…’ï¼Œâ€”â€”ä¸€å€‹æ³¥äººï¼Œå…©å€‹å°æœ¨ç¢—,兩個玻璃瓶,——都放在枕頭æ—邊。後來王ä¹åª½æŽè‘—指頭å­ç´°æŽ¨æ•²ï¼Œä¹Ÿçµ‚於想ä¸å‡ºä¸€äº›ä»€éº¼ç¼ºé™·ã€‚ +這日里,è—皮阿五簡直整天沒有到;咸亨掌柜便替單四嫂å­é›‡äº†å…©å腳夫,æ¯å二百å¦å個大錢,抬棺木到義冢地上安放。王ä¹åª½åˆå¹«ä»–ç…®äº†é£¯ï¼Œå‡¡æ˜¯å‹•éŽæ‰‹é–‹éŽå£çš„人都åƒäº†é£¯ã€‚太陽漸漸顯出è¦è½å±±çš„é¡è‰²ï¼›åƒéŽé£¯çš„人也ä¸è¦ºéƒ½é¡¯å‡ºè¦å›žå®¶çš„é¡è‰²ï¼Œâ€”—於是他們終於都回了家。 +單四嫂å­å¾ˆè¦ºå¾—頭眩,歇æ¯äº†ä¸€æœƒï¼Œå€’居然有點平穩了。但他接連著便覺得很異樣:é‡åˆ°äº†å¹³ç”Ÿæ²’有é‡åˆ°éŽçš„事,ä¸åƒæœƒæœ‰çš„事,然而的確出ç¾äº†ã€‚ä»–è¶Šæƒ³è¶Šå¥‡ï¼Œåˆæ„Ÿåˆ°ä¸€ä»¶ç•°æ¨£çš„事——這屋å­å¿½ç„¶å¤ªéœäº†ã€‚ +他站起身,點上燈ç«ï¼Œå±‹å­è¶Šé¡¯å¾—éœã€‚ä»–æ˜æ˜çš„走去關上門,回來å在床沿上,紡車éœéœçš„立在地上。他定一定神,四é¢ä¸€çœ‹ï¼Œæ›´è¦ºå¾—åç«‹ä¸å¾—,屋å­ä¸ä½†å¤ªéœï¼Œè€Œä¸”也太大了,æ±è¥¿ä¹Ÿå¤ªç©ºäº†ã€‚太大的屋å­å››éºµåŒ…åœè‘—他,太空的æ±è¥¿å››é¢å£“著他,å«ä»–喘氣ä¸å¾—。 +ä»–ç¾åœ¨çŸ¥é“他的寶兒確乎死了;ä¸é¡˜æ„見這屋å­ï¼Œå¹ç†„了燈,躺著。他一é¢å“­ï¼Œä¸€é¢æƒ³ï¼šæƒ³é‚£æ™‚候,自己紡著棉紗,寶兒å在身邊åƒèŒ´é¦™è±†ï¼Œçžªè‘—一雙å°é»‘çœ¼ç›æƒ³äº†ä¸€åˆ»ï¼Œä¾¿èªªï¼Œã€Œåª½ï¼çˆ¹è³£é¤›é£©ï¼Œæˆ‘大了也賣餛飩,賣許多許多錢,——我都給你。ã€é‚£æ™‚å€™ï¼ŒçœŸæ˜¯é€£ç´¡å‡ºçš„æ£‰ç´—ï¼Œä¹Ÿä»¿ä½›å¯¸å¯¸éƒ½æœ‰æ„æ€ï¼Œå¯¸å¯¸éƒ½æ´»è‘—。但ç¾åœ¨æ€Žéº¼äº†ï¼Ÿç¾åœ¨çš„事,單四嫂å­å»å¯¦åœ¨æ²’有想到什麼。——我早經說éŽï¼šä»–是粗笨女人。他能想出什麼呢?他單覺得這屋å­å¤ªéœï¼Œå¤ªå¤§ï¼Œå¤ªç©ºç½·äº†ã€‚ +但單四嫂å­é›–然粗笨,å»çŸ¥é“還魂是ä¸èƒ½æœ‰çš„事,他的寶兒也的確ä¸èƒ½å†è¦‹äº†ã€‚å˜†ä¸€å£æ°£ï¼Œè‡ªè¨€è‡ªèªžçš„說,「寶兒,你該還在這è£ï¼Œä½ çµ¦æˆ‘夢è£è¦‹è¦‹ç½·ã€‚ã€æ–¼æ˜¯åˆä¸Šçœ¼ï¼Œæƒ³è¶•å¿«ç¡åŽ»ï¼Œæœƒä»–çš„å¯¶å…’ï¼Œè‹¦è‹¦çš„å‘¼å¸é€šéŽäº†éœå’Œå¤§å’Œç©ºè™›ï¼Œè‡ªå·±è½å¾—明白。 +單四嫂å­çµ‚於朦朦朧朧的走入ç¡é„‰ï¼Œå…¨å±‹å­éƒ½å¾ˆéœã€‚這時紅鼻å­è€æ‹±çš„å°æ›²ï¼Œä¹Ÿæ—©ç¶“唱完;蹌蹌踉踉出了咸亨,å»åˆæå°–了喉嚨,唱é“: +「我的冤家呀ï¼â€”â€”å¯æ†ä½ ï¼Œâ€”—孤å¦å¦çš„……〠+è—皮阿五便伸手æªä½äº†è€æ‹±çš„肩頭,兩個人七歪八斜的笑著擠著走去。 +單四嫂孿—©ç¡è‘—äº†ï¼Œè€æ‹±å€‘也走了,咸亨也關上門了。這時的魯鎮,便完全è½åœ¨å¯‚éœé‡Œã€‚åªæœ‰é‚£æš—å¤œç‚ºæƒ³è®Šæˆæ˜Žå¤©ï¼Œå»ä»åœ¨é€™å¯‚éœé‡Œå¥”æ³¢ï¼›å¦æœ‰å¹¾æ¢ç‹—,也躲在暗地è£å—šå—šçš„å«ã€‚ +陳士æˆçœ‹éŽç¸£è€ƒçš„æ¦œã€å›žåˆ°å®¶è£çš„æ™‚候,已經是下åˆäº†ã€‚他去得本很早,一見榜,便先在這上é¢å°‹é™³å­—。陳字也ä¸å°‘,似乎也都爭先æå¾Œçš„跳進他眼ç›è£ä¾†ï¼Œç„¶è€ŒæŽ¥è‘—çš„å»å…¨ä¸æ˜¯å£«æˆé€™å…©å€‹å­—ã€‚ä»–æ–¼æ˜¯é‡æ–°å†åœ¨å二張榜的圓圖è£ç´°ç´°åœ°æœå°‹ï¼Œçœ‹çš„人全已散盡了,而陳士æˆåœ¨æ¦œä¸Šçµ‚於沒有見,單站在試院的照å£çš„é¢å‰ã€‚ +涼風雖然拂拂的å¹å‹•他斑白的短髮,åˆå†¬çš„太陽å»é‚„是很溫和的來曬他。但他似乎被太陽曬得頭暈了,臉色越加變æˆç°ç™½ï¼Œå¾žå‹žä¹çš„紅腫的兩眼è£ï¼Œç™¼å‡ºå¤æ€ªçš„閃光。這時他其實早已ä¸çœ‹åˆ°ä»€éº¼ç‰†ä¸Šçš„æ¦œæ–‡äº†ï¼Œåªè¦‹æœ‰è¨±å¤šçƒé»‘çš„åœ“åœˆï¼Œåœ¨çœ¼å‰æ³›æ³›çš„éŠèµ°ã€‚ +雋了秀æ‰ï¼Œä¸ŠçœåŽ»é„‰è©¦ï¼Œä¸€å¾‘è¯æ·ä¸ŠåŽ»ï¼Œâ€¦â€¦ç´³å£«å€‘æ—¢ç„¶åƒæ–¹ç™¾è¨ˆçš„來攀親,人們åˆéƒ½åƒçœ‹è¦‹ç¥žæ˜Žä¼¼çš„æ•¬ç•,深悔先å‰çš„輕薄,發æ˜ï¼Œâ€¦â€¦è¶•走了租ä½åœ¨è‡ªå·±ç ´å®…é–€è£çš„雜姓——那是ä¸å‹žèªªè¶•,自己就æ¬çš„ï¼Œâ€”â€”å±‹å®‡å…¨æ–°äº†ï¼Œé–€å£æ˜¯æ——ç«¿å’Œæ‰é¡ï¼Œâ€¦â€¦è¦æ¸…高å¯ä»¥åšäº¬å®˜ï¼Œå¦å‰‡ä¸å¦‚謀外放。……他平日安排åœç•¶çš„å‰ç¨‹ï¼Œé€™æ™‚候åˆåƒå—潮的糖塔一般,剎時倒塌,åªå‰©ä¸‹ä¸€å †ç¢Žç‰‡äº†ã€‚ä»–ä¸è‡ªè¦ºçš„æ—‹è½‰äº†è¦ºå¾—æ¸™æ•£äº†èº«è»€ï¼Œæƒ˜æƒ˜çš„èµ°å‘æ­¸å®¶çš„路。 +他剛到自己的房門å£ï¼Œä¸ƒå€‹å­¸ç«¥ä¾¿ä¸€é½Šæ”¾é–‹å–‰åš¨ï¼Œå±çš„念起書來。他大åƒä¸€é©šï¼Œè€³æœµé‚Šä¼¼ä¹Žæ•²äº†ä¸€è²ç£¬ï¼Œåªè¦‹ä¸ƒå€‹é ­æ‹–了å°è¾®å­åœ¨çœ¼å‰å¹Œï¼Œå¹Œå¾—滿房,黑圈å­ä¹Ÿå¤¾è‘—跳舞。他å下了,他們é€ä¸Šæ™šèª²ä¾†ï¼Œè‡‰ä¸Šéƒ½é¡¯å‡ºå°è¦·ä»–的神色。 +「回去罷。ã€ä»–é²ç–‘äº†ç‰‡æ™‚ï¼Œé€™æ‰æ‚²æ…˜çš„說。 +他們胡亂的包了書包,挾著,一溜煙跑走了。 +陳士æˆé‚„看見許多å°é ­å¤¾è‘—黑圓圈在眼å‰è·³èˆžï¼Œæœ‰æ™‚雜亂,有時也擺æˆç•°æ¨£çš„陣圖,然而漸漸的減少了,模胡了。 +「這回åˆå®Œäº†ï¼ã€ +他大åƒä¸€é©šï¼Œç›´è·³èµ·ä¾†ï¼Œåˆ†æ˜Žå°±åœ¨è€³é‚Šçš„話,回éŽé ­åŽ»å»ä¸¦æ²’有什麼人,仿佛åˆè½å¾—嗡的敲了一è²ç£¬ï¼Œè‡ªå·±çš„嘴也說é“: +「這回åˆå®Œäº†ï¼ã€ +他忽而舉起一隻手來,屈指計數著想,å一,å三回,連今年是å六回,竟沒有一個考官懂得文章,有眼無ç ï¼Œä¹Ÿæ˜¯å¯æ†çš„事,便ä¸ç”±å˜»å˜»çš„失了笑。然而他憤然了,驀地從書包布底下抽出謄真的制è—和試帖來,拿著往外走,剛近房門,å»çœ‹è¦‹æ»¿çœ¼éƒ½æ˜Žäº®ï¼Œé€£ä¸€ç¾¤é›žä¹Ÿæ­£åœ¨ç¬‘他,便ç¦ä¸ä½å¿ƒé ­çªçªçš„狂跳,åªå¥½ç¸®å›žè£é¢äº†ã€‚ +ä»–åˆå°±äº†å,眼格外的閃çˆï¼›ä»–ç›®ç¹è‘—許多æ±è¥¿ï¼Œç„¶è€Œå¾ˆæ¨¡èƒ¡ï¼Œâ€”—是倒塌了的糖塔一般的å‰ç¨‹èººåœ¨ä»–é¢å‰ï¼Œé€™å‰ç¨‹åˆåªæ˜¯å»£å¤§èµ·ä¾†ï¼Œé˜»ä½äº†ä»–的一切路。 +別家的炊煙早消歇了,碗筷也洗éŽäº†ï¼Œè€Œé™³å£«æˆé‚„ä¸åŽ»åšé£¯ã€‚寓在這è£çš„雜姓是知é“è€ä¾‹çš„,凡é‡åˆ°ç¸£è€ƒçš„年頭,看見發榜後的這樣的眼光,ä¸å¦‚åŠæ—©é—œäº†é–€ï¼Œä¸è¦å¤šç®¡äº‹ã€‚最先就絕了人è²ï¼ŒæŽ¥è‘—是陸續的熄了燈ç«ï¼Œç¨æœ‰æœˆäº®ï¼Œå»ç·©ç·©çš„出ç¾åœ¨å¯’夜的空中。 +空中é’碧到如一片海,略有些浮雲,仿佛有誰將粉筆洗在筆洗è£ä¼¼çš„æ–æ›³ã€‚æœˆäº®å°è‘—陳士æˆè¨»ä¸‹å¯’冷的光波來,當åˆä¹Ÿä¸éŽåƒæ˜¯ä¸€é¢æ–°ç£¨çš„éµé¡ç½·äº†ï¼Œè€Œé€™é¡å»è©­ç§˜çš„ç…§é€äº†é™³å£«æˆçš„全身,就在他身上映出éµçš„æœˆäº®çš„影。 +他還在房外的院å­è£å¾˜å¾Šï¼Œçœ¼è£é —清éœäº†ï¼Œå››è¿‘也寂éœã€‚但這寂éœå¿½åˆç„¡ç«¯çš„紛擾起來,他耳邊åˆç¢ºé‘¿è½åˆ°æ€¥ä¿ƒçš„低è²èªªï¼š +「左彎å³å½Žâ€¦â€¦ã€ +ä»–è³ç„¶äº†ï¼Œå‚¾è€³è½æ™‚,那è²éŸ³å»åˆæé«˜çš„複述é“:「å³å½Žï¼ã€ +他記得了。這院å­ï¼Œæ˜¯ä»–家還未如此雕零的時候,一到å¤å¤©çš„夜間,夜夜和他的祖æ¯åœ¨æ­¤ç´æ¶¼çš„院å­ã€‚那時他ä¸éŽå歲有零的孩å­ï¼Œèººåœ¨ç«¹æ¦»ä¸Šï¼Œç¥–æ¯ä¾¿å在榻æ—邊,講給他有趣的故事è½ã€‚伊說是曾經è½å¾—伊的祖æ¯èªªï¼Œé™³æ°çš„祖宗是巨富的,這屋å­ä¾¿æ˜¯ç¥–基,祖宗埋著無數的銀å­ï¼Œæœ‰ç¦æ°£çš„å­å­«ä¸€å®šæœƒå¾—到的罷,然而至今還沒有ç¾ã€‚至於處所,那是è—在一個謎語的中間: +「左彎å³å½Žï¼Œå‰èµ°å¾Œèµ°ï¼Œé‡é‡‘é‡éŠ€ä¸è«–斗。〠+å°æ–¼é€™è¬Žèªžï¼Œé™³å£«æˆä¾¿åœ¨å¹³æ™‚,本也常常暗地è£åŠ ä»¥æ£æ¸¬çš„ï¼Œå¯æƒœå¤§æŠµå‰›ä»¥ç‚ºå¯ä»¥é€šï¼Œå»åˆç«‹åˆ»è¦ºå¾—ä¸åˆäº†ã€‚有一回,他確有把æ¡ï¼ŒçŸ¥é“這是在租給å”家的房底下的了,然而總沒有å‰åŽ»ç™¼æŽ˜çš„å‹‡æ°£ï¼›éŽäº†å¹¾æ™‚,å¯åˆè¦ºå¾—太ä¸ç›¸åƒäº†ã€‚至於他自己房å­è£çš„幾個掘éŽçš„舊痕跡,那å»å…¨æ˜¯å…ˆå‰å¹¾å›žä¸‹ç¬¬ä»¥å¾Œçš„發了怔忡的舉動,後來自己一看到,也還感到慚愧而且羞人。 +但今天éµçš„光罩ä½äº†é™³å£«æˆï¼Œåˆè»Ÿè»Ÿçš„來勸他了,他或者å¶ä¸€é²ç–‘,便給他正經的證明,åˆåŠ ä¸Šé™°æ£®çš„æ‘§é€¼ï¼Œä½¿ä»–ä¸å¾—ä¸åˆå‘自己的房è£è½‰éŽçœ¼å…‰åŽ»ã€‚ +ç™½å…‰å¦‚ä¸€æŸ„ç™½åœ˜æ‰‡ï¼Œæ–æ–擺擺的閃起在他房è£äº†ã€‚ +「也終於在這è£ï¼ã€ +他說著,ç…å­ä¼¼çš„趕快走進那房è£åŽ»ï¼Œä½†è·¨é€²è£é¢çš„æ™‚候,便ä¸è¦‹äº†ç™½å…‰çš„å½±è¹¤ï¼Œåªæœ‰èŽ½è’¼è’¼çš„ä¸€é–“èˆŠæˆ¿ï¼Œå’Œå¹¾å€‹ç ´æ›¸æ¡Œéƒ½æ²’åœ¨æ˜æš—è£ã€‚他爽然的站著,慢慢的å†å®šç›ï¼Œç„¶è€Œç™½å…‰å»åˆ†æ˜Žçš„åˆèµ·ä¾†äº†ï¼Œé€™å›žæ›´å»£å¤§ï¼Œæ¯”ç¡«é»ƒç«æ›´ç™½å‡ˆï¼Œæ¯”æœéœ§æ›´éœå¾®ï¼Œè€Œä¸”ä¾¿åœ¨é æ±ç‰†çš„一張書桌下。 +陳士æˆç…å­ä¼¼çš„奔到門後邊,伸手去摸鋤頭,撞著一æ¢é»‘影。他ä¸çŸ¥æ€Žçš„æœ‰äº›æ€•了,張惶的點了燈,看鋤頭無éžå€šè‘—。他移開桌å­ï¼Œç”¨é‹¤é ­ä¸€æ°£æŽ˜èµ·å››å¡Šå¤§æ–¹ç£šï¼Œè¹²èº«ä¸€çœ‹ï¼Œç…§ä¾‹æ˜¯é»ƒæ¾„澄的細沙,æŽäº†è¢–爬開細沙,便露出下é¢çš„黑土來。他極å°å¿ƒçš„,幽éœçš„,一鋤一鋤往下掘,然而深夜究竟太寂éœäº†ï¼Œå°–éµè§¸åœŸçš„è²éŸ³ï¼Œç¸½æ˜¯éˆé‡çš„ä¸è‚¯çžžäººçš„發響。 +åœŸå‘æ·±åˆ°äºŒå°ºå¤šäº†ï¼Œä¸¦ä¸è¦‹æœ‰ç”•å£ï¼Œé™³å£«æˆæ­£å¿ƒç„¦ï¼Œä¸€è²è„†éŸ¿ï¼Œé —震得手腕痛,鋤尖碰到什麼堅硬的æ±è¥¿äº†ï¼›ä»–急忙拋下鋤頭,摸索著看時,一塊大方磚在下麵。他的心抖得很利害,èšç²¾æœƒç¥žçš„æŒ–起那方磚來,下麵也滿是先å‰ä¸€æ¨£çš„黑土,爬鬆了許多土,下麵似乎還無窮。但忽而åˆè§¸è‘—å …ç¡¬çš„å°æ±è¥¿äº†ï¼Œåœ“的,大約是一個銹銅錢;此外也還有幾片破碎的ç£ç‰‡ã€‚ +陳士æˆå¿ƒè£ä»¿ä½›è¦ºå¾—ç©ºè™›äº†ï¼Œæ¸¾èº«æµæ±—,急èºçš„åªçˆ¬æ”;這其間,心在空中一抖動,åˆè§¸è‘—ä¸€ç¨®å¤æ€ªçš„å°æ±è¥¿äº†ï¼Œé€™ä¼¼ä¹Žç´„略有些馬掌形的,但觸手很鬆脆。他åˆèšç²¾æœƒç¥žçš„æŒ–èµ·é‚£æ±è¥¿ä¾†ï¼Œè¬¹æ…Žçš„æ’®è‘—,就燈光下仔細看時,那æ±è¥¿æ–‘æ–‘å‰å‰çš„åƒæ˜¯çˆ›éª¨é ­ï¼Œä¸Šé¢é‚„帶著一排零è½ä¸å…¨çš„牙齒。他已經誤到這許是下巴骨了,而那下巴骨也便在他手è£ç´¢ç´¢çš„動彈起來,而且笑åŸåŸçš„顯出笑影,終於è½å¾—ä»–é–‹å£é“: +「這回åˆå®Œäº†ï¼ã€ +ä»–æ…„ç„¶çš„ç™¼äº†å¤§å†·ï¼ŒåŒæ™‚也放了手,下巴骨輕飄飄的回到å‘底è£ä¸å¤šä¹…,他也就逃到院å­è£äº†ã€‚ä»–å·çœ‹æˆ¿è£é¢ï¼Œç‡ˆç«å¦‚æ­¤è¼ç…Œï¼Œä¸‹å·´éª¨å¦‚此嘲笑,異乎尋常的怕人,便å†ä¸æ•¢å‘那邊看。他躲在é è™•的簷下的陰影è£ï¼Œè¦ºå¾—較為安全了;但在這平安中,忽而耳朵邊åˆè½å¾—竊竊的低è²èªªï¼š +ã€Œé€™è£æ²’有……到山è£åŽ»â€¦â€¦ã€ +陳士æˆä¼¼ä¹Žè¨˜å¾—白天在街上也曾è½å¾—有人說這種話,他ä¸å¾…å†è½å®Œï¼Œå·²ç¶“æç„¶å¤§æ‚Ÿäº†ã€‚ä»–çªç„¶ä»°é¢å‘天,月亮已å‘西高峰這方é¢éš±åŽ»ï¼Œé æƒ³é›¢åŸŽä¸‰å五里的西高峰正在眼å‰ï¼Œæœç¬ä¸€èˆ¬é»‘魆魆的挺立著,周åœä¾¿æ”¾å‡ºæµ©å¤§é–ƒçˆçš„白光來。 +而且這白光åˆé é çš„就在å‰é¢äº†ã€‚ +「是的,到山è£åŽ»ï¼ã€ +他決定的想,慘然的奔出去了。幾回的開門之後,門è£é¢ä¾¿å†ä¸èžä¸€äº›è²æ¯ã€‚燈ç«çµäº†å¤§ç‡ˆèŠ±ç…§è‘—ç©ºå±‹å’Œå‘æ´žï¼Œç•¢ç•¢å‰å‰çš„炸了幾è²ä¹‹å¾Œï¼Œä¾¿æ¼¸æ¼¸çš„縮å°ä»¥è‡³æ–¼ç„¡æœ‰ï¼Œé‚£æ˜¯æ®˜æ²¹å·²ç¶“燒盡了。 +「開城門來~~〠+å«è‘—å¤§å¸Œæœ›çš„ææ€–的悲è²ï¼ŒéŠçµ²ä¼¼çš„在西關門å‰çš„黎明中,戰戰兢兢的å«å–Šã€‚ +第二天的日中,有人在離西門åäº”é‡Œçš„è¬æµæ¹–è£çœ‹è¦‹ä¸€å€‹æµ®å±ï¼Œç•¶å³å‚³æšé–‹åŽ»ï¼Œçµ‚æ–¼å‚³åˆ°åœ°ä¿çš„耳朵è£äº†ï¼Œä¾¿å«é„‰ä¸‹äººæ’ˆå°‡ä¸Šä¾†ã€‚那是一個男å±ï¼Œäº”å多歲,「身中é¢ç™½ç„¡é¬šã€ï¼Œæ¸¾èº«ä¹Ÿæ²’有什麼衣褲。或者說這就是陳士æˆã€‚但鄰居懶得去看,也並無å±è¦ªèªé ˜ï¼Œæ–¼æ˜¯ç¶“縣委員相驗之後,便由地ä¿åŸ‹äº†ã€‚至於死因,那當然是沒有å•題的,å‰å–æ­»å±çš„è¡£æœæœ¬ä¾†æ˜¯å¸¸æœ‰çš„事,夠ä¸ä¸Šç–‘心到謀害去:而且仵作也證明是生å‰çš„è½æ°´ï¼Œå› ç‚ºä»–ç¢ºé‘¿æ›¾åœ¨æ°´åº•è£æŽ™å‘½ï¼Œæ‰€ä»¥å個指甲è£éƒ½æ»¿åµŒè‘—河底泥。 +有鬼似的。 +然而è¦åšé€™ä¸€ç¯‡é€Ÿæœ½çš„æ–‡ç« ï¼Œçº”下筆,便感到è¬åˆ†çš„困難了。第一是文章的åç›®ã€‚å­”å­æ›°ï¼Œâ€œå䏿­£å‰‡è¨€ä¸é †â€ã€‚這原是應該極註æ„的。傳的å目很ç¹å¤šï¼šåˆ—傳,自傳,內傳,外傳,別傳,家傳,å°å‚³â€¦â€¦ï¼Œè€Œå¯æƒœéƒ½ä¸åˆã€‚“列傳â€éº½ï¼Œé€™ä¸€ç¯‡ä¸¦éžå’Œè¨±å¤šé—ŠäººæŽ’在“正å²â€è£ï¼›â€œè‡ªå‚³â€éº½ï¼Œæˆ‘åˆä¸¦éžå°±æ˜¯é˜¿Q。說是“外傳â€ï¼Œâ€œå…§å‚³â€åœ¨é‚£è£å‘¢ï¼Ÿå€˜ç”¨â€œå…§å‚³â€ï¼Œé˜¿Qåˆæ±ºä¸æ˜¯ç¥žä»™ã€‚“別傳â€å‘¢ï¼Œé˜¿Q實在未曾有大總統上諭宣付國å²é¤¨ç«‹â€œæœ¬å‚³â€â€”—雖說英國正å²ä¸Šä¸¦ç„¡â€œåšå¾’列傳â€ï¼Œè€Œæ–‡è±ªè¿­æ›´å¸ä¹ŸåšéŽã€Šåšå¾’別傳》這一部書,但文豪則å¯ï¼Œåœ¨æˆ‘輩å»ä¸å¯ã€‚其次是“家傳â€ï¼Œå‰‡æˆ‘æ—¢ä¸çŸ¥èˆ‡é˜¿Q是å¦åŒå®—,也未曾å—ä»–å­å­«çš„æ‹œè¨—;或“å°å‚³â€ï¼Œå‰‡é˜¿Qåˆæ›´ç„¡åˆ¥çš„“大傳â€äº†ã€‚總而言之,這一篇也便是“本傳â€ï¼Œä½†å¾žæˆ‘的文章著想,因為文體å‘下,是“引車賣漿者æµâ€æ‰€ç”¨çš„è©±ï¼Œæ‰€ä»¥ä¸æ•¢åƒ­ç¨±ï¼Œä¾¿å¾žä¸å…¥ä¸‰æ•™ä¹æµçš„å°èªªå®¶æ‰€è¬‚“閑話休題言歸正傳â€é€™ä¸€å¥å¥—話è£ï¼Œå–出“正傳â€å…©å€‹å­—來,作為å目,å³ä½¿èˆ‡å¤äººæ‰€æ’°ã€Šæ›¸æ³•正傳》的“正傳â€å­—é¢ä¸Šå¾ˆç›¸æ··ï¼Œä¹Ÿé¡§ä¸å¾—了。 +第二,立傳的通例,開首大抵該是“æŸï¼Œå­—æŸï¼ŒæŸåœ°äººä¹Ÿâ€ï¼Œè€Œæˆ‘並ä¸çŸ¥é“阿Q姓什麼。有一回,他似乎是姓趙,但第二日便模糊了。那是趙太爺的兒å­é€²äº†ç§€æ‰çš„æ™‚候,鑼è²éœéœçš„報到æ‘è£ä¾†ï¼Œé˜¿Qæ­£å–了兩碗黃酒,便手舞足蹈的說,這於他也很光采,因為他和趙太爺原來是本家,細細的排起來他還比秀æ‰é•·ä¸‰è¼©å‘¢ã€‚其時幾個æ—è½äººå€’也肅然的有些起敬了。那知é“第二天,地ä¿ä¾¿å«é˜¿Q到趙太爺家è£åŽ»ï¼›å¤ªçˆºä¸€è¦‹ï¼Œæ»¿è‡‰æ¿ºæœ±ï¼Œå–é“: +“阿Q,你這渾å°å­ï¼ä½ èªªæˆ‘是你的本家麽?â€é˜¿Qä¸é–‹å£ã€‚趙太爺愈看愈生氣了,æ¶é€²å¹¾æ­¥èªªï¼šâ€œä½ æ•¢èƒ¡èªªï¼æˆ‘怎麼會有你這樣的本家?你姓趙麽?â€é˜¿Qä¸é–‹å£ï¼Œæƒ³å¾€å¾Œé€€äº†ï¼›è¶™å¤ªçˆºè·³éŽåŽ»ï¼Œçµ¦äº†ä»–ä¸€å€‹å˜´å·´ã€‚ +“你怎麼會姓趙ï¼â€”—你那è£é…å§“è¶™ï¼â€ +阿Q並沒有抗辯他確鑿姓趙,åªç”¨æ‰‹æ‘¸è‘—左頰,和地ä¿é€€å‡ºåŽ»äº†ï¼›å¤–é¢åˆè¢«åœ°ä¿è¨“斥了一番,è¬äº†åœ°ä¿äºŒç™¾æ–‡é…’錢。知é“的人都說阿Q太è’å”,自己去招打;他大約未必姓趙,å³ä½¿çœŸå§“趙,有趙太爺在這è£ï¼Œä¹Ÿä¸è©²å¦‚æ­¤èƒ¡èªªçš„ã€‚æ­¤å¾Œä¾¿å†æ²’有人æèµ·ä»–çš„æ°æ—來,所以我終於ä¸çŸ¥é“阿Q究竟什麼姓。 +第三,我åˆä¸çŸ¥é“阿Qçš„å字是怎麼寫的。他活著的時候,人都å«ä»–阿Quei,死了以後,便沒有一個人å†å«é˜¿Quei了,那è£é‚„會有“著之竹帛â€çš„事。若論“著之竹帛â€ï¼Œé€™ç¯‡æ–‡ç« è¦ç®—第一次,所以先é‡è‘—了這第一個難關。我曾仔細想:阿Quei,阿桂還是阿貴呢?倘使他號月亭,或者在八月間åšéŽç”Ÿæ—¥ï¼Œé‚£ä¸€å®šæ˜¯é˜¿æ¡‚äº†ï¼›è€Œä»–æ—¢æ²’æœ‰è™Ÿâ€”â€”ä¹Ÿè¨±æœ‰è™Ÿï¼Œåªæ˜¯æ²’有人知é“ä»–ï¼Œâ€”â€”åˆæœªå˜—æ•£éŽç”Ÿæ—¥å¾µæ–‡çš„帖å­ï¼šå¯«ä½œé˜¿æ¡‚,是武斷的。åˆå€˜ä½¿ä»–有一ä½è€å…„或令弟å«é˜¿å¯Œï¼Œé‚£ä¸€å®šæ˜¯é˜¿è²´äº†ï¼›è€Œä»–åˆåªæ˜¯ä¸€å€‹äººï¼šå¯«ä½œé˜¿è²´ï¼Œä¹Ÿæ²’有ä½è­‰çš„。其餘音Queiçš„å僻字樣,更加湊ä¸ä¸Šäº†ã€‚å…ˆå‰ï¼Œæˆ‘也曾å•éŽè¶™å¤ªçˆºçš„å…’å­èŒ‚æ‰å…ˆç”Ÿï¼Œèª°æ–™åšé›…如此公,竟也茫然,但據çµè«–說,是因為陳ç¨ç§€è¾¦äº†ã€Šæ–°é’年》æå€¡æ´‹å­—ï¼Œæ‰€ä»¥åœ‹ç²¹æ·ªäº¡ï¼Œç„¡å¯æŸ¥è€ƒäº†ã€‚æˆ‘çš„æœ€å¾Œçš„æ‰‹æ®µï¼Œåªæœ‰æ‰˜ä¸€å€‹åŒé„‰åŽ»æŸ¥é˜¿Q犯事的案å·ï¼Œå…«å€‹æœˆä¹‹å¾Œçº”有回信,說案å·è£ä¸¦ç„¡èˆ‡é˜¿Queiçš„è²éŸ³ç›¸è¿‘的人。我雖ä¸çŸ¥é“æ˜¯çœŸæ²’æœ‰ï¼Œé‚„æ˜¯æ²’æœ‰æŸ¥ï¼Œç„¶è€Œä¹Ÿå†æ²’有別的方法了。生怕註音字æ¯é‚„未通行,åªå¥½ç”¨äº†â€œæ´‹å­—â€ï¼Œç…§è‹±åœ‹æµè¡Œçš„æ‹¼æ³•寫他為阿Quei,略作阿Q。這近於盲從《新é’年》,自己也很抱歉,但茂æ‰å…¬å°šä¸”ä¸çŸ¥ï¼Œæˆ‘還有什麼好辦法呢。 +第四,是阿Qçš„ç±è²«äº†ã€‚倘他姓趙,則據ç¾åœ¨å¥½ç¨±éƒ¡æœ›çš„è€ä¾‹ï¼Œå¯ä»¥ç…§ã€Šéƒ¡å百家姓》上的註解,說是“隴西天水人也â€ï¼Œä½†å¯æƒœé€™å§“是ä¸ç”šå¯é çš„,因此ç±è²«ä¹Ÿå°±æœ‰äº›æ±ºä¸å®šã€‚ä»–é›–ç„¶å¤šä½æœªèŽŠï¼Œç„¶è€Œä¹Ÿå¸¸å¸¸å®¿åœ¨åˆ¥è™•ï¼Œä¸èƒ½èªªæ˜¯æœªèŽŠäººï¼Œå³ä½¿èªªæ˜¯â€œæœªèŽŠäººä¹Ÿâ€ï¼Œä¹Ÿä»ç„¶æœ‰ä¹–岿³•的。 +我所èŠä»¥è‡ªæ…°çš„,是還有一個“阿â€å­—éžå¸¸æ­£ç¢ºï¼Œçµ•無附會å‡å€Ÿçš„缺點,頗å¯ä»¥å°±æ­£æ–¼é€šäººã€‚至於其餘,å»éƒ½éžæ·ºå­¸æ‰€èƒ½ç©¿é‘¿ï¼Œåªå¸Œæœ›æœ‰â€œæ­·å²ç™–與考據癖â€çš„胡é©ä¹‹å…ˆç”Ÿçš„門人們,將來或者能夠尋出許多新端緒來,但是我這《阿Q正傳》到那時å»åˆæ€•早經消滅了。 +阿Qä¸ç¨æ˜¯å§“åç±è²«æœ‰äº›æ¸ºèŒ«ï¼Œé€£ä»–å…ˆå‰çš„“行狀â€ä¹Ÿæ¸ºèŒ«ã€‚因為未莊的人們之於阿Q,åªè¦ä»–å¹«å¿™ï¼Œåªæ‹¿ä»–玩笑,從來沒有留心他的“行狀â€çš„。而阿Q自己也ä¸èªªï¼Œç¨æœ‰å’Œåˆ¥äººå£è§’的時候,間或瞪著眼ç›é“: +“我先å‰â€”—比你闊的多啦ï¼ä½ ç®—是什麼æ±è¥¿ï¼â€ +阿Q沒有家,ä½åœ¨æœªèŽŠçš„åœŸç©€ç¥ è£ï¼›ä¹Ÿæ²’æœ‰å›ºå®šçš„è·æ¥­ï¼Œåªçµ¦äººå®¶åšçŸ­å·¥ï¼Œå‰²éº¥ä¾¿å‰²éº¥ï¼Œèˆ‚米便舂米,æ’船便æ’船。工作略長久時,他也或ä½åœ¨è‡¨æ™‚主人的家è£ï¼Œä½†ä¸€å®Œå°±èµ°äº†ã€‚所以,人們忙碌的時候,也還記起阿Q來,然而記起的是åšå·¥ï¼Œä¸¦ä¸æ˜¯â€œè¡Œç‹€â€ï¼›ä¸€é–‘空,連阿Q都早忘å»ï¼Œæ›´ä¸å¿…說“行狀â€äº†ã€‚åªæ˜¯æœ‰ä¸€å›žï¼Œæœ‰ä¸€å€‹è€é ­å­é Œæšèªªï¼šâ€œé˜¿Q真能åšï¼â€é€™æ™‚阿Q赤著膊,懶洋洋的瘦伶仃的正在他é¢å‰ï¼Œåˆ¥äººä¹Ÿæ‘¸ä¸è‘—這話是真心還是è­ç¬‘,然而阿Q很喜歡。 +阿Qåˆå¾ˆè‡ªå°Šï¼Œæ‰€æœ‰æœªèŽŠçš„å±…æ°‘ï¼Œå…¨ä¸åœ¨ä»–眼神è£ï¼Œç”šè€Œè‡³æ–¼å°æ–¼å…©ä½â€œæ–‡ç«¥â€ä¹Ÿæœ‰ä»¥ç‚ºä¸å€¼ä¸€ç¬‘çš„ç¥žæƒ…ã€‚å¤«æ–‡ç«¥è€…ï¼Œå°‡ä¾†ææ€•è¦è®Šç§€æ‰è€…也;趙太爺錢太爺大å—居民的尊敬,除有錢之外,就因為都是文童的爹爹,而阿Q在精神上ç¨ä¸è¡¨æ ¼å¤–çš„å´‡å¥‰ï¼Œä»–æƒ³ï¼šæˆ‘çš„å…’å­æœƒé—Šå¾—多啦ï¼åŠ ä»¥é€²äº†å¹¾å›žåŸŽï¼Œé˜¿Q自然更自負,然而他åˆå¾ˆé„™è–„城è£äººï¼Œè­¬å¦‚用三尺三寸寬的木æ¿åšæˆçš„凳å­ï¼ŒæœªèŽŠäººå«â€œé•·å‡³â€ï¼Œä»–也å«â€œé•·å‡³â€ï¼ŒåŸŽè£äººå»å«â€œæ¢å‡³â€ï¼Œä»–想:這是錯的,å¯ç¬‘ï¼æ²¹ç…Žå¤§é ­é­šï¼ŒæœªèŽŠéƒ½åŠ ä¸ŠåŠå¯¸é•·çš„蔥葉,城è£å»åŠ ä¸Šåˆ‡ç´°çš„è”¥çµ²ï¼Œä»–æƒ³ï¼šé€™ä¹Ÿæ˜¯éŒ¯çš„ï¼Œå¯ç¬‘ï¼ç„¶è€ŒæœªèŽŠäººçœŸæ˜¯ä¸è¦‹ä¸–é¢çš„å¯ç¬‘的鄉下人呵,他們沒有見éŽåŸŽè£çš„ç…Žé­šï¼ +阿Q“先å‰é—Šâ€ï¼Œè¦‹è­˜é«˜ï¼Œè€Œä¸”“真能åšâ€ï¼Œæœ¬ä¾†å¹¾ä¹Žæ˜¯ä¸€å€‹â€œå®Œäººâ€äº†ï¼Œä½†å¯æƒœä»–體質上還有一些缺點。最惱人的是在他頭皮上,頗有幾處ä¸çŸ¥æ–¼ä½•時的癩瘡疤。這雖然也在他身上,而看阿Qçš„æ„æ€ï¼Œå€’也似乎以為ä¸è¶³è²´çš„,因為他諱說“癩â€ä»¥åŠä¸€åˆ‡è¿‘於“賴â€çš„音,後來推而廣之,“光â€ä¹Ÿè«±ï¼Œâ€œäº®â€ä¹Ÿè«±ï¼Œå†å¾Œä¾†ï¼Œé€£â€œç‡ˆâ€â€œç‡­â€éƒ½è«±äº†ã€‚一犯諱,ä¸å•有心與無心,阿Q便全疤通紅的發起怒來,估é‡äº†å°æ‰‹ï¼Œå£è¨¥çš„他便罵,氣力å°çš„他便打;然而ä¸çŸ¥æ€Žéº¼ä¸€å›žäº‹ï¼Œç¸½é‚„是阿Qåƒè™§çš„æ™‚候多。於是他漸漸的變æ›äº†æ–¹é‡ï¼Œå¤§æŠµæ”¹ç‚ºæ€’目而視了。 +誰知é“阿Q採用怒目主義之後,未莊的閑人們便愈喜歡玩笑他。一見é¢ï¼Œä»–們便å‡ä½œåƒé©šçš„說: +“噲,亮起來了。†+阿Q照例的發了怒,他怒目而視了。 +“原來有ä¿éšªç‡ˆåœ¨é€™è£ï¼â€ä»–們䏦䏿€•。 +阿Q沒有法,åªå¾—å¦å¤–想出報複的話來: +“你還ä¸é………â€é€™æ™‚候,åˆä»¿ä½›åœ¨ä»–頭上的是一種高尚的光容的癩頭瘡,並éžå¹³å¸¸çš„癩頭瘡了;但上文說éŽï¼Œé˜¿Q是有見識的,他立刻知é“å’Œâ€œçŠ¯å¿Œâ€æœ‰é»žæŠµè§¸ï¼Œä¾¿ä¸å†å¾€åº•下說。 +閒人還ä¸å®Œï¼Œåªæ’©ä»–,於是終而至於打。阿Q在形å¼ä¸Šæ‰“敗了,被人æªä½é»ƒè¾®å­ï¼Œåœ¨å£ä¸Šç¢°äº†å››äº”個響頭,閒人這纔心滿æ„足的得å‹çš„走了,阿Qç«™äº†ä¸€åˆ»ï¼Œå¿ƒè£æƒ³ï¼Œâ€œæˆ‘ç¸½ç®—è¢«å…’å­æ‰“了,ç¾åœ¨çš„世界真ä¸åƒæ¨£â€¦â€¦â€æ–¼æ˜¯ä¹Ÿå¿ƒæ»¿æ„足的得å‹çš„走了。 +阿Q想在心è£çš„ï¼Œå¾Œä¾†æ¯æ¯èªªå‡ºå£ä¾†ï¼Œæ‰€ä»¥å‡¡æ˜¯å’Œé˜¿Q玩笑的人們,幾乎全知é“他有這一種精神上的å‹åˆ©æ³•,此後æ¯é€¢æªä½ä»–黃辮å­çš„æ™‚候,人就先一著å°ä»–說: +“阿Qï¼Œé€™ä¸æ˜¯å…’å­æ‰“è€å­ï¼Œæ˜¯äººæ‰“畜生。自己說:人打畜生ï¼â€ +阿Q兩隻手都æä½äº†è‡ªå·±çš„辮根,歪著頭,說é“: +“打蟲豸,好ä¸å¥½ï¼Ÿæˆ‘æ˜¯èŸ²è±¸â€”â€”é‚„ä¸æ”¾éº½ï¼Ÿâ€ +ä½†é›–ç„¶æ˜¯èŸ²è±¸ï¼Œé–’äººä¹Ÿä¸¦ä¸æ”¾ï¼Œä»èˆŠåœ¨å°±è¿‘什麼地方給他碰了五六個響頭,這纔心滿æ„足的得å‹çš„走了,他以為阿Q這回å¯é­äº†ç˜Ÿã€‚然而ä¸åˆ°åç§’é˜ï¼Œé˜¿Q也心滿æ„足的得å‹çš„走了,他覺得他是第一個能夠自輕自賤的人,除了“自輕自賤â€ä¸ç®—外,餘下的就是“第一個â€ã€‚狀元ä¸ä¹Ÿæ˜¯â€œç¬¬ä¸€å€‹â€éº½ï¼Ÿâ€œä½ ç®—是什麼æ±è¥¿â€å‘¢ï¼ï¼Ÿ +阿Qä»¥å¦‚æ˜¯ç­‰ç­‰å¦™æ³•å‰‹æœæ€¨æ•µä¹‹å¾Œï¼Œä¾¿æ„‰å¿«çš„跑到酒店è£å–幾碗酒,åˆå’Œåˆ¥äººèª¿ç¬‘一通,å£è§’一通,åˆå¾—了å‹ï¼Œæ„‰å¿«çš„回到土穀祠,放倒頭ç¡è‘—了。å‡ä½¿æœ‰éŒ¢ï¼Œä»–便去押牌寶,一堆人蹲在地é¢ä¸Šï¼Œé˜¿Q峿±—æµæ»¿é¢çš„夾在這中間,è²éŸ³ä»–最響: +“é’é¾å››ç™¾ï¼â€ +“咳~~開~~啦ï¼â€æ¨å®¶æ­é–‹ç›’å­è“‹ï¼Œä¹Ÿæ˜¯æ±—æµæ»¿é¢çš„唱。“天門啦~~角回啦~~ï¼äººå’Œç©¿å ‚空在那è£å•¦ï½žï½žï¼é˜¿Q的銅錢拿éŽä¾†ï½žï½žï¼ +“穿堂一百——一百五åï¼â€ +阿Q的錢便在這樣的歌åŸä¹‹ä¸‹ï¼Œæ¼¸æ¼¸çš„è¼¸å…¥åˆ¥å€‹æ±—æµæ»¿é¢çš„人物的腰間。他終於åªå¥½æ“ å‡ºå †å¤–,站在後é¢çœ‹ï¼Œæ›¿åˆ¥äººè‘—急,一直到散場,然後戀戀的回到土穀祠,第二天,腫著眼ç›åŽ»å·¥ä½œã€‚ +但真所謂“塞ç¿å¤±é¦¬å®‰çŸ¥éžç¦â€ç½·ï¼Œé˜¿Qä¸å¹¸è€Œè´äº†ä¸€å›žï¼Œä»–倒幾乎失敗了。 +é€™æ˜¯æœªèŽŠè³½ç¥žçš„æ™šä¸Šã€‚é€™æ™šä¸Šç…§ä¾‹æœ‰ä¸€è‡ºæˆ²ï¼Œæˆ²è‡ºå·¦è¿‘ï¼Œä¹Ÿç…§ä¾‹æœ‰è¨±å¤šçš„è³­æ”¤ã€‚åšæˆ²çš„鑼鼓,在阿Q耳朵è£ä»¿ä½›åœ¨å里之外;他åªè½å¾—æ¨å®¶çš„æ­Œå”±äº†ã€‚ä»–è´è€Œåˆè´ï¼ŒéŠ…éŒ¢è®Šæˆè§’洋,角洋變æˆå¤§æ´‹ï¼Œå¤§æ´‹åˆæˆäº†ç–Šã€‚他興高采烈得éžå¸¸ï¼šâ€œå¤©é–€å…©å¡Šï¼â€ +ä»–ä¸çŸ¥é“èª°å’Œèª°ç‚ºä»€éº¼æ‰“èµ·æž¶ä¾†äº†ã€‚ç½µè²æ‰“è²è…³æ­¥è²ï¼Œæ˜é ­æ˜è…¦çš„一大陣,他纔爬起來,賭攤ä¸è¦‹äº†ï¼Œäººå€‘也ä¸è¦‹äº†ï¼Œèº«ä¸Šæœ‰å¹¾è™•很似乎有些痛,似乎也挨了幾拳幾腳似的,幾個人詫異的å°ä»–看。他如有所失的走進土穀祠,定一定神,知é“他的一堆洋錢ä¸è¦‹äº†ã€‚è¶•è³½æœƒçš„è³­æ”¤å¤šä¸æ˜¯æœ¬æ‘人,還到那è£åŽ»å°‹æ ¹æŸ¢å‘¢ï¼Ÿ +很白很亮的一堆洋錢ï¼è€Œä¸”是他的——ç¾åœ¨ä¸è¦‹äº†ï¼èªªæ˜¯ç®—è¢«å…’å­æ‹¿åŽ»äº†ç½·ï¼Œç¸½é‚„æ˜¯å¿½å¿½ä¸æ¨‚ï¼›èªªè‡ªå·±æ˜¯èŸ²è±¸ç½·ï¼Œä¹Ÿé‚„æ˜¯å¿½å¿½ä¸æ¨‚:他這回纔有些感到失敗的苦痛了。 +但他立刻轉敗為å‹äº†ã€‚ä»–æ“Žèµ·å³æ‰‹ï¼Œç”¨åŠ›çš„åœ¨è‡ªå·±è‡‰ä¸Šé€£æ‰“äº†å…©å€‹å˜´å·´ï¼Œç†±å‰Œå‰Œçš„æœ‰äº›ç—›ï¼›æ‰“å®Œä¹‹å¾Œï¼Œä¾¿å¿ƒå¹³æ°£å’Œèµ·ä¾†ï¼Œä¼¼ä¹Žæ‰“çš„æ˜¯è‡ªå·±ï¼Œè¢«æ‰“çš„æ˜¯åˆ¥ä¸€å€‹è‡ªå·±ï¼Œä¸ä¹…也就仿佛是自己打了別個一般,——雖然還有些熱剌剌,——心滿æ„足的得å‹çš„躺下了。他ç¡è‘—了。 +然而阿Q雖然常優å‹ï¼Œå»ç›´å¾…蒙趙太爺打他嘴巴之後,這纔出了å。 +他付éŽåœ°ä¿äºŒç™¾æ–‡é…’錢,憤憤的躺下了,後來想:“ç¾åœ¨çš„ä¸–ç•Œå¤ªä¸æˆè©±ï¼Œå…’å­æ‰“è€å­â€¦â€¦â€æ–¼æ˜¯å¿½è€Œæƒ³åˆ°è¶™å¤ªçˆºçš„å¨é¢¨ï¼Œè€Œç¾åœ¨æ˜¯ä»–的兒å­äº†ï¼Œä¾¿è‡ªå·±ä¹Ÿæ¼¸æ¼¸çš„å¾—æ„起來,爬起身,唱著《å°å­¤å­€ä¸Šå¢³ã€‹åˆ°é…’店去。這時候,他åˆè¦ºå¾—趙太爺高人一等了。 +說也怪,從此之後,果然大家也仿佛格外尊敬他。這在阿Q,或者以為因為他是趙太爺的父親,而其實也ä¸ç„¶ã€‚未莊通例,倘如阿七打阿八,或者æŽå››æ‰“張三,å‘來本ä¸ç®—å£ç¢‘。一上å£ç¢‘,則打的既有å,被打的也就托庇有了å。至於錯在阿Q,那自然是ä¸å¿…èªªã€‚æ‰€ä»¥è€…ä½•ï¼Ÿå°±å› ç‚ºè¶™å¤ªçˆºæ˜¯ä¸æœƒéŒ¯çš„。但他既然錯,為什麼大家åˆä»¿ä½›æ ¼å¤–尊敬他呢?這å¯é›£è§£ï¼Œç©¿é‘¿èµ·ä¾†èªªï¼Œæˆ–者因為阿Q說是趙太爺的本家,雖然挨了打,大家也還怕有些真,總ä¸å¦‚尊敬一些穩當。å¦å‰‡ï¼Œä¹Ÿå¦‚孔廟è£çš„å¤ªç‰¢ä¸€èˆ¬ï¼Œé›–ç„¶èˆ‡è±¬ç¾Šä¸€æ¨£ï¼ŒåŒæ˜¯ç•œç”Ÿï¼Œä½†æ—¢ç¶“è–äººä¸‹ç®¸ï¼Œå…ˆå„’å€‘ä¾¿ä¸æ•¢å¦„動了。 +阿Q此後倒得æ„了許多年。 +有一年的春天,他醉醺醺的在街上走,在牆根的日光下,看見王胡在那è£èµ¤è‘—膊æ‰è¨å­ï¼Œä»–忽然覺得身上也癢起來了。這王胡,åˆç™©åˆèƒ¡ï¼Œåˆ¥äººéƒ½å«ä»–王癩胡,阿Qå»åˆªåŽ»äº†ä¸€å€‹ç™©å­—ï¼Œç„¶è€Œéžå¸¸æ¸ºè¦–他。阿Qçš„æ„æ€ï¼Œä»¥ç‚ºç™©æ˜¯ä¸è¶³ç‚ºå¥‡çš„ï¼Œåªæœ‰é€™ä¸€éƒ¨çµ¡è…®é¬å­ï¼Œå¯¦åœ¨å¤ªæ–°å¥‡ï¼Œä»¤äººçœ‹ä¸ä¸Šçœ¼ã€‚他於是併排å下去了。倘是別的閑人們,阿Qæœ¬ä¸æ•¢å¤§æ„å下去。但這王胡æ—邊,他有什麼怕呢?è€å¯¦èªªï¼šä»–肯å下去,簡直還是抬舉他。 +阿Q也脫下破夾襖來,翻檢了一回,ä¸çŸ¥é“å› ç‚ºæ–°æ´—å‘¢é‚„æ˜¯å› ç‚ºç²—å¿ƒï¼Œè¨±å¤šå·¥å¤«ï¼Œåªæ‰åˆ°ä¸‰å››å€‹ã€‚ä»–çœ‹é‚£çŽ‹èƒ¡ï¼Œå»æ˜¯ä¸€å€‹åˆä¸€å€‹ï¼Œå…©å€‹åˆä¸‰å€‹ï¼Œåªæ”¾åœ¨å˜´è£ç•¢ç•¢å‰å‰çš„響。 +阿Qæœ€åˆæ˜¯å¤±æœ›ï¼Œå¾Œä¾†å»ä¸å¹³äº†ï¼šçœ‹ä¸ä¸Šçœ¼çš„王胡尚且那麼多,自己倒å這樣少,這是怎樣的大失體統的事呵ï¼ä»–很想尋一兩個大的,然而竟沒有,好容易纔æ‰åˆ°ä¸€å€‹ä¸­çš„ï¼Œæ¨æ¨çš„塞在厚嘴唇è£ï¼Œç‹ å‘½ä¸€å’¬ï¼ŒåŠˆçš„ä¸€è²ï¼Œåˆä¸åŠçŽ‹èƒ¡çš„éŸ¿ã€‚ +ä»–ç™©ç˜¡ç–¤å¡Šå¡Šé€šç´…äº†ï¼Œå°‡è¡£æœæ‘”在地上,å一å£å”¾æ²«ï¼Œèªªï¼š +“這毛蟲ï¼â€ +“癩皮狗,你罵誰?â€çŽ‹èƒ¡è¼•è”‘çš„æŠ¬èµ·çœ¼ä¾†èªªã€‚ +阿Q近來雖然比較的å—人尊敬,自己也更高傲些,但和那些打慣的閑人們見é¢é‚„è†½æ€¯ï¼Œç¨æœ‰é€™å›žå»éžå¸¸æ­¦å‹‡äº†ã€‚這樣滿臉é¬å­çš„æ±è¥¿ï¼Œä¹Ÿæ•¢å‡ºè¨€ç„¡ç‹€éº½ï¼Ÿ +“誰èªä¾¿ç½µèª°ï¼â€ä»–站起來,兩手å‰åœ¨è…°é–“說。 +“你的骨頭癢了麽?â€çŽ‹èƒ¡ä¹Ÿç«™èµ·ä¾†ï¼ŒæŠ«ä¸Šè¡£æœèªªã€‚ +阿Q以為他è¦é€ƒäº†ï¼Œæ¶é€²åŽ»å°±æ˜¯ä¸€æ‹³ã€‚é€™æ‹³é ­é‚„æœªé”到身上,已經被他抓ä½äº†ï¼Œåªä¸€æ‹‰ï¼Œé˜¿Q蹌蹌踉踉的跌進去,立刻åˆè¢«çŽ‹èƒ¡æ‰­ä½äº†è¾®å­ï¼Œè¦æ‹‰åˆ°ç‰†ä¸Šç…§ä¾‹åŽ»ç¢°é ­ã€‚ +“‘å›å­å‹•å£ä¸å‹•手’ï¼â€é˜¿Q歪著頭說。 +çŽ‹èƒ¡ä¼¼ä¹Žä¸æ˜¯å›å­ï¼Œä¸¦ä¸ç†æœƒï¼Œä¸€é€£çµ¦ä»–碰了五下,åˆç”¨åŠ›çš„ä¸€æŽ¨ï¼Œè‡³æ–¼é˜¿Q跌出六尺多é ï¼Œé€™çº”滿足的去了。 +在阿Q的記憶上,這大約è¦ç®—是生平第一件的屈辱,因為王胡以絡腮é¬å­çš„缺點,å‘來åªè¢«ä»–奚è½ï¼Œå¾žæ²’有奚è½ä»–,更ä¸å¿…說動手了。而他ç¾åœ¨ç«Ÿå‹•手,很æ„外,難é“真如市上所說,皇å¸å·²ç¶“åœäº†ï¼Œä¸è¦ç§€æ‰å’Œèˆ‰äººäº†ï¼Œå› æ­¤è¶™å®¶æ¸›äº†å¨é¢¨ï¼Œå› æ­¤ä»–們也便å°è¦·äº†ä»–麽? +阿Qç„¡å¯é©å¾žçš„站著。 +é é çš„走來了一個人,他的å°é ­åˆåˆ°äº†ã€‚這也是阿Q最厭惡的一個人,就是錢太爺的大兒å­ã€‚ä»–å…ˆå‰è·‘上城è£åŽ»é€²æ´‹å­¸å ‚ï¼Œä¸çŸ¥æ€Žéº¼åˆè·‘åˆ°æ±æ´‹åŽ»äº†ï¼ŒåŠå¹´ä¹‹å¾Œä»–回到家è£ä¾†ï¼Œè…¿ä¹Ÿç›´äº†ï¼Œè¾®å­ä¹Ÿä¸è¦‹äº†ï¼Œä»–çš„æ¯è¦ªå¤§å“­äº†å幾場,他的è€å©†è·³äº†ä¸‰å›žäº•。後來,他的æ¯è¦ªåˆ°è™•èªªï¼Œâ€œé€™è¾®å­æ˜¯è¢«å£žäººçŒé†‰äº†é…’剪去了。本來å¯ä»¥åšå¤§å®˜ï¼Œç¾åœ¨åªå¥½ç­‰ç•™é•·å†èªªäº†ã€‚â€ç„¶è€Œé˜¿Qä¸è‚¯ä¿¡ï¼Œåç¨±ä»–â€œå‡æ´‹é¬¼å­â€ï¼Œä¹Ÿå«ä½œâ€œè£é€šå¤–國的人â€ï¼Œä¸€è¦‹ä»–,一定在肚å­è£æš—暗的咒罵。 +阿Q尤其“深惡而痛絕之â€çš„,是他的一æ¢å‡è¾®å­ã€‚è¾®å­è€Œè‡³æ–¼å‡ï¼Œå°±æ˜¯æ²’有了åšäººçš„資格;他的è€å©†ä¸è·³ç¬¬å››å›žäº•ï¼Œä¹Ÿä¸æ˜¯å¥½å¥³äººã€‚ +é€™â€œå‡æ´‹é¬¼å­â€è¿‘來了。 +“禿兒。驢……â€é˜¿Q歷來本åªåœ¨è‚šå­è£ç½µï¼Œæ²’有出éŽè²ï¼Œé€™å›žå› ç‚ºæ­£æ°£å¿¿ï¼Œå› ç‚ºè¦å ±ä»‡ï¼Œä¾¿ä¸ç”±çš„輕輕的說出來了。 +䏿–™é€™ç¦¿å…’廿‹¿è‘—一支黃漆的æ£å­â€”—就是阿Q所謂哭喪棒——大蹋步走了éŽä¾†ã€‚阿Q在這剎那,便知é“å¤§ç´„è¦æ‰“了,趕緊抽緊筋骨,è³äº†è‚©è†€ç­‰å€™è‘—,果然,æ‹çš„一è²ï¼Œä¼¼ä¹Žç¢ºé‘¿æ‰“在自己頭上了。 +“我說他ï¼â€é˜¿Q指著近æ—的一個孩å­ï¼Œåˆ†è¾¯èªªã€‚ +æ‹ï¼æ‹æ‹ï¼ +在阿Q的記憶上,這大約è¦ç®—æ˜¯ç”Ÿå¹³ç¬¬äºŒä»¶çš„å±ˆè¾±ã€‚å¹¸è€Œæ‹æ‹çš„響了之後,於他倒似乎完çµäº†ä¸€ä»¶äº‹ï¼Œå而覺得輕鬆些,而且“忘å»â€é€™ä¸€ä»¶ç¥–傳的寶è²ä¹Ÿç™¼ç”Ÿäº†æ•ˆåŠ›ï¼Œä»–æ…¢æ…¢çš„èµ°ï¼Œå°‡åˆ°é…’åº—é–€å£ï¼Œæ—©å·²æœ‰äº›é«˜èˆˆäº†ã€‚ +但å°é¢èµ°ä¾†äº†éœä¿®åºµè£çš„å°å°¼å§‘。阿Q便在平時,看見伊也一定è¦å”¾ç½µï¼Œè€Œæ³åœ¨å±ˆè¾±ä¹‹å¾Œå‘¢ï¼Ÿä»–於是發生了回憶,åˆç™¼ç”Ÿäº†æ•µæ„¾äº†ã€‚ +“我ä¸çŸ¥é“我今天為什麼這樣晦氣,原來就因為見了你ï¼â€ä»–想。 +他迎上去,大è²çš„å一å£å”¾æ²«ï¼š +“咳,呸ï¼â€ +å°å°¼å§‘å…¨ä¸ç¬ï¼Œä½Žäº†é ­åªæ˜¯èµ°ã€‚阿Q走近伊身æ—,çªç„¶ä¼¸å‡ºæ‰‹åŽ»æ‘©è‘—ä¼Šæ–°å‰ƒçš„é ­çš®ï¼Œå‘†ç¬‘è‘—ï¼Œèªªï¼š +“禿兒ï¼å¿«å›žåŽ»ï¼Œå’Œå°šç­‰è‘—ä½ â€¦â€¦â€ +“你怎麼動手動腳……â€å°¼å§‘滿臉通紅的說,一é¢è¶•快走。 +酒店è£çš„人大笑了。阿Q看見自己的勛業得了賞識,便愈加興高采烈起來: +“和尚動得,我動ä¸å¾—?â€ä»–扭ä½ä¼Šçš„é¢é °ã€‚ +酒店è£çš„人大笑了。阿Qæ›´å¾—æ„,而且為了滿足那些賞鑒家起見,å†ç”¨åŠ›çš„ä¸€æ“°ï¼Œçº”æ”¾æ‰‹ã€‚ +他這一戰,早忘å»äº†çŽ‹èƒ¡ï¼Œä¹Ÿå¿˜å»äº†å‡æ´‹é¬¼å­ï¼Œä¼¼ä¹Žå°æ–¼ä»Šå¤©çš„一切“晦氣â€éƒ½å ±äº†ä»‡ï¼›è€Œä¸”奇怪,åˆä»¿ä½›å…¨èº«æ¯”æ‹æ‹çš„響了之後輕鬆,飄飄然的似乎è¦é£›åŽ»äº†ã€‚ +“這斷å­çµ•孫的阿Qï¼â€é é åœ°è½å¾—å°å°¼å§‘的帶哭的è²éŸ³ã€‚ +“哈哈哈ï¼â€é˜¿Qå分得æ„的笑。 +“哈哈哈ï¼â€é…’店è£çš„人也ä¹åˆ†å¾—æ„的笑。 +有人說:有些å‹åˆ©è€…ï¼Œé¡˜æ„æ•µæ‰‹å¦‚虎,如鷹,他纔感得å‹åˆ©çš„æ­¡å–œï¼›å‡ä½¿å¦‚羊,如å°é›žï¼Œä»–便å覺得å‹åˆ©çš„ç„¡èŠã€‚åˆæœ‰äº›å‹åˆ©è€…,當剋æœä¸€åˆ‡ä¹‹å¾Œï¼Œçœ‹è¦‹æ­»çš„æ­»äº†ï¼Œé™çš„é™äº†ï¼Œâ€œè‡£èª æƒ¶èª ææ­»ç½ªæ­»ç½ªâ€ï¼Œä»–æ–¼æ˜¯æ²’æœ‰äº†æ•µäººï¼Œæ²’æœ‰äº†å°æ‰‹ï¼Œæ²’有了朋å‹ï¼Œåªæœ‰è‡ªå·±åœ¨ä¸Šï¼Œä¸€å€‹ï¼Œå­¤å¦å¦ï¼Œæ·’涼,寂寞,便å而感到了å‹åˆ©çš„æ‚²å“€ã€‚然而我們的阿Q廿²’有這樣ä¹ï¼Œä»–是永é å¾—æ„的:這或者也是中國精神文明冠於全çƒçš„一個證據了。 +看那,他飄飄然的似乎è¦é£›åŽ»äº†ï¼ +然而這一次的å‹åˆ©ï¼Œå»åˆä½¿ä»–有些異樣。他飄飄然的飛了大åŠå¤©ï¼Œé£„進土穀祠,照例應該躺下便打鼾。誰知é“這一晚,他很ä¸å®¹æ˜“åˆçœ¼ï¼Œä»–è¦ºå¾—è‡ªå·±çš„å¤§æ‹‡æŒ‡å’Œç¬¬äºŒæŒ‡æœ‰é»žå¤æ€ªï¼šä»¿ä½›æ¯”平常滑膩些。ä¸çŸ¥é“是å°å°¼å§‘的臉上有一點滑膩的æ±è¥¿ç²˜åœ¨ä»–指上,還是他的指頭在å°å°¼å§‘臉上磨得滑膩了?…… +“斷å­çµ•孫的阿Qï¼â€ +阿Q的耳朵è£åˆè½åˆ°é€™å¥è©±ã€‚他想:ä¸éŒ¯ï¼Œæ‡‰è©²æœ‰ä¸€å€‹å¥³äººï¼Œæ–·å­çµ•孫便沒有人供一碗飯,……應該有一個女人。夫“ä¸å­æœ‰ä¸‰ç„¡å¾Œç‚ºå¤§â€ï¼Œè€Œâ€œè‹¥æ•–之鬼餒而â€ï¼Œä¹Ÿæ˜¯ä¸€ä»¶äººç”Ÿçš„å¤§å“€ï¼Œæ‰€ä»¥ä»–é‚£æ€æƒ³ï¼Œå…¶å¯¦æ˜¯æ¨£æ¨£åˆæ–¼è–經賢傳的,åªå¯æƒœå¾Œä¾†æœ‰äº›â€œä¸èƒ½æ”¶å…¶æ”¾å¿ƒâ€äº†ã€‚ +“女人,女人ï¼â€¦â€¦â€ä»–想。 +“……和尚動得……女人,女人ï¼â€¦â€¦å¥³äººï¼â€ä»–åˆæƒ³ã€‚ +我們ä¸èƒ½çŸ¥é“這晚上阿Q在什麼時候纔打鼾。但大約他從此總覺得指頭有些滑膩,所以他從此總有些飄飄然;“女……â€ä»–想。 +峿­¤ä¸€ç«¯ï¼Œæˆ‘們便å¯ä»¥çŸ¥é“女人是害人的æ±è¥¿ã€‚ +中國的男人,本來大åŠéƒ½å¯ä»¥åšè–è³¢ï¼Œå¯æƒœå…¨è¢«å¥³äººæ¯€æŽ‰äº†ã€‚商是妲己鬧亡的;周是褒姒弄壞的;秦……雖然å²ç„¡æ˜Žæ–‡ï¼Œæˆ‘們也å‡å®šä»–因為女人,大約未必å分錯;而董å“坿˜¯çš„確給貂蟬害死了。 +阿Q本來也是正人,我們雖然ä¸çŸ¥é“他曾蒙什麼明師指授éŽï¼Œä½†ä»–å°æ–¼â€œç”·å¥³ä¹‹å¤§é˜²â€å»æ­·ä¾†éžå¸¸åš´ï¼›ä¹Ÿå¾ˆæœ‰æŽ’斥異端——如å°å°¼å§‘åŠå‡æ´‹é¬¼å­ä¹‹é¡žâ€”—的正氣。他的學說是:凡尼姑,一定與和尚ç§é€šï¼›ä¸€å€‹å¥³äººåœ¨å¤–é¢èµ°ï¼Œä¸€å®šæƒ³å¼•誘野男人;一男一女在那è£è¬›è©±ï¼Œä¸€å®šè¦æœ‰å‹¾ç•¶äº†ã€‚為懲治他們起見,所以他往往怒目而視,或者大è²èªªå¹¾å¥â€œèª…心â€è©±ï¼Œæˆ–è€…åœ¨å†·åƒ»è™•ï¼Œä¾¿å¾žå¾Œé¢æ“²ä¸€å¡Šå°çŸ³é ­ã€‚ +誰知é“他將到“而立â€ä¹‹å¹´ï¼Œç«Ÿè¢«å°å°¼å§‘å®³å¾—é£„é£„ç„¶äº†ã€‚é€™é£„é£„ç„¶çš„ç²¾ç¥žï¼Œåœ¨ç¦®æ•™ä¸Šæ˜¯ä¸æ‡‰è©²æœ‰çš„ï¼Œâ€”â€”æ‰€ä»¥å¥³äººçœŸå¯æƒ¡ï¼Œå‡ä½¿å°å°¼å§‘çš„è‡‰ä¸Šä¸æ»‘膩,阿Q便ä¸è‡³æ–¼è¢«è ±ï¼Œåˆå‡ä½¿å°å°¼å§‘的臉上蓋一層布,阿Q便也ä¸è‡³æ–¼è¢«è ±äº†ï¼Œâ€”—他五六年å‰ï¼Œæ›¾åœ¨æˆ²è‡ºä¸‹çš„人å¢ä¸­æ“°éŽä¸€å€‹å¥³äººçš„大腿,但因為隔一層褲,所以此後並ä¸é£„飄然,——而å°å°¼å§‘並ä¸ç„¶ï¼Œé€™ä¹Ÿè¶³è¦‹ç•°ç«¯ä¹‹å¯æƒ¡ã€‚ +“女……â€é˜¿Q想。 +ä»–å°æ–¼ä»¥ç‚ºâ€œä¸€å®šæƒ³å¼•誘野男人â€çš„女人,時常留心看,然而伊並ä¸å°ä»–ç¬‘ã€‚ä»–å°æ–¼å’Œä»–講話的女人,也時常留心è½ï¼Œç„¶è€Œä¼Šåˆä¸¦ä¸æèµ·é—œæ–¼ä»€éº¼å‹¾ç•¶çš„è©±ä¾†ã€‚å“¦ï¼Œé€™ä¹Ÿæ˜¯å¥³äººå¯æƒ¡ä¹‹ä¸€ç¯€ï¼šä¼Šå€‘全都è¦è£â€œå‡æ­£ç¶“â€çš„。 +這一天,阿Q在趙太爺家è£èˆ‚了一天米,åƒéŽæ™šé£¯ï¼Œä¾¿å在廚房è£å¸æ—±ç…™ã€‚倘在別家,åƒéŽæ™šé£¯æœ¬å¯ä»¥å›žåŽ»çš„äº†ï¼Œä½†è¶™åºœä¸Šæ™šé£¯æ—©ï¼Œé›–èªªå®šä¾‹ä¸å‡†æŽŒç‡ˆï¼Œä¸€åƒå®Œä¾¿ç¡è¦ºï¼Œç„¶è€Œå¶ç„¶ä¹Ÿæœ‰ä¸€äº›ä¾‹å¤–:其一,是趙大爺未進秀æ‰çš„æ™‚候,准其點燈讀文章;其二,便是阿Q來åšçŸ­å·¥çš„æ™‚候,准其點燈舂米。因為這一æ¢ä¾‹å¤–,所以阿Q在動手舂米之å‰ï¼Œé‚„å在廚房è£å¸æ—±ç…™ã€‚ +å³åª½ï¼Œæ˜¯è¶™å¤ªçˆºå®¶è£å”¯ä¸€çš„女僕,洗完了碗碟,也就在長凳上å下了,而且和阿Q談閑天: +“太太兩天沒有åƒé£¯å“©ï¼Œå› ç‚ºè€çˆºè¦è²·ä¸€å€‹å°çš„……†+女人……å³åª½â€¦â€¦é€™å°å­¤å­€â€¦â€¦â€é˜¿Q想。 +“我們的少奶奶是八月è£è¦ç”Ÿå­©å­äº†â€¦â€¦â€ +“女人……â€é˜¿Q想。 +阿Q放下煙管,站了起來。 +“我們的少奶奶……â€å³åª½é‚„嘮å¨èªªã€‚ +“我和你困覺,我和你困覺ï¼â€é˜¿Q忽然æ¶ä¸ŠåŽ»ï¼Œå°ä¼Šè·ªä¸‹äº†ã€‚ +一剎時中很寂然。 +“阿呀ï¼â€å³åª½æ¥žäº†ä¸€æ¯ï¼Œçªç„¶ç™¼æŠ–,大å«è‘—往外跑,且跑且嚷,似乎後來帶哭了。 +阿Qå°äº†ç‰†å£è·ªè‘—也發楞,於是兩手扶著空æ¿å‡³ï¼Œæ…¢æ…¢çš„站起來,仿佛覺得有些糟。他這時確也有些å¿å¿‘了,慌張的將煙管æ’在褲帶上,就想去舂米。蓬的一è²ï¼Œé ­ä¸Šè‘—了很粗的一下,他急忙迴轉身去,那秀æ‰ä¾¿æ‹¿äº†ä¸€æ”¯å¤§ç«¹æ ç«™åœ¨ä»–é¢å‰ã€‚ +“你å了,……你這……†+大竹æ åˆå‘他劈下來了。阿Q兩手去抱頭,æ‹çš„æ­£æ‰“在指節上,這å¯å¾ˆæœ‰äº›ç—›ã€‚ä»–è¡å‡ºå»šæˆ¿é–€ï¼Œä»¿ä½›èƒŒä¸Šåˆè‘—了一下似的。 +“忘八蛋ï¼â€ç§€æ‰åœ¨å¾Œé¢ç”¨äº†å®˜è©±é€™æ¨£ç½µã€‚ +阿Q奔入舂米場,一個人站著,還覺得指頭痛,還記得“忘八蛋â€ï¼Œå› ç‚ºé€™è©±æ˜¯æœªèŽŠçš„é„‰ä¸‹äººå¾žä¾†ä¸ç”¨ï¼Œå°ˆæ˜¯è¦‹éŽå®˜åºœçš„闊人用的,所以格外怕,而å°è±¡ä¹Ÿæ ¼å¤–深。但這時,他那“女……â€çš„æ€æƒ³å»ä¹Ÿæ²’有了。而且打罵之後,似乎一件事也已經收æŸï¼Œå€’åè¦ºå¾—ä¸€ç„¡æŽ›ç¤™ä¼¼çš„ï¼Œä¾¿å‹•æ‰‹åŽ»èˆ‚ç±³ã€‚èˆ‚äº†ä¸€æœƒï¼Œä»–ç†±èµ·ä¾†äº†ï¼Œåˆæ­‡äº†æ‰‹è„«è¡£æœã€‚ +脫下衣æœçš„æ™‚候,他è½å¾—外é¢å¾ˆç†±é¬§ï¼Œé˜¿Q生平本來最愛看熱鬧,便å³å°‹è²èµ°å‡ºåŽ»äº†ã€‚å°‹è²æ¼¸æ¼¸çš„尋到趙太爺的內院è£ï¼Œé›–然在æ˜é»ƒä¸­ï¼Œå»è¾¨å¾—出許多人,趙府一家連兩日ä¸åƒé£¯çš„太太也在內,還有間å£çš„é„’ä¸ƒå«‚ï¼ŒçœŸæ­£æœ¬å®¶çš„è¶™ç™½çœ¼ï¼Œè¶™å¸æ™¨ã€‚ +少奶奶正拖著å³åª½èµ°å‡ºä¸‹æˆ¿ä¾†ï¼Œä¸€é¢èªªï¼š +“你到外é¢ä¾†ï¼Œâ€¦â€¦ä¸è¦èº²åœ¨è‡ªå·±æˆ¿è£æƒ³â€¦â€¦â€ +“誰ä¸çŸ¥é“你正經,……短見是è¬è¬å°‹ä¸å¾—的。â€é„’七嫂也從æ—說。 +å³åª½åªæ˜¯å“­ï¼Œå¤¾äº›è©±ï¼Œå»ä¸ç”šè½å¾—分明。 +阿Q想:“哼,有趣,這å°å­¤å­€ä¸çŸ¥é“鬧著什麼玩æ„兒了?â€ä»–想打è½ï¼Œèµ°è¿‘è¶™å¸æ™¨çš„身邊。這時他猛然間看見趙大爺å‘ä»–å¥”ä¾†ï¼Œè€Œä¸”æ‰‹è£æè‘—ä¸€æ”¯å¤§ç«¹æ ã€‚他看見這一支大竹æ ï¼Œä¾¿çŒ›ç„¶é–“悟到自己曾經被打,和這一場熱鬧似乎有點相關。他翻身便走,想逃回舂米場,ä¸åœ–這支竹æ é˜»äº†ä»–的去路,於是他åˆç¿»èº«ä¾¿èµ°ï¼Œè‡ªç„¶è€Œç„¶çš„走出後門,ä¸å¤šå·¥å¤«ï¼Œå·²åœ¨åœŸç©€ç¥ å…§äº†ã€‚ +阿Qå了一會,皮膚有些起粟,他覺得冷了,因為雖在春季,而夜間頗有餘寒,尚ä¸å®œæ–¼èµ¤è†Šã€‚他也記得布衫留在趙家,但倘若去å–ï¼Œåˆæ·±æ€•ç§€æ‰çš„竹æ ã€‚然而地ä¿é€²ä¾†äº†ã€‚ +“阿Q,你的媽媽的ï¼ä½ é€£è¶™å®¶çš„用人都調戲起來,簡直是造å。害得我晚上沒有覺ç¡ï¼Œä½ çš„媽媽的ï¼â€¦â€¦â€ +如是云云的教訓了一通,阿Q自然沒有話。臨末,因為在晚上,應該é€åœ°ä¿åŠ å€é…’錢四百文,阿Q正沒有ç¾éŒ¢ï¼Œä¾¿ç”¨ä¸€é ‚æ°ˆå¸½åšæŠµæŠ¼ï¼Œä¸¦ä¸”è¨‚å®šäº†äº”æ¢ä»¶ï¼š +一 明天用紅燭——è¦ä¸€æ–¤é‡çš„——一å°ï¼Œé¦™ä¸€å°ï¼Œåˆ°è¶™åºœä¸ŠåŽ»è³ ç½ªã€‚ +二 趙府上請é“士祓除縊鬼,費用由阿Q負擔。 +三 阿Q從此ä¸å‡†è¸é€²è¶™åºœçš„門檻。四 å³åª½æ­¤å¾Œå€˜æœ‰ä¸æ¸¬ï¼ŒæƒŸé˜¿Q是å•。 +五 阿Qä¸å‡†å†åŽ»ç´¢å–工錢和布衫。 +阿Qè‡ªç„¶éƒ½ç­”æ‡‰äº†ï¼Œå¯æƒœæ²’有錢。幸而已經春天,棉被å¯ä»¥ç„¡ç”¨ï¼Œä¾¿è³ªäº†äºŒåƒå¤§éŒ¢ï¼Œå±¥è¡Œæ¢ç´„。赤膊磕頭之後,居然還剩幾文,他也ä¸å†è´–氈帽,統統å–了酒了。但趙家也並ä¸ç‡’香點燭,因為太太拜佛的時候å¯ä»¥ç”¨ï¼Œç•™è‘—了。那破布衫是大åŠåšäº†å°‘奶奶八月間生下來的孩å­çš„襯尿布,那å°åŠç ´çˆ›çš„便都åšäº†å³åª½çš„鞋底。 +第五章 生計å•題[编辑 +阿Q禮畢之後,ä»èˆŠå›žåˆ°åœŸç©€ç¥ ï¼Œå¤ªé™½ä¸‹åŽ»äº†ï¼Œæ¼¸æ¼¸è¦ºå¾—ä¸–ä¸Šæœ‰äº›å¤æ€ªã€‚ä»–ä»”ç´°ä¸€æƒ³ï¼Œçµ‚æ–¼çœæ‚ŸéŽä¾†ï¼šå…¶åŽŸå› è“‹åœ¨è‡ªå·±çš„èµ¤è†Šã€‚ä»–è¨˜å¾—ç ´å¤¾è¥–é‚„åœ¨ï¼Œä¾¿æŠ«åœ¨èº«ä¸Šï¼Œèººå€’äº†ï¼Œå¾…å¼µé–‹çœ¼ç›ï¼ŒåŽŸä¾†å¤ªé™½åˆå·²ç¶“照在西牆上頭了。他å起身,一é¢èªªé“,“媽媽的……†+他起來之後,也ä»èˆŠåœ¨è¡—ä¸Šé€›ï¼Œé›–ç„¶ä¸æ¯”赤膊之有切膚之痛,å»åˆæ¼¸æ¼¸çš„è¦ºå¾—ä¸–ä¸Šæœ‰äº›å¤æ€ªäº†ã€‚仿佛從這一天起,未莊的女人們忽然都怕了羞,伊們一見阿Q走來,便個個躲進門è£åŽ»ã€‚ç”šè€Œè‡³æ–¼å°‡è¿‘äº”åæ­²çš„鄒七嫂,也跟著別人亂鑽,而且將å一歲的女兒都å«é€²åŽ»äº†ã€‚é˜¿Q很以為奇,而且想:“這些æ±è¥¿å¿½ç„¶éƒ½å­¸èµ·å°å§æ¨¡æ¨£ä¾†äº†ã€‚這娼婦們……†+ï¼Œå»æ˜¯è¨±å¤šæ—¥ä»¥å¾Œçš„事。其一,酒店ä¸è‚¯è³’欠了;其二,管土穀祠的è€é ­å­èªªäº›å»¢è©±ï¼Œä¼¼ä¹Žå«ä»–èµ°ï¼›å…¶ä¸‰ï¼Œä»–é›–ç„¶è¨˜ä¸æ¸…多少日,但確乎有許多日,沒有一個人來å«ä»–åšçŸ­å·¥ã€‚酒店ä¸è³’,熬著也罷了;è€é ­å­å‚¬ä»–èµ°ï¼Œåš•å›Œä¸€é€šä¹Ÿå°±ç®—äº†ï¼›åªæ˜¯æ²’有人來å«ä»–åšçŸ­å·¥ï¼Œå»ä½¿é˜¿Q肚å­é¤“:這委實是一件éžå¸¸â€œåª½åª½çš„â€çš„事情。 +阿Qå¿ä¸ä¸‹åŽ»äº†ï¼Œä»–åªå¥½åˆ°è€ä¸»é¡§çš„å®¶è£åŽ»æŽ¢å•,——但ç¨ä¸è¨±è¸é€²è¶™åºœçš„門檻,——然而情形也異樣:一定走出一個男人來,ç¾äº†å分煩厭的相貌,åƒå›žè¦†ä¹žä¸ä¸€èˆ¬çš„æ–æ‰‹é“: +“沒有沒有ï¼ä½ å‡ºåŽ»ï¼â€ +阿Q愈覺得稀奇了。他想,這些人家å‘來少ä¸äº†è¦å¹«å¿™ï¼Œä¸è‡³æ–¼ç¾åœ¨å¿½ç„¶éƒ½ç„¡äº‹ï¼Œé€™ç¸½è©²æœ‰äº›è¹Šè¹ºåœ¨è£é¢äº†ã€‚他留心打è½ï¼Œçº”知é“他們有事都去å«å°Don。這å°D,是一個窮å°å­ï¼Œåˆç˜¦åˆä¹ï¼Œåœ¨é˜¿Q的眼ç›è£ï¼Œä½ç½®æ˜¯åœ¨çŽ‹èƒ¡ä¹‹ä¸‹çš„ï¼Œèª°æ–™é€™å°å­ç«Ÿè¬€äº†ä»–的飯碗去。所以阿Q這一氣,更與平常ä¸åŒï¼Œç•¶æ°£æ†¤æ†¤çš„走著的時候,忽然將手一æšï¼Œå”±é“: +“我手執鋼鞭將你打ï¼â€¦â€¦â€ +幾天之後,他竟在錢府的照å£å‰é‡è¦‹äº†å°D。“仇人相見分外眼明â€ï¼Œé˜¿Q便迎上去,å°D也站ä½äº†ã€‚ +“畜生ï¼â€é˜¿Q怒目而視的說,嘴角上飛出唾沫來。 +“我是蟲豸,好麽?……â€å°D說。 +這謙éœå使阿Qæ›´åŠ æ†¤æ€’èµ·ä¾†ï¼Œä½†ä»–æ‰‹è£æ²’有鋼鞭,於是åªå¾—撲上去,伸手去拔å°D的辮å­ã€‚å°D一手護ä½äº†è‡ªå·±çš„辮根,一手也來拔阿Q的辮å­ï¼Œé˜¿Q便也將空著的一隻手護ä½äº†è‡ªå·±çš„辮根。從先å‰çš„阿Q看來,,å°D本來是ä¸è¶³é½’數的,但他近來挨了餓,åˆç˜¦åˆä¹å·²ç¶“ä¸ä¸‹æ–¼å°D,所以便æˆäº†å‹¢å‡åŠ›æ•µçš„ç¾è±¡ï¼Œå››é𻿉‹æ‹”著兩顆頭,都彎了腰,在錢家粉牆上映出一個è—色的虹形,至於åŠé»žé˜ä¹‹ä¹…了。 +“好了,好了ï¼â€çœ‹çš„人們說,大約是解勸的。 +“好,好ï¼â€çœ‹çš„人們說,ä¸çŸ¥é“是解勸,是頌æšï¼Œé‚„是煽動。 +然而他們都ä¸è½ã€‚阿Q進三步,å°D便退三步,都站著;å°D進三步,阿Q便退三步,åˆéƒ½ç«™è‘—。大約åŠé»žé˜ï¼Œâ€”—未莊少有自鳴é˜ï¼Œæ‰€ä»¥å¾ˆé›£èªªï¼Œæˆ–者二å分,——他們的頭髮è£ä¾¿éƒ½å†’煙,é¡ä¸Šä¾¿éƒ½æµæ±—,阿Q的手放鬆了,在åŒä¸€çž¬é–“,å°Dçš„æ‰‹ä¹Ÿæ­£æ”¾é¬†äº†ï¼ŒåŒæ™‚ç›´èµ·ï¼ŒåŒæ™‚退開,都擠出人å¢åŽ»ã€‚ +“記著罷,媽媽的……â€é˜¿Q回éŽé ­åŽ»èªªã€‚ +“媽媽的,記著罷……â€å°D也回éŽé ­ä¾†èªªã€‚ +這一場“é¾è™Žé¬¥â€ä¼¼ä¹Žä¸¦ç„¡å‹æ•—,也ä¸çŸ¥é“çœ‹çš„äººå¯æ»¿è¶³ï¼Œéƒ½æ²’有發什麼議論,而阿Qå»ä»ç„¶æ²’有人來å«ä»–åšçŸ­å·¥ã€‚ +æœ‰ä¸€æ—¥å¾ˆæº«å’Œï¼Œå¾®é¢¨æ‹‚æ‹‚çš„é —æœ‰äº›å¤æ„了,阿Qå»è¦ºå¾—å¯’å†·èµ·ä¾†ï¼Œä½†é€™é‚„å¯æ“”當,第一倒是肚å­é¤“。棉被,氈帽,布衫,早已沒有了,其次就賣了棉襖;ç¾åœ¨æœ‰è¤²å­ï¼Œå»è¬ä¸å¯è„«çš„;有破夾襖,åˆé™¤äº†é€äººåšéž‹åº•之外,決定賣ä¸å‡ºéŒ¢ã€‚他早想在路上拾得一註錢,但至今還沒有見;他想在自己的破屋è£å¿½ç„¶å°‹åˆ°ä¸€è¨»éŒ¢ï¼Œæ…Œå¼µçš„四顧,但屋內是空虛而且瞭然。於是他決計出門求食去了。 +他在路上走著è¦â€œæ±‚食â€ï¼Œçœ‹è¦‹ç†Ÿè­˜çš„酒店,看見熟識的饅頭,但他都走éŽäº†ï¼Œä¸ä½†æ²’有暫åœï¼Œè€Œä¸”䏦䏿ƒ³è¦ã€‚ä»–æ‰€æ±‚çš„ä¸æ˜¯é€™é¡žæ±è¥¿äº†ï¼›ä»–求的是什麼æ±è¥¿ï¼Œä»–自己ä¸çŸ¥é“。 +æœªèŽŠæœ¬ä¸æ˜¯å¤§æ‘鎮,ä¸å¤šæ™‚便走盡了。æ‘外多是水田,滿眼是新秧的嫩綠,夾著幾個圓形的活動的黑點,便是耕田的農夫。阿Q並ä¸è³žé‘’這田家樂,å»åªæ˜¯èµ°ï¼Œå› ç‚ºä»–直覺的知é“這與他的“求食â€ä¹‹é“是很é¼é çš„。但他終於走到éœä¿®åºµçš„牆外了。 +庵周åœä¹Ÿæ˜¯æ°´ç”°ï¼Œç²‰ç‰†çªå‡ºåœ¨æ–°ç¶ è£ï¼Œå¾Œé¢çš„ä½ŽåœŸç‰†è£æ˜¯èœåœ’。阿Qé²ç–‘了一會,四é¢ä¸€çœ‹ï¼Œä¸¦æ²’有人。他便爬上這矮牆去,扯著何首çƒè—¤ï¼Œä½†æ³¥åœŸä»ç„¶ç°Œç°Œçš„æŽ‰ï¼Œé˜¿Q的腳也索索的抖;終於攀著桑樹æžï¼Œè·³åˆ°è£é¢äº†ã€‚è£é¢çœŸæ˜¯é¬±é¬±è”¥è”¥ï¼Œä½†ä¼¼ä¹Žä¸¦æ²’æœ‰é»ƒé…’é¥…é ­ï¼Œä»¥åŠæ­¤å¤–å¯åƒçš„之類。é è¥¿ç‰†æ˜¯ç«¹å¢ï¼Œä¸‹éºµè¨±å¤šç­ï¼Œåªå¯æƒœéƒ½æ˜¯ä¸¦æœªç…®ç†Ÿçš„ï¼Œé‚„æœ‰æ²¹èœæ—©ç¶“çµå­ï¼ŒèŠ¥èœå·²å°‡é–‹èŠ±ï¼Œå°ç™½èœä¹Ÿå¾ˆè€äº†ã€‚ +阿Q仿佛文童è½ç¬¬ä¼¼çš„覺得很冤屈,他慢慢走近園門去,忽而éžå¸¸é©šå–œäº†ï¼Œé€™åˆ†æ˜Žæ˜¯ä¸€ç•¦è€è˜¿è””。他於是蹲下便拔,而門å£çªç„¶ä¼¸å‡ºä¸€å€‹å¾ˆåœ“的頭來,åˆå³ç¸®å›žåŽ»äº†ï¼Œé€™åˆ†æ˜Žæ˜¯å°å°¼å§‘。å°å°¼å§‘ä¹‹æµæ˜¯é˜¿Q本來視若è‰èŠ¥çš„ï¼Œä½†ä¸–äº‹é ˆâ€œé€€ä¸€æ­¥æƒ³â€ï¼Œæ‰€ä»¥ä»–便趕緊拔起四個蘿蔔,擰下é’葉,兜在大襟è£ã€‚然而è€å°¼å§‘已經出來了。 +“阿彌陀佛,阿Q,你怎麼跳進園è£ä¾†å·è˜¿è””ï¼â€¦â€¦é˜¿å‘€ï¼Œç½ªéŽå‘µï¼Œé˜¿å”·ï¼Œé˜¿å½Œé™€ä½›ï¼â€¦â€¦â€ +“我什麼時候跳進你的園è£ä¾†å·è˜¿è””?â€é˜¿Q且看且走的說。 +“ç¾åœ¨â€¦â€¦é€™ä¸æ˜¯ï¼Ÿâ€è€å°¼å§‘指著他的衣兜。 +“這是你的?你能å«å¾—他答應你麽?你……†+阿Q沒有說完話,拔步便跑;追來的是一匹很肥大的黑狗。這本來在å‰é–€çš„,ä¸çŸ¥æ€Žçš„到後園來了。黑狗哼而且追,已經è¦å’¬è‘—阿Q的腿,幸而從衣兜è£è½ä¸‹ä¸€å€‹è˜¿è””來,那狗給一嚇,略略一åœï¼Œé˜¿Q已經爬上桑樹,跨到土牆,連人和蘿蔔都滾出牆外é¢äº†ã€‚åªå‰©è‘—黑狗還在å°è‘—桑樹嗥,è€å°¼å§‘念著佛。 +阿Qæ€•å°¼å§‘åˆæ”¾å‡ºé»‘ç‹—ä¾†ï¼Œæ‹¾èµ·è˜¿è””ä¾¿èµ°ï¼Œæ²¿è·¯åˆæ’¿äº†å¹¾å¡Šå°çŸ³é ­ï¼Œä½†é»‘ç‹—å»ä¸¦ä¸å†ç¾ã€‚阿Q於是拋了石塊,一é¢èµ°ä¸€é¢åƒï¼Œè€Œä¸”想é“,這è£ä¹Ÿæ²’有什麼æ±è¥¿å°‹ï¼Œä¸å¦‚進城去…… +待三個蘿蔔åƒå®Œæ™‚,他已經打定了進城的主æ„了。 +第六章 從中興到末路[编辑] +在未莊å†çœ‹è¦‹é˜¿Q出ç¾çš„æ™‚候,是剛éŽäº†é€™å¹´çš„中秋。人們都驚異,說是阿Q回來了,於是åˆå›žä¸ŠåŽ»æƒ³é“,他先å‰é‚£è£åŽ»äº†å‘¢ï¼Ÿé˜¿Qå‰å¹¾å›žçš„上城,大抵早就興高采烈的å°äººèªªï¼Œä½†é€™ä¸€æ¬¡å»ä¸¦ä¸ï¼Œæ‰€ä»¥ä¹Ÿæ²’有一個人留心到。他或者也曾告訴éŽç®¡åœŸç©€ç¥ çš„è€é ­å­ï¼Œç„¶è€ŒæœªèŽŠè€ä¾‹ï¼Œåªæœ‰è¶™å¤ªçˆºã€éŒ¢å¤ªçˆºå’Œç§€æ‰å¤§çˆºä¸ŠåŸŽçº”ç®—ä¸€ä»¶äº‹ã€‚å‡æ´‹é¬¼å­å°šä¸”ä¸è¶³æ•¸ï¼Œä½•æ³æ˜¯é˜¿Q:因此è€é ­å­ä¹Ÿå°±ä¸æ›¿ä»–宣傳,而未莊的社會上也就無從知é“了。 +但阿Q這回的回來,å»èˆ‡å…ˆå‰å¤§ä¸åŒï¼Œç¢ºä¹Žå¾ˆå€¼å¾—驚異。天色將黑,他ç¡çœ¼è’™æœ§çš„在酒店門å‰å‡ºç¾äº†ï¼Œä»–走近櫃臺,從腰間伸出手來,滿把是銀的和銅的,在櫃上一扔說,“ç¾éŒ¢ï¼æ‰“酒來ï¼â€ç©¿çš„æ˜¯æ–°å¤¾è¥–,看去腰間還掛著一個大æ­é€£ï¼Œæ²‰éˆ¿éˆ¿çš„將褲帶墜æˆäº†å¾ˆå½Žå¾ˆå½Žçš„弧線。未莊è€ä¾‹ï¼Œçœ‹è¦‹ç•¥æœ‰äº›é†’目的人物,是與其慢也寧敬的,ç¾åœ¨é›–ç„¶æ˜ŽçŸ¥é“æ˜¯é˜¿Q,但因為和破夾襖的阿Q有些兩樣了,å¤äººäº‘,“士別三日便當刮目相待â€ï¼Œæ‰€ä»¥å ‚倌,掌櫃,酒客,路人,便自然顯出一種å‡è€Œä¸”敬的形態來。掌櫃既先之以點頭,åˆç¹¼ä¹‹ä»¥è«‡è©±ï¼š +“è±ï¼Œé˜¿Q,你回來了ï¼â€ +“回來了。†+“發財發財,你是——在……†+“上城去了ï¼â€ +這一件新èžï¼Œç¬¬äºŒå¤©ä¾¿å‚³é了全未莊。人人都願æ„知é“ç¾éŒ¢å’Œæ–°å¤¾è¥–的阿Q的中興å²ï¼Œæ‰€ä»¥åœ¨é…’店è£ï¼ŒèŒ¶é¤¨è£ï¼Œå»Ÿç°·ä¸‹ï¼Œä¾¿æ¼¸æ¼¸çš„æŽ¢è½å‡ºä¾†äº†ã€‚é€™çµæžœï¼Œæ˜¯é˜¿Q得了新敬ç•。 +據阿Q說,他是在舉人è€çˆºå®¶è£å¹«å¿™ã€‚這一節,è½çš„人都肅然了。這è€çˆºæœ¬å§“白,但因為åˆåŸŽè£åªæœ‰ä»–一個舉人,所以ä¸å¿…å†å† å§“,說起舉人來就是他。這也ä¸ç¨åœ¨æœªèŽŠæ˜¯å¦‚æ­¤ï¼Œä¾¿æ˜¯ä¸€ç™¾é‡Œæ–¹åœ“ä¹‹å…§ä¹Ÿéƒ½å¦‚æ­¤ï¼Œäººå€‘å¹¾ä¹Žå¤šä»¥ç‚ºä»–çš„å§“åå°±å«èˆ‰äººè€çˆºçš„äº†ã€‚åœ¨é€™äººçš„åºœä¸Šå¹«å¿™ï¼Œé‚£ç•¶ç„¶æ˜¯å¯æ•¬çš„。但據阿Qåˆèªªï¼Œä»–å»ä¸é«˜èˆˆå†å¹«å¿™äº†ï¼Œå› ç‚ºé€™èˆ‰äººè€çˆºå¯¦åœ¨å¤ªâ€œåª½åª½çš„â€äº†ã€‚這一節,è½çš„人都嘆æ¯è€Œä¸”å¿«æ„,因為阿Q本ä¸é…在舉人è€çˆºå®¶è£å¹«å¿™ï¼Œè€Œä¸å¹«å¿™æ˜¯å¯æƒœçš„。 +據阿Qèªªï¼Œä»–çš„å›žä¾†ï¼Œä¼¼ä¹Žä¹Ÿç”±æ–¼ä¸æ»¿æ„城è£äººï¼Œé€™å°±åœ¨ä»–們將長凳稱為æ¢å‡³ï¼Œè€Œä¸”煎魚用蔥絲,加以最近觀察所得的缺點,是女人的走路也扭得ä¸å¾ˆå¥½ã€‚ç„¶è€Œä¹Ÿå¶æœ‰å¤§å¯ä½©æœçš„地方,å³å¦‚未莊的鄉下人ä¸éŽæ‰“三åäºŒå¼µçš„ç«¹ç‰Œï¼Œåªæœ‰å‡æ´‹é¬¼å­èƒ½å¤ å‰â€œéº»é†¬â€ï¼ŒåŸŽè£å»é€£å°çƒé¾œå­éƒ½å‰å¾—ç²¾ç†Ÿçš„ã€‚ä»€éº¼å‡æ´‹é¬¼å­ï¼Œåªè¦æ”¾åœ¨åŸŽè£çš„å幾歲的å°çƒé¾œå­çš„æ‰‹è£ï¼Œä¹Ÿå°±ç«‹åˆ»æ˜¯â€œå°é¬¼è¦‹é–»çŽ‹â€ã€‚這一節,è½çš„人都赧然了。 +“你們å¯çœ‹è¦‹éŽæ®ºé ­éº½ï¼Ÿâ€é˜¿Q說,“咳,好看。殺é©å‘½é»¨ã€‚唉,好看好看,……â€ä»–æ–æ–頭,將唾沫飛在正å°é¢çš„è¶™å¸æ™¨çš„臉上。這一節,è½çš„人都凜然了。但阿Qåˆå››é¢ä¸€çœ‹ï¼Œå¿½ç„¶æšèµ·å³æ‰‹ï¼Œç…§è‘—伸長脖å­è½å¾—出神的王胡的後項窩上直劈下去é“: +“嚓ï¼â€ +çŽ‹èƒ¡é©šå¾—ä¸€è·³ï¼ŒåŒæ™‚電光石ç«ä¼¼çš„趕快縮了頭,而è½çš„人åˆéƒ½æ‚šç„¶è€Œä¸”欣然了。從此王胡瘟頭瘟腦的許多日,並且å†ä¸æ•¢èµ°è¿‘阿Q的身邊;別的人也一樣。 +阿Q這時在未莊人眼ç›è£çš„地ä½ï¼Œé›–䏿•¢èªªè¶…éŽè¶™å¤ªçˆºï¼Œä½†è¬‚之差ä¸å¤šï¼Œå¤§ç´„也就沒有什麼語病的了。 +然而ä¸å¤šä¹…,這阿Q的大å忽åˆå‚³éäº†æœªèŽŠçš„é–¨ä¸­ã€‚é›–ç„¶æœªèŽŠåªæœ‰éŒ¢è¶™å…©å§“是大屋,此外å之ä¹éƒ½æ˜¯æ·ºé–¨ï¼Œä½†é–¨ä¸­ç©¶ç«Ÿæ˜¯é–¨ä¸­ï¼Œæ‰€ä»¥ä¹Ÿç®—å¾—ä¸€ä»¶ç¥žç•°ã€‚å¥³äººå€‘è¦‹é¢æ™‚一定說,鄒七嫂在阿Qé‚£è£è²·äº†ä¸€æ¢è—綢裙,舊固然是舊的,但åªåŒ–了ä¹è§’錢。還有趙白眼的æ¯è¦ªï¼Œâ€”â€”ä¸€èªªæ˜¯è¶™å¸æ™¨çš„æ¯è¦ªï¼Œå¾…è€ƒï¼Œâ€”â€”ä¹Ÿè²·äº†ä¸€ä»¶å­©å­ç©¿çš„å¤§ç´…æ´‹ç´—è¡«ï¼Œä¸ƒæˆæ–°ï¼Œåªç”¨ä¸‰ç™¾å¤§éŒ¢ä¹äºŒä¸²ã€‚於是伊們都眼巴巴的想見阿Q,缺綢裙的想å•ä»–è²·ç¶¢è£™ï¼Œè¦æ´‹ç´—衫的想å•他買洋紗衫,ä¸ä½†è¦‹äº†ä¸é€ƒé¿ï¼Œæœ‰æ™‚阿Q已經走éŽäº†ï¼Œä¹Ÿé‚„è¦è¿½ä¸ŠåŽ»å«ä½ä»–,å•é“: +“阿Q,你還有綢裙麽?沒有?紗衫也è¦çš„,有罷?†+後來這終於從淺閨傳進深閨è£åŽ»äº†ã€‚å› ç‚ºé„’ä¸ƒå«‚å¾—æ„之餘,將伊的綢裙請趙太太去鑒賞,趙太太åˆå‘Šè¨´äº†è¶™å¤ªçˆºè€Œä¸”著實æ­ç¶­äº†ä¸€ç•ªã€‚趙太爺便在晚飯桌上,和秀æ‰å¤§çˆºè¨Žè«–,以為阿Qå¯¦åœ¨æœ‰äº›å¤æ€ªï¼Œæˆ‘們門窗應該å°å¿ƒäº›ï¼›ä½†ä»–çš„æ±è¥¿ï¼Œä¸çŸ¥é“å¯é‚„有什麼å¯è²·ï¼Œä¹Ÿè¨±æœ‰é»žå¥½æ±è¥¿ç½·ã€‚åŠ ä»¥è¶™å¤ªå¤ªä¹Ÿæ­£æƒ³è²·ä¸€ä»¶åƒ¹å»‰ç‰©ç¾Žçš„çš®èƒŒå¿ƒã€‚æ–¼æ˜¯å®¶æ—æ±ºè­°ï¼Œä¾¿æ‰˜é„’七嫂å³åˆ»åŽ»å°‹é˜¿Q,而且為此新闢了第三種的例外:這晚上也姑且特准點油燈。 +油燈幹了ä¸å°‘了,阿Qé‚„ä¸åˆ°ã€‚趙府的全眷都很焦急,打著呵欠,或æ¨é˜¿Q太飄忽,或怨鄒七嫂ä¸ä¸Šç·Šã€‚趙太太還怕他因為春天的æ¢ä»¶ä¸æ•¢ä¾†ï¼Œè€Œè¶™å¤ªçˆºä»¥ç‚ºä¸è¶³æ…®ï¼šå› ç‚ºé€™æ˜¯â€œæˆ‘â€åŽ»å«ä»–的。果然,到底趙太爺有見識,阿Q終於跟著鄒七嫂進來了。“他åªèªªæ²’有沒有,我說你自己當é¢èªªåŽ»ï¼Œä»–é‚„è¦èªªï¼Œæˆ‘說……â€é„’七嫂氣喘åå的走著說。 +“太爺ï¼â€é˜¿Q似笑éžç¬‘çš„å«äº†ä¸€è²ï¼Œåœ¨ç°·ä¸‹ç«™ä½äº†ã€‚ +“阿Q,è½èªªä½ åœ¨å¤–é¢ç™¼è²¡ï¼Œâ€è¶™å¤ªçˆºè¸±é–‹åŽ»ï¼Œçœ¼ç›æ‰“é‡è‘—他的全身,一é¢èªªã€‚“那很好,那很好的。這個,……è½èªªä½ æœ‰äº›èˆŠæ±è¥¿ï¼Œâ€¦â€¦å¯ä»¥éƒ½æ‹¿ä¾†çœ‹ä¸€çœ‹ï¼Œâ€¦â€¦é€™ä¹Ÿä¸¦ä¸æ˜¯åˆ¥çš„,因為我倒è¦â€¦â€¦â€â€œæˆ‘å°é„’七嫂說éŽäº†ã€‚都完了。â€â€œå®Œäº†ï¼Ÿâ€è¶™å¤ªçˆºä¸è¦ºå¤±è²çš„èªªï¼Œâ€œé‚£è£æœƒå®Œå¾—這樣快呢?â€â€œé‚£æ˜¯æœ‹å‹çš„,本來ä¸å¤šã€‚他們買了些,……â€â€œç¸½è©²é‚„有一點罷。â€â€œç¾åœ¨ï¼Œåªå‰©äº†ä¸€å¼µé–€å¹•了。â€â€œå°±æ‹¿é–€å¹•來看看罷。â€è¶™å¤ªå¤ªæ…Œå¿™èªªã€‚ +“那麼,明天拿來就是,â€è¶™å¤ªçˆºå»ä¸ç”šç†±å¿ƒäº†ã€‚“阿Q,你以後有什麼æ±è¥¿çš„æ™‚候,你儘先é€ä¾†çµ¦æˆ‘們看,……†+â€œåƒ¹éŒ¢æ±ºä¸æœƒæ¯”別家出得少ï¼â€ç§€æ‰èªªã€‚ç§€æ‰å¨˜å­å¿™ä¸€çž¥é˜¿Q的臉,看他感動了沒有。 +“我è¦ä¸€ä»¶çš®èƒŒå¿ƒã€‚â€è¶™å¤ªå¤ªèªªã€‚ +阿Qé›–ç„¶ç­”æ‡‰è‘—ï¼Œå»æ‡¶æ´‹æ´‹çš„出去了,也ä¸çŸ¥é“ä»–æ˜¯å¦æ”¾åœ¨å¿ƒä¸Šã€‚é€™ä½¿è¶™å¤ªçˆºå¾ˆå¤±æœ›ï¼Œæ°£æ†¤è€Œä¸”æ“”å¿ƒï¼Œè‡³æ–¼åœæ­¢äº†æ‰“呵欠。秀æ‰å°æ–¼é˜¿Q的態度也很ä¸å¹³ï¼Œæ–¼æ˜¯èªªï¼Œé€™å¿˜å…«è›‹è¦æé˜²ï¼Œæˆ–者ä¸å¦‚å©å’地ä¿ï¼Œä¸è¨±ä»–ä½åœ¨æœªèŽŠã€‚ä½†è¶™å¤ªçˆºä»¥ç‚ºä¸ç„¶ï¼Œèªªé€™ä¹Ÿæ€•è¦çµæ€¨ï¼Œæ³ä¸”åšé€™è·¯ç”Ÿæ„的大概是“è€é·¹ä¸åƒçª©ä¸‹é£Ÿâ€ï¼Œæœ¬æ‘倒ä¸å¿…擔心的;åªè¦è‡ªå·±å¤œè£è­¦é†’點就是了。秀æ‰è½äº†é€™â€œåº­è¨“â€ï¼Œéžå¸¸ä¹‹ä»¥ç‚ºç„¶ï¼Œä¾¿å³åˆ»æ’¤éŠ·äº†é©…é€é˜¿Qçš„æè­°ï¼Œè€Œä¸”å®å›‘鄒七嫂,請伊åƒè¬ä¸è¦å‘人æèµ·é€™ä¸€æ®µè©±ã€‚ +但第二日,鄒七嫂便將那è—裙去染了皂,åˆå°‡é˜¿Qå¯ç–‘之點傳æšå‡ºåŽ»äº†ï¼Œå¯æ˜¯ç¢ºæ²’有æèµ·ç§€æ‰è¦é©…é€ä»–這一節。然而這已經於阿Q很ä¸åˆ©ã€‚最先,地ä¿å°‹ä¸Šé–€äº†ï¼Œå–了他的門幕去,阿Q說是趙太太è¦çœ‹çš„,而地ä¿ä¹Ÿä¸é‚„並且è¦è­°å®šæ¯æœˆçš„å­æ•¬éŒ¢ã€‚其次,是æ‘äººå°æ–¼ä»–的敬ç•å¿½è€Œè®Šç›¸äº†ï¼Œé›–ç„¶é‚„ä¸æ•¢ä¾†æ”¾è‚†ï¼Œå»å¾ˆæœ‰é é¿çš„神情,而這神情和先å‰çš„防他來“嚓â€çš„æ™‚候åˆä¸åŒï¼Œé —混著“敬而é ä¹‹â€çš„分å­äº†ã€‚ +åªæœ‰ä¸€ç­é–‘人們å»é‚„è¦å°‹æ ¹ç©¶åº•的去探阿Q的底細。阿Q也並ä¸è«±é£¾ï¼Œå‚²ç„¶çš„說出他的經驗來。從此他們纔知é“,他ä¸éŽæ˜¯ä¸€å€‹å°è…³è‰²ï¼Œä¸ä½†ä¸èƒ½ä¸Šç‰†ï¼Œä¸¦ä¸”ä¸èƒ½é€²æ´žï¼Œåªç«™åœ¨æ´žå¤–接æ±è¥¿ã€‚有一夜,他剛纔接到一個包,正手å†é€²åŽ»ï¼Œä¸ä¸€æœƒï¼Œåªè½å¾—è£é¢å¤§åš·èµ·ä¾†ï¼Œä»–ä¾¿è¶•ç·Šè·‘ï¼Œé€£å¤œçˆ¬å‡ºåŸŽï¼Œé€ƒå›žæœªèŽŠä¾†äº†ï¼Œå¾žæ­¤ä¸æ•¢å†åŽ»åšã€‚ç„¶è€Œé€™æ•…äº‹å»æ–¼é˜¿Qæ›´ä¸åˆ©ï¼Œæ‘äººå°æ–¼é˜¿Q的“敬而é ä¹‹â€è€…ï¼Œæœ¬å› ç‚ºæ€•çµæ€¨ï¼Œèª°æ–™ä»–ä¸éŽæ˜¯ä¸€å€‹ä¸æ•¢å†å·çš„å·å…’呢?這實在是“斯亦ä¸è¶³ç•也矣â€ã€‚ +第七章 é©å‘½[编辑] +å®£çµ±ä¸‰å¹´ä¹æœˆå四日——å³é˜¿Qå°‡æ­é€£è³£çµ¦è¶™ç™½çœ¼çš„這一天——三更四點,有一隻大çƒç¯·èˆ¹åˆ°äº†è¶™åºœä¸Šçš„æ²³åŸ é ­ã€‚這船從黑魆魆中盪來,鄉下人ç¡å¾—熟,都沒有知é“;出去時將近黎明,å»å¾ˆæœ‰å¹¾å€‹çœ‹è¦‹çš„äº†ã€‚æ“šæŽ¢é ­æŽ¢è…¦çš„èª¿æŸ¥ä¾†çš„çµæžœï¼ŒçŸ¥é“那竟是舉人è€çˆºçš„èˆ¹ï¼ +那船便將大ä¸å®‰è¼‰çµ¦äº†æœªèŽŠï¼Œä¸åˆ°æ­£åˆï¼Œå…¨æ‘的人心就很動æ–。船的使命,趙家本來是很秘密的,但茶åŠé…’肆è£å»éƒ½èªªï¼Œé©å‘½é»¨è¦é€²åŸŽï¼Œèˆ‰äººè€çˆºåˆ°æˆ‘們鄉下來逃難了。惟有鄒七嫂ä¸ä»¥ç‚ºç„¶ï¼Œèªªé‚£ä¸éŽæ˜¯å¹¾å£ç ´è¡£ç®±ï¼Œèˆ‰äººè€çˆºæƒ³ä¾†å¯„存的,å»å·²è¢«è¶™å¤ªçˆºå›žè¦†è½‰åŽ»ã€‚å…¶å¯¦èˆ‰äººè€çˆºå’Œè¶™ç§€æ‰ç´ ä¸ç›¸èƒ½ï¼Œåœ¨ç†æœ¬ä¸èƒ½æœ‰â€œå…±æ‚£é›£â€çš„æƒ…誼,æ³ä¸”鄒七嫂åˆå’Œè¶™å®¶æ˜¯é„°å±…,見èžè¼ƒç‚ºåˆ‡è¿‘,所以大概該是伊å°çš„。 +阿Q的耳朵è£ï¼Œæœ¬ä¾†æ—©è½åˆ°éŽé©å‘½é»¨é€™ä¸€å¥è©±ï¼Œä»Šå¹´åˆè¦ªçœ¼è¦‹éŽæ®ºæŽ‰é©å‘½é»¨ã€‚但他有一種ä¸çŸ¥å¾žé‚£è£ä¾†çš„æ„è¦‹ï¼Œä»¥ç‚ºé©å‘½é»¨ä¾¿æ˜¯é€ å,造åä¾¿æ˜¯èˆ‡ä»–ç‚ºé›£ï¼Œæ‰€ä»¥ä¸€å‘æ˜¯â€œæ·±æƒ¡è€Œç—›çµ•之â€çš„ã€‚æ®Šä¸æ–™é€™å»ä½¿ç™¾é‡Œèžå的舉人è€çˆºæœ‰é€™æ¨£æ€•,於是他未å…也有些“神往â€äº†ï¼Œæ³ä¸”未莊的一群鳥男女的慌張的神情,也使阿Qæ›´å¿«æ„。 +“é©å‘½ä¹Ÿå¥½ç½·ï¼Œâ€é˜¿Q想,“é©é€™å¤¥åª½åª½çš„çš„å‘½ï¼Œå¤ªå¯æƒ¡ï¼å¤ªå¯æ¨ï¼â€¦â€¦ä¾¿æ˜¯æˆ‘ï¼Œä¹Ÿè¦æŠ•é™é©å‘½é»¨äº†ã€‚†+阿Q近來用度窘,大約略略有些ä¸å¹³ï¼›åР以åˆé–“å–äº†å…©ç¢—ç©ºè‚šé…’ï¼Œæ„ˆåŠ é†‰å¾—å¿«ï¼Œä¸€é¢æƒ³ä¸€é¢èµ°ï¼Œä¾¿åˆé£„飄然起來。ä¸çŸ¥æ€Žéº¼ä¸€ä¾†ï¼Œå¿½è€Œä¼¼ä¹Žé©å‘½é»¨ä¾¿æ˜¯è‡ªå·±ï¼ŒæœªèŽŠäººå»éƒ½æ˜¯ä»–的俘虜了。他得æ„之餘,ç¦ä¸ä½å¤§è²çš„åš·é“: +“造å了ï¼é€ å了ï¼â€ +未莊人都用了驚懼的眼光å°ä»–çœ‹ã€‚é€™ä¸€ç¨®å¯æ†çš„眼光,是阿Q從來沒有見éŽçš„,一見之下,åˆä½¿ä»–舒æœå¾—如六月è£å–了雪水。他更加高興的走而且喊é“: +“好,……我è¦ä»€éº¼å°±æ˜¯ä»€éº¼ï¼Œæˆ‘歡喜誰就是誰。得得,é˜é˜ï¼æ‚”ä¸è©²ï¼Œé…’醉錯斬了鄭賢弟,悔ä¸è©²ï¼Œå‘€å‘€å‘€â€¦â€¦å¾—得,é˜é˜ï¼Œå¾—,é˜ä»¤é˜ï¼æˆ‘手執鋼鞭將你打……†+趙府上的兩ä½ç”·äººå’Œå…©å€‹çœŸæœ¬å®¶ï¼Œä¹Ÿæ­£ç«™åœ¨å¤§é–€å£è«–é©å‘½ã€‚阿Q沒有見,昂了頭直唱éŽåŽ»ã€‚â€œå¾—å¾—ï¼Œâ€¦â€¦â€ +“è€Q,â€è¶™å¤ªçˆºæ€¯æ€¯çš„迎著低è²çš„å«ã€‚“é˜é˜ï¼Œâ€é˜¿Qæ–™ä¸åˆ°ä»–çš„å字會和“è€â€å­—è¯çµèµ·ä¾†ï¼Œä»¥ç‚ºæ˜¯ä¸€å¥åˆ¥çš„è©±ï¼Œèˆ‡å·±ç„¡å¹¹ï¼Œåªæ˜¯å”±ã€‚“得,é˜ï¼Œé˜ä»¤é˜ï¼Œé˜ï¼â€â€œè€Q。â€â€œæ‚”ä¸è©²â€¦â€¦â€ +“阿Qï¼â€ç§€æ‰åªå¾—直呼其å了。 +阿Q這纔站ä½ï¼Œæ­ªè‘—é ­å•é“,“什麼?†+“è€Q,…ç¾åœ¨â€¦â€¦â€è¶™å¤ªçˆºå»åˆæ²’有話,“ç¾åœ¨â€¦â€¦ç™¼è²¡éº½ï¼Ÿâ€ +“發財?自然。è¦ä»€éº¼å°±æ˜¯ä»€éº¼â€¦â€¦â€ +“阿……Qå“¥ï¼Œåƒæˆ‘å€‘é€™æ¨£çª®æœ‹å‹æ˜¯ä¸è¦ç·Šçš„……â€è¶™ç™½çœ¼æƒ´æƒ´çš„說,似乎想探é©å‘½é»¨çš„å£é¢¨ã€‚ +“窮朋å‹ï¼Ÿä½ ç¸½æ¯”我有錢。â€é˜¿Q說著自去了。 +大家都憮然,沒有話。趙太爺父å­å›žå®¶ï¼Œæ™šä¸Šå•†é‡åˆ°é»žç‡ˆã€‚趙白眼回家,便從腰間扯下æ­é€£ä¾†ï¼Œäº¤çµ¦ä»–女人è—在箱底è£ã€‚ +阿Q飄飄然的飛了一通,回到土穀祠,酒已經醒é€äº†ã€‚這晚上,管祠的è€é ­å­ä¹Ÿæ„外的和氣,請他å–茶;阿Q便å‘ä»–è¦äº†å…©å€‹é¤…,åƒå®Œä¹‹å¾Œï¼Œåˆè¦äº†ä¸€æ”¯é»žéŽçš„四兩燭和一個樹燭臺,點起來,ç¨è‡ªèººåœ¨è‡ªå·±çš„å°å±‹è£ã€‚他說ä¸å‡ºçš„æ–°é®®è€Œä¸”高興,燭ç«åƒå…ƒå¤œä¼¼çš„é–ƒé–ƒçš„è·³ï¼Œä»–çš„æ€æƒ³ä¹Ÿè¿¸è·³èµ·ä¾†äº†ï¼š +“造å?有趣,……來了一陣白盔白甲的é©å‘½é»¨ï¼Œéƒ½æ‹¿è‘—æ¿åˆ€ï¼Œé‹¼éž­ï¼Œç‚¸å½ˆï¼Œæ´‹ç‚®ï¼Œä¸‰å°–å…©åˆƒåˆ€ï¼Œé‰¤é®æ§ï¼Œèµ°éŽåœŸç©€ç¥ ï¼Œå«é“,‘阿Qï¼åŒåŽ»åŒåŽ»ï¼â€™æ–¼æ˜¯ä¸€åŒåŽ»ã€‚â€¦â€¦ +“這時未莊的一夥鳥男女纔好笑哩,跪下å«é“,‘阿Q,饒命ï¼â€™èª°è½ä»–ï¼ç¬¬ä¸€å€‹è©²æ­»çš„æ˜¯å°D和趙太爺,還有秀æ‰ï¼Œé‚„æœ‰å‡æ´‹é¬¼å­ï¼Œâ€¦â€¦ç•™å¹¾æ¢éº½ï¼ŸçŽ‹èƒ¡æœ¬ä¾†é‚„å¯ç•™ï¼Œä½†ä¹Ÿä¸è¦äº†ã€‚…… +“æ±è¥¿ï¼Œâ€¦â€¦ç›´èµ°é€²åŽ»æ‰“é–‹ç®±å­ä¾†ï¼šå…ƒå¯¶ï¼Œæ´‹éŒ¢ï¼Œæ´‹ç´—衫,……秀æ‰å¨˜å­çš„一張寧å¼åºŠå…ˆæ¬åˆ°åœŸç©€ç¥ ï¼Œæ­¤å¤–便擺了錢家的桌椅,——或者也就用趙家的罷。自己是ä¸å‹•手的了,å«å°D來æ¬ï¼Œè¦æ¬å¾—快,æ¬å¾—ä¸å¿«æ‰“嘴巴。…… +â€œè¶™å¸æ™¨çš„妹å­çœŸé†œã€‚鄒七嫂的女兒éŽå¹¾å¹´å†èªªã€‚凿´‹é¬¼å­çš„è€å©†æœƒå’Œæ²’有辮å­çš„男人ç¡è¦ºï¼Œåš‡ï¼Œä¸æ˜¯å¥½æ±è¥¿ï¼ç§€æ‰çš„è€å©†æ˜¯çœ¼èƒžä¸Šæœ‰ç–¤çš„。……å³åª½é•·ä¹…ä¸è¦‹äº†ï¼Œä¸çŸ¥é“在那è£ï¼Œâ€”â€”å¯æƒœè…³å¤ªå¤§ã€‚†+阿Q沒有想得å分åœç•¶ï¼Œå·²ç¶“發了鼾è²ï¼Œå››å…©ç‡­é‚„åªé»žåŽ»äº†å°åŠå¯¸ï¼Œç´…焰焰的光照著他張開的嘴。 +“è·è·ï¼â€é˜¿Q忽而大å«èµ·ä¾†ï¼ŒæŠ¬äº†é ­å€‰çš‡çš„四顧,待到看見四兩燭,å»åˆå€’é ­ç¡åŽ»äº†ã€‚ +第二天他起得很é²ï¼Œèµ°å‡ºè¡—上看時,樣樣都照舊。他也ä»ç„¶è‚šé¤“,他想著,想ä¸èµ·ä»€éº¼ä¾†ï¼›ä½†ä»–忽而似乎有了主æ„了,慢慢的跨開步,有æ„ç„¡æ„的走到éœä¿®åºµã€‚ +庵和春天時節一樣éœï¼Œç™½çš„牆å£å’Œæ¼†é»‘的門。他想了一想,å‰åŽ»æ‰“é–€ï¼Œä¸€éš»ç‹—åœ¨è£é¢å«ã€‚他急急拾了幾塊斷磚,å†ä¸ŠåŽ»è¼ƒç‚ºç”¨åŠ›çš„æ‰“ï¼Œæ‰“åˆ°é»‘é–€ä¸Šç”Ÿå‡ºè¨±å¤šéº»é»žçš„æ™‚å€™ï¼Œçº”è½å¾—有人來開門。 +阿Q連忙æå¥½ç£šé ­ï¼Œæ“ºé–‹é¦¬æ­¥ï¼Œæº–備和黑狗來開戰。但庵門åªé–‹äº†ä¸€æ¢ç¸«ï¼Œä¸¦ç„¡é»‘狗從中è¡å‡ºï¼Œæœ›é€²åŽ»åªæœ‰ä¸€å€‹è€å°¼å§‘。 +“你åˆä¾†ä»€éº¼äº‹ï¼Ÿâ€ä¼Šå¤§åƒä¸€é©šçš„說。 +“é©å‘½äº†â€¦â€¦ä½ çŸ¥é“?……â€é˜¿Q說得很å«ç³Šã€‚ +“é©å‘½é©å‘½ï¼Œé©éŽä¸€é©çš„,……你們è¦é©å¾—我們怎麼樣呢?â€è€å°¼å§‘兩眼通紅的說。 +“什麼?……â€é˜¿Q詫異了。 +“你ä¸çŸ¥é“,他們已經來é©éŽäº†ï¼â€ +“誰?……â€é˜¿Q更其詫異了。 +“那秀æ‰å’Œæ´‹é¬¼å­ï¼â€ +阿Q很出æ„外,ä¸ç”±çš„一錯愕;è€å°¼å§‘見他失了銳氣,便飛速的關了門,阿Qå†æŽ¨æ™‚ï¼Œç‰¢ä¸å¯é–‹ï¼Œå†æ‰“時,沒有回答了。 +那還是上åˆçš„äº‹ã€‚è¶™ç§€æ‰æ¶ˆæ¯éˆï¼Œä¸€çŸ¥é“é©å‘½é»¨å·²åœ¨å¤œé–“進城,便將辮å­ç›¤åœ¨é ‚上,一早去拜訪那歷來也ä¸ç›¸èƒ½çš„錢洋鬼å­ã€‚這是“咸與維新â€çš„æ™‚候了,所以他們便談得很投機,立刻æˆäº†æƒ…投æ„åˆçš„åŒå¿—,也相約去é©å‘½ã€‚ä»–å€‘æƒ³è€Œåˆæƒ³ï¼Œçº”想出éœä¿®åºµè£æœ‰ä¸€å¡Šâ€œçš‡å¸è¬æ­²è¬è¬æ­²â€çš„é¾ç‰Œï¼Œæ˜¯æ‡‰è©²è¶•ç·Šé©æŽ‰çš„ï¼Œæ–¼æ˜¯åˆç«‹åˆ»åŒåˆ°åºµè£åŽ»é©å‘½ã€‚因為è€å°¼å§‘來阻擋,說了三å¥è©±ï¼Œä»–們便將伊當作滿政府,在頭上很給了ä¸å°‘çš„æ£å­å’Œæ —鑿。尼姑待他們走後,定了神來檢點,é¾ç‰Œå›ºç„¶å·²ç¶“碎在地上了,而且åˆä¸è¦‹äº†è§€éŸ³å¨˜å¨˜åº§å‰çš„一個宣德çˆã€‚ +這事阿Q後來纔知é“。他頗悔自己ç¡è‘—,但也深怪他們ä¸ä¾†æ‹›å‘¼ä»–。他åˆé€€ä¸€æ­¥æƒ³é“: +“難é“ä»–å€‘é‚„æ²’æœ‰çŸ¥é“æˆ‘已經投é™äº†é©å‘½é»¨éº½ï¼Ÿâ€ +第八章 ä¸å‡†é©å‘½[编辑] +未莊的人心日見其安éœäº†ã€‚據傳來的消æ¯ï¼ŒçŸ¥é“é©å‘½é»¨é›–然進了城,倒還沒有什麼大異樣。知縣大è€çˆºé‚„是原官,ä¸éŽæ”¹ç¨±äº†ä»€éº¼ï¼Œè€Œä¸”舉人è€çˆºä¹Ÿåšäº†ä»€éº¼â€”—這些åç›®ï¼ŒæœªèŽŠäººéƒ½èªªä¸æ˜Žç™½â€”—官,帶兵的也還是先å‰çš„è€æŠŠç¸½ã€‚åªæœ‰ä¸€ä»¶å¯æ€•çš„äº‹æ˜¯å¦æœ‰å¹¾å€‹ä¸å¥½çš„é©å‘½é»¨å¤¾åœ¨è£é¢æ—亂,第二天便動手剪辮å­ï¼Œè½èªªé‚£é„°æ‘的航船七斤便著了é“兒,弄得ä¸åƒäººæ¨£å­äº†ã€‚但這å»é‚„ä¸ç®—å¤§ææ€–,因為未莊人本來少上城,å³ä½¿å¶æœ‰æƒ³é€²åŸŽçš„,也就立刻變了計,碰ä¸è‘—這å±éšªã€‚阿Qæœ¬ä¹Ÿæƒ³é€²åŸŽåŽ»å°‹ä»–çš„è€æœ‹å‹ï¼Œä¸€å¾—這消æ¯ï¼Œä¹Ÿåªå¾—作罷了。 +但未莊也ä¸èƒ½èªªæ˜¯ç„¡æ”¹é©ã€‚幾天之後,將辮å­ç›¤åœ¨é ‚ä¸Šçš„é€æ¼¸å¢žåŠ èµ·ä¾†äº†ï¼Œæ—©ç¶“èªªéŽï¼Œæœ€å…ˆè‡ªç„¶æ˜¯èŒ‚æ‰å…¬ï¼Œå…¶æ¬¡ä¾¿æ˜¯è¶™å¸æ™¨å’Œè¶™ç™½çœ¼ï¼Œå¾Œä¾†æ˜¯é˜¿Q。倘在å¤å¤©ï¼Œå¤§å®¶å°‡è¾®å­ç›¤åœ¨é ­é ‚上或者打一個çµï¼Œæœ¬ä¸ç®—什麼稀奇事,但ç¾åœ¨æ˜¯æš®ç§‹ï¼Œæ‰€ä»¥é€™â€œç§‹è¡Œå¤ä»¤â€çš„æƒ…形,在盤辮家ä¸èƒ½ä¸èªªæ˜¯è¬åˆ†çš„英斷,而在未莊也ä¸èƒ½èªªç„¡é—œæ–¼æ”¹é©äº†ã€‚ +è¶™å¸æ™¨è…¦å¾Œç©ºè•©ç›ªçš„走來,看見的人大嚷說, +“è±ï¼Œé©å‘½é»¨ä¾†äº†ï¼â€ +阿Qè½åˆ°äº†å¾ˆç¾¡æ…•。他雖然早知é“ç§€æ‰ç›¤è¾®çš„大新èžï¼Œä½†ç¸½æ²’有想到自己å¯ä»¥ç…§æ¨£åšï¼Œç¾åœ¨çœ‹è¦‹è¶™å¸æ™¨ä¹Ÿå¦‚æ­¤ï¼Œçº”æœ‰äº†å­¸æ¨£çš„æ„æ€ï¼Œå®šä¸‹å¯¦è¡Œçš„æ±ºå¿ƒã€‚他用一支竹筷將辮å­ç›¤åœ¨é ­é ‚上,é²ç–‘多時,這纔放膽的走去。 +他在街上走,人也看他,然而ä¸èªªä»€éº¼è©±ï¼Œé˜¿Qç•¶åˆå¾ˆä¸å¿«ï¼Œå¾Œä¾†ä¾¿å¾ˆä¸å¹³ã€‚ä»–è¿‘ä¾†å¾ˆå®¹æ˜“é¬§è„¾æ°£äº†ï¼›å…¶å¯¦ä»–çš„ç”Ÿæ´»ï¼Œå€’ä¹Ÿä¸¦ä¸æ¯”造å之å‰å艱難,人見他也客氣,店鋪也ä¸èªªè¦ç¾éŒ¢ã€‚而阿Q總覺得自己太失æ„:既然é©äº†å‘½ï¼Œä¸æ‡‰è©²åªæ˜¯é€™æ¨£çš„。æ³ä¸”有一回看見å°D,愈使他氣破肚皮了。 +å°D也將辮å­ç›¤åœ¨é ­é ‚上了,而且也居然用一支竹筷。阿Qè¬æ–™ä¸åˆ°ä»–也敢這樣åšï¼Œè‡ªå·±ä¹Ÿæ±ºä¸å‡†ä»–這樣åšï¼å°D是什麼æ±è¥¿å‘¢ï¼Ÿä»–很想å³åˆ»æªä½ä»–,拗斷他的竹筷,放下他的辮å­ï¼Œä¸¦ä¸”批他幾個嘴巴,èŠä¸”懲罰他忘了生辰八字,也敢來åšé©å‘½é»¨çš„罪。但他終於饒放了,單是怒目而視的å一å£å”¾æ²«é““呸ï¼â€ +這幾日è£ï¼Œé€²åŸŽåŽ»çš„åªæœ‰ä¸€å€‹å‡æ´‹é¬¼å­ã€‚è¶™ç§€æ‰æœ¬ä¹Ÿæƒ³é è‘—寄存箱å­çš„æ·µæºï¼Œè¦ªèº«åŽ»æ‹œè¨ªèˆ‰äººè€çˆºçš„,但因為有剪辮的å±éšªï¼Œæ‰€ä»¥ä¹Ÿä¸­æ­¢äº†ã€‚他寫了一å°â€œé»ƒå‚˜æ ¼â€çš„ä¿¡ï¼Œæ‰˜å‡æ´‹é¬¼å­å¸¶ä¸ŠåŸŽï¼Œè€Œä¸”æ‰˜ä»–çµ¦è‡ªå·±ç´¹ä»‹ç´¹ä»‹ï¼ŒåŽ»é€²è‡ªç”±é»¨ã€‚å‡æ´‹é¬¼å­å›žä¾†æ™‚,å‘ç§€æ‰è¨Žé‚„了四塊洋錢,秀æ‰ä¾¿æœ‰ä¸€å¡ŠéŠ€æ¡ƒå­æŽ›åœ¨å¤§è¥Ÿä¸Šäº†ï¼›æœªèŽŠäººéƒ½é©šæœï¼Œèªªé€™æ˜¯æŸ¿æ²¹é»¨çš„é ‚å­ï¼ŒæŠµå¾—一個翰林;趙太爺因此也驟然大闊,é éŽæ–¼ä»–å…’å­åˆé›‹ç§€æ‰çš„æ™‚候,所以目空一切,見了阿Qï¼Œä¹Ÿå°±å¾ˆæœ‰äº›ä¸æ”¾åœ¨çœ¼è£äº†ã€‚ +阿Q正在ä¸å¹³ï¼Œåˆæ™‚時刻刻感著冷è½ï¼Œä¸€è½å¾—這銀桃å­çš„å‚³èªªï¼Œä»–ç«‹å³æ‚Ÿå‡ºè‡ªå·±ä¹‹æ‰€ä»¥å†·è½çš„原因了:è¦é©å‘½ï¼Œå–®èªªæŠ•é™ï¼Œæ˜¯ä¸è¡Œçš„;盤上辮å­ï¼Œä¹Ÿä¸è¡Œçš„;第一著ä»ç„¶è¦å’Œé©å‘½é»¨åŽ»çµè­˜ã€‚他生平所知é“çš„é©å‘½é»¨åªæœ‰å…©å€‹ï¼ŒåŸŽè£çš„一個早已“嚓â€çš„æ®ºæŽ‰äº†ï¼Œç¾åœ¨åªå‰©äº†ä¸€å€‹å‡æ´‹é¬¼å­ã€‚他除å»è¶•ç·ŠåŽ»å’Œå‡æ´‹é¬¼å­å•†é‡ä¹‹å¤–ï¼Œå†æ²’有別的é“路了。 +錢府的大門正開著,阿Q便怯怯的躄進去。他一到è£é¢ï¼Œå¾ˆåƒäº†é©šï¼Œåªè¦‹å‡æ´‹é¬¼å­æ­£ç«™åœ¨é™¢å­çš„中央,一身çƒé»‘的大約是洋衣,身上也掛著一塊銀桃å­ï¼Œæ‰‹è£æ˜¯é˜¿Q曾經領教éŽçš„æ£å­ï¼Œå·²ç¶“留到一尺多長的辮å­éƒ½æ‹†é–‹äº†æŠ«åœ¨è‚©èƒŒä¸Šï¼Œè“¬é ­æ•£é«®çš„åƒä¸€å€‹åŠ‰æµ·ä»™ã€‚å°é¢æŒºç›´çš„站著趙白眼和三個閑人,正在必æ­å¿…敬的è½èªªè©±ã€‚ +阿Qè¼•è¼•çš„èµ°è¿‘äº†ï¼Œç«™åœ¨è¶™ç™½çœ¼çš„èƒŒå¾Œï¼Œå¿ƒè£æƒ³æ‹›å‘¼ï¼Œå»ä¸çŸ¥é“怎麼說纔好:å«ä»–凿´‹é¬¼å­å›ºç„¶æ˜¯ä¸è¡Œçš„了,洋人也ä¸å¦¥ï¼Œé©å‘½é»¨ä¹Ÿä¸å¦¥ï¼Œæˆ–è€…å°±æ‡‰è©²å«æ´‹å…ˆç”Ÿäº†ç½·ã€‚ +æ´‹å…ˆç”Ÿå»æ²’有見他,因為白著眼ç›è¬›å¾—正起å‹ï¼š +“我是性急的,所以我們見é¢ï¼Œæˆ‘ç¸½æ˜¯èªªï¼šæ´ªå“¥ï¼æˆ‘們動手罷ï¼ä»–å»ç¸½èªªé“Noï¼â€”â€”é€™æ˜¯æ´‹è©±ï¼Œä½ å€‘ä¸æ‡‚的。å¦å‰‡æ—©å·²æˆåŠŸäº†ã€‚ç„¶è€Œé€™æ­£æ˜¯ä»–åšäº‹å°å¿ƒçš„地方。他å†ä¸‰å†å››çš„請我上湖北,我還沒有肯。誰願æ„在這å°ç¸£åŸŽè£åšäº‹æƒ…。……†+“唔,……這個……â€é˜¿Q候他略åœï¼Œçµ‚於用å二分的勇氣開å£äº†ï¼Œä½†ä¸çŸ¥é“因為什麼,åˆä¸¦ä¸å«ä»–洋先生。 +è½è‘—說話的四個人都åƒé©šçš„回顧他。洋先生也纔看見: +“什麼?†+“我……†+“出去ï¼â€ +â€œæˆ‘è¦æŠ•â€¦â€¦â€ +“滾出去ï¼â€æ´‹å…ˆç”Ÿæšèµ·å“­å–ªæ£’來了。 +趙白眼和閑人們便都å†å–é“:“先生å«ä½ æ»¾å‡ºåŽ»ï¼Œä½ é‚„ä¸è½éº½ï¼â€ +阿Q將手å‘頭上一é®ï¼Œä¸è‡ªè¦ºçš„逃出門外;洋先生倒也沒有追。他快跑了六å多步,這纔慢慢的走,於是心è£ä¾¿æ¹§èµ·äº†æ†‚æ„:洋先生ä¸å‡†ä»–é©å‘½ï¼Œä»–冿²’有別的路;從此決ä¸èƒ½æœ›æœ‰ç™½ç›”白甲的人來å«ä»–,他所有的抱負,志å‘,希望,å‰ç¨‹ï¼Œå…¨è¢«ä¸€ç­†å‹¾éŠ·äº†ã€‚è‡³æ–¼é–‘äººå€‘å‚³æšé–‹åŽ»ï¼Œçµ¦å°D王胡等輩笑話,倒是還在其次的事。 +他似乎從來沒有經驗éŽé€™æ¨£çš„ç„¡èŠã€‚ä»–å°æ–¼è‡ªå·±çš„盤辮å­ï¼Œä»¿ä½›ä¹Ÿè¦ºå¾—ç„¡æ„味,è¦ä¾®è”‘;為報仇起見,很想立刻放下辮å­ä¾†ï¼Œä½†ä¹Ÿæ²’有竟放。他éŠåˆ°å¤œé–“,賒了兩碗酒,å–ä¸‹è‚šåŽ»ï¼Œæ¼¸æ¼¸çš„é«˜èˆˆèµ·ä¾†äº†ï¼Œæ€æƒ³è£çº”åˆå‡ºç¾ç™½ç›”白甲的碎片。 +有一天,他照例的混到夜深,待酒店è¦é—œé–€ï¼Œçº”踱回土穀祠去。 +æ‹ï¼Œå§ï½žï½žï¼ +他忽而è½å¾—一種異樣的è²éŸ³ï¼Œåˆä¸æ˜¯çˆ†ç«¹ã€‚阿Q本來是愛看熱鬧,愛管閑事的,便在暗中直尋éŽåŽ»ã€‚ä¼¼ä¹Žå‰é¢æœ‰äº›è…³æ­¥è²ï¼›ä»–æ­£è½ï¼ŒçŒ›ç„¶é–“一個人從å°é¢é€ƒä¾†äº†ã€‚阿Q一看見,便趕緊翻身跟著逃。那人轉彎,阿Q也轉彎,那人站ä½äº†ï¼Œé˜¿Q也站ä½ã€‚他看後é¢ä¸¦ç„¡ä»€éº¼ï¼Œçœ‹é‚£äººä¾¿æ˜¯å°D。 +“什麼?â€é˜¿Qä¸å¹³èµ·ä¾†äº†ã€‚ +â€œè¶™â€¦â€¦è¶™å®¶é­æ¶äº†ï¼â€å°D氣喘åå的說。 +阿Q的心怦怦的跳了。å°D說了便走;阿Qå»é€ƒè€Œåˆåœçš„兩三回。但他究竟是åšéŽâ€œé€™è·¯ç”Ÿæ„â€ï¼Œæ ¼å¤–膽大,於是躄出路角,仔細的è½ï¼Œä¼¼ä¹Žæœ‰äº›åš·åš·ï¼Œåˆä»”ç´°çš„çœ‹ï¼Œä¼¼ä¹Žè¨±å¤šç™½ç›”ç™½ç”²çš„äººï¼Œçµ¡ç¹¹çš„å°‡ç®±å­æŠ¬å‡ºäº†ï¼Œå™¨å…·æŠ¬å‡ºäº†ï¼Œç§€æ‰å¨˜å­çš„寧å¼åºŠä¹ŸæŠ¬å‡ºäº†ï¼Œä½†æ˜¯ä¸åˆ†æ˜Žï¼Œä»–還想上å‰ï¼Œå…©éš»è…³å»æ²’有動。 +這一夜沒有月,未莊在黑暗è£å¾ˆå¯‚éœï¼Œå¯‚éœåˆ°åƒç¾²çš‡æ™‚候一般太平。阿Q站著看到自己發煩,也似乎還是先å‰ä¸€æ¨£ï¼Œåœ¨é‚£è£ä¾†ä¾†å¾€å¾€çš„æ¬ï¼Œç®±å­æŠ¬å‡ºäº†ï¼Œå™¨å…·æŠ¬å‡ºäº†ï¼Œç§€æ‰å¨˜å­çš„寧å¼åºŠä¹ŸæŠ¬å‡ºäº†ï¼Œâ€¦â€¦æŠ¬å¾—他自己有些ä¸ä¿¡ä»–的眼ç›äº†ã€‚但他決計ä¸å†ä¸Šå‰ï¼Œå»å›žåˆ°è‡ªå·±çš„祠è£åŽ»äº†ã€‚ +åœŸç©€ç¥ è£æ›´æ¼†é»‘;他關好大門,摸進自己的屋å­è£ã€‚ä»–èººäº†å¥½ä¸€æœƒï¼Œé€™çº”å®šäº†ç¥žï¼Œè€Œä¸”ç™¼å‡ºé—œæ–¼è‡ªå·±çš„æ€æƒ³ä¾†ï¼šç™½ç›”白甲的人明明到了,並ä¸ä¾†æ‰“招呼,æ¬äº†è¨±å¤šå¥½æ±è¥¿ï¼Œåˆæ²’æœ‰è‡ªå·±çš„ä»½ï¼Œâ€”â€”é€™å…¨æ˜¯å‡æ´‹é¬¼å­å¯æƒ¡ï¼Œä¸å‡†æˆ‘造å,å¦å‰‡ï¼Œé€™æ¬¡ä½•至於沒有我的份呢?阿Q越想越氣,終於ç¦ä¸ä½æ»¿å¿ƒç—›æ¨èµ·ä¾†ï¼Œæ¯’毒的點一點頭:“ä¸å‡†æˆ‘造å,åªå‡†ä½ é€ åï¼Ÿåª½åª½çš„å‡æ´‹é¬¼å­ï¼Œâ€”—好,你造åï¼é€ å是殺頭的罪å呵,我總è¦å‘Šä¸€ç‹€ï¼Œçœ‹ä½ æŠ“進縣è£åŽ»æ®ºé ­ï¼Œâ€”â€”æ»¿é–€æŠ„æ–¬ï¼Œâ€”â€”åš“ï¼åš“ï¼â€ +第ä¹ç« ã€€å¤§åœ˜åœ“[编辑] +è¶™å®¶é­æ¶ä¹‹å¾Œï¼ŒæœªèŽŠäººå¤§æŠµå¾ˆå¿«æ„è€Œä¸”ææ…Œï¼Œé˜¿Q也很快æ„è€Œä¸”ææ…Œã€‚但四天之後,阿Q在åŠå¤œè£å¿½è¢«æŠ“進縣城è£åŽ»äº†ã€‚é‚£æ™‚æ°æ˜¯æš—夜,一隊兵,一隊團ä¸ï¼Œä¸€éšŠå“¡è­¦ï¼Œäº”å€‹åµæŽ¢ï¼Œæ‚„æ‚„åœ°åˆ°äº†æœªèŽŠï¼Œä¹˜æ˜æš—åœä½åœŸç©€ç¥ ï¼Œæ­£å°é–€æž¶å¥½æ©Ÿé—œæ§ï¼›ç„¶è€Œé˜¿Qä¸è¡å‡ºã€‚許多時沒有動éœï¼ŒæŠŠç¸½ç„¦æ€¥èµ·ä¾†äº†ï¼Œæ‡¸äº†äºŒååƒçš„賞,纔有兩個團ä¸å†’äº†éšªï¼Œé€¾åž£é€²åŽ»ï¼Œè£æ‡‰å¤–åˆï¼Œä¸€æ“而入,將阿Q抓出來;直待擒出祠外é¢çš„æ©Ÿé—œæ§å·¦è¿‘,他纔有些清醒了。 +到進城,已經是正åˆï¼Œé˜¿Q見自己被攙進一所破衙門,轉了五六個彎,便推在一間å°å±‹è£ã€‚ä»–å‰›å‰›ä¸€è¹Œè¸‰ï¼Œé‚£ç”¨æ•´æ ªçš„æœ¨æ–™åšæˆçš„æŸµæ¬„門便跟著他的腳跟闔上了,其餘的三é¢éƒ½æ˜¯ç‰†å£ï¼Œä»”細看時,屋角上還有兩個人。 +阿Q雖然有些å¿å¿‘,å»ä¸¦ä¸å¾ˆè‹¦æ‚¶ï¼Œå› ç‚ºä»–那土穀祠è£çš„è‡¥å®¤ï¼Œä¹Ÿä¸¦æ²’æœ‰æ¯”é€™é–“å±‹å­æ›´é«˜æ˜Žã€‚那兩個也仿佛是鄉下人,漸漸和他兜æ­èµ·ä¾†äº†ï¼Œä¸€å€‹èªªæ˜¯èˆ‰äººè€çˆºè¦è¿½ä»–祖父欠下來的陳租,一個ä¸çŸ¥é“為了什麼事。他們å•阿Q,阿Q爽利的答é“,“因為我想造å。†+他下åŠå¤©ä¾¿åˆè¢«æŠ“出柵欄門去了,到得大堂,上é¢å著一個滿頭剃得精光的è€é ­å­ã€‚阿Q疑心他是和尚,但看見下麵站著一排兵,兩æ—åˆç«™è‘—å幾個長衫人物,也有滿頭剃得精光åƒé€™è€é ­å­çš„,也有將一尺來長的頭髮披在背後åƒé‚£å‡æ´‹é¬¼å­çš„,都是一臉橫肉,怒目而視的看他;他便知é“這人一定有些來歷,è†é—œç¯€ç«‹åˆ»è‡ªç„¶è€Œç„¶çš„寬鬆,便跪了下去了。 +“站著說ï¼ä¸è¦è·ªï¼â€é•·è¡«äººç‰©éƒ½å†å–說。 +阿Q雖然似乎懂得,但總覺得站ä¸ä½ï¼Œèº«ä¸ç”±å·±çš„蹲了下去,而且終於è¶å‹¢æ”¹ç‚ºè·ªä¸‹äº†ã€‚ +“奴隸性ï¼â€¦â€¦â€é•·è¡«äººç‰©åˆé„™å¤·ä¼¼çš„說,但也沒有å«ä»–起來。 +“你從實招來罷,å…å¾—åƒè‹¦ã€‚我早都知é“了。招了å¯ä»¥æ”¾ä½ ã€‚â€é‚£å…‰é ­çš„è€é ­å­çœ‹å®šäº†é˜¿Q的臉,沉éœçš„æ¸…楚的說。 +“招罷ï¼â€é•·è¡«äººç‰©ä¹Ÿå¤§è²èªªã€‚ +“我本來è¦â€¦â€¦ä¾†æŠ•……â€é˜¿Q胡è£èƒ¡å¡—的想了一通,這纔斷斷續續的說。 +“那麼,為什麼ä¸ä¾†çš„呢?â€è€é ­å­å’Œæ°£çš„å•。 +â€œå‡æ´‹é¬¼å­ä¸å‡†æˆ‘ï¼â€ +“胡說此刻說,也é²äº†ã€‚ç¾åœ¨ä½ çš„åŒé»¨åœ¨é‚£è£ï¼Ÿâ€ +“什麼?…… +“那一晚打劫趙家的一夥人。†+â€œä»–å€‘æ²’æœ‰ä¾†å«æˆ‘。他們自己æ¬èµ°äº†ã€‚â€é˜¿Qæèµ·ä¾†ä¾¿æ†¤æ†¤ã€‚ +“走到那è£åŽ»äº†å‘¢ï¼Ÿèªªå‡ºä¾†ä¾¿æ”¾ä½ äº†ã€‚â€è€é ­å­æ›´å’Œæ°£äº†ã€‚ +“我ä¸çŸ¥é“ï¼Œâ€¦â€¦ä»–å€‘æ²’æœ‰ä¾†å«æˆ‘……†+然而è€é ­å­ä½¿äº†ä¸€å€‹çœ¼è‰²ï¼Œé˜¿Q便åˆè¢«æŠ“進柵欄門è£äº†ã€‚他第二次抓出柵欄門,是第二天的上åˆã€‚ +大堂的情形都照舊。上é¢ä»ç„¶å著光頭的è€é ­å­ï¼Œé˜¿Q也ä»ç„¶ä¸‹äº†è·ªã€‚ +è€é ­å­å’Œæ°£çš„å•é“,“你還有什麼話說麽?†+阿Q一想,沒有話,便回答說,“沒有。†+於是一個長衫人物拿了一張紙,並一支筆é€åˆ°é˜¿Qçš„é¢å‰ï¼Œè¦å°‡ç­†å¡žåœ¨ä»–手è£ã€‚阿Q這時很åƒé©šï¼Œå¹¾ä¹Žâ€œé­‚飛魄散â€äº†ï¼šå› ç‚ºä»–çš„æ‰‹å’Œç­†ç›¸é—œï¼Œé€™å›žæ˜¯åˆæ¬¡ã€‚ä»–æ­£ä¸çŸ¥æ€Žæ¨£æ‹¿ï¼›é‚£äººå»åˆæŒ‡è‘—一處地方教他畫花押。 +“我……我……ä¸èªå¾—字。â€é˜¿Q一把抓ä½äº†ç­†ï¼Œæƒ¶æè€Œä¸”慚愧的說。 +“那麼,便宜你,畫一個圓圈ï¼â€ +阿Qè¦ç•«åœ“圈了,那手æè‘—ç­†å»åªæ˜¯æŠ–。於是那人替他將紙鋪在地上,阿Qä¼ä¸‹åŽ»ï¼Œä½¿ç›¡äº†å¹³ç”Ÿçš„åŠ›æ°£ç•«åœ“åœˆã€‚ä»–ç”Ÿæ€•è¢«äººç¬‘è©±ï¼Œç«‹å¿—è¦ç•«å¾—åœ“ï¼Œä½†é€™å¯æƒ¡çš„ç­†ä¸ä½†å¾ˆæ²‰é‡ï¼Œä¸¦ä¸”ä¸è½è©±ï¼Œå‰›å‰›ä¸€æŠ–一抖的幾乎è¦åˆç¸«ï¼Œå»åˆå‘外一è³ï¼Œç•«æˆç“œå­æ¨¡æ¨£äº†ã€‚ +阿Q正羞愧自己畫得ä¸åœ“,那人å»ä¸è¨ˆè¼ƒï¼Œæ—©å·²æŽ£äº†ç´™ç­†åŽ»ï¼Œè¨±å¤šäººåˆå°‡ä»–第二次抓進柵欄門。 +他第二次進了柵欄,倒也並ä¸ååˆ†æ‡Šæƒ±ã€‚ä»–ä»¥ç‚ºäººç”Ÿå¤©åœ°ä¹‹é–“ï¼Œå¤§ç´„æœ¬ä¾†æœ‰æ™‚è¦æŠ“é€²æŠ“å‡ºï¼Œæœ‰æ™‚è¦åœ¨ç´™ä¸Šç•«åœ“圈的,惟有圈而ä¸åœ“ï¼Œå»æ˜¯ä»–“行狀â€ä¸Šçš„一個汙點。但ä¸å¤šæ™‚也就釋然了,他想:孫å­çº”畫得很圓的圓圈呢。於是他ç¡è‘—了。 +然而這一夜,舉人è€çˆºå而ä¸èƒ½ç¡ï¼šä»–和把總嘔了氣了。舉人è€çˆºä¸»å¼µç¬¬ä¸€è¦è¿½è´“,把總主張第一è¦ç¤ºçœ¾ã€‚把總近來很ä¸å°‡èˆ‰äººè€çˆºæ”¾åœ¨çœ¼è£äº†ï¼Œæ‹æ¡ˆæ‰“凳的說é“,“懲一儆百ï¼ä½ çœ‹ï¼Œæˆ‘åšé©å‘½é»¨é‚„ä¸ä¸ŠäºŒåå¤©ï¼Œæ¶æ¡ˆå°±æ˜¯å幾件,全ä¸ç ´æ¡ˆï¼Œæˆ‘çš„é¢å­åœ¨é‚£è£ï¼Ÿç ´äº†æ¡ˆï¼Œä½ åˆä¾†è¿‚ã€‚ä¸æˆï¼é€™æ˜¯æˆ‘管的ï¼â€èˆ‰äººè€çˆºçª˜æ€¥äº†ï¼Œç„¶è€Œé‚„å …æŒï¼Œèªªæ˜¯å€˜è‹¥ä¸è¿½è´“,他便立刻辭了幫辦民政的è·å‹™ã€‚而把總å»é“,“請便罷ï¼â€æ–¼æ˜¯èˆ‰äººè€çˆºåœ¨é€™ä¸€å¤œç«Ÿæ²’有ç¡ï¼Œä½†å¹¸ç¬¬äºŒå¤©å€’也沒有辭。 +阿Q第三次抓出柵欄門的時候,便是舉人è€çˆºç¡ä¸è‘—的那一夜的明天的上åˆäº†ã€‚他到了大堂,上é¢é‚„å著照例的光頭è€é ­å­ï¼›é˜¿Q也照例的下了跪。 +è€é ­å­å¾ˆå’Œæ°£çš„å•é“,“你還有什麼話麽?†+阿Q一想,沒有話,便回答說,“沒有。†+è¨±å¤šé•·è¡«å’ŒçŸ­è¡«äººç‰©ï¼Œå¿½ç„¶çµ¦ä»–ç©¿ä¸Šä¸€ä»¶æ´‹å¸ƒçš„ç™½èƒŒå¿ƒï¼Œä¸Šé¢æœ‰äº›é»‘字。阿Qå¾ˆæ°£è‹¦ï¼šå› ç‚ºé€™å¾ˆåƒæ˜¯å¸¶å­ï¼Œè€Œå¸¶å­æ˜¯æ™¦æ°£çš„ã€‚ç„¶è€ŒåŒæ™‚他的兩手åç¸›äº†ï¼ŒåŒæ™‚åˆè¢«ä¸€ç›´æŠ“出衙門外去了。 +阿Q被抬上了一輛沒有蓬的車,幾個短衣人物也和他åŒå在一處。這車立刻走動了,å‰é¢æ˜¯ä¸€ç­èƒŒè‘—洋炮的兵們和團ä¸ï¼Œå…©æ—æ˜¯è¨±å¤šå¼µè‘—å˜´çš„çœ‹å®¢ï¼Œå¾Œé¢æ€Žæ¨£ï¼Œé˜¿Q沒有見。但他çªç„¶è¦ºåˆ°äº†ï¼šé€™è±ˆä¸æ˜¯åŽ»æ®ºé ­éº½ï¼Ÿä»–ä¸€æ€¥ï¼Œå…©çœ¼ç™¼é»‘ï¼Œè€³æœµè£å–¤çš„一è²ï¼Œä¼¼ä¹Žç™¼æ˜äº†ã€‚ç„¶è€Œä»–åˆæ²’有全發æ˜ï¼Œæœ‰æ™‚雖然著急,有時å»ä¹Ÿæ³°ç„¶ï¼›ä»–æ„æ€ä¹‹é–“,似乎覺得人生天地間,大約本來有時也未å…è¦æ®ºé ­çš„。 +ä»–é‚„èªå¾—路,於是有些詫異了:怎麼ä¸å‘著法場走呢?他ä¸çŸ¥é“這是在éŠè¡—,在示眾。但å³ä½¿çŸ¥é“也一樣,他ä¸éŽä¾¿ä»¥ç‚ºäººç”Ÿå¤©åœ°é–“,大約本來有時也未å…è¦éŠè¡—è¦ç¤ºçœ¾ç½·äº† +ä»–çœæ‚Ÿäº†ï¼Œé€™æ˜¯ç¹žåˆ°æ³•場去的路,這一定是“嚓â€çš„去殺頭。他惘惘的å‘å·¦å³çœ‹ï¼Œå…¨è·Ÿè‘—馬蟻似的人,而在無æ„中,å»åœ¨è·¯æ—的人å¢ä¸­ç™¼è¦‹äº†ä¸€å€‹å³åª½ã€‚很久é•,伊原來在城è£åšå·¥äº†ã€‚阿Qå¿½ç„¶å¾ˆç¾žæ„§è‡ªå·±æ²’å¿—æ°£ï¼šç«Ÿæ²’æœ‰å”±å¹¾å¥æˆ²ã€‚ä»–çš„æ€æƒ³ä»¿ä½›æ—‹é¢¨ä¼¼çš„在腦è£ä¸€è¿´æ—‹ï¼šã€Šå°å­¤å­€ä¸Šå¢³ã€‹æ¬ å ‚皇,《é¾è™Žé¬¥ã€‹è£çš„“悔ä¸è©²â€¦â€¦â€ä¹Ÿå¤ªä¹ï¼Œé‚„是“手執鋼鞭將你打â€ç½·ã€‚ä»–åŒæ™‚想手一æšï¼Œçº”記得這兩手原來都æ†è‘—,於是“手執鋼鞭â€ä¹Ÿä¸å”±äº†ã€‚ +“éŽäº†äºŒåå¹´åˆæ˜¯ä¸€å€‹â€¦â€¦â€é˜¿Q在百忙中,“無師自通â€çš„說出åŠå¥å¾žä¾†ä¸èªªçš„話。 +“好ï¼ï¼ï¼â€å¾žäººå¢è£ï¼Œä¾¿ç™¼å‡ºè±ºç‹¼çš„å—¥å«ä¸€èˆ¬çš„è²éŸ³ä¾†ã€‚ +車å­ä¸ä½çš„å‰è¡Œï¼Œé˜¿Q在å–采è²ä¸­ï¼Œè¼ªè½‰çœ¼ç›åŽ»çœ‹å³åª½ï¼Œä¼¼ä¹Žä¼Šä¸€å‘並沒有見他,å»åªæ˜¯å‡ºç¥žçš„看著兵們背上的洋炮。 +阿Q於是å†çœ‹é‚£äº›å–采的人們 +é€™å‰Žé‚£ä¸­ï¼Œä»–çš„æ€æƒ³åˆä»¿ä½›æ—‹é¢¨ä¼¼çš„在腦è£ä¸€è¿´æ—‹äº†ã€‚四年之å‰ï¼Œä»–曾在山腳下é‡è¦‹ä¸€éš»é¤“狼,永是ä¸è¿‘ä¸é çš„跟定他,è¦åƒä»–çš„è‚‰ã€‚ä»–é‚£æ™‚åš‡å¾—å¹¾ä¹Žè¦æ­»ï¼Œå¹¸è€Œæ‰‹è£æœ‰ä¸€æŸ„斫柴刀,纔得仗這壯了膽,支æŒåˆ°æœªèŽŠï¼›å¯æ˜¯æ°¸é è¨˜å¾—那狼眼ç›ï¼Œåˆå‡¶åˆæ€¯ï¼Œé–ƒé–ƒçš„åƒå…©é¡†é¬¼ç«ï¼Œä¼¼ä¹Žé é çš„來穿é€äº†ä»–的皮肉。而這回他åˆçœ‹è¦‹å¾žä¾†æ²’有見éŽçš„æ›´å¯æ€•的眼ç›äº†ï¼Œåˆéˆåˆé‹’利,ä¸ä½†å·²ç¶“咀嚼了他的話,並且還è¦å’€åš¼ä»–皮肉以外的æ±è¥¿ï¼Œæ°¸æ˜¯ä¸è¿‘ä¸é çš„跟他走。 +這些ç›å€‘似乎連æˆä¸€æ°£ï¼Œå·²ç¶“在那è£å’¬ä»–çš„éˆé­‚。 +“救命,……†+然而阿Q沒有說。他早就兩眼發黑,耳朵è£å—¡çš„一è²ï¼Œè¦ºå¾—全身仿佛微塵似的迸散了。 +至於當時的影響,最大的倒å在舉人è€çˆºï¼Œå› ç‚ºçµ‚於沒有追贓,他全家都號啕了。其次是趙府,éžç‰¹ç§€æ‰å› ç‚ºä¸ŠåŸŽåŽ»å ±å®˜ï¼Œè¢«ä¸å¥½çš„é©å‘½é»¨å‰ªäº†è¾®å­ï¼Œè€Œä¸”åˆç ´è²»äº†äºŒååƒçš„賞錢,所以全家也號啕了。從這一天以來,他們便漸漸的都發生了éºè€çš„æ°£å‘³ã€‚ +至於輿論,在未莊是無異議,自然都說阿Qå£žï¼Œè¢«æ§æ–ƒä¾¿æ˜¯ä»–的壞的證據:ä¸å£žåˆä½•è‡³æ–¼è¢«æ§æ–ƒå‘¢ï¼Ÿè€ŒåŸŽè£çš„輿論å»ä¸ä½³ï¼Œä»–們多åŠä¸æ»¿è¶³ï¼Œä»¥ç‚ºæ§æ–ƒä¸¦ç„¡æ®ºé ­é€™èˆ¬å¥½çœ‹ï¼›è€Œä¸”那是怎樣的一個å¯ç¬‘çš„æ­»å›šå‘µï¼Œæ¸¸äº†é‚£éº¼ä¹…çš„è¡—ï¼Œç«Ÿæ²’æœ‰å”±ä¸€å¥æˆ²ï¼šä»–們白跟一趟了。 EOT; + protected static $encoding = 'UTF-8'; + protected static function explode($text) { $chars = array(); - foreach (preg_split('//u', preg_replace('/\s+/', '', $text)) as $char) { - if ($char !== '') { + + foreach (preg_split('//u', str_replace(PHP_EOL, '', $text)) as $char) { + if (! empty($char)) { $chars[] = $char; } } + return $chars; } protected static function strlen($text) { - return function_exists('mb_strlen') ? mb_strlen($text, 'UTF-8') : count(static::explode($text)); + return function_exists('mb_strlen') + ? mb_strlen($text, static::$encoding) + : count(static::explode($text)); } protected static function validStart($word) { - return !in_array($word, static::$notBeginPunct); + return ! in_array($word, static::$notBeginPunct); } protected static function appendEnd($text) { + $mbAvailable = extension_loaded('mbstring'); + // extract the last char of $text - if (function_exists('mb_substr')) { - $last = mb_substr($text, mb_strlen($text)-1, 'UTF-8'); + if ($mbAvailable) { + // in order to support php 5.3, third param use 1 instead of null + // https://secure.php.net/manual/en/function.mb-substr.php#refsect1-function.mb-substr-changelog + $last = mb_substr($text, mb_strlen($text, static::$encoding) - 1, 1, static::$encoding); } else { - $chars = static::split($text); - $last = end($chars); + $chars = static::utf8Encoding($text); + $last = $chars[count($chars) - 1]; } + // if the last char is a not-valid-end punctuation, remove it if (in_array($last, static::$notEndPunct)) { - $text = preg_replace('/.$/u', '', $text); + if ($mbAvailable) { + $text = mb_substr($text, 0, mb_strlen($text, static::$encoding) - 1, static::$encoding); + } else { + array_pop($chars); + $text = implode('', $chars); + } } + // if the last char is not a valid punctuation, append a default one. - return in_array($last, static::$endPunct) ? $text : $text.'。'; + return in_array($last, static::$endPunct) ? $text : $text . '。'; + } + + /** + * Convert original string to utf-8 encoding. + * + * @param string $text + * @return array + */ + protected static function utf8Encoding($text) + { + $encoding = array(); + + $chars = str_split($text); + + $countChars = count($chars); + + for ($i = 0; $i < $countChars; ++$i) { + $temp = $chars[$i]; + + $ord = ord($chars[$i]); + + switch (true) { + case $ord > 251: + $temp .= $chars[++$i]; + // no break + case $ord > 247: + $temp .= $chars[++$i]; + // no break + case $ord > 239: + $temp .= $chars[++$i]; + // no break + case $ord > 223: + $temp .= $chars[++$i]; + // no break + case $ord > 191: + $temp .= $chars[++$i]; + // no break + } + + $encoding[] = $temp; + } + + return $encoding; } } diff --git a/vendor/fzaninotto/faker/src/Faker/UniqueGenerator.php b/vendor/fzaninotto/faker/src/Faker/UniqueGenerator.php index 335882dd..431f7653 100644 --- a/vendor/fzaninotto/faker/src/Faker/UniqueGenerator.php +++ b/vendor/fzaninotto/faker/src/Faker/UniqueGenerator.php @@ -12,7 +12,11 @@ class UniqueGenerator protected $maxRetries; protected $uniques = array(); - public function __construct(Generator $generator, $maxRetries) + /** + * @param Generator $generator + * @param integer $maxRetries + */ + public function __construct(Generator $generator, $maxRetries = 10000) { $this->generator = $generator; $this->maxRetries = $maxRetries; @@ -20,6 +24,8 @@ class UniqueGenerator /** * Catch and proxy all generator calls but return only unique values + * @param string $attribute + * @return mixed */ public function __get($attribute) { @@ -28,6 +34,9 @@ class UniqueGenerator /** * Catch and proxy all generator calls with arguments but return only unique values + * @param string $name + * @param array $arguments + * @return mixed */ public function __call($name, $arguments) { @@ -41,8 +50,8 @@ class UniqueGenerator if ($i > $this->maxRetries) { throw new \OverflowException(sprintf('Maximum retries of %d reached without finding a unique value', $this->maxRetries)); } - } while (array_key_exists($res, $this->uniques[$name])); - $this->uniques[$name][$res]= null; + } while (array_key_exists(serialize($res), $this->uniques[$name])); + $this->uniques[$name][serialize($res)]= null; return $res; } diff --git a/vendor/fzaninotto/faker/src/Faker/ValidGenerator.php b/vendor/fzaninotto/faker/src/Faker/ValidGenerator.php new file mode 100644 index 00000000..1352dfc0 --- /dev/null +++ b/vendor/fzaninotto/faker/src/Faker/ValidGenerator.php @@ -0,0 +1,65 @@ +valid() + */ +class ValidGenerator +{ + protected $generator; + protected $validator; + protected $maxRetries; + + /** + * @param Generator $generator + * @param callable|null $validator + * @param integer $maxRetries + */ + public function __construct(Generator $generator, $validator = null, $maxRetries = 10000) + { + if (is_null($validator)) { + $validator = function () { + return true; + }; + } elseif (!is_callable($validator)) { + throw new \InvalidArgumentException('valid() only accepts callables as first argument'); + } + $this->generator = $generator; + $this->validator = $validator; + $this->maxRetries = $maxRetries; + } + + /** + * Catch and proxy all generator calls but return only valid values + * @param string $attribute + * + * @return mixed + */ + public function __get($attribute) + { + return $this->__call($attribute, array()); + } + + /** + * Catch and proxy all generator calls with arguments but return only valid values + * @param string $name + * @param array $arguments + * + * @return mixed + */ + public function __call($name, $arguments) + { + $i = 0; + do { + $res = call_user_func_array(array($this->generator, $name), $arguments); + $i++; + if ($i > $this->maxRetries) { + throw new \OverflowException(sprintf('Maximum retries of %d reached without finding a valid value', $this->maxRetries)); + } + } while (!call_user_func($this->validator, $res)); + + return $res; + } +} diff --git a/vendor/fzaninotto/faker/src/autoload.php b/vendor/fzaninotto/faker/src/autoload.php index 69324ba3..f55914de 100644 --- a/vendor/fzaninotto/faker/src/autoload.php +++ b/vendor/fzaninotto/faker/src/autoload.php @@ -10,7 +10,6 @@ spl_autoload_register(function ($className) { $className = ltrim($className, '\\'); $fileName = ''; - $namespace = ''; if ($lastNsPos = strripos($className, '\\')) { $namespace = substr($className, 0, $lastNsPos); $className = substr($className, $lastNsPos + 1); diff --git a/vendor/fzaninotto/faker/test/Faker/Calculator/LuhnTest.php b/vendor/fzaninotto/faker/test/Faker/Calculator/LuhnTest.php deleted file mode 100644 index c2170172..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Calculator/LuhnTest.php +++ /dev/null @@ -1,62 +0,0 @@ -assertInternalType('string', $checkDigit); - $this->assertEquals($checkDigit, Luhn::computeCheckDigit($partialNumber)); - } - - public function validatorProvider() - { - return array( - array('79927398710', false), - array('79927398711', false), - array('79927398712', false), - array('79927398713', true), - array('79927398714', false), - array('79927398715', false), - array('79927398716', false), - array('79927398717', false), - array('79927398718', false), - array('79927398719', false), - array(79927398713, true), - array(79927398714, false), - ); - } - - /** - * @dataProvider validatorProvider - */ - public function testIsValid($number, $isValid) - { - $this->assertEquals($isValid, Luhn::isValid($number)); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/DefaultGeneratorTest.php b/vendor/fzaninotto/faker/test/Faker/DefaultGeneratorTest.php deleted file mode 100644 index 262243d1..00000000 --- a/vendor/fzaninotto/faker/test/Faker/DefaultGeneratorTest.php +++ /dev/null @@ -1,27 +0,0 @@ -assertSame(null, $generator->value); - } - - public function testGeneratorReturnsDefaultValueForAnyPropertyGet() - { - $generator = new DefaultGenerator(123); - $this->assertSame(123, $generator->foo); - $this->assertNotSame(null, $generator->bar); - } - - public function testGeneratorReturnsDefaultValueForAnyMethodCall() - { - $generator = new DefaultGenerator(123); - $this->assertSame(123, $generator->foobar()); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/GeneratorTest.php b/vendor/fzaninotto/faker/test/Faker/GeneratorTest.php deleted file mode 100644 index 9fea4f86..00000000 --- a/vendor/fzaninotto/faker/test/Faker/GeneratorTest.php +++ /dev/null @@ -1,144 +0,0 @@ -addProvider(new FooProvider()); - $generator->addProvider(new BarProvider()); - $this->assertEquals('barfoo', $generator->format('fooFormatter')); - } - - public function testGetFormatterReturnsCallable() - { - $generator = new Generator; - $provider = new FooProvider(); - $generator->addProvider($provider); - $this->assertTrue(is_callable($generator->getFormatter('fooFormatter'))); - } - - public function testGetFormatterReturnsCorrectFormatter() - { - $generator = new Generator; - $provider = new FooProvider(); - $generator->addProvider($provider); - $expected = array($provider, 'fooFormatter'); - $this->assertEquals($expected, $generator->getFormatter('fooFormatter')); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testGetFormatterThrowsExceptionOnIncorrectProvider() - { - $generator = new Generator; - $generator->getFormatter('fooFormatter'); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testGetFormatterThrowsExceptionOnIncorrectFormatter() - { - $generator = new Generator; - $provider = new FooProvider(); - $generator->addProvider($provider); - $generator->getFormatter('barFormatter'); - } - - public function testFormatCallsFormatterOnProvider() - { - $generator = new Generator; - $provider = new FooProvider(); - $generator->addProvider($provider); - $this->assertEquals('foobar', $generator->format('fooFormatter')); - } - - public function testFormatTransfersArgumentsToFormatter() - { - $generator = new Generator; - $provider = new FooProvider(); - $generator->addProvider($provider); - $this->assertEquals('bazfoo', $generator->format('fooFormatterWithArguments', array('foo'))); - } - - public function testParseReturnsSameStringWhenItContainsNoCurlyBraces() - { - $generator = new Generator(); - $this->assertEquals('fooBar#?', $generator->parse('fooBar#?')); - } - - public function testParseReturnsStringWithTokensReplacedByFormatters() - { - $generator = new Generator(); - $provider = new FooProvider(); - $generator->addProvider($provider); - $this->assertEquals('This is foobar a text with foobar', $generator->parse('This is {{fooFormatter}} a text with {{ fooFormatter }}')); - } - - public function testMagicGetCallsFormat() - { - $generator = new Generator; - $provider = new FooProvider(); - $generator->addProvider($provider); - $this->assertEquals('foobar', $generator->fooFormatter); - } - - public function testMagicCallCallsFormat() - { - $generator = new Generator; - $provider = new FooProvider(); - $generator->addProvider($provider); - $this->assertEquals('foobar', $generator->fooFormatter()); - } - - public function testMagicCallCallsFormatWithArguments() - { - $generator = new Generator; - $provider = new FooProvider(); - $generator->addProvider($provider); - $this->assertEquals('bazfoo', $generator->fooFormatterWithArguments('foo')); - } - - public function testSeed() - { - $generator = new Generator; - - $generator->seed(0); - $mtRandWithSeedZero = mt_rand(); - $generator->seed(0); - $this->assertEquals($mtRandWithSeedZero, mt_rand(), 'seed(0) should be deterministic.'); - - $generator->seed(); - $mtRandWithoutSeed = mt_rand(); - $this->assertNotEquals($mtRandWithSeedZero, $mtRandWithoutSeed, 'seed() should be different than seed(0)'); - $generator->seed(); - $this->assertNotEquals($mtRandWithoutSeed, mt_rand(), 'seed() should not be deterministic.'); - } -} - -class FooProvider -{ - public function fooFormatter() - { - return 'foobar'; - } - - public function fooFormatterWithArguments($value = '') - { - return 'baz' . $value; - } -} - -class BarProvider -{ - public function fooFormatter() - { - return 'barfoo'; - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/AddressTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/AddressTest.php deleted file mode 100644 index cbabce56..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/AddressTest.php +++ /dev/null @@ -1,34 +0,0 @@ -addProvider(new Address($faker)); - $this->faker = $faker; - } - - public function testLatitude() - { - $latitude = $this->faker->latitude(); - $this->assertInternalType('float', $latitude); - $this->assertGreaterThanOrEqual(-90, $latitude); - $this->assertLessThanOrEqual(90, $latitude); - } - - public function testLongitude() - { - $longitude = $this->faker->longitude(); - $this->assertInternalType('float', $longitude); - $this->assertGreaterThanOrEqual(-180, $longitude); - $this->assertLessThanOrEqual(180, $longitude); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/BarcodeTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/BarcodeTest.php deleted file mode 100644 index a7ee6d98..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/BarcodeTest.php +++ /dev/null @@ -1,45 +0,0 @@ -addProvider(new Barcode($faker)); - $faker->seed(0); - $this->faker = $faker; - } - - public function testEan8() - { - $code = $this->faker->ean8(); - $this->assertRegExp('/^\d{8}$/i', $code); - $codeWitoutChecksum = substr($code, 0, -1); - $checksum = substr($code, -1); - $this->assertEquals(TestableBarcode::eanChecksum($codeWitoutChecksum), $checksum); - } - - public function testEan13() - { - $code = $this->faker->ean13(); - $this->assertRegExp('/^\d{13}$/i', $code); - $codeWitoutChecksum = substr($code, 0, -1); - $checksum = substr($code, -1); - $this->assertEquals(TestableBarcode::eanChecksum($codeWitoutChecksum), $checksum); - } -} - -class TestableBarcode extends Barcode -{ - public static function eanChecksum($input) - { - return parent::eanChecksum($input); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/BaseTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/BaseTest.php deleted file mode 100644 index 95e694ab..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/BaseTest.php +++ /dev/null @@ -1,446 +0,0 @@ -assertTrue(is_integer(BaseProvider::randomDigit())); - } - - public function testRandomDigitReturnsDigit() - { - $this->assertTrue(BaseProvider::randomDigit() >= 0); - $this->assertTrue(BaseProvider::randomDigit() < 10); - } - - public function testRandomDigitNotNullReturnsNotNullDigit() - { - $this->assertTrue(BaseProvider::randomDigitNotNull() > 0); - $this->assertTrue(BaseProvider::randomDigitNotNull() < 10); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testRandomNumberThrowsExceptionWhenCalledWithAMax() - { - BaseProvider::randomNumber(5, 200); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testRandomNumberThrowsExceptionWhenCalledWithATooHighNumberOfDigits() - { - BaseProvider::randomNumber(10); - } - - public function testRandomNumberReturnsInteger() - { - $this->assertTrue(is_integer(BaseProvider::randomNumber())); - $this->assertTrue(is_integer(BaseProvider::randomNumber(5, false))); - } - - public function testRandomNumberReturnsDigit() - { - $this->assertTrue(BaseProvider::randomNumber(3) >= 0); - $this->assertTrue(BaseProvider::randomNumber(3) < 1000); - } - - public function testRandomNumberAcceptsStrictParamToEnforceNumberSize() - { - $this->assertEquals(5, strlen((string) BaseProvider::randomNumber(5, true))); - } - - public function testNumberBetween() - { - $min = 5; - $max = 6; - - $this->assertGreaterThanOrEqual($min, BaseProvider::numberBetween($min, $max)); - $this->assertGreaterThanOrEqual(BaseProvider::numberBetween($min, $max), $max); - } - - public function testNumberBetweenAcceptsZeroAsMax() - { - $this->assertEquals(0, BaseProvider::numberBetween(0, 0)); - } - - public function testRandomFloat() - { - $min = 4; - $max = 10; - $nbMaxDecimals = 8; - - $result = BaseProvider::randomFloat($nbMaxDecimals, $min, $max); - - $parts = explode('.', $result); - - $this->assertInternalType('float', $result); - $this->assertGreaterThanOrEqual($min, $result); - $this->assertLessThanOrEqual($max, $result); - $this->assertLessThanOrEqual($nbMaxDecimals, strlen($parts[1])); - } - - public function testRandomLetterReturnsString() - { - $this->assertTrue(is_string(BaseProvider::randomLetter())); - } - - public function testRandomLetterReturnsSingleLetter() - { - $this->assertEquals(1, strlen(BaseProvider::randomLetter())); - } - - public function testRandomLetterReturnsLowercaseLetter() - { - $lowercaseLetters = 'abcdefghijklmnopqrstuvwxyz'; - $this->assertTrue(strpos($lowercaseLetters, BaseProvider::randomLetter()) !== false); - } - - public function testRandomAsciiReturnsString() - { - $this->assertTrue(is_string(BaseProvider::randomAscii())); - } - - public function testRandomAsciiReturnsSingleCharacter() - { - $this->assertEquals(1, strlen(BaseProvider::randomAscii())); - } - - public function testRandomAsciiReturnsAsciiCharacter() - { - $lowercaseLetters = '!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'; - $this->assertTrue(strpos($lowercaseLetters, BaseProvider::randomAscii()) !== false); - } - - public function testRandomElementReturnsNullWhenArrayEmpty() - { - $this->assertNull(BaseProvider::randomElement(array())); - } - - public function testRandomElementReturnsElementFromArray() - { - $elements = array('23', 'e', 32, '#'); - $this->assertContains(BaseProvider::randomElement($elements), $elements); - } - - public function testRandomElementReturnsElementFromAssociativeArray() - { - $elements = array('tata' => '23', 'toto' => 'e', 'tutu' => 32, 'titi' => '#'); - $this->assertContains(BaseProvider::randomElement($elements), $elements); - } - - public function testShuffleReturnsStringWhenPassedAStringArgument() - { - $this->assertInternalType('string', BaseProvider::shuffle('foo')); - } - - public function testShuffleReturnsArrayWhenPassedAnArrayArgument() - { - $this->assertInternalType('array', BaseProvider::shuffle(array(1, 2, 3))); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testShuffleThrowsExceptionWhenPassedAnInvalidArgument() - { - BaseProvider::shuffle(false); - } - - public function testShuffleArraySupportsEmptyArrays() - { - $this->assertEquals(array(), BaseProvider::shuffleArray(array())); - } - - public function testShuffleArrayReturnsAnArrayOfTheSameSize() - { - $array = array(1, 2, 3, 4, 5); - $this->assertSameSize($array, BaseProvider::shuffleArray($array)); - } - - public function testShuffleArrayReturnsAnArrayWithSameElements() - { - $array = array(2, 4, 6, 8, 10); - $shuffleArray = BaseProvider::shuffleArray($array); - $this->assertContains(2, $shuffleArray); - $this->assertContains(4, $shuffleArray); - $this->assertContains(6, $shuffleArray); - $this->assertContains(8, $shuffleArray); - $this->assertContains(10, $shuffleArray); - } - - public function testShuffleArrayReturnsADifferentArrayThanTheOriginal() - { - $arr = array(1, 2, 3, 4, 5); - $shuffledArray = BaseProvider::shuffleArray($arr); - $this->assertNotEquals($arr, $shuffledArray); - } - - public function testShuffleArrayLeavesTheOriginalArrayUntouched() - { - $arr = array(1, 2, 3, 4, 5); - BaseProvider::shuffleArray($arr); - $this->assertEquals($arr, array(1, 2, 3, 4, 5)); - } - - public function testShuffleStringSupportsEmptyStrings() - { - $this->assertEquals('', BaseProvider::shuffleString('')); - } - - public function testShuffleStringReturnsAnStringOfTheSameSize() - { - $string = 'abcdef'; - $this->assertEquals(strlen($string), strlen(BaseProvider::shuffleString($string))); - } - - public function testShuffleStringReturnsAnStringWithSameElements() - { - $string = 'acegi'; - $shuffleString = BaseProvider::shuffleString($string); - $this->assertContains('a', $shuffleString); - $this->assertContains('c', $shuffleString); - $this->assertContains('e', $shuffleString); - $this->assertContains('g', $shuffleString); - $this->assertContains('i', $shuffleString); - } - - public function testShuffleStringReturnsADifferentStringThanTheOriginal() - { - $string = 'abcdef'; - $shuffledString = BaseProvider::shuffleString($string); - $this->assertNotEquals($string, $shuffledString); - } - - public function testShuffleStringLeavesTheOriginalStringUntouched() - { - $string = 'abcdef'; - BaseProvider::shuffleString($string); - $this->assertEquals($string, 'abcdef'); - } - - public function testNumerifyReturnsSameStringWhenItContainsNoHashSign() - { - $this->assertEquals('fooBar?', BaseProvider::numerify('fooBar?')); - } - - public function testNumerifyReturnsStringWithHashSignsReplacedByDigits() - { - $this->assertRegExp('/foo\dBa\dr/', BaseProvider::numerify('foo#Ba#r')); - } - - public function testNumerifyReturnsStringWithPercentageSignsReplacedByDigits() - { - $this->assertRegExp('/foo\dBa\dr/', BaseProvider::numerify('foo%Ba%r')); - } - - public function testNumerifyReturnsStringWithPercentageSignsReplacedByNotNullDigits() - { - $this->assertNotEquals('0', BaseProvider::numerify('%')); - } - - public function testNumerifyCanGenerateALargeNumberOfDigits() - { - $largePattern = str_repeat('#', 20); // definitely larger than PHP_INT_MAX on all systems - $this->assertEquals(20, strlen(BaseProvider::numerify($largePattern))); - } - - public function testLexifyReturnsSameStringWhenItContainsNoQuestionMark() - { - $this->assertEquals('fooBar#', BaseProvider::lexify('fooBar#')); - } - - public function testLexifyReturnsStringWithQuestionMarksReplacedByLetters() - { - $this->assertRegExp('/foo[a-z]Ba[a-z]r/', BaseProvider::lexify('foo?Ba?r')); - } - - public function testBothifyCombinesNumerifyAndLexify() - { - $this->assertRegExp('/foo[a-z]Ba\dr/', BaseProvider::bothify('foo?Ba#r')); - } - - public function testAsciifyReturnsSameStringWhenItContainsNoStarSign() - { - $this->assertEquals('fooBar?', BaseProvider::asciify('fooBar?')); - } - - public function testAsciifyReturnsStringWithStarSignsReplacedByAsciiChars() - { - $this->assertRegExp('/foo.Ba.r/', BaseProvider::asciify('foo*Ba*r')); - } - - public function regexifyBasicDataProvider() - { - return array( - array('azeQSDF1234', 'azeQSDF1234', 'does not change non regex chars'), - array('foo(bar){1}', 'foobar', 'replaces regex characters'), - array('', '', 'supports empty string'), - array('/^foo(bar){1}$/', 'foobar', 'ignores regex delimiters') - ); - } - - /** - * @dataProvider regexifyBasicDataProvider - */ - public function testRegexifyBasicFeatures($input, $output, $message) - { - $this->assertEquals($output, BaseProvider::regexify($input), $message); - } - - public function regexifyDataProvider() - { - return array( - array('\d', 'numbers'), - array('\w', 'letters'), - array('(a|b)', 'alternation'), - array('[aeiou]', 'basic character class'), - array('[a-z]', 'character class range'), - array('[a-z1-9]', 'multiple character class range'), - array('a*b+c?', 'single character quantifiers'), - array('a{2}', 'brackets quantifiers'), - array('a{2,3}', 'min-max brackets quantifiers'), - array('[aeiou]{2,3}', 'brackets quantifiers on basic character class'), - array('[a-z]{2,3}', 'brackets quantifiers on character class range'), - array('(a|b){2,3}', 'brackets quantifiers on alternation'), - array('\.\*\?\+', 'escaped characters'), - array('[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}', 'complex regex') - ); - } - - /** - * @dataProvider regexifyDataProvider - */ - public function testRegexifySupportedRegexSyntax($pattern, $message) - { - $this->assertRegExp('/' . $pattern . '/', BaseProvider::regexify($pattern), 'Regexify supports ' . $message); - } - - public function testOptionalReturnsProviderValueWhenCalledWithWeight1() - { - $faker = new \Faker\Generator(); - $faker->addProvider(new \Faker\Provider\Base($faker)); - $this->assertNotNull($faker->optional(1)->randomDigit); - } - - public function testOptionalReturnsNullWhenCalledWithWeight0() - { - $faker = new \Faker\Generator(); - $faker->addProvider(new \Faker\Provider\Base($faker)); - $this->assertNull($faker->optional(0)->randomDigit); - } - - public function testOptionalAllowsChainingPropertyAccess() - { - $faker = new \Faker\Generator(); - $faker->addProvider(new \Faker\Provider\Base($faker)); - $faker->addProvider(new \ArrayObject(array(1))); // hack because method_exists forbids stubs - $this->assertEquals(1, $faker->optional(1)->count); - $this->assertNull($faker->optional(0)->count); - } - - public function testOptionalAllowsChainingMethodCall() - { - $faker = new \Faker\Generator(); - $faker->addProvider(new \Faker\Provider\Base($faker)); - $faker->addProvider(new \ArrayObject(array(1))); // hack because method_exists forbids stubs - $this->assertEquals(1, $faker->optional(1)->count()); - $this->assertNull($faker->optional(0)->count()); - } - - public function testOptionalAllowsChainingProviderCallRandomlyReturnNull() - { - $faker = new \Faker\Generator(); - $faker->addProvider(new \Faker\Provider\Base($faker)); - $values = array(); - for ($i=0; $i < 10; $i++) { - $values[]= $faker->optional()->randomDigit; - } - $this->assertContains(null, $values); - } - - public function testUniqueAllowsChainingPropertyAccess() - { - $faker = new \Faker\Generator(); - $faker->addProvider(new \Faker\Provider\Base($faker)); - $faker->addProvider(new \ArrayObject(array(1))); // hack because method_exists forbids stubs - $this->assertEquals(1, $faker->unique()->count); - } - - public function testUniqueAllowsChainingMethodCall() - { - $faker = new \Faker\Generator(); - $faker->addProvider(new \Faker\Provider\Base($faker)); - $faker->addProvider(new \ArrayObject(array(1))); // hack because method_exists forbids stubs - $this->assertEquals(1, $faker->unique()->count()); - } - - public function testUniqueReturnsOnlyUniqueValues() - { - $faker = new \Faker\Generator(); - $faker->addProvider(new \Faker\Provider\Base($faker)); - $values = array(); - for ($i=0; $i < 10; $i++) { - $values[]= $faker->unique()->randomDigit; - } - sort($values); - $this->assertEquals(array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), $values); - } - - /** - * @expectedException OverflowException - */ - public function testUniqueThrowsExceptionWhenNoUniqueValueCanBeGenerated() - { - $faker = new \Faker\Generator(); - $faker->addProvider(new \Faker\Provider\Base($faker)); - for ($i=0; $i < 11; $i++) { - $faker->unique()->randomDigit; - } - } - - public function testUniqueCanResetUniquesWhenPassedTrueAsArgument() - { - $faker = new \Faker\Generator(); - $faker->addProvider(new \Faker\Provider\Base($faker)); - $values = array(); - for ($i=0; $i < 10; $i++) { - $values[]= $faker->unique()->randomDigit; - } - $values[]= $faker->unique(true)->randomDigit; - for ($i=0; $i < 9; $i++) { - $values[]= $faker->unique()->randomDigit; - } - sort($values); - $this->assertEquals(array(0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9), $values); - } - - /** - * @expectedException LengthException - * @expectedExceptionMessage Cannot get 2 elements, only 1 in array - */ - public function testRandomElementsThrowsWhenRequestingTooManyKeys() - { - BaseProvider::randomElements(array('foo'), 2); - } - - public function testRandomElements() - { - $this->assertCount(1, BaseProvider::randomElements(), 'Should work without any input'); - - $empty = BaseProvider::randomElements(array(), 0); - $this->assertInternalType('array', $empty); - $this->assertCount(0, $empty); - - $shuffled = BaseProvider::randomElements(array('foo', 'bar', 'baz'), 3); - $this->assertContains('foo', $shuffled); - $this->assertContains('bar', $shuffled); - $this->assertContains('baz', $shuffled); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/BiasedTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/BiasedTest.php deleted file mode 100644 index 1f7a99ac..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/BiasedTest.php +++ /dev/null @@ -1,73 +0,0 @@ -generator = new Generator(); - $this->generator->addProvider(new Biased($this->generator)); - - $this->results = array_fill(1, self::MAX, 0); - } - - public function performFake($function) - { - for($i = 0; $i < self::NUMBERS; $i++) { - $this->results[$this->generator->biasedNumberBetween(1, self::MAX, $function)]++; - } - } - - public function testUnbiased() - { - $this->performFake(array('\Faker\Provider\Biased', 'unbiased')); - - // assert that all numbers are near the expected unbiased value - foreach ($this->results as $number => $amount) { - // integral - $assumed = (1 / self::MAX * $number) - (1 / self::MAX * ($number - 1)); - // calculate the fraction of the whole area - $assumed /= 1; - $this->assertGreaterThan(self::NUMBERS * $assumed * .95, $amount, "Value was more than 5 percent under the expected value"); - $this->assertLessThan(self::NUMBERS * $assumed * 1.05, $amount, "Value was more than 5 percent over the expected value"); - } - } - - public function testLinearHigh() - { - $this->performFake(array('\Faker\Provider\Biased', 'linearHigh')); - - foreach ($this->results as $number => $amount) { - // integral - $assumed = 0.5 * pow(1 / self::MAX * $number, 2) - 0.5 * pow(1 / self::MAX * ($number - 1), 2); - // calculate the fraction of the whole area - $assumed /= pow(1, 2) * .5; - $this->assertGreaterThan(self::NUMBERS * $assumed * .9, $amount, "Value was more than 10 percent under the expected value"); - $this->assertLessThan(self::NUMBERS * $assumed * 1.1, $amount, "Value was more than 10 percent over the expected value"); - } - } - - public function testLinearLow() - { - $this->performFake(array('\Faker\Provider\Biased', 'linearLow')); - - foreach ($this->results as $number => $amount) { - // integral - $assumed = -0.5 * pow(1 / self::MAX * $number, 2) - -0.5 * pow(1 / self::MAX * ($number - 1), 2); - // shift the graph up - $assumed += 1 / self::MAX; - // calculate the fraction of the whole area - $assumed /= pow(1, 2) * .5; - $this->assertGreaterThan(self::NUMBERS * $assumed * .9, $amount, "Value was more than 10 percent under the expected value"); - $this->assertLessThan(self::NUMBERS * $assumed * 1.1, $amount, "Value was more than 10 percent over the expected value"); - } - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/ColorTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/ColorTest.php deleted file mode 100644 index cdb4ab1a..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/ColorTest.php +++ /dev/null @@ -1,46 +0,0 @@ -assertRegExp('/^#[a-f0-9]{6}$/i', Color::hexColor()); - } - - public function testSafeHexColor() - { - $this->assertRegExp('/^#[a-f0-9]{6}$/i', Color::safeHexColor()); - } - - public function testRgbColorAsArray() - { - $this->assertEquals(3, count(Color::rgbColorAsArray())); - } - - public function testRgbColor() - { - $regexp = '([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])'; - $this->assertRegExp('/^' . $regexp . ',' . $regexp . ',' . $regexp . '$/i', Color::rgbColor()); - } - - public function testRgbCssColor() - { - $regexp = '([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])'; - $this->assertRegExp('/^rgb\(' . $regexp . ',' . $regexp . ',' . $regexp . '\)$/i', Color::rgbCssColor()); - } - - public function testSafeColorName() - { - $this->assertRegExp('/^[\w]+$/', Color::safeColorName()); - } - - public function testColorName() - { - $this->assertRegExp('/^[\w]+$/', Color::colorName()); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/DateTimeTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/DateTimeTest.php deleted file mode 100644 index 60310bde..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/DateTimeTest.php +++ /dev/null @@ -1,122 +0,0 @@ -assertInternalType('int', $timestamp); - $this->assertTrue($timestamp >= 0); - $this->assertTrue($timestamp <= time()); - } - - public function testDateTime() - { - $date = DateTimeProvider::dateTime(); - $this->assertInstanceOf('\DateTime', $date); - $this->assertGreaterThanOrEqual(new \DateTime('@0'), $date); - $this->assertLessThanOrEqual(new \DateTime(), $date); - } - - public function testDateTimeAD() - { - $date = DateTimeProvider::dateTimeAD(); - $this->assertInstanceOf('\DateTime', $date); - $this->assertGreaterThanOrEqual(new \DateTime('0000-01-01 00:00:00'), $date); - $this->assertLessThanOrEqual(new \DateTime(), $date); - } - - public function testIso8601() - { - $date = DateTimeProvider::iso8601(); - $this->assertRegExp('/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-Z](\d{4})?$/', $date); - $this->assertGreaterThanOrEqual(new \DateTime('@0'), new \DateTime($date)); - $this->assertLessThanOrEqual(new \DateTime(), new \DateTime($date)); - } - - public function testDate() - { - $date = DateTimeProvider::date(); - $this->assertRegExp('/^\d{4}-\d{2}-\d{2}$/', $date); - $this->assertGreaterThanOrEqual(new \DateTime('@0'), new \DateTime($date)); - $this->assertLessThanOrEqual(new \DateTime(), new \DateTime($date)); - } - - public function testTime() - { - $date = DateTimeProvider::time(); - $this->assertRegExp('/^\d{2}:\d{2}:\d{2}$/', $date); - } - - /** - * - * @dataProvider providerDateTimeBetween - */ - public function testDateTimeBetween($start, $end) - { - $date = DateTimeProvider::dateTimeBetween($start, $end); - $this->assertInstanceOf('\DateTime', $date); - $this->assertGreaterThanOrEqual(new \DateTime($start), $date); - $this->assertLessThanOrEqual(new \DateTime($end), $date); - } - - public function providerDateTimeBetween() - { - return array( - array('-1 year', false), - array('-1 year', null), - array('-1 day', '-1 hour'), - array('-1 day', 'now'), - ); - } - - public function testFixedSeedWithMaximumTimestamp() - { - $max = '2018-03-01 12:00:00'; - - mt_srand(1); - $unixTime = DateTimeProvider::unixTime($max); - $datetimeAD = DateTimeProvider::dateTimeAD($max); - $dateTime1 = DateTimeProvider::dateTime($max); - $dateTimeBetween = DateTimeProvider::dateTimeBetween('2014-03-01 06:00:00', $max); - $date = DateTimeProvider::date('Y-m-d', $max); - $time = DateTimeProvider::time('H:i:s', $max); - $iso8601 = DateTimeProvider::iso8601($max); - $dateTimeThisCentury = DateTimeProvider::dateTimeThisCentury($max); - $dateTimeThisDecade = DateTimeProvider::dateTimeThisDecade($max); - $dateTimeThisMonth = DateTimeProvider::dateTimeThisMonth($max); - $amPm = DateTimeProvider::amPm($max); - $dayOfMonth = DateTimeProvider::dayOfMonth($max); - $dayOfWeek = DateTimeProvider::dayOfWeek($max); - $month = DateTimeProvider::month($max); - $monthName = DateTimeProvider::monthName($max); - $year = DateTimeProvider::year($max); - $dateTimeThisYear = DateTimeProvider::dateTimeThisYear($max); - mt_srand(); - - //regenerate Random Date with same seed and same maximum end timestamp - mt_srand(1); - $this->assertEquals($unixTime, DateTimeProvider::unixTime($max)); - $this->assertEquals($datetimeAD, DateTimeProvider::dateTimeAD($max)); - $this->assertEquals($dateTime1, DateTimeProvider::dateTime($max)); - $this->assertEquals($dateTimeBetween, DateTimeProvider::dateTimeBetween('2014-03-01 06:00:00', $max)); - $this->assertEquals($date, DateTimeProvider::date('Y-m-d', $max)); - $this->assertEquals($time, DateTimeProvider::time('H:i:s', $max)); - $this->assertEquals($iso8601, DateTimeProvider::iso8601($max)); - $this->assertEquals($dateTimeThisCentury, DateTimeProvider::dateTimeThisCentury($max)); - $this->assertEquals($dateTimeThisDecade, DateTimeProvider::dateTimeThisDecade($max)); - $this->assertEquals($dateTimeThisMonth, DateTimeProvider::dateTimeThisMonth($max)); - $this->assertEquals($amPm, DateTimeProvider::amPm($max)); - $this->assertEquals($dayOfMonth, DateTimeProvider::dayOfMonth($max)); - $this->assertEquals($dayOfWeek, DateTimeProvider::dayOfWeek($max)); - $this->assertEquals($month, DateTimeProvider::month($max)); - $this->assertEquals($monthName, DateTimeProvider::monthName($max)); - $this->assertEquals($year, DateTimeProvider::year($max)); - $this->assertEquals($dateTimeThisYear, DateTimeProvider::dateTimeThisYear($max)); - mt_srand(); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/ImageTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/ImageTest.php deleted file mode 100644 index 0535d4da..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/ImageTest.php +++ /dev/null @@ -1,62 +0,0 @@ -assertRegExp('#^http://lorempixel.com/640/480/#', Image::imageUrl()); - } - - public function testImageUrlAcceptsCustomWidthAndHeight() - { - $this->assertRegExp('#^http://lorempixel.com/800/400/#', Image::imageUrl(800, 400)); - } - - public function testImageUrlAcceptsCustomCategory() - { - $this->assertRegExp('#^http://lorempixel.com/800/400/nature/#', Image::imageUrl(800, 400, 'nature')); - } - - public function testImageUrlAcceptsCustomText() - { - $this->assertRegExp('#^http://lorempixel.com/800/400/nature/Faker#', Image::imageUrl(800, 400, 'nature', false, 'Faker')); - } - - public function testImageUrlAddsARandomGetParameterByDefault() - { - $url = Image::imageUrl(800, 400); - $splitUrl = preg_split('/\?/', $url); - - $this->assertEquals(count($splitUrl), 2); - $this->assertRegexp('#\d{5}#', $splitUrl[1]); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testUrlWithDimensionsAndBadCategory() - { - Image::imageUrl(800, 400, 'bullhonky'); - } - - public function testDownloadWithDefaults() - { - $file = Image::image(sys_get_temp_dir()); - $this->assertFileExists($file); - if (function_exists('getimagesize')) { - list($width, $height, $type, $attr) = getimagesize($file); - $this->assertEquals(640, $width); - $this->assertEquals(480, $height); - $this->assertEquals(constant('IMAGETYPE_JPEG'), $type); - } else { - $this->assertEquals('jpg', pathinfo($file, PATHINFO_EXTENSION)); - } - if (file_exists($file)) { - unlink($file); - } - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/InternetTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/InternetTest.php deleted file mode 100644 index fcd750b1..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/InternetTest.php +++ /dev/null @@ -1,120 +0,0 @@ -addProvider(new Lorem($faker)); - $faker->addProvider(new Person($faker)); - $faker->addProvider(new Internet($faker)); - $faker->addProvider(new Company($faker)); - $this->faker = $faker; - } - - public function localeDataProvider() - { - $providerPath = realpath(__DIR__ . '/../../../src/Faker/Provider'); - $localePaths = array_filter(glob($providerPath . '/*', GLOB_ONLYDIR)); - foreach ($localePaths as $path) { - $parts = explode('/', $path); - $locales[] = array($parts[count($parts) - 1]); - } - - return $locales; - } - - /** - * @link http://stackoverflow.com/questions/12026842/how-to-validate-an-email-address-in-php - * - * @requires PHP 5.4 - * @dataProvider localeDataProvider - */ - public function testEmailIsValid($locale) - { - $this->loadLocalProviders($locale); - $pattern = '/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD'; - $emailAddress = $this->faker->email(); - $this->assertRegExp($pattern, $emailAddress); - } - - /** - * @requires PHP 5.4 - * @dataProvider localeDataProvider - */ - public function testUsernameIsValid($locale) - { - $this->loadLocalProviders($locale); - $pattern = '/^[A-Za-z0-9._]+$/'; - $username = $this->faker->username(); - $this->assertRegExp($pattern, $username); - } - - public function loadLocalProviders($locale) - { - $providerPath = realpath(__DIR__ . '/../../../src/Faker/Provider'); - if (file_exists($providerPath.'/'.$locale.'/Internet.php')) { - $internet = "\\Faker\\Provider\\$locale\\Internet"; - $this->faker->addProvider(new $internet($this->faker)); - } - if (file_exists($providerPath.'/'.$locale.'/Person.php')) { - $person = "\\Faker\\Provider\\$locale\\Person"; - $this->faker->addProvider(new $person($this->faker)); - } - if (file_exists($providerPath.'/'.$locale.'/Company.php')) { - $company = "\\Faker\\Provider\\$locale\\Company"; - $this->faker->addProvider(new $company($this->faker)); - } - } - - public function testPasswordIsValid() - { - $this->assertRegexp('/^.{6}$/', $this->faker->password(6, 6)); - } - - public function testSlugIsValid() - { - $pattern = '/^[a-z0-9-]+$/'; - $slug = $this->faker->slug(); - $this->assertSame(preg_match($pattern, $slug), 1); - } - - public function testUrlIsValid() - { - $url = $this->faker->url(); - $this->assertNotFalse(filter_var($url, FILTER_VALIDATE_URL)); - } - - public function testLocalIpv4() - { - $this->assertNotFalse(filter_var(Internet::localIpv4(), FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)); - } - - public function testIpv4() - { - $this->assertNotFalse(filter_var($this->faker->ipv4(), FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)); - } - - public function testIpv6() - { - $this->assertNotFalse(filter_var($this->faker->ipv6(), FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)); - } - - public function testMacAddress() - { - $this->assertRegExp('/^([0-9A-F]{2}[:]){5}([0-9A-F]{2})$/i', Internet::macAddress()); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/LocalizationTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/LocalizationTest.php deleted file mode 100644 index 347b1351..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/LocalizationTest.php +++ /dev/null @@ -1,26 +0,0 @@ -assertNotNull($faker->name(), 'Localized Name Provider ' . $matches[1] . ' does not throw errors'); - } - } - - public function testLocalizedAddressProvidersDoNotThrowErrors() - { - foreach (glob(__DIR__ . '/../../../src/Faker/Provider/*/Address.php') as $localizedAddress) { - preg_match('#/([a-zA-Z_]+)/Address\.php#', $localizedAddress, $matches); - $faker = Factory::create($matches[1]); - $this->assertNotNull($faker->address(), 'Localized Address Provider ' . $matches[1] . ' does not throw errors'); - } - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/LoremTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/LoremTest.php deleted file mode 100644 index 62785d43..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/LoremTest.php +++ /dev/null @@ -1,108 +0,0 @@ -assertEquals('Word word word word.', TestableLorem::text(24)); - } - - public function testTextReturnsSentencesWhenAskedSizeLessThan100() - { - $this->assertEquals('This is a test sentence. This is a test sentence. This is a test sentence.', TestableLorem::text(99)); - } - - public function testTextReturnsParagraphsWhenAskedSizeGreaterOrEqualThanThan100() - { - $this->assertEquals('This is a test paragraph. It has three sentences. Exactly three.', TestableLorem::text(100)); - } - - public function testSentenceWithZeroNbWordsReturnsEmptyString() - { - $this->assertEquals('', Lorem::sentence(0)); - } - - public function testSentenceWithNegativeNbWordsReturnsEmptyString() - { - $this->assertEquals('', Lorem::sentence(-1)); - } - - public function testParagraphWithZeroNbSentencesReturnsEmptyString() - { - $this->assertEquals('', Lorem::paragraph(0)); - } - - public function testParagraphWithNegativeNbSentencesReturnsEmptyString() - { - $this->assertEquals('', Lorem::paragraph(-1)); - } - - public function testSentenceWithPositiveNbWordsReturnsAtLeastOneWord() - { - $sentence = Lorem::sentence(1); - - $this->assertGreaterThan(1, strlen($sentence)); - $this->assertGreaterThanOrEqual(1, count(explode(' ', $sentence))); - } - - public function testParagraphWithPositiveNbSentencesReturnsAtLeastOneWord() - { - $paragraph = Lorem::paragraph(1); - - $this->assertGreaterThan(1, strlen($paragraph)); - $this->assertGreaterThanOrEqual(1, count(explode(' ', $paragraph))); - } - - public function testWordssAsText() - { - $words = TestableLorem::words(2, true); - - $this->assertEquals('word word', $words); - } - - public function testSentencesAsText() - { - $sentences = TestableLorem::sentences(2, true); - - $this->assertEquals('This is a test sentence. This is a test sentence.', $sentences); - } - - public function testParagraphsAsText() - { - $paragraphs = TestableLorem::paragraphs(2, true); - - $expected = "This is a test paragraph. It has three sentences. Exactly three.\n\nThis is a test paragraph. It has three sentences. Exactly three."; - $this->assertEquals($expected, $paragraphs); - } -} - -class TestableLorem extends Lorem -{ - - public static function word() - { - return 'word'; - } - - public static function sentence($nbWords = 5, $variableNbWords = true) - { - return 'This is a test sentence.'; - } - - public static function paragraph($nbSentences = 3, $variableNbSentences = true) - { - return 'This is a test paragraph. It has three sentences. Exactly three.'; - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/MiscellaneousTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/MiscellaneousTest.php deleted file mode 100644 index 6a4c5591..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/MiscellaneousTest.php +++ /dev/null @@ -1,54 +0,0 @@ -assertContains(Miscellaneous::boolean(), array(true, false)); - } - - public function testMd5() - { - $this->assertRegExp('/^[a-z0-9]{32}$/', Miscellaneous::md5()); - } - - public function testSha1() - { - $this->assertRegExp('/^[a-z0-9]{40}$/', Miscellaneous::sha1()); - } - - public function testSha256() - { - $this->assertRegExp('/^[a-z0-9]{64}$/', Miscellaneous::sha256()); - } - - public function testLocale() - { - $this->assertRegExp('/^[a-z]{2,3}_[A-Z]{2}$/', Miscellaneous::locale()); - } - - public function testCountryCode() - { - $this->assertRegExp('/^[A-Z]{2}$/', Miscellaneous::countryCode()); - } - - public function testCountryISOAlpha3() - { - $this->assertRegExp('/^[A-Z]{3}$/', Miscellaneous::countryISOAlpha3()); - } - - public function testLanguage() - { - $this->assertRegExp('/^[a-z]{2}$/', Miscellaneous::languageCode()); - } - - public function testCurrencyCode() - { - $this->assertRegExp('/^[A-Z]{3}$/', Miscellaneous::currencyCode()); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/PaymentTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/PaymentTest.php deleted file mode 100644 index 0f20d91f..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/PaymentTest.php +++ /dev/null @@ -1,68 +0,0 @@ -addProvider(new BaseProvider($faker)); - $faker->addProvider(new DateTimeProvider($faker)); - $faker->addProvider(new PersonProvider($faker)); - $faker->addProvider(new PaymentProvider($faker)); - $this->faker = $faker; - } - - public function testCreditCardTypeReturnsValidVendorName() - { - $this->assertTrue(in_array($this->faker->creditCardType, array('Visa', 'MasterCard', 'American Express', 'Discover Card'))); - } - - public function creditCardNumberProvider() - { - return array( - array('Discover Card', '/^6011\d{12}$/'), - array('Visa', '/^4\d{12,15}$/'), - array('MasterCard', '/^5[1-5]\d{14}$/') - ); - } - - /** - * @dataProvider creditCardNumberProvider - */ - public function testCreditCardNumberReturnsValidCreditCardNumber($type, $regexp) - { - $cardNumber = $this->faker->creditCardNumber($type); - $this->assertRegExp($regexp, $cardNumber); - $this->assertTrue(Luhn::isValid($cardNumber)); - } - - public function testCreditCardNumberCanFormatOutput() - { - $this->assertRegExp('/^6011-\d{4}-\d{4}-\d{4}$/', $this->faker->creditCardNumber('Discover Card', true)); - } - - public function testCreditCardExpirationDateReturnsValidDateByDefault() - { - $expirationDate = $this->faker->creditCardExpirationDate; - $this->assertTrue(intval($expirationDate->format('U')) > strtotime('now')); - $this->assertTrue(intval($expirationDate->format('U')) < strtotime('+36 months')); - } - - public function testRandomCard() - { - $cardDetails = $this->faker->creditCardDetails; - $this->assertEquals(count($cardDetails), 4); - $this->assertEquals(array('type', 'number', 'name', 'expirationDate'), array_keys($cardDetails)); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/PersonTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/PersonTest.php deleted file mode 100644 index a8d1c0f2..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/PersonTest.php +++ /dev/null @@ -1,86 +0,0 @@ -addProvider(new Person($faker)); - $this->assertContains($faker->firstName($gender), $expected); - } - - public function firstNameProvider() - { - return array( - array(null, array('John', 'Jane')), - array('foobar', array('John', 'Jane')), - array('male', array('John')), - array('female', array('Jane')), - ); - } - - public function testFirstNameMale() - { - $this->assertContains(Person::firstNameMale(), array('John')); - } - - public function testFirstNameFemale() - { - $this->assertContains(Person::firstNameFemale(), array('Jane')); - } - - /** - * @dataProvider titleProvider - */ - public function testTitle($gender, $expected) - { - $faker = new Generator(); - $faker->addProvider(new Person($faker)); - $this->assertContains($faker->title($gender), $expected); - } - - public function titleProvider() - { - return array( - array(null, array('Mr.', 'Mrs.', 'Ms.', 'Miss', 'Dr.', 'Prof.')), - array('foobar', array('Mr.', 'Mrs.', 'Ms.', 'Miss', 'Dr.', 'Prof.')), - array('male', array('Mr.', 'Dr.', 'Prof.')), - array('female', array('Mrs.', 'Ms.', 'Miss', 'Dr.', 'Prof.')), - ); - } - - public function testTitleMale() - { - $this->assertContains(Person::titleMale(), array('Mr.', 'Dr.', 'Prof.')); - } - - public function testTitleFemale() - { - $this->assertContains(Person::titleFemale(), array('Mrs.', 'Ms.', 'Miss', 'Dr.', 'Prof.')); - } - - public function testLastNameReturnsDoe() - { - $faker = new Generator(); - $faker->addProvider(new Person($faker)); - $this->assertEquals($faker->lastName(), 'Doe'); - } - - public function testNameReturnsFirstNameAndLastName() - { - $faker = new Generator(); - $faker->addProvider(new Person($faker)); - $this->assertContains($faker->name(), array('John Doe', 'Jane Doe')); - $this->assertContains($faker->name('foobar'), array('John Doe', 'Jane Doe')); - $this->assertContains($faker->name('male'), array('John Doe')); - $this->assertContains($faker->name('female'), array('Jane Doe')); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/ProviderOverrideTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/ProviderOverrideTest.php deleted file mode 100644 index 68f75ae6..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/ProviderOverrideTest.php +++ /dev/null @@ -1,189 +0,0 @@ - - */ - -namespace Faker\Test\Provider; - -use Faker; - -/** - * Class ProviderOverrideTest - * - * @package Faker\Test\Provider - * - * This class tests a large portion of all locale specific providers. It does not test the entire stack, because each - * locale specific provider (can) has specific implementations. The goal of this test is to test the common denominator - * and to try to catch possible invalid multi-byte sequences. - */ -class ProviderOverrideTest extends \PHPUnit_Framework_TestCase -{ - /** - * Constants with regular expression patterns for testing the output. - * - * Regular expressions are sensitive for malformed strings (e.g.: strings with incorrect encodings) so by using - * PCRE for the tests, even though they seem fairly pointless, we test for incorrect encodings also. - */ - const TEST_STRING_REGEX = '/.+/u'; - - /** - * Slightly more specific for e-mail, the point isn't to properly validate e-mails. - */ - const TEST_EMAIL_REGEX = '/^(.+)@(.+)$/ui'; - - /** - * @dataProvider localeDataProvider - * @param string $locale - */ - public function testAddress($locale = null) - { - $faker = Faker\Factory::create($locale); - - $this->assertRegExp(static::TEST_STRING_REGEX, $faker->city); - $this->assertRegExp(static::TEST_STRING_REGEX, $faker->postcode); - $this->assertRegExp(static::TEST_STRING_REGEX, $faker->address); - $this->assertRegExp(static::TEST_STRING_REGEX, $faker->country); - } - - - /** - * @dataProvider localeDataProvider - * @param string $locale - */ - public function testCompany($locale = null) - { - $faker = Faker\Factory::create($locale); - - $this->assertRegExp(static::TEST_STRING_REGEX, $faker->company); - } - - - /** - * @dataProvider localeDataProvider - * @param string $locale - */ - public function testDateTime($locale = null) - { - $faker = Faker\Factory::create($locale); - - $this->assertRegExp(static::TEST_STRING_REGEX, $faker->century); - $this->assertRegExp(static::TEST_STRING_REGEX, $faker->timezone); - } - - - /** - * @dataProvider localeDataProvider - * @param string $locale - */ - public function testInternet($locale = null) - { - $faker = Faker\Factory::create($locale); - - $this->assertRegExp(static::TEST_STRING_REGEX, $faker->userName); - - $this->assertRegExp(static::TEST_EMAIL_REGEX, $faker->email); - $this->assertRegExp(static::TEST_EMAIL_REGEX, $faker->safeEmail); - $this->assertRegExp(static::TEST_EMAIL_REGEX, $faker->freeEmail); - $this->assertRegExp(static::TEST_EMAIL_REGEX, $faker->companyEmail); - } - - - /** - * @dataProvider localeDataProvider - * @param string $locale - */ - public function testPerson($locale = null) - { - $faker = Faker\Factory::create($locale); - - $this->assertRegExp(static::TEST_STRING_REGEX, $faker->name); - $this->assertRegExp(static::TEST_STRING_REGEX, $faker->title); - $this->assertRegExp(static::TEST_STRING_REGEX, $faker->firstName); - $this->assertRegExp(static::TEST_STRING_REGEX, $faker->lastName); - } - - - /** - * @dataProvider localeDataProvider - * @param string $locale - */ - public function testPhoneNumber($locale = null) - { - $faker = Faker\Factory::create($locale); - - $this->assertRegExp(static::TEST_STRING_REGEX, $faker->phoneNumber); - } - - - /** - * @dataProvider localeDataProvider - * @param string $locale - */ - public function testUserAgent($locale = null) - { - $faker = Faker\Factory::create($locale); - - $this->assertRegExp(static::TEST_STRING_REGEX, $faker->userAgent); - } - - - /** - * @dataProvider localeDataProvider - * - * @param null $locale - * @param string $locale - */ - public function testUuid($locale = null) - { - $faker = Faker\Factory::create($locale); - - $this->assertRegExp(static::TEST_STRING_REGEX, $faker->uuid); - } - - - /** - * @return array - */ - public function localeDataProvider() - { - $locales = $this->getAllLocales(); - $data = array(); - - foreach ($locales as $locale) { - $data[] = array( - $locale - ); - } - - return $data; - } - - - /** - * Returns all locales as array values - * - * @return array - */ - private function getAllLocales() - { - static $locales = array(); - - if ( ! empty($locales)) { - return $locales; - } - - // Finding all PHP files in the xx_XX directories - $providerDir = __DIR__ .'/../../../src/Faker/Provider'; - foreach (glob($providerDir .'/*_*/*.php') as $file) { - $localisation = basename(dirname($file)); - - if (isset($locales[ $localisation ])) { - continue; - } - - $locales[ $localisation ] = $localisation; - } - - return $locales; - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/TextTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/TextTest.php deleted file mode 100644 index 3baf49f3..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/TextTest.php +++ /dev/null @@ -1,54 +0,0 @@ -addProvider(new Text($generator)); - $generator->seed(0); - - $lengths = array(10, 20, 50, 70, 90, 120, 150, 200, 500); - - foreach ($lengths as $length) { - $this->assertLessThan($length, $generator->realText($length)); - } - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testTextMaxIndex() - { - $generator = new Generator(); - $generator->addProvider(new Text($generator)); - $generator->seed(0); - $generator->realText(200, 11); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testTextMinIndex() - { - $generator = new Generator(); - $generator->addProvider(new Text($generator)); - $generator->seed(0); - $generator->realText(200, 0); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testTextMinLength() - { - $generator = new Generator(); - $generator->addProvider(new Text($generator)); - $generator->seed(0); - $generator->realText(9); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/UserAgentTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/UserAgentTest.php deleted file mode 100644 index b45b9f86..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/UserAgentTest.php +++ /dev/null @@ -1,38 +0,0 @@ -assertNotNull(UserAgent::userAgent()); - } - - public function testFirefoxUserAgent() - { - $this->stringContains(' Firefox/', UserAgent::firefox()); - } - - public function testSafariUserAgent() - { - $this->stringContains('Safari/', UserAgent::safari()); - } - - public function testInternetExplorerUserAgent() - { - $this->assertStringStartsWith('Mozilla/5.0 (compatible; MSIE ', UserAgent::internetExplorer()); - } - - public function testOperaUserAgent() - { - $this->assertStringStartsWith('Opera/', UserAgent::opera()); - } - - public function testChromeUserAgent() - { - $this->stringContains('(KHTML, like Gecko) Chrome/', UserAgent::chrome()); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/UuidTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/UuidTest.php deleted file mode 100644 index fceb8dfe..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/UuidTest.php +++ /dev/null @@ -1,26 +0,0 @@ -assertTrue($this->isUuid($uuid)); - } - - public function testUuidExpectedSeed() - { - mt_srand(123); - $this->assertEquals("8e2e0c84-50dd-367c-9e66-f3ab455c78d6", BaseProvider::uuid()); - $this->assertEquals("073eb60a-902c-30ab-93d0-a94db371f6c8", BaseProvider::uuid()); - } - - protected function isUuid($uuid) - { - return is_string($uuid) && (bool) preg_match('/^[a-f0-9]{8,8}-(?:[a-f0-9]{4,4}-){3,3}[a-f0-9]{12,12}$/i', $uuid); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/at_AT/PaymentTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/at_AT/PaymentTest.php deleted file mode 100644 index afc8c27b..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/at_AT/PaymentTest.php +++ /dev/null @@ -1,30 +0,0 @@ -addProvider(new Payment($faker)); - $this->faker = $faker; - } - - public function testVatIsValid() - { - $vat = $this->faker->vat(); - $unspacedVat = $this->faker->vat(false); - $this->assertRegExp('/^(AT U\d{8})$/', $vat); - $this->assertRegExp('/^(ATU\d{8})$/', $unspacedVat); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/be_BE/PaymentTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/be_BE/PaymentTest.php deleted file mode 100644 index d253b05c..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/be_BE/PaymentTest.php +++ /dev/null @@ -1,30 +0,0 @@ -addProvider(new Payment($faker)); - $this->faker = $faker; - } - - public function testVatIsValid() - { - $vat = $this->faker->vat(); - $unspacedVat = $this->faker->vat(false); - $this->assertRegExp('/^(BE 0\d{9})$/', $vat); - $this->assertRegExp('/^(BE0\d{9})$/', $unspacedVat); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/bg_BG/PaymentTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/bg_BG/PaymentTest.php deleted file mode 100644 index 31c6325c..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/bg_BG/PaymentTest.php +++ /dev/null @@ -1,30 +0,0 @@ -addProvider(new Payment($faker)); - $this->faker = $faker; - } - - public function testVatIsValid() - { - $vat = $this->faker->vat(); - $unspacedVat = $this->faker->vat(false); - $this->assertRegExp('/^(BG \d{9,10})$/', $vat); - $this->assertRegExp('/^(BG\d{9,10})$/', $unspacedVat); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/de_AT/InternetTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/de_AT/InternetTest.php deleted file mode 100644 index 91ce5ca5..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/de_AT/InternetTest.php +++ /dev/null @@ -1,32 +0,0 @@ -addProvider(new Person($faker)); - $faker->addProvider(new Internet($faker)); - $faker->addProvider(new Company($faker)); - $this->faker = $faker; - } - - public function testEmailIsValid() - { - $email = $this->faker->email(); - $this->assertNotFalse(filter_var($email, FILTER_VALIDATE_EMAIL)); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/de_AT/PhoneNumberTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/de_AT/PhoneNumberTest.php deleted file mode 100644 index 2d61ad5e..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/de_AT/PhoneNumberTest.php +++ /dev/null @@ -1,28 +0,0 @@ -addProvider(new PhoneNumber($faker)); - $this->faker = $faker; - } - - public function testPhoneNumberFormat() - { - $number = $this->faker->phoneNumber; - $this->assertRegExp('/^06\d{2} \d{7}|\+43 \d{4} \d{4}(-\d{2})?$/', $number); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/fr_FR/CompanyTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/fr_FR/CompanyTest.php deleted file mode 100644 index 5486cf9d..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/fr_FR/CompanyTest.php +++ /dev/null @@ -1,74 +0,0 @@ -addProvider(new Company($faker)); - $this->faker = $faker; - } - - public function testSiretReturnsAValidSiret() - { - $siret = $this->faker->siret(false); - $this->assertRegExp("/^\d{14}$/", $siret); - $this->assertTrue(Luhn::isValid($siret)); - } - - public function testSiretReturnsAWellFormattedSiret() - { - $siret = $this->faker->siret(); - $this->assertRegExp("/^\d{3}\s\d{3}\s\d{3}\s\d{5}$/", $siret); - $siret = str_replace(' ', '', $siret); - $this->assertTrue(Luhn::isValid($siret)); - } - - public function testSirenReturnsAValidSiren() - { - $siren = $this->faker->siren(false); - $this->assertRegExp("/^\d{9}$/", $siren); - $this->assertTrue(Luhn::isValid($siren)); - } - - public function testSirenReturnsAWellFormattedSiren() - { - $siren = $this->faker->siren(); - $this->assertRegExp("/^\d{3}\s\d{3}\s\d{3}$/", $siren); - $siren = str_replace(' ', '', $siren); - $this->assertTrue(Luhn::isValid($siren)); - } - - public function testCatchPhraseReturnsValidCatchPhrase() - { - $this->assertTrue(TestableCompany::isCatchPhraseValid($this->faker->catchPhrase())); - } - - public function testIsCatchPhraseValidReturnsFalseWhenAWordsAppearsTwice() - { - $isCatchPhraseValid = TestableCompany::isCatchPhraseValid('La sécurité de rouler en toute sécurité'); - $this->assertFalse($isCatchPhraseValid); - } - - public function testIsCatchPhraseValidReturnsTrueWhenNoWordAppearsTwice() - { - $isCatchPhraseValid = TestableCompany::isCatchPhraseValid('La sécurité de rouler en toute simplicité'); - $this->assertTrue($isCatchPhraseValid); - } -} - -class TestableCompany extends Company -{ - public static function isCatchPhraseValid($catchPhrase) - { - return parent::isCatchPhraseValid($catchPhrase); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/id_ID/PersonTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/id_ID/PersonTest.php deleted file mode 100644 index abd039f0..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/id_ID/PersonTest.php +++ /dev/null @@ -1,40 +0,0 @@ -addProvider(new Person($faker)); - $this->faker = $faker; - } - - public function testIfFirstNameMaleCanReturnData() - { - $firstNameMale = $this->faker->firstNameMale(); - $this->assertNotEmpty($firstNameMale); - } - - public function testIfLastNameMaleCanReturnData() - { - $lastNameMale = $this->faker->lastNameMale(); - $this->assertNotEmpty($lastNameMale); - } - - public function testIfFirstNameFemaleCanReturnData() - { - $firstNameFemale = $this->faker->firstNameFemale(); - $this->assertNotEmpty($firstNameFemale); - } - - public function testIfLastNameFemaleCanReturnData() - { - $lastNameFemale = $this->faker->lastNameFemale(); - $this->assertNotEmpty($lastNameFemale); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/ja_JP/PersonTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/ja_JP/PersonTest.php deleted file mode 100755 index 97fc566c..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/ja_JP/PersonTest.php +++ /dev/null @@ -1,36 +0,0 @@ -addProvider(new Person($faker)); - $faker->seed(1); - - $this->assertEquals('アオタ ミノル', $faker->kanaName); - } - - public function testFirstKanaNameReturnsHaruka() - { - $faker = new Generator(); - $faker->addProvider(new Person($faker)); - $faker->seed(1); - - $this->assertEquals('ãƒãƒ«ã‚«', $faker->firstKanaName); - } - - public function testLastKanaNameReturnsNakajima() - { - $faker = new Generator(); - $faker->addProvider(new Person($faker)); - $faker->seed(1); - - $this->assertEquals('ナカジマ', $faker->lastKanaName); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/pt_BR/CompanyTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/pt_BR/CompanyTest.php deleted file mode 100644 index f59142bd..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/pt_BR/CompanyTest.php +++ /dev/null @@ -1,25 +0,0 @@ -addProvider(new Company($faker)); - $this->faker = $faker; - } - - public function testCnpjFormatIsValid() - { - $cnpj = $this->faker->cnpj(false); - $this->assertRegExp('/\d{8}\d{4}\d{2}/', $cnpj); - $cnpj = $this->faker->cnpj(true); - $this->assertRegExp('/\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}/', $cnpj); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/pt_BR/PersonTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/pt_BR/PersonTest.php deleted file mode 100644 index 767c1887..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/pt_BR/PersonTest.php +++ /dev/null @@ -1,33 +0,0 @@ -addProvider(new Person($faker)); - $this->faker = $faker; - } - - public function testCpfFormatIsValid() - { - $cpf = $this->faker->cpf(false); - $this->assertRegExp('/\d{9}\d{2}/', $cpf); - $cpf = $this->faker->cpf(true); - $this->assertRegExp('/\d{3}\.\d{3}\.\d{3}-\d{2}/', $cpf); - } - - public function testRgFormatIsValid() - { - $rg = $this->faker->rg(false); - $this->assertRegExp('/\d{8}\d/', $rg); - $rg = $this->faker->rg(true); - $this->assertRegExp('/\d{2}\.\d{3}\.\d{3}-[0-9X]/', $rg); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/AddressTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/AddressTest.php deleted file mode 100644 index d2adc158..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/AddressTest.php +++ /dev/null @@ -1,30 +0,0 @@ -addProvider(new Address($faker)); - $this->faker = $faker; - } - - public function testPostCodeIsValid() - { - $main = '[1-9]{1}[0-9]{2}[0,1,4,5,9]{1}'; - $pattern = "/^($main)|($main-[0-9]{3})+$/"; - $postcode = $this->faker->postcode(); - $this->assertSame(preg_match($pattern, $postcode), 1, $postcode); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/PersonTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/PersonTest.php deleted file mode 100644 index 9bfb7a2f..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/PersonTest.php +++ /dev/null @@ -1,52 +0,0 @@ -addProvider(new Person($faker)); - $this->faker = $faker; - } - - public function testTaxpayerIdentificationNumberIsValid() - { - $tin = $this->faker->taxpayerIdentificationNumber(); - $this->assertTrue($this->isValidTin($tin), $tin); - } - - /** - * - * @link http://pt.wikipedia.org/wiki/N%C3%BAmero_de_identifica%C3%A7%C3%A3o_fiscal - * - * @param type $tin - * - * @return boolean - */ - public static function isValidTin($tin) - { - $regex = '(([1,2,3,5,6,8]{1}[0-9]{8})|((45)|(70)|(71)|(72)|(77)|(79)|(90|(98|(99))))[0-9]{7})'; - if (is_null($tin) || !is_numeric($tin) || !strlen($tin) == 9 || preg_match("/$regex/", $tin) !== 1) { - return false; - } - $n = str_split($tin); - // cd - Control Digit - $cd = ($n[0] * 9 + $n[1] * 8 + $n[2] * 7 + $n[3] * 6 + $n[4] * 5 + $n[5] * 4 + $n[6] * 3 + $n[7] * 2) % 11; - if ($cd === 0 || $cd === 1) { - $cd = 0; - } else { - $cd = 11 - $cd; - } - if ($cd === intval($n[8])) { - return true; - } - - return false; - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/PhoneNumberTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/PhoneNumberTest.php deleted file mode 100644 index 04b2f63d..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/PhoneNumberTest.php +++ /dev/null @@ -1,25 +0,0 @@ -addProvider(new PhoneNumber($faker)); - $this->faker = $faker; - } - - public function testPhoneNumberReturnsPhoneNumberWithOrWithoutPrefix() - { - $this->assertRegExp('/^(9[1,2,3,6][0-9]{7})|(2[0-9]{8})|(\+351 [2][0-9]{8})|(\+351 9[1,2,3,6][0-9]{7})/', $this->faker->phoneNumber()); - } - public function testMobileNumberReturnsMobileNumberWithOrWithoutPrefix() - { - $this->assertRegExp('/^(9[1,2,3,6][0-9]{7})/', $this->faker->mobileNumber()); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/ro_RO/PersonTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/ro_RO/PersonTest.php deleted file mode 100644 index 5816b63c..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/ro_RO/PersonTest.php +++ /dev/null @@ -1,95 +0,0 @@ -seed(1); - $faker->addProvider(new DateTime($faker)); - $faker->addProvider(new Person($faker)); - $this->faker = $faker; - } - - public function testCnpReturnsValidCnp() - { - $cnp = $this->faker->cnp; - $this->assertTrue($this->isValidCnp($cnp)); - } - - public function testCnpReturnsMaleCnp() - { - $cnp = $this->faker->cnp('m'); - $this->assertRegExp('/^[1357]\d{12}$/', $cnp); - } - - public function testCnpReturnsFemaleCnp() - { - $cnp = $this->faker->cnp('f'); - $this->assertRegExp('/^[2468]\d{12}$/', $cnp); - } - - public function testCnpReturns1800sCnp() - { - $cnp = $this->faker->cnp(null, 1800); - $this->assertRegExp('/^[34]\d{12}$/', $cnp); - } - - public function testCnpReturns1900sCnp() - { - $cnp = $this->faker->cnp(null, 1900); - $this->assertRegExp('/^[12]\d{12}$/', $cnp); - } - - public function testCnpReturns2000sCnp() - { - $cnp = $this->faker->cnp(null, 2000); - $this->assertRegExp('/^[56]\d{12}$/', $cnp); - } - - public function testCnpReturnsBrasovCnp() - { - $cnp = $this->faker->cnp(null, null, 'BV'); - $this->assertRegExp('/^\d{7}08\d{4}$/', $cnp); - } - - public function testCnpReturns2000sClujFemaleCnp() - { - $cnp = $this->faker->cnp('f', 2000, 'CJ'); - $this->assertRegExp('/^6\d{6}12\d{4}$/', $cnp); - } - - protected function isValidCnp($cnp) - { - if ( - is_string($cnp) - && (bool) preg_match(static::TEST_CNP_REGEX, $cnp) - && checkdate(substr($cnp, 3, 2), substr($cnp, 5, 2), substr($cnp, 1, 2)) - ){ - $checkNumber = 279146358279; - - $checksum = 0; - foreach (range(0, 11) as $digit) { - $checksum += substr($cnp, $digit, 1) * substr($checkNumber, $digit, 1); - } - $checksum = $checksum % 11; - - if ( - ($checksum < 10 && $checksum == substr($cnp, -1)) - || ($checksum == 10 && substr($cnp, -1) == 1) - ){ - return true; - } - } - - return false; - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/ro_RO/PhoneNumberTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/ro_RO/PhoneNumberTest.php deleted file mode 100644 index 97314d5f..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/ro_RO/PhoneNumberTest.php +++ /dev/null @@ -1,31 +0,0 @@ -addProvider(new PhoneNumber($faker)); - $this->faker = $faker; - } - - public function testPhoneNumberReturnsNormalPhoneNumber() - { - $this->assertRegExp('/^0(?:[23][13-7]|7\d)\d{7}$/', $this->faker->phoneNumber()); - } - - public function testTollFreePhoneNumberReturnsTollFreePhoneNumber() - { - $this->assertRegExp('/^08(?:0[1267]|70)\d{6}$/', $this->faker->tollFreePhoneNumber()); - } - - public function testPremiumRatePhoneNumberReturnsPremiumRatePhoneNumber() - { - $this->assertRegExp('/^090[036]\d{6}$/', $this->faker->premiumRatePhoneNumber()); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/sv_SE/PersonTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/sv_SE/PersonTest.php deleted file mode 100644 index 623723a6..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/sv_SE/PersonTest.php +++ /dev/null @@ -1,60 +0,0 @@ -addProvider(new Person($faker)); - $this->faker = $faker; - } - - public function provideSeedAndExpectedReturn() - { - return array( - array(1, '720727', '720727-5798'), - array(2, '710414', '710414-5664'), - array(3, '591012', '591012-4519'), - array(4, '180307', '180307-0356'), - array(5, '820904', '820904-7748') - ); - } - - /** - * @dataProvider provideSeedAndExpectedReturn - */ - public function testPersonalIdentityNumberUsesBirthDateIfProvided($seed, $birthdate, $expected) - { - $faker = $this->faker; - $faker->seed($seed); - $pin = $faker->personalIdentityNumber(\DateTime::createFromFormat('ymd', $birthdate)); - $this->assertEquals($expected, $pin); - } - - public function testPersonalIdentityNumberGeneratesLuhnCompliantNumbers() - { - $pin = str_replace('-', '', $this->faker->personalIdentityNumber()); - $this->assertTrue(Luhn::isValid($pin)); - } - - public function testPersonalIdentityNumberGeneratesOddValuesForMales() - { - $pin = $this->faker->personalIdentityNumber(null, 'male'); - $this->assertEquals(1, $pin{9} % 2); - } - - public function testPersonalIdentityNumberGeneratesEvenValuesForFemales() - { - $pin = $this->faker->personalIdentityNumber(null, 'female'); - $this->assertEquals(0, $pin{9} % 2); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/uk_UA/AddressTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/uk_UA/AddressTest.php deleted file mode 100644 index a3e38d73..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/uk_UA/AddressTest.php +++ /dev/null @@ -1,80 +0,0 @@ -addProvider(new Address($faker)); - $this->faker = $faker; - } - - public function testPostCodeIsValid() - { - $main = '[0-9]{5}'; - $pattern = "/^($main)|($main-[0-9]{3})+$/"; - $postcode = $this->faker->postcode; - $this->assertRegExp($pattern, $postcode, 'Post code ' . $postcode . ' is wrong!'); - } - - public function testEmptySuffixes() - { - $this->assertEmpty($this->faker->citySuffix, 'City suffix should be empty!'); - $this->assertEmpty($this->faker->streetSuffix, 'Street suffix should be empty!'); - } - - public function testStreetCyrOnly() - { - $pattern = "/[0-9Ð-ЩЯІЇЄЮа-щÑіїєюьIVXCM][0-9Ð-ЩЯІЇЄЮа-щÑіїєюь \'-.]*[Ð-Яа-Ñ.]/u"; - $streetName = $this->faker->streetName; - $this->assertSame( - preg_match($pattern, $streetName), - 1, - 'Street name ' . $streetName . ' is wrong!' - ); - } - - public function testCityNameCyrOnly() - { - $pattern = "/[Ð-ЩЯІЇЄЮа-щÑіїєюь][0-9Ð-ЩЯІЇЄЮа-щÑіїєюь \'-]*[Ð-Яа-Ñ]/u"; - $city = $this->faker->city; - $this->assertSame( - preg_match($pattern, $city), - 1, - 'City name ' . $city . ' is wrong!' - ); - } - - public function testRegionNameCyrOnly() - { - $pattern = "/[Ð-ЩЯІЇЄЮ][Ð-ЩЯІЇЄЮа-щÑіїєюь]*а$/u"; - $regionName = $this->faker->region; - $this->assertSame( - preg_match($pattern, $regionName), - 1, - 'Region name ' . $regionName . ' is wrong!' - ); - } - - public function testCountryCyrOnly() - { - $pattern = "/[Ð-ЩЯІЇЄЮа-щÑіїєюьIVXCM][Ð-ЩЯІЇЄЮа-щÑіїєюь \'-]*[Ð-Яа-Ñ.]/u"; - $country = $this->faker->country; - $this->assertSame( - preg_match($pattern, $country), - 1, - 'Country name ' . $country . ' is wrong!' - ); - } -} diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/uk_UA/PhoneNumberTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/uk_UA/PhoneNumberTest.php deleted file mode 100644 index 13620c72..00000000 --- a/vendor/fzaninotto/faker/test/Faker/Provider/uk_UA/PhoneNumberTest.php +++ /dev/null @@ -1,35 +0,0 @@ -addProvider(new PhoneNumber($faker)); - $this->faker = $faker; - } - - public function testPhoneNumberFormat() - { - $pattern = "/((\+38)(((\(\d{3}\))\d{7}|(\(\d{4}\))\d{6})|(\d{8})))|0\d{9}/"; - $phoneNumber = $this->faker->phoneNumber; - $this->assertSame( - preg_match($pattern, $phoneNumber), - 1, - 'Phone number format ' . $phoneNumber . ' is wrong!' - ); - - } - -} diff --git a/vendor/fzaninotto/faker/test/documentor.php b/vendor/fzaninotto/faker/test/documentor.php deleted file mode 100644 index 1051ea28..00000000 --- a/vendor/fzaninotto/faker/test/documentor.php +++ /dev/null @@ -1,16 +0,0 @@ -seed(1); -$documentor = new Faker\Documentor($generator); -?> -getFormatters() as $provider => $formatters): ?> - -### `` - - $example): ?> - // - - -seed(5); - -echo ''; -?> - - - - -boolean(25)): ?> - - -
- streetAddress ?> - city ?> - postcode ?> - state ?> -
- -boolean(33)): ?> - bs ?> - -boolean(33)): ?> - - - -boolean(15)): ?> -
-text(400) ?> -]]> -
- -
- -
diff --git a/vendor/laravelcollective/html/src/FormBuilder.php b/vendor/laravelcollective/html/src/FormBuilder.php index 3dc5a1d3..7c0dfe55 100644 --- a/vendor/laravelcollective/html/src/FormBuilder.php +++ b/vendor/laravelcollective/html/src/FormBuilder.php @@ -331,9 +331,9 @@ class FormBuilder * * @return \Illuminate\Support\HtmlString */ - public function password($name, $value = null, $options = []) + public function password($name, $options = []) { - return $this->input('password', $name, $value, $options); + return $this->input('password', $name, '', $options); } /** diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php similarity index 100% rename from vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php rename to vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php diff --git a/vendor/phpunit/phpunit/src/Util/Fileloader.php b/vendor/phpunit/phpunit/src/Util/FileLoader.php similarity index 100% rename from vendor/phpunit/phpunit/src/Util/Fileloader.php rename to vendor/phpunit/phpunit/src/Util/FileLoader.php diff --git a/vendor/psr/cache/README.md b/vendor/psr/cache/README.md index 9855a318..c8706cee 100644 --- a/vendor/psr/cache/README.md +++ b/vendor/psr/cache/README.md @@ -1,12 +1,9 @@ -Caching Interface -============== +PSR Cache +========= -This repository holds all interfaces related to [PSR-6 (Caching Interface)][psr-url]. +This repository holds all interfaces defined by +[PSR-6](http://www.php-fig.org/psr/psr-6/). -Note that this is not a Caching implementation of its own. It is merely interfaces that describe the components of a Caching mechanism. - -The installable [package][package-url] and [implementations][implementation-url] are listed on Packagist. - -[psr-url]: https://www.php-fig.org/psr/psr-6/ -[package-url]: https://packagist.org/packages/psr/cache -[implementation-url]: https://packagist.org/providers/psr/cache-implementation +Note that this is not a Cache implementation of its own. It is merely an +interface that describes a Cache implementation. See the specification for more +details. diff --git a/vendor/psr/cache/composer.json b/vendor/psr/cache/composer.json index 4b687971..e828fec9 100644 --- a/vendor/psr/cache/composer.json +++ b/vendor/psr/cache/composer.json @@ -6,11 +6,11 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "homepage": "http://www.php-fig.org/" } ], "require": { - "php": ">=8.0.0" + "php": ">=5.3.0" }, "autoload": { "psr-4": { diff --git a/vendor/psr/cache/src/CacheException.php b/vendor/psr/cache/src/CacheException.php index bb785f46..e27f22f8 100644 --- a/vendor/psr/cache/src/CacheException.php +++ b/vendor/psr/cache/src/CacheException.php @@ -5,6 +5,6 @@ namespace Psr\Cache; /** * Exception interface for all exceptions thrown by an Implementing Library. */ -interface CacheException extends \Throwable +interface CacheException { } diff --git a/vendor/psr/cache/src/CacheItemInterface.php b/vendor/psr/cache/src/CacheItemInterface.php index 2b2e4bb8..63d05dd1 100644 --- a/vendor/psr/cache/src/CacheItemInterface.php +++ b/vendor/psr/cache/src/CacheItemInterface.php @@ -32,7 +32,7 @@ interface CacheItemInterface * @return string * The key string for this cache item. */ - public function getKey(): string; + public function getKey(); /** * Retrieves the value of the item from the cache associated with this object's key. @@ -46,7 +46,7 @@ interface CacheItemInterface * @return mixed * The value corresponding to this cache item's key, or null if not found. */ - public function get(): mixed; + public function get(); /** * Confirms if the cache item lookup resulted in a cache hit. @@ -57,7 +57,7 @@ interface CacheItemInterface * @return bool * True if the request resulted in a cache hit. False otherwise. */ - public function isHit(): bool; + public function isHit(); /** * Sets the value represented by this cache item. @@ -72,12 +72,12 @@ interface CacheItemInterface * @return static * The invoked object. */ - public function set(mixed $value): static; + public function set($value); /** * Sets the expiration time for this cache item. * - * @param ?\DateTimeInterface $expiration + * @param \DateTimeInterface|null $expiration * The point in time after which the item MUST be considered expired. * If null is passed explicitly, a default value MAY be used. If none is set, * the value should be stored permanently or for as long as the @@ -86,7 +86,7 @@ interface CacheItemInterface * @return static * The called object. */ - public function expiresAt(?\DateTimeInterface $expiration): static; + public function expiresAt($expiration); /** * Sets the expiration time for this cache item. @@ -101,5 +101,5 @@ interface CacheItemInterface * @return static * The called object. */ - public function expiresAfter(int|\DateInterval|null $time): static; + public function expiresAfter($time); } diff --git a/vendor/psr/cache/src/CacheItemPoolInterface.php b/vendor/psr/cache/src/CacheItemPoolInterface.php index 4b3017c7..03514196 100644 --- a/vendor/psr/cache/src/CacheItemPoolInterface.php +++ b/vendor/psr/cache/src/CacheItemPoolInterface.php @@ -29,7 +29,7 @@ interface CacheItemPoolInterface * @return CacheItemInterface * The corresponding Cache Item. */ - public function getItem(string $key): CacheItemInterface; + public function getItem($key); /** * Returns a traversable set of cache items. @@ -41,13 +41,13 @@ interface CacheItemPoolInterface * If any of the keys in $keys are not a legal value a \Psr\Cache\InvalidArgumentException * MUST be thrown. * - * @return iterable - * An iterable collection of Cache Items keyed by the cache keys of + * @return array|\Traversable + * A traversable collection of Cache Items keyed by the cache keys of * each item. A Cache item will be returned for each key, even if that * key is not found. However, if no keys are specified then an empty * traversable MUST be returned instead. */ - public function getItems(array $keys = []): iterable; + public function getItems(array $keys = array()); /** * Confirms if the cache contains specified cache item. @@ -66,7 +66,7 @@ interface CacheItemPoolInterface * @return bool * True if item exists in the cache, false otherwise. */ - public function hasItem(string $key): bool; + public function hasItem($key); /** * Deletes all items in the pool. @@ -74,7 +74,7 @@ interface CacheItemPoolInterface * @return bool * True if the pool was successfully cleared. False if there was an error. */ - public function clear(): bool; + public function clear(); /** * Removes the item from the pool. @@ -89,14 +89,14 @@ interface CacheItemPoolInterface * @return bool * True if the item was successfully removed. False if there was an error. */ - public function deleteItem(string $key): bool; + public function deleteItem($key); /** * Removes multiple items from the pool. * * @param string[] $keys * An array of keys that should be removed from the pool. - * + * @throws InvalidArgumentException * If any of the keys in $keys are not a legal value a \Psr\Cache\InvalidArgumentException * MUST be thrown. @@ -104,7 +104,7 @@ interface CacheItemPoolInterface * @return bool * True if the items were successfully removed. False if there was an error. */ - public function deleteItems(array $keys): bool; + public function deleteItems(array $keys); /** * Persists a cache item immediately. @@ -115,7 +115,7 @@ interface CacheItemPoolInterface * @return bool * True if the item was successfully persisted. False if there was an error. */ - public function save(CacheItemInterface $item): bool; + public function save(CacheItemInterface $item); /** * Sets a cache item to be persisted later. @@ -126,7 +126,7 @@ interface CacheItemPoolInterface * @return bool * False if the item could not be queued or if a commit was attempted and failed. True otherwise. */ - public function saveDeferred(CacheItemInterface $item): bool; + public function saveDeferred(CacheItemInterface $item); /** * Persists any deferred cache items. @@ -134,5 +134,5 @@ interface CacheItemPoolInterface * @return bool * True if all not-yet-saved items were successfully saved or there were none. False otherwise. */ - public function commit(): bool; + public function commit(); } diff --git a/vendor/psr/log/Psr/Log/AbstractLogger.php b/vendor/psr/log/Psr/Log/AbstractLogger.php new file mode 100644 index 00000000..e02f9daf --- /dev/null +++ b/vendor/psr/log/Psr/Log/AbstractLogger.php @@ -0,0 +1,128 @@ +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 mixed[] $context + * + * @return void + */ + public function alert($message, array $context = array()) + { + $this->log(LogLevel::ALERT, $message, $context); + } + + /** + * Critical conditions. + * + * Example: Application component unavailable, unexpected exception. + * + * @param string $message + * @param mixed[] $context + * + * @return void + */ + public function critical($message, array $context = array()) + { + $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 mixed[] $context + * + * @return void + */ + public function error($message, array $context = array()) + { + $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 mixed[] $context + * + * @return void + */ + public function warning($message, array $context = array()) + { + $this->log(LogLevel::WARNING, $message, $context); + } + + /** + * Normal but significant events. + * + * @param string $message + * @param mixed[] $context + * + * @return void + */ + public function notice($message, array $context = array()) + { + $this->log(LogLevel::NOTICE, $message, $context); + } + + /** + * Interesting events. + * + * Example: User logs in, SQL logs. + * + * @param string $message + * @param mixed[] $context + * + * @return void + */ + public function info($message, array $context = array()) + { + $this->log(LogLevel::INFO, $message, $context); + } + + /** + * Detailed debug information. + * + * @param string $message + * @param mixed[] $context + * + * @return void + */ + public function debug($message, array $context = array()) + { + $this->log(LogLevel::DEBUG, $message, $context); + } +} diff --git a/vendor/psr/log/src/InvalidArgumentException.php b/vendor/psr/log/Psr/Log/InvalidArgumentException.php similarity index 100% rename from vendor/psr/log/src/InvalidArgumentException.php rename to vendor/psr/log/Psr/Log/InvalidArgumentException.php diff --git a/vendor/psr/log/src/LogLevel.php b/vendor/psr/log/Psr/Log/LogLevel.php similarity index 100% rename from vendor/psr/log/src/LogLevel.php rename to vendor/psr/log/Psr/Log/LogLevel.php diff --git a/vendor/psr/log/src/LoggerAwareInterface.php b/vendor/psr/log/Psr/Log/LoggerAwareInterface.php similarity index 100% rename from vendor/psr/log/src/LoggerAwareInterface.php rename to vendor/psr/log/Psr/Log/LoggerAwareInterface.php diff --git a/vendor/psr/log/src/LoggerAwareTrait.php b/vendor/psr/log/Psr/Log/LoggerAwareTrait.php similarity index 88% rename from vendor/psr/log/src/LoggerAwareTrait.php rename to vendor/psr/log/Psr/Log/LoggerAwareTrait.php index 5f1553a4..82bf45c8 100644 --- a/vendor/psr/log/src/LoggerAwareTrait.php +++ b/vendor/psr/log/Psr/Log/LoggerAwareTrait.php @@ -12,7 +12,7 @@ trait LoggerAwareTrait * * @var LoggerInterface|null */ - protected ?LoggerInterface $logger = null; + protected $logger; /** * Sets a logger. diff --git a/vendor/psr/log/src/LoggerInterface.php b/vendor/psr/log/Psr/Log/LoggerInterface.php similarity index 67% rename from vendor/psr/log/src/LoggerInterface.php rename to vendor/psr/log/Psr/Log/LoggerInterface.php index b4d062b9..2206cfde 100644 --- a/vendor/psr/log/src/LoggerInterface.php +++ b/vendor/psr/log/Psr/Log/LoggerInterface.php @@ -22,12 +22,12 @@ interface LoggerInterface /** * System is unusable. * - * @param string|\Stringable $message + * @param string $message * @param mixed[] $context * * @return void */ - public function emergency(string|\Stringable $message, array $context = []); + public function emergency($message, array $context = array()); /** * Action must be taken immediately. @@ -35,35 +35,35 @@ interface LoggerInterface * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * - * @param string|\Stringable $message + * @param string $message * @param mixed[] $context * * @return void */ - public function alert(string|\Stringable $message, array $context = []); + public function alert($message, array $context = array()); /** * Critical conditions. * * Example: Application component unavailable, unexpected exception. * - * @param string|\Stringable $message + * @param string $message * @param mixed[] $context * * @return void */ - public function critical(string|\Stringable $message, array $context = []); + public function critical($message, array $context = array()); /** * Runtime errors that do not require immediate action but should typically * be logged and monitored. * - * @param string|\Stringable $message + * @param string $message * @param mixed[] $context * * @return void */ - public function error(string|\Stringable $message, array $context = []); + public function error($message, array $context = array()); /** * Exceptional occurrences that are not errors. @@ -71,55 +71,55 @@ interface LoggerInterface * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * - * @param string|\Stringable $message + * @param string $message * @param mixed[] $context * * @return void */ - public function warning(string|\Stringable $message, array $context = []); + public function warning($message, array $context = array()); /** * Normal but significant events. * - * @param string|\Stringable $message + * @param string $message * @param mixed[] $context * * @return void */ - public function notice(string|\Stringable $message, array $context = []); + public function notice($message, array $context = array()); /** * Interesting events. * * Example: User logs in, SQL logs. * - * @param string|\Stringable $message + * @param string $message * @param mixed[] $context * * @return void */ - public function info(string|\Stringable $message, array $context = []); + public function info($message, array $context = array()); /** * Detailed debug information. * - * @param string|\Stringable $message + * @param string $message * @param mixed[] $context * * @return void */ - public function debug(string|\Stringable $message, array $context = []); + public function debug($message, array $context = array()); /** * Logs with an arbitrary level. * * @param mixed $level - * @param string|\Stringable $message + * @param string $message * @param mixed[] $context * * @return void * * @throws \Psr\Log\InvalidArgumentException */ - public function log($level, string|\Stringable $message, array $context = []); + public function log($level, $message, array $context = array()); } diff --git a/vendor/psr/log/src/LoggerTrait.php b/vendor/psr/log/Psr/Log/LoggerTrait.php similarity index 70% rename from vendor/psr/log/src/LoggerTrait.php rename to vendor/psr/log/Psr/Log/LoggerTrait.php index 920bda77..e392fef0 100644 --- a/vendor/psr/log/src/LoggerTrait.php +++ b/vendor/psr/log/Psr/Log/LoggerTrait.php @@ -15,12 +15,12 @@ trait LoggerTrait /** * System is unusable. * - * @param string|\Stringable $message + * @param string $message * @param array $context * * @return void */ - public function emergency(string|\Stringable $message, array $context = []) + public function emergency($message, array $context = array()) { $this->log(LogLevel::EMERGENCY, $message, $context); } @@ -31,12 +31,12 @@ trait LoggerTrait * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * - * @param string|\Stringable $message + * @param string $message * @param array $context * * @return void */ - public function alert(string|\Stringable $message, array $context = []) + public function alert($message, array $context = array()) { $this->log(LogLevel::ALERT, $message, $context); } @@ -46,12 +46,12 @@ trait LoggerTrait * * Example: Application component unavailable, unexpected exception. * - * @param string|\Stringable $message + * @param string $message * @param array $context * * @return void */ - public function critical(string|\Stringable $message, array $context = []) + public function critical($message, array $context = array()) { $this->log(LogLevel::CRITICAL, $message, $context); } @@ -60,12 +60,12 @@ trait LoggerTrait * Runtime errors that do not require immediate action but should typically * be logged and monitored. * - * @param string|\Stringable $message + * @param string $message * @param array $context * * @return void */ - public function error(string|\Stringable $message, array $context = []) + public function error($message, array $context = array()) { $this->log(LogLevel::ERROR, $message, $context); } @@ -76,12 +76,12 @@ trait LoggerTrait * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * - * @param string|\Stringable $message + * @param string $message * @param array $context * * @return void */ - public function warning(string|\Stringable $message, array $context = []) + public function warning($message, array $context = array()) { $this->log(LogLevel::WARNING, $message, $context); } @@ -89,12 +89,12 @@ trait LoggerTrait /** * Normal but significant events. * - * @param string|\Stringable $message + * @param string $message * @param array $context * * @return void */ - public function notice(string|\Stringable $message, array $context = []) + public function notice($message, array $context = array()) { $this->log(LogLevel::NOTICE, $message, $context); } @@ -104,12 +104,12 @@ trait LoggerTrait * * Example: User logs in, SQL logs. * - * @param string|\Stringable $message + * @param string $message * @param array $context * * @return void */ - public function info(string|\Stringable $message, array $context = []) + public function info($message, array $context = array()) { $this->log(LogLevel::INFO, $message, $context); } @@ -117,12 +117,12 @@ trait LoggerTrait /** * Detailed debug information. * - * @param string|\Stringable $message + * @param string $message * @param array $context * * @return void */ - public function debug(string|\Stringable $message, array $context = []) + public function debug($message, array $context = array()) { $this->log(LogLevel::DEBUG, $message, $context); } @@ -131,12 +131,12 @@ trait LoggerTrait * Logs with an arbitrary level. * * @param mixed $level - * @param string|\Stringable $message + * @param string $message * @param array $context * * @return void * * @throws \Psr\Log\InvalidArgumentException */ - abstract public function log($level, string|\Stringable $message, array $context = []); + abstract public function log($level, $message, array $context = array()); } diff --git a/vendor/psr/log/src/NullLogger.php b/vendor/psr/log/Psr/Log/NullLogger.php similarity index 79% rename from vendor/psr/log/src/NullLogger.php rename to vendor/psr/log/Psr/Log/NullLogger.php index 56077057..c8f7293b 100644 --- a/vendor/psr/log/src/NullLogger.php +++ b/vendor/psr/log/Psr/Log/NullLogger.php @@ -16,14 +16,14 @@ class NullLogger extends AbstractLogger * Logs with an arbitrary level. * * @param mixed $level - * @param string|\Stringable $message - * @param array $context + * @param string $message + * @param array $context * * @return void * * @throws \Psr\Log\InvalidArgumentException */ - public function log($level, string|\Stringable $message, array $context = []) + public function log($level, $message, array $context = array()) { // noop } diff --git a/vendor/psr/log/Psr/Log/Test/DummyTest.php b/vendor/psr/log/Psr/Log/Test/DummyTest.php new file mode 100644 index 00000000..9638c110 --- /dev/null +++ b/vendor/psr/log/Psr/Log/Test/DummyTest.php @@ -0,0 +1,18 @@ + ". + * + * Example ->error('Foo') would yield "error Foo". + * + * @return string[] + */ + abstract public function getLogs(); + + public function testImplements() + { + $this->assertInstanceOf('Psr\Log\LoggerInterface', $this->getLogger()); + } + + /** + * @dataProvider provideLevelsAndMessages + */ + public function testLogsAtAllLevels($level, $message) + { + $logger = $this->getLogger(); + $logger->{$level}($message, array('user' => 'Bob')); + $logger->log($level, $message, array('user' => 'Bob')); + + $expected = array( + $level.' message of level '.$level.' with context: Bob', + $level.' message of level '.$level.' with context: Bob', + ); + $this->assertEquals($expected, $this->getLogs()); + } + + public function provideLevelsAndMessages() + { + return array( + LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'), + LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'), + LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'), + LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'), + LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'), + LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'), + LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'), + LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'), + ); + } + + /** + * @expectedException \Psr\Log\InvalidArgumentException + */ + public function testThrowsOnInvalidLevel() + { + $logger = $this->getLogger(); + $logger->log('invalid level', 'Foo'); + } + + public function testContextReplacement() + { + $logger = $this->getLogger(); + $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar')); + + $expected = array('info {Message {nothing} Bob Bar a}'); + $this->assertEquals($expected, $this->getLogs()); + } + + public function testObjectCastToString() + { + if (method_exists($this, 'createPartialMock')) { + $dummy = $this->createPartialMock('Psr\Log\Test\DummyTest', array('__toString')); + } else { + $dummy = $this->getMock('Psr\Log\Test\DummyTest', array('__toString')); + } + $dummy->expects($this->once()) + ->method('__toString') + ->will($this->returnValue('DUMMY')); + + $this->getLogger()->warning($dummy); + + $expected = array('warning DUMMY'); + $this->assertEquals($expected, $this->getLogs()); + } + + public function testContextCanContainAnything() + { + $closed = fopen('php://memory', 'r'); + fclose($closed); + + $context = array( + 'bool' => true, + 'null' => null, + 'string' => 'Foo', + 'int' => 0, + 'float' => 0.5, + 'nested' => array('with object' => new DummyTest), + 'object' => new \DateTime, + 'resource' => fopen('php://memory', 'r'), + 'closed' => $closed, + ); + + $this->getLogger()->warning('Crazy context data', $context); + + $expected = array('warning Crazy context data'); + $this->assertEquals($expected, $this->getLogs()); + } + + public function testContextExceptionKeyCanBeExceptionOrOtherValues() + { + $logger = $this->getLogger(); + $logger->warning('Random message', array('exception' => 'oops')); + $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail'))); + + $expected = array( + 'warning Random message', + 'critical Uncaught Exception!' + ); + $this->assertEquals($expected, $this->getLogs()); + } +} diff --git a/vendor/psr/log/Psr/Log/Test/TestLogger.php b/vendor/psr/log/Psr/Log/Test/TestLogger.php new file mode 100644 index 00000000..1be32304 --- /dev/null +++ b/vendor/psr/log/Psr/Log/Test/TestLogger.php @@ -0,0 +1,147 @@ + $level, + 'message' => $message, + 'context' => $context, + ]; + + $this->recordsByLevel[$record['level']][] = $record; + $this->records[] = $record; + } + + public function hasRecords($level) + { + return isset($this->recordsByLevel[$level]); + } + + public function hasRecord($record, $level) + { + if (is_string($record)) { + $record = ['message' => $record]; + } + return $this->hasRecordThatPasses(function ($rec) use ($record) { + if ($rec['message'] !== $record['message']) { + return false; + } + if (isset($record['context']) && $rec['context'] !== $record['context']) { + return false; + } + return true; + }, $level); + } + + public function hasRecordThatContains($message, $level) + { + return $this->hasRecordThatPasses(function ($rec) use ($message) { + return strpos($rec['message'], $message) !== false; + }, $level); + } + + public function hasRecordThatMatches($regex, $level) + { + return $this->hasRecordThatPasses(function ($rec) use ($regex) { + return preg_match($regex, $rec['message']) > 0; + }, $level); + } + + public function hasRecordThatPasses(callable $predicate, $level) + { + if (!isset($this->recordsByLevel[$level])) { + return false; + } + foreach ($this->recordsByLevel[$level] as $i => $rec) { + if (call_user_func($predicate, $rec, $i)) { + return true; + } + } + return false; + } + + public function __call($method, $args) + { + if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { + $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; + $level = strtolower($matches[2]); + if (method_exists($this, $genericMethod)) { + $args[] = $level; + return call_user_func_array([$this, $genericMethod], $args); + } + } + throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); + } + + public function reset() + { + $this->records = []; + $this->recordsByLevel = []; + } +} diff --git a/vendor/psr/log/composer.json b/vendor/psr/log/composer.json index f3f06671..ca056953 100644 --- a/vendor/psr/log/composer.json +++ b/vendor/psr/log/composer.json @@ -11,16 +11,16 @@ } ], "require": { - "php": ">=8.0.0" + "php": ">=5.3.0" }, "autoload": { "psr-4": { - "Psr\\Log\\": "src" + "Psr\\Log\\": "Psr/Log/" } }, "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.1.x-dev" } } } diff --git a/vendor/psr/log/src/AbstractLogger.php b/vendor/psr/log/src/AbstractLogger.php deleted file mode 100644 index d60a091a..00000000 --- a/vendor/psr/log/src/AbstractLogger.php +++ /dev/null @@ -1,15 +0,0 @@ - +Copyright (c) 2012-2021 Ben Ramsey Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/ramsey/uuid/README.md b/vendor/ramsey/uuid/README.md index 1862569f..97e81a50 100644 --- a/vendor/ramsey/uuid/README.md +++ b/vendor/ramsey/uuid/README.md @@ -8,9 +8,9 @@ Source Code Download Package PHP Programming Language - Read License - Build Status - Codecov Code Coverage + Read License + Build Status + Codecov Code Coverage Psalm Type Coverage

@@ -38,7 +38,7 @@ composer require ramsey/uuid See the documentation for a thorough upgrade guide: -* [Upgrading ramsey/uuid Version 3 to 4](https://uuid.ramsey.dev/en/stable/upgrading/3-to-4.html) +* [Upgrading ramsey/uuid Version 3 to 4](https://uuid.ramsey.dev/en/latest/upgrading/3-to-4.html) ## Documentation @@ -74,10 +74,10 @@ licensed for use under the MIT License (MIT). Please see [LICENSE][] for more information. [rfc4122]: http://tools.ietf.org/html/rfc4122 -[conduct]: https://github.com/ramsey/uuid/blob/4.x/CODE_OF_CONDUCT.md +[conduct]: https://github.com/ramsey/uuid/blob/main/CODE_OF_CONDUCT.md [javauuid]: http://docs.oracle.com/javase/6/docs/api/java/util/UUID.html [pyuuid]: http://docs.python.org/3/library/uuid.html [composer]: http://getcomposer.org/ -[contributing.md]: https://github.com/ramsey/uuid/blob/4.x/CONTRIBUTING.md -[security.md]: https://github.com/ramsey/uuid/blob/4.x/SECURITY.md -[license]: https://github.com/ramsey/uuid/blob/4.x/LICENSE +[contributing.md]: https://github.com/ramsey/uuid/blob/main/CONTRIBUTING.md +[security.md]: https://github.com/ramsey/uuid/blob/main/SECURITY.md +[license]: https://github.com/ramsey/uuid/blob/main/LICENSE diff --git a/vendor/ramsey/uuid/composer.json b/vendor/ramsey/uuid/composer.json index 74490af7..3f3b5ac4 100644 --- a/vendor/ramsey/uuid/composer.json +++ b/vendor/ramsey/uuid/composer.json @@ -1,18 +1,23 @@ { "name": "ramsey/uuid", - "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", - "license": "MIT", "type": "library", + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", "keywords": [ "uuid", "identifier", "guid" ], + "license": "MIT", "require": { - "php": "^8.0", + "php": "^7.2 || ^8.0", "ext-json": "*", - "brick/math": "^0.8.8 || ^0.9 || ^0.10", - "ramsey/collection": "^1.0" + "brick/math": "^0.8 || ^0.9", + "ramsey/collection": "^1.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php80": "^1.14" + }, + "replace": { + "rhumsaa/uuid": "self.version" }, "require-dev": { "captainhook/captainhook": "^5.10", @@ -21,33 +26,40 @@ "doctrine/annotations": "^1.8", "ergebnis/composer-normalize": "^2.15", "mockery/mockery": "^1.3", + "moontoast/math": "^1.1", "paragonie/random-lib": "^2", "php-mock/php-mock": "^2.2", "php-mock/php-mock-mockery": "^1.3", "php-parallel-lint/php-parallel-lint": "^1.1", "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.1", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", "phpunit/phpunit": "^8.5 || ^9", - "ramsey/composer-repl": "^1.4", - "slevomat/coding-standard": "^8.4", + "slevomat/coding-standard": "^7.0", "squizlabs/php_codesniffer": "^3.5", "vimeo/psalm": "^4.9" }, - "replace": { - "rhumsaa/uuid": "self.version" - }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-ctype": "Enables faster processing of character classification using ctype functions.", "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." }, - "minimum-stability": "dev", - "prefer-stable": true, + "config": { + "sort-packages": true + }, + "extra": { + "branch-alias": { + "dev-main": "4.x-dev" + }, + "captainhook": { + "force-install": true + } + }, "autoload": { "psr-4": { "Ramsey\\Uuid\\": "src/" @@ -63,21 +75,8 @@ "Ramsey\\Uuid\\Test\\": "tests/" } }, - "config": { - "allow-plugins": { - "captainhook/plugin-composer": true, - "ergebnis/composer-normalize": true, - "phpstan/extension-installer": true, - "dealerdirect/phpcodesniffer-composer-installer": true, - "ramsey/composer-repl": true - }, - "sort-packages": true - }, - "extra": { - "captainhook": { - "force-install": true - } - }, + "minimum-stability": "dev", + "prefer-stable": true, "scripts": { "analyze": [ "@phpstan", @@ -90,8 +89,8 @@ "phpcbf": "phpcbf -vpw --cache=build/cache/phpcs.cache", "phpcs": "phpcs --cache=build/cache/phpcs.cache", "phpstan": [ - "phpstan analyse --no-progress --memory-limit=1G", - "phpstan analyse -c phpstan-tests.neon --no-progress --memory-limit=1G" + "phpstan analyse --no-progress", + "phpstan analyse -c phpstan-tests.neon --no-progress" ], "phpunit": "phpunit --verbose --colors=always", "phpunit-coverage": "phpunit --verbose --colors=always --coverage-html build/coverage", diff --git a/vendor/ramsey/uuid/src/Builder/BuilderCollection.php b/vendor/ramsey/uuid/src/Builder/BuilderCollection.php index 9df3110f..89fa1e3c 100644 --- a/vendor/ramsey/uuid/src/Builder/BuilderCollection.php +++ b/vendor/ramsey/uuid/src/Builder/BuilderCollection.php @@ -27,11 +27,6 @@ use Traversable; /** * A collection of UuidBuilderInterface objects * - * @deprecated this class has been deprecated, and will be removed in 5.0.0. The use-case for this class comes from - * a pre-`phpstan/phpstan` and pre-`vimeo/psalm` ecosystem, in which type safety had to be mostly enforced - * at runtime: that is no longer necessary, now that you can safely verify your code to be correct, and use - * more generic types like `iterable` instead. - * * @extends AbstractCollection */ class BuilderCollection extends AbstractCollection diff --git a/vendor/ramsey/uuid/src/Builder/DegradedUuidBuilder.php b/vendor/ramsey/uuid/src/Builder/DegradedUuidBuilder.php index 20b38421..23931e41 100644 --- a/vendor/ramsey/uuid/src/Builder/DegradedUuidBuilder.php +++ b/vendor/ramsey/uuid/src/Builder/DegradedUuidBuilder.php @@ -30,7 +30,15 @@ use Ramsey\Uuid\UuidInterface; */ class DegradedUuidBuilder implements UuidBuilderInterface { - private TimeConverterInterface $timeConverter; + /** + * @var NumberConverterInterface + */ + private $numberConverter; + + /** + * @var TimeConverterInterface + */ + private $timeConverter; /** * @param NumberConverterInterface $numberConverter The number converter to @@ -39,9 +47,10 @@ class DegradedUuidBuilder implements UuidBuilderInterface * for converting timestamps extracted from a UUID to Unix timestamps */ public function __construct( - private NumberConverterInterface $numberConverter, + NumberConverterInterface $numberConverter, ?TimeConverterInterface $timeConverter = null ) { + $this->numberConverter = $numberConverter; $this->timeConverter = $timeConverter ?: new DegradedTimeConverter(); } diff --git a/vendor/ramsey/uuid/src/Builder/FallbackBuilder.php b/vendor/ramsey/uuid/src/Builder/FallbackBuilder.php index ba5f31fb..470d2f75 100644 --- a/vendor/ramsey/uuid/src/Builder/FallbackBuilder.php +++ b/vendor/ramsey/uuid/src/Builder/FallbackBuilder.php @@ -28,10 +28,16 @@ use Ramsey\Uuid\UuidInterface; class FallbackBuilder implements UuidBuilderInterface { /** - * @param iterable $builders An array of UUID builders + * @var BuilderCollection */ - public function __construct(private iterable $builders) + private $builders; + + /** + * @param BuilderCollection $builders An array of UUID builders + */ + public function __construct(BuilderCollection $builders) { + $this->builders = $builders; } /** diff --git a/vendor/ramsey/uuid/src/Codec/GuidStringCodec.php b/vendor/ramsey/uuid/src/Codec/GuidStringCodec.php index 04872e0b..f11e9d50 100644 --- a/vendor/ramsey/uuid/src/Codec/GuidStringCodec.php +++ b/vendor/ramsey/uuid/src/Codec/GuidStringCodec.php @@ -18,7 +18,6 @@ use Ramsey\Uuid\Guid\Guid; use Ramsey\Uuid\UuidInterface; use function bin2hex; -use function sprintf; use function substr; /** @@ -30,26 +29,6 @@ use function substr; */ class GuidStringCodec extends StringCodec { - public function encode(UuidInterface $uuid): string - { - $hex = bin2hex($uuid->getFields()->getBytes()); - - /** @var non-empty-string */ - return sprintf( - '%02s%02s%02s%02s-%02s%02s-%02s%02s-%04s-%012s', - substr($hex, 6, 2), - substr($hex, 4, 2), - substr($hex, 2, 2), - substr($hex, 0, 2), - substr($hex, 10, 2), - substr($hex, 8, 2), - substr($hex, 14, 2), - substr($hex, 12, 2), - substr($hex, 16, 4), - substr($hex, 20), - ); - } - public function decode(string $encodedUuid): UuidInterface { $bytes = $this->getBytes($encodedUuid); diff --git a/vendor/ramsey/uuid/src/Codec/StringCodec.php b/vendor/ramsey/uuid/src/Codec/StringCodec.php index 95f38d2e..58c9f580 100644 --- a/vendor/ramsey/uuid/src/Codec/StringCodec.php +++ b/vendor/ramsey/uuid/src/Codec/StringCodec.php @@ -17,13 +17,12 @@ namespace Ramsey\Uuid\Codec; use Ramsey\Uuid\Builder\UuidBuilderInterface; use Ramsey\Uuid\Exception\InvalidArgumentException; use Ramsey\Uuid\Exception\InvalidUuidStringException; +use Ramsey\Uuid\Rfc4122\FieldsInterface; use Ramsey\Uuid\Uuid; use Ramsey\Uuid\UuidInterface; -use function bin2hex; use function hex2bin; use function implode; -use function sprintf; use function str_replace; use function strlen; use function substr; @@ -37,28 +36,36 @@ use function substr; */ class StringCodec implements CodecInterface { + /** + * @var UuidBuilderInterface + */ + private $builder; + /** * Constructs a StringCodec * * @param UuidBuilderInterface $builder The builder to use when encoding UUIDs */ - public function __construct(private UuidBuilderInterface $builder) + public function __construct(UuidBuilderInterface $builder) { + $this->builder = $builder; } public function encode(UuidInterface $uuid): string { - $hex = bin2hex($uuid->getFields()->getBytes()); + /** @var FieldsInterface $fields */ + $fields = $uuid->getFields(); - /** @var non-empty-string */ - return sprintf( - '%08s-%04s-%04s-%04s-%012s', - substr($hex, 0, 8), - substr($hex, 8, 4), - substr($hex, 12, 4), - substr($hex, 16, 4), - substr($hex, 20), - ); + return $fields->getTimeLow()->toString() + . '-' + . $fields->getTimeMid()->toString() + . '-' + . $fields->getTimeHiAndVersion()->toString() + . '-' + . $fields->getClockSeqHiAndReserved()->toString() + . $fields->getClockSeqLow()->toString() + . '-' + . $fields->getNode()->toString(); } /** diff --git a/vendor/ramsey/uuid/src/Converter/Number/BigNumberConverter.php b/vendor/ramsey/uuid/src/Converter/Number/BigNumberConverter.php index 99b88b3b..fef63fd0 100644 --- a/vendor/ramsey/uuid/src/Converter/Number/BigNumberConverter.php +++ b/vendor/ramsey/uuid/src/Converter/Number/BigNumberConverter.php @@ -27,7 +27,10 @@ use Ramsey\Uuid\Math\BrickMathCalculator; */ class BigNumberConverter implements NumberConverterInterface { - private NumberConverterInterface $converter; + /** + * @var NumberConverterInterface + */ + private $converter; public function __construct() { diff --git a/vendor/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php b/vendor/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php index 043c3c43..501eac0f 100644 --- a/vendor/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php +++ b/vendor/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php @@ -26,8 +26,14 @@ use Ramsey\Uuid\Type\Integer as IntegerObject; */ class GenericNumberConverter implements NumberConverterInterface { - public function __construct(private CalculatorInterface $calculator) + /** + * @var CalculatorInterface + */ + private $calculator; + + public function __construct(CalculatorInterface $calculator) { + $this->calculator = $calculator; } /** diff --git a/vendor/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php b/vendor/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php index b6bca9ee..7390dad8 100644 --- a/vendor/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php +++ b/vendor/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php @@ -29,7 +29,10 @@ use Ramsey\Uuid\Type\Time; */ class BigNumberTimeConverter implements TimeConverterInterface { - private TimeConverterInterface $converter; + /** + * @var TimeConverterInterface + */ + private $converter; public function __construct() { diff --git a/vendor/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php b/vendor/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php index f6b60abb..a8aa64b7 100644 --- a/vendor/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php +++ b/vendor/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php @@ -50,8 +50,14 @@ class GenericTimeConverter implements TimeConverterInterface */ private const MICROSECOND_INTERVALS = '10'; - public function __construct(private CalculatorInterface $calculator) + /** + * @var CalculatorInterface + */ + private $calculator; + + public function __construct(CalculatorInterface $calculator) { + $this->calculator = $calculator; } public function calculateTime(string $seconds, string $microseconds): Hexadecimal diff --git a/vendor/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php b/vendor/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php index 66009f14..538d2f2f 100644 --- a/vendor/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php +++ b/vendor/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php @@ -58,9 +58,20 @@ class PhpTimeConverter implements TimeConverterInterface */ private const MICROSECOND_INTERVALS = 10; - private int $phpPrecision; - private CalculatorInterface $calculator; - private TimeConverterInterface $fallbackConverter; + /** + * @var CalculatorInterface + */ + private $calculator; + + /** + * @var TimeConverterInterface + */ + private $fallbackConverter; + + /** + * @var int + */ + private $phpPrecision; public function __construct( ?CalculatorInterface $calculator = null, @@ -121,11 +132,11 @@ class PhpTimeConverter implements TimeConverterInterface } /** - * @param float|int $time The time to split into seconds and microseconds + * @param int|float $time The time to split into seconds and microseconds * * @return string[] */ - private function splitTime(float | int $time): array + private function splitTime($time): array { $split = explode('.', (string) $time, 2); diff --git a/vendor/ramsey/uuid/src/Converter/Time/UnixTimeConverter.php b/vendor/ramsey/uuid/src/Converter/Time/UnixTimeConverter.php deleted file mode 100644 index 4d6d0a8a..00000000 --- a/vendor/ramsey/uuid/src/Converter/Time/UnixTimeConverter.php +++ /dev/null @@ -1,90 +0,0 @@ - - * @license http://opensource.org/licenses/MIT MIT - */ - -declare(strict_types=1); - -namespace Ramsey\Uuid\Converter\Time; - -use Ramsey\Uuid\Converter\TimeConverterInterface; -use Ramsey\Uuid\Math\CalculatorInterface; -use Ramsey\Uuid\Math\RoundingMode; -use Ramsey\Uuid\Type\Hexadecimal; -use Ramsey\Uuid\Type\Integer as IntegerObject; -use Ramsey\Uuid\Type\Time; - -use function explode; -use function str_pad; - -use const STR_PAD_LEFT; - -/** - * UnixTimeConverter converts Unix Epoch timestamps to/from hexadecimal values - * consisting of milliseconds elapsed since the Unix Epoch - * - * @psalm-immutable - */ -class UnixTimeConverter implements TimeConverterInterface -{ - private const MILLISECONDS = 1000; - - public function __construct(private CalculatorInterface $calculator) - { - } - - public function calculateTime(string $seconds, string $microseconds): Hexadecimal - { - $timestamp = new Time($seconds, $microseconds); - - // Convert the seconds into milliseconds. - $sec = $this->calculator->multiply( - $timestamp->getSeconds(), - new IntegerObject(self::MILLISECONDS), - ); - - // Convert the microseconds into milliseconds; the scale is zero because - // we need to discard the fractional part. - $usec = $this->calculator->divide( - RoundingMode::DOWN, // Always round down to stay in the previous millisecond. - 0, - $timestamp->getMicroseconds(), - new IntegerObject(self::MILLISECONDS), - ); - - /** @var IntegerObject $unixTime */ - $unixTime = $this->calculator->add($sec, $usec); - - $unixTimeHex = str_pad( - $this->calculator->toHexadecimal($unixTime)->toString(), - 12, - '0', - STR_PAD_LEFT - ); - - return new Hexadecimal($unixTimeHex); - } - - public function convertTime(Hexadecimal $uuidTimestamp): Time - { - $milliseconds = $this->calculator->toInteger($uuidTimestamp); - - $unixTimestamp = $this->calculator->divide( - RoundingMode::HALF_UP, - 6, - $milliseconds, - new IntegerObject(self::MILLISECONDS) - ); - - $split = explode('.', (string) $unixTimestamp, 2); - - return new Time($split[0], $split[1] ?? '0'); - } -} diff --git a/vendor/ramsey/uuid/src/DeprecatedUuidInterface.php b/vendor/ramsey/uuid/src/DeprecatedUuidInterface.php index ac01a79c..ed6d9dec 100644 --- a/vendor/ramsey/uuid/src/DeprecatedUuidInterface.php +++ b/vendor/ramsey/uuid/src/DeprecatedUuidInterface.php @@ -18,7 +18,8 @@ use DateTimeInterface; use Ramsey\Uuid\Converter\NumberConverterInterface; /** - * This interface encapsulates deprecated methods for ramsey/uuid + * This interface encapsulates deprecated methods for ramsey/uuid; this + * interface and its methods will be removed in ramsey/uuid 5.0.0. * * @psalm-immutable */ @@ -122,6 +123,12 @@ interface DeprecatedUuidInterface */ public function getTimestampHex(): string; + /** + * @deprecated In ramsey/uuid version 5.0.0, this will be removed from this + * interface. It has moved to {@see \Ramsey\Uuid\Rfc4122\UuidInterface::getUrn()}. + */ + public function getUrn(): string; + /** * @deprecated Use {@see UuidInterface::getFields()} to get a * {@see FieldsInterface} instance. If it is a diff --git a/vendor/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php b/vendor/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php index d3fbb0cc..34282952 100644 --- a/vendor/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php +++ b/vendor/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php @@ -17,8 +17,10 @@ namespace Ramsey\Uuid; use DateTimeImmutable; use DateTimeInterface; use Ramsey\Uuid\Converter\NumberConverterInterface; +use Ramsey\Uuid\Converter\TimeConverterInterface; use Ramsey\Uuid\Exception\DateTimeException; use Ramsey\Uuid\Exception\UnsupportedOperationException; +use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface; use Throwable; use function str_pad; @@ -30,17 +32,29 @@ use const STR_PAD_LEFT; * This trait encapsulates deprecated methods for ramsey/uuid; this trait and * its methods will be removed in ramsey/uuid 5.0.0. * - * @deprecated This trait and its methods will be removed in ramsey/uuid 5.0.0. - * * @psalm-immutable */ trait DeprecatedUuidMethodsTrait { + /** + * @var Rfc4122FieldsInterface + */ + protected $fields; + + /** + * @var NumberConverterInterface + */ + protected $numberConverter; + + /** + * @var TimeConverterInterface + */ + protected $timeConverter; + /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getClockSeqHiAndReserved()} + * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface} + * instance, you may call {@see Rfc4122FieldsInterface::getClockSeqHiAndReserved()} * and use the arbitrary-precision math library of your choice to * convert it to a string integer. */ @@ -51,9 +65,8 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getClockSeqHiAndReserved()}. + * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface} + * instance, you may call {@see Rfc4122FieldsInterface::getClockSeqHiAndReserved()}. */ public function getClockSeqHiAndReservedHex(): string { @@ -62,9 +75,8 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getClockSeqLow()} + * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface} + * instance, you may call {@see Rfc4122FieldsInterface::getClockSeqLow()} * and use the arbitrary-precision math library of your choice to * convert it to a string integer. */ @@ -75,9 +87,8 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getClockSeqLow()}. + * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface} + * instance, you may call {@see Rfc4122FieldsInterface::getClockSeqLow()}. */ public function getClockSeqLowHex(): string { @@ -86,9 +97,8 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getClockSeq()} + * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface} + * instance, you may call {@see Rfc4122FieldsInterface::getClockSeq()} * and use the arbitrary-precision math library of your choice to * convert it to a string integer. */ @@ -99,9 +109,8 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getClockSeq()}. + * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface} + * instance, you may call {@see Rfc4122FieldsInterface::getClockSeq()}. */ public function getClockSequenceHex(): string { @@ -148,7 +157,7 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. + * {@see FieldsInterface} instance. * * @return string[] */ @@ -210,11 +219,10 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getNode()} and use the - * arbitrary-precision math library of your choice to convert it to a - * string integer. + * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface} + * instance, you may call {@see Rfc4122FieldsInterface::getNode()} + * and use the arbitrary-precision math library of your choice to + * convert it to a string integer. */ public function getNode(): string { @@ -223,9 +231,8 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getNode()}. + * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface} + * instance, you may call {@see Rfc4122FieldsInterface::getNode()}. */ public function getNodeHex(): string { @@ -234,9 +241,8 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getTimeHiAndVersion()} + * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface} + * instance, you may call {@see Rfc4122FieldsInterface::getTimeHiAndVersion()} * and use the arbitrary-precision math library of your choice to * convert it to a string integer. */ @@ -247,9 +253,8 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getTimeHiAndVersion()}. + * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface} + * instance, you may call {@see Rfc4122FieldsInterface::getTimeHiAndVersion()}. */ public function getTimeHiAndVersionHex(): string { @@ -258,11 +263,10 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getTimeLow()} and use the - * arbitrary-precision math library of your choice to convert it to a - * string integer. + * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface} + * instance, you may call {@see Rfc4122FieldsInterface::getTimeLow()} + * and use the arbitrary-precision math library of your choice to + * convert it to a string integer. */ public function getTimeLow(): string { @@ -271,9 +275,8 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getTimeLow()}. + * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface} + * instance, you may call {@see Rfc4122FieldsInterface::getTimeLow()}. */ public function getTimeLowHex(): string { @@ -282,11 +285,10 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getTimeMid()} and use the - * arbitrary-precision math library of your choice to convert it to a - * string integer. + * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface} + * instance, you may call {@see Rfc4122FieldsInterface::getTimeMid()} + * and use the arbitrary-precision math library of your choice to + * convert it to a string integer. */ public function getTimeMid(): string { @@ -295,9 +297,8 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getTimeMid()}. + * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface} + * instance, you may call {@see Rfc4122FieldsInterface::getTimeMid()}. */ public function getTimeMidHex(): string { @@ -306,11 +307,10 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getTimestamp()} and use - * the arbitrary-precision math library of your choice to convert it to - * a string integer. + * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface} + * instance, you may call {@see Rfc4122FieldsInterface::getTimestamp()} + * and use the arbitrary-precision math library of your choice to + * convert it to a string integer. */ public function getTimestamp(): string { @@ -323,9 +323,8 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call - * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getTimestamp()}. + * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface} + * instance, you may call {@see Rfc4122FieldsInterface::getTimestamp()}. */ public function getTimestampHex(): string { @@ -336,9 +335,20 @@ trait DeprecatedUuidMethodsTrait return $this->fields->getTimestamp()->toString(); } + /** + * @deprecated This has moved to {@see Rfc4122FieldsInterface::getUrn()} and + * is available on {@see \Ramsey\Uuid\Rfc4122\UuidV1}, + * {@see \Ramsey\Uuid\Rfc4122\UuidV3}, {@see \Ramsey\Uuid\Rfc4122\UuidV4}, + * and {@see \Ramsey\Uuid\Rfc4122\UuidV5}. + */ + public function getUrn(): string + { + return 'urn:uuid:' . $this->toString(); + } + /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a + * {@see FieldsInterface} instance. If it is a * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getVariant()}. */ @@ -349,7 +359,7 @@ trait DeprecatedUuidMethodsTrait /** * @deprecated Use {@see UuidInterface::getFields()} to get a - * {@see \Ramsey\Uuid\Fields\FieldsInterface} instance. If it is a + * {@see FieldsInterface} instance. If it is a * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getVersion()}. */ diff --git a/vendor/ramsey/uuid/src/FeatureSet.php b/vendor/ramsey/uuid/src/FeatureSet.php index b9af869f..a8ab2fdb 100644 --- a/vendor/ramsey/uuid/src/FeatureSet.php +++ b/vendor/ramsey/uuid/src/FeatureSet.php @@ -14,6 +14,7 @@ declare(strict_types=1); namespace Ramsey\Uuid; +use Ramsey\Uuid\Builder\BuilderCollection; use Ramsey\Uuid\Builder\FallbackBuilder; use Ramsey\Uuid\Builder\UuidBuilderInterface; use Ramsey\Uuid\Codec\CodecInterface; @@ -35,7 +36,6 @@ use Ramsey\Uuid\Generator\RandomGeneratorFactory; use Ramsey\Uuid\Generator\RandomGeneratorInterface; use Ramsey\Uuid\Generator\TimeGeneratorFactory; use Ramsey\Uuid\Generator\TimeGeneratorInterface; -use Ramsey\Uuid\Generator\UnixTimeGenerator; use Ramsey\Uuid\Guid\GuidBuilder; use Ramsey\Uuid\Math\BrickMathCalculator; use Ramsey\Uuid\Math\CalculatorInterface; @@ -43,6 +43,7 @@ use Ramsey\Uuid\Nonstandard\UuidBuilder as NonstandardUuidBuilder; use Ramsey\Uuid\Provider\Dce\SystemDceSecurityProvider; use Ramsey\Uuid\Provider\DceSecurityProviderInterface; use Ramsey\Uuid\Provider\Node\FallbackNodeProvider; +use Ramsey\Uuid\Provider\Node\NodeProviderCollection; use Ramsey\Uuid\Provider\Node\RandomNodeProvider; use Ramsey\Uuid\Provider\Node\SystemNodeProvider; use Ramsey\Uuid\Provider\NodeProviderInterface; @@ -62,25 +63,92 @@ use const PHP_INT_SIZE; */ class FeatureSet { - private ?TimeProviderInterface $timeProvider = null; - private CalculatorInterface $calculator; - private CodecInterface $codec; - private DceSecurityGeneratorInterface $dceSecurityGenerator; - private NameGeneratorInterface $nameGenerator; - private NodeProviderInterface $nodeProvider; - private NumberConverterInterface $numberConverter; - private RandomGeneratorInterface $randomGenerator; - private TimeConverterInterface $timeConverter; - private TimeGeneratorInterface $timeGenerator; - private TimeGeneratorInterface $unixTimeGenerator; - private UuidBuilderInterface $builder; - private ValidatorInterface $validator; + /** + * @var bool + */ + private $disableBigNumber = false; + + /** + * @var bool + */ + private $disable64Bit = false; + + /** + * @var bool + */ + private $ignoreSystemNode = false; + + /** + * @var bool + */ + private $enablePecl = false; + + /** + * @var UuidBuilderInterface + */ + private $builder; + + /** + * @var CodecInterface + */ + private $codec; + + /** + * @var DceSecurityGeneratorInterface + */ + private $dceSecurityGenerator; + + /** + * @var NameGeneratorInterface + */ + private $nameGenerator; + + /** + * @var NodeProviderInterface + */ + private $nodeProvider; + + /** + * @var NumberConverterInterface + */ + private $numberConverter; + + /** + * @var TimeConverterInterface + */ + private $timeConverter; + + /** + * @var RandomGeneratorInterface + */ + private $randomGenerator; + + /** + * @var TimeGeneratorInterface + */ + private $timeGenerator; + + /** + * @var TimeProviderInterface + */ + private $timeProvider; + + /** + * @var ValidatorInterface + */ + private $validator; + + /** + * @var CalculatorInterface + */ + private $calculator; /** * @param bool $useGuids True build UUIDs using the GuidStringCodec * @param bool $force32Bit True to force the use of 32-bit functionality * (primarily for testing purposes) - * @param bool $forceNoBigNumber (obsolete) + * @param bool $forceNoBigNumber True to disable the use of moontoast/math + * (primarily for testing purposes) * @param bool $ignoreSystemNode True to disable attempts to check for the * system node ID (primarily for testing purposes) * @param bool $enablePecl True to enable the use of the PeclUuidTimeGenerator @@ -88,23 +156,25 @@ class FeatureSet */ public function __construct( bool $useGuids = false, - private bool $force32Bit = false, + bool $force32Bit = false, bool $forceNoBigNumber = false, - private bool $ignoreSystemNode = false, - private bool $enablePecl = false + bool $ignoreSystemNode = false, + bool $enablePecl = false ) { - $this->randomGenerator = $this->buildRandomGenerator(); + $this->disableBigNumber = $forceNoBigNumber; + $this->disable64Bit = $force32Bit; + $this->ignoreSystemNode = $ignoreSystemNode; + $this->enablePecl = $enablePecl; + $this->setCalculator(new BrickMathCalculator()); $this->builder = $this->buildUuidBuilder($useGuids); $this->codec = $this->buildCodec($useGuids); $this->nodeProvider = $this->buildNodeProvider(); $this->nameGenerator = $this->buildNameGenerator(); + $this->randomGenerator = $this->buildRandomGenerator(); $this->setTimeProvider(new SystemTimeProvider()); $this->setDceSecurityProvider(new SystemDceSecurityProvider()); $this->validator = new GenericValidator(); - - assert($this->timeProvider !== null); - $this->unixTimeGenerator = $this->buildUnixTimeGenerator(); } /** @@ -187,14 +257,6 @@ class FeatureSet return $this->timeGenerator; } - /** - * Returns the Unix Epoch time generator configured for this environment - */ - public function getUnixTimeGenerator(): TimeGeneratorInterface - { - return $this->unixTimeGenerator; - } - /** * Returns the validator configured for this environment */ @@ -232,10 +294,7 @@ class FeatureSet public function setNodeProvider(NodeProviderInterface $nodeProvider): void { $this->nodeProvider = $nodeProvider; - - if (isset($this->timeProvider)) { - $this->timeGenerator = $this->buildTimeGenerator($this->timeProvider); - } + $this->timeGenerator = $this->buildTimeGenerator($this->timeProvider); } /** @@ -291,10 +350,10 @@ class FeatureSet return new RandomNodeProvider(); } - return new FallbackNodeProvider([ + return new FallbackNodeProvider(new NodeProviderCollection([ new SystemNodeProvider(), new RandomNodeProvider(), - ]); + ])); } /** @@ -336,14 +395,6 @@ class FeatureSet ))->getGenerator(); } - /** - * Returns a Unix Epoch time generator configured for this environment - */ - private function buildUnixTimeGenerator(): TimeGeneratorInterface - { - return new UnixTimeGenerator($this->randomGenerator); - } - /** * Returns a name generator configured for this environment */ @@ -381,10 +432,11 @@ class FeatureSet return new GuidBuilder($this->numberConverter, $this->timeConverter); } - return new FallbackBuilder([ + /** @psalm-suppress ImpureArgument */ + return new FallbackBuilder(new BuilderCollection([ new Rfc4122UuidBuilder($this->numberConverter, $this->timeConverter), new NonstandardUuidBuilder($this->numberConverter, $this->timeConverter), - ]); + ])); } /** @@ -392,6 +444,6 @@ class FeatureSet */ private function is64BitSystem(): bool { - return PHP_INT_SIZE === 8 && !$this->force32Bit; + return PHP_INT_SIZE === 8 && !$this->disable64Bit; } } diff --git a/vendor/ramsey/uuid/src/Fields/SerializableFieldsTrait.php b/vendor/ramsey/uuid/src/Fields/SerializableFieldsTrait.php index 3d36b6f1..16e6525d 100644 --- a/vendor/ramsey/uuid/src/Fields/SerializableFieldsTrait.php +++ b/vendor/ramsey/uuid/src/Fields/SerializableFieldsTrait.php @@ -56,23 +56,22 @@ trait SerializableFieldsTrait /** * Constructs the object from a serialized string representation * - * @param string $data The serialized string representation of the object + * @param string $serialized The serialized string representation of the object * + * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint * @psalm-suppress UnusedMethodCall */ - public function unserialize(string $data): void + public function unserialize($serialized): void { - if (strlen($data) === 16) { - $this->__construct($data); + if (strlen($serialized) === 16) { + $this->__construct($serialized); } else { - $this->__construct(base64_decode($data)); + $this->__construct(base64_decode($serialized)); } } /** - * @param array{bytes?: string} $data - * - * @psalm-suppress UnusedMethodCall + * @param array{bytes: string} $data */ public function __unserialize(array $data): void { diff --git a/vendor/ramsey/uuid/src/Generator/CombGenerator.php b/vendor/ramsey/uuid/src/Generator/CombGenerator.php index 0e887060..49b09381 100644 --- a/vendor/ramsey/uuid/src/Generator/CombGenerator.php +++ b/vendor/ramsey/uuid/src/Generator/CombGenerator.php @@ -61,10 +61,22 @@ class CombGenerator implements RandomGeneratorInterface { public const TIMESTAMP_BYTES = 6; + /** + * @var RandomGeneratorInterface + */ + private $randomGenerator; + + /** + * @var NumberConverterInterface + */ + private $converter; + public function __construct( - private RandomGeneratorInterface $generator, - private NumberConverterInterface $numberConverter + RandomGeneratorInterface $generator, + NumberConverterInterface $numberConverter ) { + $this->converter = $numberConverter; + $this->randomGenerator = $generator; } /** @@ -75,7 +87,7 @@ class CombGenerator implements RandomGeneratorInterface */ public function generate(int $length): string { - if ($length < self::TIMESTAMP_BYTES) { + if ($length < self::TIMESTAMP_BYTES || $length < 0) { throw new InvalidArgumentException( 'Length must be a positive integer greater than or equal to ' . self::TIMESTAMP_BYTES ); @@ -83,11 +95,11 @@ class CombGenerator implements RandomGeneratorInterface $hash = ''; if (self::TIMESTAMP_BYTES > 0 && $length > self::TIMESTAMP_BYTES) { - $hash = $this->generator->generate($length - self::TIMESTAMP_BYTES); + $hash = $this->randomGenerator->generate($length - self::TIMESTAMP_BYTES); } $lsbTime = str_pad( - $this->numberConverter->toHex($this->timestamp()), + $this->converter->toHex($this->timestamp()), self::TIMESTAMP_BYTES * 2, '0', STR_PAD_LEFT diff --git a/vendor/ramsey/uuid/src/Generator/DceSecurityGenerator.php b/vendor/ramsey/uuid/src/Generator/DceSecurityGenerator.php index 37ba7813..aca8c5db 100644 --- a/vendor/ramsey/uuid/src/Generator/DceSecurityGenerator.php +++ b/vendor/ramsey/uuid/src/Generator/DceSecurityGenerator.php @@ -52,11 +52,29 @@ class DceSecurityGenerator implements DceSecurityGeneratorInterface */ private const CLOCK_SEQ_LOW = 0; + /** + * @var NumberConverterInterface + */ + private $numberConverter; + + /** + * @var TimeGeneratorInterface + */ + private $timeGenerator; + + /** + * @var DceSecurityProviderInterface + */ + private $dceSecurityProvider; + public function __construct( - private NumberConverterInterface $numberConverter, - private TimeGeneratorInterface $timeGenerator, - private DceSecurityProviderInterface $dceSecurityProvider + NumberConverterInterface $numberConverter, + TimeGeneratorInterface $timeGenerator, + DceSecurityProviderInterface $dceSecurityProvider ) { + $this->numberConverter = $numberConverter; + $this->timeGenerator = $timeGenerator; + $this->dceSecurityProvider = $dceSecurityProvider; } public function generate( @@ -135,7 +153,8 @@ class DceSecurityGenerator implements DceSecurityGeneratorInterface // Replace bytes in the time-based UUID with DCE Security values. $bytes = substr_replace($bytes, $identifierBytes, 0, 4); + $bytes = substr_replace($bytes, $domainByte, 9, 1); - return substr_replace($bytes, $domainByte, 9, 1); + return $bytes; } } diff --git a/vendor/ramsey/uuid/src/Generator/DefaultTimeGenerator.php b/vendor/ramsey/uuid/src/Generator/DefaultTimeGenerator.php index ea1e2a6f..d245c7bc 100644 --- a/vendor/ramsey/uuid/src/Generator/DefaultTimeGenerator.php +++ b/vendor/ramsey/uuid/src/Generator/DefaultTimeGenerator.php @@ -23,11 +23,11 @@ use Ramsey\Uuid\Provider\TimeProviderInterface; use Ramsey\Uuid\Type\Hexadecimal; use Throwable; +use function ctype_xdigit; use function dechex; use function hex2bin; use function is_int; use function pack; -use function preg_match; use function sprintf; use function str_pad; use function strlen; @@ -40,11 +40,29 @@ use const STR_PAD_LEFT; */ class DefaultTimeGenerator implements TimeGeneratorInterface { + /** + * @var NodeProviderInterface + */ + private $nodeProvider; + + /** + * @var TimeConverterInterface + */ + private $timeConverter; + + /** + * @var TimeProviderInterface + */ + private $timeProvider; + public function __construct( - private NodeProviderInterface $nodeProvider, - private TimeConverterInterface $timeConverter, - private TimeProviderInterface $timeProvider + NodeProviderInterface $nodeProvider, + TimeConverterInterface $timeConverter, + TimeProviderInterface $timeProvider ) { + $this->nodeProvider = $nodeProvider; + $this->timeConverter = $timeConverter; + $this->timeProvider = $timeProvider; } /** @@ -103,13 +121,13 @@ class DefaultTimeGenerator implements TimeGeneratorInterface * Uses the node provider given when constructing this instance to get * the node ID (usually a MAC address) * - * @param int|string|null $node A node value that may be used to override the node provider + * @param string|int|null $node A node value that may be used to override the node provider * * @return string 6-byte binary string representation of the node * * @throws InvalidArgumentException */ - private function getValidNode(int | string | null $node): string + private function getValidNode($node): string { if ($node === null) { $node = $this->nodeProvider->getNode(); @@ -120,7 +138,7 @@ class DefaultTimeGenerator implements TimeGeneratorInterface $node = dechex($node); } - if (!preg_match('/^[A-Fa-f0-9]+$/', (string) $node) || strlen((string) $node) > 12) { + if (!ctype_xdigit((string) $node) || strlen((string) $node) > 12) { throw new InvalidArgumentException('Invalid node value'); } diff --git a/vendor/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php b/vendor/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php index 6a6d1aec..3780c5c6 100644 --- a/vendor/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php +++ b/vendor/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php @@ -33,16 +33,21 @@ class PeclUuidNameGenerator implements NameGeneratorInterface /** @psalm-pure */ public function generate(UuidInterface $ns, string $name, string $hashAlgorithm): string { - $uuid = match ($hashAlgorithm) { - 'md5' => uuid_generate_md5($ns->toString(), $name), - 'sha1' => uuid_generate_sha1($ns->toString(), $name), - default => throw new NameException( - sprintf( + switch ($hashAlgorithm) { + case 'md5': + $uuid = uuid_generate_md5($ns->toString(), $name); + + break; + case 'sha1': + $uuid = uuid_generate_sha1($ns->toString(), $name); + + break; + default: + throw new NameException(sprintf( 'Unable to hash namespace and name with algorithm \'%s\'', $hashAlgorithm - ) - ), - }; + )); + } return uuid_parse($uuid); } diff --git a/vendor/ramsey/uuid/src/Generator/RandomGeneratorInterface.php b/vendor/ramsey/uuid/src/Generator/RandomGeneratorInterface.php index 1180b976..5c83cb4d 100644 --- a/vendor/ramsey/uuid/src/Generator/RandomGeneratorInterface.php +++ b/vendor/ramsey/uuid/src/Generator/RandomGeneratorInterface.php @@ -22,7 +22,7 @@ interface RandomGeneratorInterface /** * Generates a string of randomized binary data * - * @param int<1, max> $length The number of bytes of random binary data to generate + * @param int $length The number of bytes of random binary data to generate * * @return string A binary string */ diff --git a/vendor/ramsey/uuid/src/Generator/RandomLibAdapter.php b/vendor/ramsey/uuid/src/Generator/RandomLibAdapter.php index fd0ccc8a..24ed5692 100644 --- a/vendor/ramsey/uuid/src/Generator/RandomLibAdapter.php +++ b/vendor/ramsey/uuid/src/Generator/RandomLibAdapter.php @@ -21,15 +21,14 @@ use RandomLib\Generator; * RandomLibAdapter generates strings of random binary data using the * paragonie/random-lib library * - * @deprecated This class will be removed in 5.0.0. Use the default - * RandomBytesGenerator or implement your own generator that implements - * RandomGeneratorInterface. - * * @link https://packagist.org/packages/paragonie/random-lib paragonie/random-lib */ class RandomLibAdapter implements RandomGeneratorInterface { - private Generator $generator; + /** + * @var Generator + */ + private $generator; /** * Constructs a RandomLibAdapter diff --git a/vendor/ramsey/uuid/src/Generator/TimeGeneratorFactory.php b/vendor/ramsey/uuid/src/Generator/TimeGeneratorFactory.php index 8d06fc3a..3d55fc4d 100644 --- a/vendor/ramsey/uuid/src/Generator/TimeGeneratorFactory.php +++ b/vendor/ramsey/uuid/src/Generator/TimeGeneratorFactory.php @@ -24,11 +24,29 @@ use Ramsey\Uuid\Provider\TimeProviderInterface; */ class TimeGeneratorFactory { + /** + * @var NodeProviderInterface + */ + private $nodeProvider; + + /** + * @var TimeConverterInterface + */ + private $timeConverter; + + /** + * @var TimeProviderInterface + */ + private $timeProvider; + public function __construct( - private NodeProviderInterface $nodeProvider, - private TimeConverterInterface $timeConverter, - private TimeProviderInterface $timeProvider + NodeProviderInterface $nodeProvider, + TimeConverterInterface $timeConverter, + TimeProviderInterface $timeProvider ) { + $this->nodeProvider = $nodeProvider; + $this->timeConverter = $timeConverter; + $this->timeProvider = $timeProvider; } /** diff --git a/vendor/ramsey/uuid/src/Generator/UnixTimeGenerator.php b/vendor/ramsey/uuid/src/Generator/UnixTimeGenerator.php deleted file mode 100644 index af94decf..00000000 --- a/vendor/ramsey/uuid/src/Generator/UnixTimeGenerator.php +++ /dev/null @@ -1,169 +0,0 @@ - - * @license http://opensource.org/licenses/MIT MIT - */ - -declare(strict_types=1); - -namespace Ramsey\Uuid\Generator; - -use Brick\Math\BigInteger; -use DateTimeImmutable; -use DateTimeInterface; -use Ramsey\Uuid\Type\Hexadecimal; - -use function hash; -use function pack; -use function str_pad; -use function strlen; -use function substr; -use function substr_replace; -use function unpack; - -use const PHP_INT_SIZE; -use const STR_PAD_LEFT; - -/** - * UnixTimeGenerator generates bytes that combine a 48-bit timestamp in - * milliseconds since the Unix Epoch with 80 random bits - * - * Code and concepts within this class are borrowed from the symfony/uid package - * and are used under the terms of the MIT license distributed with symfony/uid. - * - * symfony/uid is copyright (c) Fabien Potencier. - * - * @link https://symfony.com/components/Uid Symfony Uid component - * @link https://github.com/symfony/uid/blob/4f9f537e57261519808a7ce1d941490736522bbc/UuidV7.php Symfony UuidV7 class - * @link https://github.com/symfony/uid/blob/6.2/LICENSE MIT License - */ -class UnixTimeGenerator implements TimeGeneratorInterface -{ - private static string $time = ''; - private static ?string $seed = null; - private static int $seedIndex = 0; - - /** @var int[] */ - private static array $rand = []; - - /** @var int[] */ - private static array $seedParts; - - public function __construct( - private RandomGeneratorInterface $randomGenerator, - private int $intSize = PHP_INT_SIZE - ) { - } - - /** - * @param Hexadecimal|int|string|null $node Unused in this generator - * @param int|null $clockSeq Unused in this generator - * @param DateTimeInterface $dateTime A date-time instance to use when - * generating bytes - * - * @inheritDoc - */ - public function generate($node = null, ?int $clockSeq = null, ?DateTimeInterface $dateTime = null): string - { - $time = ($dateTime ?? new DateTimeImmutable('now'))->format('Uv'); - - if ($time > self::$time || ($dateTime !== null && $time !== self::$time)) { - $this->randomize($time); - } else { - $time = $this->increment(); - } - - if ($this->intSize >= 8) { - $time = substr(pack('J', (int) $time), -6); - } else { - $time = str_pad(BigInteger::of($time)->toBytes(false), 6, "\x00", STR_PAD_LEFT); - } - - /** @var non-empty-string */ - return $time . pack('n*', self::$rand[1], self::$rand[2], self::$rand[3], self::$rand[4], self::$rand[5]); - } - - private function randomize(string $time): void - { - if (self::$seed === null) { - $seed = $this->randomGenerator->generate(16); - self::$seed = $seed; - } else { - $seed = $this->randomGenerator->generate(10); - } - - /** @var int[] $rand */ - $rand = unpack('n*', $seed); - $rand[1] &= 0x03ff; - - self::$rand = $rand; - self::$time = $time; - } - - /** - * Special thanks to Nicolas Grekas for sharing the following information: - * - * Within the same ms, we increment the rand part by a random 24-bit number. - * - * Instead of getting this number from random_bytes(), which is slow, we get - * it by sha512-hashing self::$seed. This produces 64 bytes of entropy, - * which we need to split in a list of 24-bit numbers. unpack() first splits - * them into 16 x 32-bit numbers; we take the first byte of each of these - * numbers to get 5 extra 24-bit numbers. Then, we consume those numbers - * one-by-one and run this logic every 21 iterations. - * - * self::$rand holds the random part of the UUID, split into 5 x 16-bit - * numbers for x86 portability. We increment this random part by the next - * 24-bit number in the self::$seedParts list and decrement - * self::$seedIndex. - * - * @link https://twitter.com/nicolasgrekas/status/1583356938825261061 Tweet from Nicolas Grekas - */ - private function increment(): string - { - if (self::$seedIndex === 0 && self::$seed !== null) { - self::$seed = hash('sha512', self::$seed, true); - - /** @var int[] $s */ - $s = unpack('l*', self::$seed); - $s[] = ($s[1] >> 8 & 0xff0000) | ($s[2] >> 16 & 0xff00) | ($s[3] >> 24 & 0xff); - $s[] = ($s[4] >> 8 & 0xff0000) | ($s[5] >> 16 & 0xff00) | ($s[6] >> 24 & 0xff); - $s[] = ($s[7] >> 8 & 0xff0000) | ($s[8] >> 16 & 0xff00) | ($s[9] >> 24 & 0xff); - $s[] = ($s[10] >> 8 & 0xff0000) | ($s[11] >> 16 & 0xff00) | ($s[12] >> 24 & 0xff); - $s[] = ($s[13] >> 8 & 0xff0000) | ($s[14] >> 16 & 0xff00) | ($s[15] >> 24 & 0xff); - - self::$seedParts = $s; - self::$seedIndex = 21; - } - - self::$rand[5] = 0xffff & $carry = self::$rand[5] + (self::$seedParts[self::$seedIndex--] & 0xffffff); - self::$rand[4] = 0xffff & $carry = self::$rand[4] + ($carry >> 16); - self::$rand[3] = 0xffff & $carry = self::$rand[3] + ($carry >> 16); - self::$rand[2] = 0xffff & $carry = self::$rand[2] + ($carry >> 16); - self::$rand[1] += $carry >> 16; - - if (0xfc00 & self::$rand[1]) { - $time = self::$time; - $mtime = (int) substr($time, -9); - - if ($this->intSize >= 8 || strlen($time) < 10) { - $time = (string) ((int) $time + 1); - } elseif ($mtime === 999999999) { - $time = (1 + (int) substr($time, 0, -9)) . '000000000'; - } else { - $mtime++; - $time = substr_replace($time, str_pad((string) $mtime, 9, '0', STR_PAD_LEFT), -9); - } - - $this->randomize($time); - } - - return self::$time; - } -} diff --git a/vendor/ramsey/uuid/src/Guid/Fields.php b/vendor/ramsey/uuid/src/Guid/Fields.php index 0fc5d1c9..d8a1a2b1 100644 --- a/vendor/ramsey/uuid/src/Guid/Fields.php +++ b/vendor/ramsey/uuid/src/Guid/Fields.php @@ -17,7 +17,6 @@ namespace Ramsey\Uuid\Guid; use Ramsey\Uuid\Exception\InvalidArgumentException; use Ramsey\Uuid\Fields\SerializableFieldsTrait; use Ramsey\Uuid\Rfc4122\FieldsInterface; -use Ramsey\Uuid\Rfc4122\MaxTrait; use Ramsey\Uuid\Rfc4122\NilTrait; use Ramsey\Uuid\Rfc4122\VariantTrait; use Ramsey\Uuid\Rfc4122\VersionTrait; @@ -45,12 +44,16 @@ use const STR_PAD_LEFT; */ final class Fields implements FieldsInterface { - use MaxTrait; use NilTrait; use SerializableFieldsTrait; use VariantTrait; use VersionTrait; + /** + * @var string + */ + private $bytes; + /** * @param string $bytes A 16-byte binary string representation of a UUID * @@ -58,15 +61,17 @@ final class Fields implements FieldsInterface * @throws InvalidArgumentException if the byte string does not represent a GUID * @throws InvalidArgumentException if the byte string does not contain a valid version */ - public function __construct(private string $bytes) + public function __construct(string $bytes) { - if (strlen($this->bytes) !== 16) { + if (strlen($bytes) !== 16) { throw new InvalidArgumentException( 'The byte string must be 16 bytes long; ' - . 'received ' . strlen($this->bytes) . ' bytes' + . 'received ' . strlen($bytes) . ' bytes' ); } + $this->bytes = $bytes; + if (!$this->isCorrectVariant()) { throw new InvalidArgumentException( 'The byte string received does not conform to the RFC ' @@ -144,13 +149,7 @@ final class Fields implements FieldsInterface public function getClockSeq(): Hexadecimal { - if ($this->isMax()) { - $clockSeq = 0xffff; - } elseif ($this->isNil()) { - $clockSeq = 0x0000; - } else { - $clockSeq = hexdec(bin2hex(substr($this->bytes, 8, 2))) & 0x3fff; - } + $clockSeq = hexdec(bin2hex(substr($this->bytes, 8, 2))) & 0x3fff; return new Hexadecimal(str_pad(dechex($clockSeq), 4, '0', STR_PAD_LEFT)); } @@ -172,7 +171,7 @@ final class Fields implements FieldsInterface public function getVersion(): ?int { - if ($this->isNil() || $this->isMax()) { + if ($this->isNil()) { return null; } @@ -184,7 +183,7 @@ final class Fields implements FieldsInterface private function isCorrectVariant(): bool { - if ($this->isNil() || $this->isMax()) { + if ($this->isNil()) { return true; } diff --git a/vendor/ramsey/uuid/src/Guid/GuidBuilder.php b/vendor/ramsey/uuid/src/Guid/GuidBuilder.php index c036bb20..758dd6b7 100644 --- a/vendor/ramsey/uuid/src/Guid/GuidBuilder.php +++ b/vendor/ramsey/uuid/src/Guid/GuidBuilder.php @@ -31,6 +31,16 @@ use Throwable; */ class GuidBuilder implements UuidBuilderInterface { + /** + * @var NumberConverterInterface + */ + private $numberConverter; + + /** + * @var TimeConverterInterface + */ + private $timeConverter; + /** * @param NumberConverterInterface $numberConverter The number converter to * use when constructing the Guid @@ -38,9 +48,11 @@ class GuidBuilder implements UuidBuilderInterface * for converting timestamps extracted from a UUID to Unix timestamps */ public function __construct( - private NumberConverterInterface $numberConverter, - private TimeConverterInterface $timeConverter + NumberConverterInterface $numberConverter, + TimeConverterInterface $timeConverter ) { + $this->numberConverter = $numberConverter; + $this->timeConverter = $timeConverter; } /** diff --git a/vendor/ramsey/uuid/src/Lazy/LazyUuidFromString.php b/vendor/ramsey/uuid/src/Lazy/LazyUuidFromString.php index c0b47bbf..8ba75796 100644 --- a/vendor/ramsey/uuid/src/Lazy/LazyUuidFromString.php +++ b/vendor/ramsey/uuid/src/Lazy/LazyUuidFromString.php @@ -18,8 +18,8 @@ use DateTimeInterface; use Ramsey\Uuid\Converter\NumberConverterInterface; use Ramsey\Uuid\Exception\UnsupportedOperationException; use Ramsey\Uuid\Fields\FieldsInterface; +use Ramsey\Uuid\Nonstandard\UuidV6; use Ramsey\Uuid\Rfc4122\UuidV1; -use Ramsey\Uuid\Rfc4122\UuidV6; use Ramsey\Uuid\Type\Hexadecimal; use Ramsey\Uuid\Type\Integer as IntegerObject; use Ramsey\Uuid\UuidFactory; @@ -55,14 +55,18 @@ use function substr; final class LazyUuidFromString implements UuidInterface { public const VALID_REGEX = '/\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/ms'; - - private ?UuidInterface $unwrapped = null; - /** - * @psalm-param non-empty-string $uuid + * @var string + * @psalm-var non-empty-string */ - public function __construct(private string $uuid) + private $uuid; + /** @var UuidInterface|null */ + private $unwrapped; + + /** @psalm-param non-empty-string $uuid */ + public function __construct(string $uuid) { + $this->uuid = $uuid; } /** @psalm-pure */ @@ -101,20 +105,19 @@ final class LazyUuidFromString implements UuidInterface /** * {@inheritDoc} * - * @param string $data + * @param string $serialized * - * @psalm-param non-empty-string $data + * @psalm-param non-empty-string $serialized */ - public function unserialize(string $data): void + public function unserialize($serialized): void { - $this->uuid = $data; + $this->uuid = $serialized; } /** - * @param array{string?: string} $data + * @param array{string: string} $data * - * @psalm-param array{string?: non-empty-string} $data - * @psalm-suppress UnusedMethodCall + * @psalm-param array{string: non-empty-string} $data */ public function __unserialize(array $data): void { diff --git a/vendor/ramsey/uuid/src/Nonstandard/Fields.php b/vendor/ramsey/uuid/src/Nonstandard/Fields.php index 5dfe6107..927bc6a2 100644 --- a/vendor/ramsey/uuid/src/Nonstandard/Fields.php +++ b/vendor/ramsey/uuid/src/Nonstandard/Fields.php @@ -47,19 +47,26 @@ final class Fields implements FieldsInterface use SerializableFieldsTrait; use VariantTrait; + /** + * @var string + */ + private $bytes; + /** * @param string $bytes A 16-byte binary string representation of a UUID * * @throws InvalidArgumentException if the byte string is not exactly 16 bytes */ - public function __construct(private string $bytes) + public function __construct(string $bytes) { - if (strlen($this->bytes) !== 16) { + if (strlen($bytes) !== 16) { throw new InvalidArgumentException( 'The byte string must be 16 bytes long; ' - . 'received ' . strlen($this->bytes) . ' bytes' + . 'received ' . strlen($bytes) . ' bytes' ); } + + $this->bytes = $bytes; } public function getBytes(): string @@ -123,9 +130,4 @@ final class Fields implements FieldsInterface { return false; } - - public function isMax(): bool - { - return false; - } } diff --git a/vendor/ramsey/uuid/src/Nonstandard/UuidBuilder.php b/vendor/ramsey/uuid/src/Nonstandard/UuidBuilder.php index 82efd402..0c892773 100644 --- a/vendor/ramsey/uuid/src/Nonstandard/UuidBuilder.php +++ b/vendor/ramsey/uuid/src/Nonstandard/UuidBuilder.php @@ -29,6 +29,16 @@ use Throwable; */ class UuidBuilder implements UuidBuilderInterface { + /** + * @var NumberConverterInterface + */ + private $numberConverter; + + /** + * @var TimeConverterInterface + */ + private $timeConverter; + /** * @param NumberConverterInterface $numberConverter The number converter to * use when constructing the Nonstandard\Uuid @@ -36,9 +46,11 @@ class UuidBuilder implements UuidBuilderInterface * for converting timestamps extracted from a UUID to Unix timestamps */ public function __construct( - private NumberConverterInterface $numberConverter, - private TimeConverterInterface $timeConverter + NumberConverterInterface $numberConverter, + TimeConverterInterface $timeConverter ) { + $this->numberConverter = $numberConverter; + $this->timeConverter = $timeConverter; } /** diff --git a/vendor/ramsey/uuid/src/Nonstandard/UuidV6.php b/vendor/ramsey/uuid/src/Nonstandard/UuidV6.php index 1a7bbaf7..05586b3e 100644 --- a/vendor/ramsey/uuid/src/Nonstandard/UuidV6.php +++ b/vendor/ramsey/uuid/src/Nonstandard/UuidV6.php @@ -14,34 +14,39 @@ declare(strict_types=1); namespace Ramsey\Uuid\Nonstandard; +use DateTimeImmutable; +use DateTimeInterface; use Ramsey\Uuid\Codec\CodecInterface; use Ramsey\Uuid\Converter\NumberConverterInterface; use Ramsey\Uuid\Converter\TimeConverterInterface; +use Ramsey\Uuid\Exception\DateTimeException; use Ramsey\Uuid\Exception\InvalidArgumentException; use Ramsey\Uuid\Lazy\LazyUuidFromString; use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface; -use Ramsey\Uuid\Rfc4122\TimeTrait; use Ramsey\Uuid\Rfc4122\UuidInterface; use Ramsey\Uuid\Rfc4122\UuidV1; use Ramsey\Uuid\Uuid; +use Throwable; + +use function hex2bin; +use function str_pad; +use function substr; + +use const STR_PAD_LEFT; /** - * Reordered time, or version 6, UUIDs include timestamp, clock sequence, and - * node values that are combined into a 128-bit unsigned integer - * - * @deprecated Use {@see \Ramsey\Uuid\Rfc4122\UuidV6} instead. + * Ordered-time, or version 6, UUIDs include timestamp, clock sequence, and node + * values that are combined into a 128-bit unsigned integer * * @link https://github.com/uuid6/uuid6-ietf-draft UUID version 6 IETF draft * @link http://gh.peabody.io/uuidv6/ "Version 6" UUIDs * * @psalm-immutable */ -class UuidV6 extends Uuid implements UuidInterface +final class UuidV6 extends Uuid implements UuidInterface { - use TimeTrait; - /** - * Creates a version 6 (reordered time) UUID + * Creates a version 6 (time-based) UUID * * @param Rfc4122FieldsInterface $fields The fields from which to construct a UUID * @param NumberConverterInterface $numberConverter The number converter to use @@ -57,16 +62,39 @@ class UuidV6 extends Uuid implements UuidInterface CodecInterface $codec, TimeConverterInterface $timeConverter ) { - if ($fields->getVersion() !== Uuid::UUID_TYPE_REORDERED_TIME) { + if ($fields->getVersion() !== Uuid::UUID_TYPE_PEABODY) { throw new InvalidArgumentException( 'Fields used to create a UuidV6 must represent a ' - . 'version 6 (reordered time) UUID' + . 'version 6 (ordered-time) UUID' ); } parent::__construct($fields, $numberConverter, $codec, $timeConverter); } + /** + * Returns a DateTimeInterface object representing the timestamp associated + * with the UUID + * + * @return DateTimeImmutable A PHP DateTimeImmutable instance representing + * the timestamp of a version 6 UUID + */ + public function getDateTime(): DateTimeInterface + { + $time = $this->timeConverter->convertTime($this->fields->getTimestamp()); + + try { + return new DateTimeImmutable( + '@' + . $time->getSeconds()->toString() + . '.' + . str_pad($time->getMicroseconds()->toString(), 6, '0', STR_PAD_LEFT) + ); + } catch (Throwable $e) { + throw new DateTimeException($e->getMessage(), (int) $e->getCode(), $e); + } + } + /** * Converts this UUID into an instance of a version 1 UUID */ @@ -88,7 +116,7 @@ class UuidV6 extends Uuid implements UuidInterface /** * Converts a version 1 UUID into an instance of a version 6 UUID */ - public static function fromUuidV1(UuidV1 $uuidV1): \Ramsey\Uuid\Rfc4122\UuidV6 + public static function fromUuidV1(UuidV1 $uuidV1): UuidV6 { $hex = $uuidV1->getHex()->toString(); $hex = substr($hex, 13, 3) diff --git a/vendor/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php b/vendor/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php index d5b6cf0c..6d6240b7 100644 --- a/vendor/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php +++ b/vendor/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php @@ -21,6 +21,7 @@ use Ramsey\Uuid\Type\Integer as IntegerObject; use function escapeshellarg; use function preg_split; use function str_getcsv; +use function strpos; use function strrpos; use function strtolower; use function strtoupper; @@ -41,7 +42,6 @@ class SystemDceSecurityProvider implements DceSecurityProviderInterface */ public function getUid(): IntegerObject { - /** @var int|float|string|IntegerObject|null $uid */ static $uid = null; if ($uid instanceof IntegerObject) { @@ -72,7 +72,6 @@ class SystemDceSecurityProvider implements DceSecurityProviderInterface */ public function getGid(): IntegerObject { - /** @var int|float|string|IntegerObject|null $gid */ static $gid = null; if ($gid instanceof IntegerObject) { @@ -105,10 +104,15 @@ class SystemDceSecurityProvider implements DceSecurityProviderInterface return ''; } - return match ($this->getOs()) { - 'WIN' => $this->getWindowsUid(), - default => trim((string) shell_exec('id -u')), - }; + switch ($this->getOs()) { + case 'WIN': + return $this->getWindowsUid(); + case 'DAR': + case 'FRE': + case 'LIN': + default: + return trim((string) shell_exec('id -u')); + } } /** @@ -120,10 +124,15 @@ class SystemDceSecurityProvider implements DceSecurityProviderInterface return ''; } - return match ($this->getOs()) { - 'WIN' => $this->getWindowsGid(), - default => trim((string) shell_exec('id -g')), - }; + switch ($this->getOs()) { + case 'WIN': + return $this->getWindowsGid(); + case 'DAR': + case 'FRE': + case 'LIN': + default: + return trim((string) shell_exec('id -g')); + } } /** @@ -133,7 +142,7 @@ class SystemDceSecurityProvider implements DceSecurityProviderInterface { $disabledFunctions = strtolower((string) ini_get('disable_functions')); - return !str_contains($disabledFunctions, 'shell_exec'); + return strpos($disabledFunctions, 'shell_exec') === false; } /** @@ -141,13 +150,7 @@ class SystemDceSecurityProvider implements DceSecurityProviderInterface */ private function getOs(): string { - /** - * @psalm-suppress UnnecessaryVarAnnotation - * @var string $phpOs - */ - $phpOs = constant('PHP_OS'); - - return strtoupper(substr($phpOs, 0, 3)); + return strtoupper(substr(constant('PHP_OS'), 0, 3)); } /** @@ -226,6 +229,6 @@ class SystemDceSecurityProvider implements DceSecurityProviderInterface return ''; } - return trim(substr($sid, $lastHyphen + 1)); + return trim((string) substr($sid, $lastHyphen + 1)); } } diff --git a/vendor/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php b/vendor/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php index d2eb20b7..cad01045 100644 --- a/vendor/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php +++ b/vendor/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php @@ -25,17 +25,23 @@ use Ramsey\Uuid\Type\Hexadecimal; class FallbackNodeProvider implements NodeProviderInterface { /** - * @param iterable $providers Array of node providers + * @var NodeProviderCollection */ - public function __construct(private iterable $providers) + private $nodeProviders; + + /** + * @param NodeProviderCollection $providers Array of node providers + */ + public function __construct(NodeProviderCollection $providers) { + $this->nodeProviders = $providers; } public function getNode(): Hexadecimal { $lastProviderException = null; - foreach ($this->providers as $provider) { + foreach ($this->nodeProviders as $provider) { try { return $provider->getNode(); } catch (NodeException $exception) { diff --git a/vendor/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php b/vendor/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php index 1b979fae..536cb603 100644 --- a/vendor/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php +++ b/vendor/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php @@ -21,11 +21,6 @@ use Ramsey\Uuid\Type\Hexadecimal; /** * A collection of NodeProviderInterface objects * - * @deprecated this class has been deprecated, and will be removed in 5.0.0. The use-case for this class comes from - * a pre-`phpstan/phpstan` and pre-`vimeo/psalm` ecosystem, in which type safety had to be mostly enforced - * at runtime: that is no longer necessary, now that you can safely verify your code to be correct, and use - * more generic types like `iterable` instead. - * * @extends AbstractCollection */ class NodeProviderCollection extends AbstractCollection diff --git a/vendor/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php b/vendor/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php index 0f7536a8..51f1b02e 100644 --- a/vendor/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php +++ b/vendor/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php @@ -32,7 +32,10 @@ use const STR_PAD_LEFT; */ class StaticNodeProvider implements NodeProviderInterface { - private Hexadecimal $node; + /** + * @var Hexadecimal + */ + private $node; /** * @param Hexadecimal $node The static node value to use diff --git a/vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php b/vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php index d0a1e697..d512f22a 100644 --- a/vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php +++ b/vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php @@ -27,8 +27,8 @@ use function ob_start; use function preg_match; use function preg_match_all; use function reset; -use function str_contains; use function str_replace; +use function strpos; use function strtolower; use function strtoupper; use function substr; @@ -100,18 +100,12 @@ class SystemNodeProvider implements NodeProviderInterface { $disabledFunctions = strtolower((string) ini_get('disable_functions')); - if (str_contains($disabledFunctions, 'passthru')) { + if (strpos($disabledFunctions, 'passthru') !== false) { return ''; } - /** - * @psalm-suppress UnnecessaryVarAnnotation - * @var string $phpOs - */ - $phpOs = constant('PHP_OS'); - ob_start(); - switch (strtoupper(substr($phpOs, 0, 3))) { + switch (strtoupper(substr(constant('PHP_OS'), 0, 3))) { case 'WIN': passthru('ipconfig /all 2>&1'); @@ -148,20 +142,13 @@ class SystemNodeProvider implements NodeProviderInterface { $mac = ''; - /** - * @psalm-suppress UnnecessaryVarAnnotation - * @var string $phpOs - */ - $phpOs = constant('PHP_OS'); - - if (strtoupper($phpOs) === 'LINUX') { + if (strtoupper(constant('PHP_OS')) === 'LINUX') { $addressPaths = glob('/sys/class/net/*/address', GLOB_NOSORT); if ($addressPaths === false || count($addressPaths) === 0) { return ''; } - /** @var array $macs */ $macs = []; array_walk($addressPaths, function (string $addressPath) use (&$macs): void { @@ -170,10 +157,7 @@ class SystemNodeProvider implements NodeProviderInterface } }); - /** @var callable $trim */ - $trim = 'trim'; - - $macs = array_map($trim, $macs); + $macs = array_map('trim', $macs); // Remove invalid entries. $macs = array_filter($macs, function (string $address) { @@ -181,7 +165,6 @@ class SystemNodeProvider implements NodeProviderInterface && preg_match(self::SYSFS_PATTERN, $address); }); - /** @var string|bool $mac */ $mac = reset($macs); } diff --git a/vendor/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php b/vendor/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php index 526c8ff4..b8bfd721 100644 --- a/vendor/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php +++ b/vendor/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php @@ -19,15 +19,21 @@ use Ramsey\Uuid\Type\Integer as IntegerObject; use Ramsey\Uuid\Type\Time; /** - * FixedTimeProvider uses a known time to provide the time + * FixedTimeProvider uses an known time to provide the time * * This provider allows the use of a previously-generated, or known, time * when generating time-based UUIDs. */ class FixedTimeProvider implements TimeProviderInterface { - public function __construct(private Time $time) + /** + * @var Time + */ + private $fixedTime; + + public function __construct(Time $time) { + $this->fixedTime = $time; } /** @@ -37,7 +43,7 @@ class FixedTimeProvider implements TimeProviderInterface */ public function setUsec($value): void { - $this->time = new Time($this->time->getSeconds(), $value); + $this->fixedTime = new Time($this->fixedTime->getSeconds(), $value); } /** @@ -47,11 +53,11 @@ class FixedTimeProvider implements TimeProviderInterface */ public function setSec($value): void { - $this->time = new Time($value, $this->time->getMicroseconds()); + $this->fixedTime = new Time($value, $this->fixedTime->getMicroseconds()); } public function getTime(): Time { - return $this->time; + return $this->fixedTime; } } diff --git a/vendor/ramsey/uuid/src/Rfc4122/Fields.php b/vendor/ramsey/uuid/src/Rfc4122/Fields.php index 9acf810c..2ccc20bb 100644 --- a/vendor/ramsey/uuid/src/Rfc4122/Fields.php +++ b/vendor/ramsey/uuid/src/Rfc4122/Fields.php @@ -40,12 +40,16 @@ use const STR_PAD_LEFT; */ final class Fields implements FieldsInterface { - use MaxTrait; use NilTrait; use SerializableFieldsTrait; use VariantTrait; use VersionTrait; + /** + * @var string + */ + private $bytes; + /** * @param string $bytes A 16-byte binary string representation of a UUID * @@ -53,15 +57,17 @@ final class Fields implements FieldsInterface * @throws InvalidArgumentException if the byte string does not represent an RFC 4122 UUID * @throws InvalidArgumentException if the byte string does not contain a valid version */ - public function __construct(private string $bytes) + public function __construct(string $bytes) { - if (strlen($this->bytes) !== 16) { + if (strlen($bytes) !== 16) { throw new InvalidArgumentException( 'The byte string must be 16 bytes long; ' - . 'received ' . strlen($this->bytes) . ' bytes' + . 'received ' . strlen($bytes) . ' bytes' ); } + $this->bytes = $bytes; + if (!$this->isCorrectVariant()) { throw new InvalidArgumentException( 'The byte string received does not conform to the RFC 4122 variant' @@ -82,13 +88,7 @@ final class Fields implements FieldsInterface public function getClockSeq(): Hexadecimal { - if ($this->isMax()) { - $clockSeq = 0xffff; - } elseif ($this->isNil()) { - $clockSeq = 0x0000; - } else { - $clockSeq = hexdec(bin2hex(substr($this->bytes, 8, 2))) & 0x3fff; - } + $clockSeq = hexdec(bin2hex(substr($this->bytes, 8, 2))) & 0x3fff; return new Hexadecimal(str_pad(dechex($clockSeq), 4, '0', STR_PAD_LEFT)); } @@ -140,53 +140,52 @@ final class Fields implements FieldsInterface */ public function getTimestamp(): Hexadecimal { - $timestamp = match ($this->getVersion()) { - Uuid::UUID_TYPE_DCE_SECURITY => sprintf( - '%03x%04s%08s', - hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff, - $this->getTimeMid()->toString(), - '' - ), - Uuid::UUID_TYPE_REORDERED_TIME => sprintf( - '%08s%04s%03x', - $this->getTimeLow()->toString(), - $this->getTimeMid()->toString(), - hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff - ), - // The Unix timestamp in version 7 UUIDs is a 48-bit number, - // but for consistency, we will return a 60-bit number, padded - // to the left with zeros. - Uuid::UUID_TYPE_UNIX_TIME => sprintf( - '%011s%04s', - $this->getTimeLow()->toString(), - $this->getTimeMid()->toString(), - ), - default => sprintf( - '%03x%04s%08s', - hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff, - $this->getTimeMid()->toString(), - $this->getTimeLow()->toString() - ), - }; + switch ($this->getVersion()) { + case Uuid::UUID_TYPE_DCE_SECURITY: + $timestamp = sprintf( + '%03x%04s%08s', + hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff, + $this->getTimeMid()->toString(), + '' + ); + + break; + case Uuid::UUID_TYPE_PEABODY: + $timestamp = sprintf( + '%08s%04s%03x', + $this->getTimeLow()->toString(), + $this->getTimeMid()->toString(), + hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff + ); + + break; + default: + $timestamp = sprintf( + '%03x%04s%08s', + hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff, + $this->getTimeMid()->toString(), + $this->getTimeLow()->toString() + ); + } return new Hexadecimal($timestamp); } public function getVersion(): ?int { - if ($this->isNil() || $this->isMax()) { + if ($this->isNil()) { return null; } - /** @var int[] $parts */ + /** @var array $parts */ $parts = unpack('n*', $this->bytes); - return $parts[4] >> 12; + return (int) $parts[4] >> 12; } private function isCorrectVariant(): bool { - if ($this->isNil() || $this->isMax()) { + if ($this->isNil()) { return true; } diff --git a/vendor/ramsey/uuid/src/Rfc4122/FieldsInterface.php b/vendor/ramsey/uuid/src/Rfc4122/FieldsInterface.php index 2241cf57..a303525d 100644 --- a/vendor/ramsey/uuid/src/Rfc4122/FieldsInterface.php +++ b/vendor/ramsey/uuid/src/Rfc4122/FieldsInterface.php @@ -103,13 +103,11 @@ interface FieldsInterface extends BaseFieldsInterface * The version number describes how the UUID was generated and has the * following meaning: * - * 1. Gregorian time UUID + * 1. Time-based UUID * 2. DCE security UUID * 3. Name-based UUID hashed with MD5 * 4. Randomly generated UUID * 5. Name-based UUID hashed with SHA-1 - * 6. Reordered time UUID - * 7. Unix Epoch time UUID * * This returns `null` if the UUID is not an RFC 4122 variant, since version * is only meaningful for this variant. diff --git a/vendor/ramsey/uuid/src/Rfc4122/MaxTrait.php b/vendor/ramsey/uuid/src/Rfc4122/MaxTrait.php deleted file mode 100644 index dedb7279..00000000 --- a/vendor/ramsey/uuid/src/Rfc4122/MaxTrait.php +++ /dev/null @@ -1,41 +0,0 @@ - - * @license http://opensource.org/licenses/MIT MIT - */ - -declare(strict_types=1); - -namespace Ramsey\Uuid\Rfc4122; - -/** - * Provides common functionality for max UUIDs - * - * The max UUID is special form of UUID that is specified to have all 128 bits - * set to one. It is the inverse of the nil UUID. - * - * @link https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis-00#section-5.10 Max UUID - * - * @psalm-immutable - */ -trait MaxTrait -{ - /** - * Returns the bytes that comprise the fields - */ - abstract public function getBytes(): string; - - /** - * Returns true if the byte string represents a max UUID - */ - public function isMax(): bool - { - return $this->getBytes() === "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"; - } -} diff --git a/vendor/ramsey/uuid/src/Rfc4122/MaxUuid.php b/vendor/ramsey/uuid/src/Rfc4122/MaxUuid.php deleted file mode 100644 index e5ffa72c..00000000 --- a/vendor/ramsey/uuid/src/Rfc4122/MaxUuid.php +++ /dev/null @@ -1,27 +0,0 @@ - - * @license http://opensource.org/licenses/MIT MIT - */ - -declare(strict_types=1); - -namespace Ramsey\Uuid\Rfc4122; - -use Ramsey\Uuid\Uuid; - -/** - * The max UUID is special form of UUID that is specified to have all 128 bits - * set to one - * - * @psalm-immutable - */ -final class MaxUuid extends Uuid implements UuidInterface -{ -} diff --git a/vendor/ramsey/uuid/src/Rfc4122/TimeTrait.php b/vendor/ramsey/uuid/src/Rfc4122/TimeTrait.php deleted file mode 100644 index 5d939fac..00000000 --- a/vendor/ramsey/uuid/src/Rfc4122/TimeTrait.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @license http://opensource.org/licenses/MIT MIT - */ - -declare(strict_types=1); - -namespace Ramsey\Uuid\Rfc4122; - -use DateTimeImmutable; -use DateTimeInterface; -use Ramsey\Uuid\Exception\DateTimeException; -use Throwable; - -use function str_pad; - -use const STR_PAD_LEFT; - -/** - * Provides common functionality for getting the time from a time-based UUID - * - * @psalm-immutable - */ -trait TimeTrait -{ - /** - * Returns a DateTimeInterface object representing the timestamp associated - * with the UUID - * - * @return DateTimeImmutable A PHP DateTimeImmutable instance representing - * the timestamp of a time-based UUID - */ - public function getDateTime(): DateTimeInterface - { - $time = $this->timeConverter->convertTime($this->fields->getTimestamp()); - - try { - return new DateTimeImmutable( - '@' - . $time->getSeconds()->toString() - . '.' - . str_pad($time->getMicroseconds()->toString(), 6, '0', STR_PAD_LEFT) - ); - } catch (Throwable $e) { - throw new DateTimeException($e->getMessage(), (int) $e->getCode(), $e); - } - } -} diff --git a/vendor/ramsey/uuid/src/Rfc4122/UuidBuilder.php b/vendor/ramsey/uuid/src/Rfc4122/UuidBuilder.php index 2c2677db..736931af 100644 --- a/vendor/ramsey/uuid/src/Rfc4122/UuidBuilder.php +++ b/vendor/ramsey/uuid/src/Rfc4122/UuidBuilder.php @@ -17,13 +17,11 @@ namespace Ramsey\Uuid\Rfc4122; use Ramsey\Uuid\Builder\UuidBuilderInterface; use Ramsey\Uuid\Codec\CodecInterface; use Ramsey\Uuid\Converter\NumberConverterInterface; -use Ramsey\Uuid\Converter\Time\UnixTimeConverter; use Ramsey\Uuid\Converter\TimeConverterInterface; use Ramsey\Uuid\Exception\UnableToBuildUuidException; use Ramsey\Uuid\Exception\UnsupportedOperationException; -use Ramsey\Uuid\Math\BrickMathCalculator; +use Ramsey\Uuid\Nonstandard\UuidV6; use Ramsey\Uuid\Rfc4122\UuidInterface as Rfc4122UuidInterface; -use Ramsey\Uuid\Uuid; use Ramsey\Uuid\UuidInterface; use Throwable; @@ -34,7 +32,15 @@ use Throwable; */ class UuidBuilder implements UuidBuilderInterface { - private TimeConverterInterface $unixTimeConverter; + /** + * @var NumberConverterInterface + */ + private $numberConverter; + + /** + * @var TimeConverterInterface + */ + private $timeConverter; /** * Constructs the DefaultUuidBuilder @@ -42,18 +48,14 @@ class UuidBuilder implements UuidBuilderInterface * @param NumberConverterInterface $numberConverter The number converter to * use when constructing the Uuid * @param TimeConverterInterface $timeConverter The time converter to use - * for converting Gregorian time extracted from version 1, 2, and 6 - * UUIDs to Unix timestamps - * @param TimeConverterInterface|null $unixTimeConverter The time converter - * to use for converter Unix Epoch time extracted from version 7 UUIDs - * to Unix timestamps + * for converting timestamps extracted from a UUID to Unix timestamps */ public function __construct( - private NumberConverterInterface $numberConverter, - private TimeConverterInterface $timeConverter, - ?TimeConverterInterface $unixTimeConverter = null + NumberConverterInterface $numberConverter, + TimeConverterInterface $timeConverter ) { - $this->unixTimeConverter = $unixTimeConverter ?? new UnixTimeConverter(new BrickMathCalculator()); + $this->numberConverter = $numberConverter; + $this->timeConverter = $timeConverter; } /** @@ -69,34 +71,25 @@ class UuidBuilder implements UuidBuilderInterface public function build(CodecInterface $codec, string $bytes): UuidInterface { try { - /** @var Fields $fields */ $fields = $this->buildFields($bytes); if ($fields->isNil()) { return new NilUuid($fields, $this->numberConverter, $codec, $this->timeConverter); } - if ($fields->isMax()) { - return new MaxUuid($fields, $this->numberConverter, $codec, $this->timeConverter); - } - switch ($fields->getVersion()) { - case Uuid::UUID_TYPE_TIME: + case 1: return new UuidV1($fields, $this->numberConverter, $codec, $this->timeConverter); - case Uuid::UUID_TYPE_DCE_SECURITY: + case 2: return new UuidV2($fields, $this->numberConverter, $codec, $this->timeConverter); - case Uuid::UUID_TYPE_HASH_MD5: + case 3: return new UuidV3($fields, $this->numberConverter, $codec, $this->timeConverter); - case Uuid::UUID_TYPE_RANDOM: + case 4: return new UuidV4($fields, $this->numberConverter, $codec, $this->timeConverter); - case Uuid::UUID_TYPE_HASH_SHA1: + case 5: return new UuidV5($fields, $this->numberConverter, $codec, $this->timeConverter); - case Uuid::UUID_TYPE_REORDERED_TIME: + case 6: return new UuidV6($fields, $this->numberConverter, $codec, $this->timeConverter); - case Uuid::UUID_TYPE_UNIX_TIME: - return new UuidV7($fields, $this->numberConverter, $codec, $this->unixTimeConverter); - case Uuid::UUID_TYPE_CUSTOM: - return new UuidV8($fields, $this->numberConverter, $codec, $this->timeConverter); } throw new UnsupportedOperationException( diff --git a/vendor/ramsey/uuid/src/Rfc4122/UuidInterface.php b/vendor/ramsey/uuid/src/Rfc4122/UuidInterface.php index e80f33be..3e4d9fae 100644 --- a/vendor/ramsey/uuid/src/Rfc4122/UuidInterface.php +++ b/vendor/ramsey/uuid/src/Rfc4122/UuidInterface.php @@ -26,4 +26,11 @@ use Ramsey\Uuid\UuidInterface as BaseUuidInterface; */ interface UuidInterface extends BaseUuidInterface { + /** + * Returns the string standard representation of the UUID as a URN + * + * @link http://en.wikipedia.org/wiki/Uniform_Resource_Name Uniform Resource Name + * @link https://tools.ietf.org/html/rfc4122#section-3 RFC 4122, § 3: Namespace Registration Template + */ + public function getUrn(): string; } diff --git a/vendor/ramsey/uuid/src/Rfc4122/UuidV1.php b/vendor/ramsey/uuid/src/Rfc4122/UuidV1.php index 515c038d..764e42f8 100644 --- a/vendor/ramsey/uuid/src/Rfc4122/UuidV1.php +++ b/vendor/ramsey/uuid/src/Rfc4122/UuidV1.php @@ -14,25 +14,31 @@ declare(strict_types=1); namespace Ramsey\Uuid\Rfc4122; +use DateTimeImmutable; +use DateTimeInterface; use Ramsey\Uuid\Codec\CodecInterface; use Ramsey\Uuid\Converter\NumberConverterInterface; use Ramsey\Uuid\Converter\TimeConverterInterface; +use Ramsey\Uuid\Exception\DateTimeException; use Ramsey\Uuid\Exception\InvalidArgumentException; use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface; use Ramsey\Uuid\Uuid; +use Throwable; + +use function str_pad; + +use const STR_PAD_LEFT; /** - * Gregorian time, or version 1, UUIDs include timestamp, clock sequence, and node + * Time-based, or version 1, UUIDs include timestamp, clock sequence, and node * values that are combined into a 128-bit unsigned integer * * @psalm-immutable */ final class UuidV1 extends Uuid implements UuidInterface { - use TimeTrait; - /** - * Creates a version 1 (Gregorian time) UUID + * Creates a version 1 (time-based) UUID * * @param Rfc4122FieldsInterface $fields The fields from which to construct a UUID * @param NumberConverterInterface $numberConverter The number converter to use @@ -57,4 +63,30 @@ final class UuidV1 extends Uuid implements UuidInterface parent::__construct($fields, $numberConverter, $codec, $timeConverter); } + + /** + * Returns a DateTimeInterface object representing the timestamp associated + * with the UUID + * + * The timestamp value is only meaningful in a time-based UUID, which + * has version type 1. + * + * @return DateTimeImmutable A PHP DateTimeImmutable instance representing + * the timestamp of a version 1 UUID + */ + public function getDateTime(): DateTimeInterface + { + $time = $this->timeConverter->convertTime($this->fields->getTimestamp()); + + try { + return new DateTimeImmutable( + '@' + . $time->getSeconds()->toString() + . '.' + . str_pad($time->getMicroseconds()->toString(), 6, '0', STR_PAD_LEFT) + ); + } catch (Throwable $e) { + throw new DateTimeException($e->getMessage(), (int) $e->getCode(), $e); + } + } } diff --git a/vendor/ramsey/uuid/src/Rfc4122/UuidV2.php b/vendor/ramsey/uuid/src/Rfc4122/UuidV2.php index c8ccbe42..74906f05 100644 --- a/vendor/ramsey/uuid/src/Rfc4122/UuidV2.php +++ b/vendor/ramsey/uuid/src/Rfc4122/UuidV2.php @@ -14,33 +14,28 @@ declare(strict_types=1); namespace Ramsey\Uuid\Rfc4122; +use DateTimeImmutable; +use DateTimeInterface; use Ramsey\Uuid\Codec\CodecInterface; use Ramsey\Uuid\Converter\NumberConverterInterface; use Ramsey\Uuid\Converter\TimeConverterInterface; +use Ramsey\Uuid\Exception\DateTimeException; use Ramsey\Uuid\Exception\InvalidArgumentException; use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface; use Ramsey\Uuid\Type\Integer as IntegerObject; use Ramsey\Uuid\Uuid; +use Throwable; use function hexdec; +use function str_pad; + +use const STR_PAD_LEFT; /** * DCE Security version, or version 2, UUIDs include local domain identifier, * local ID for the specified domain, and node values that are combined into a * 128-bit unsigned integer * - * It is important to note that a version 2 UUID suffers from some loss of - * fidelity of the timestamp, due to replacing the time_low field with the - * local identifier. When constructing the timestamp value for date - * purposes, we replace the local identifier bits with zeros. As a result, - * the timestamp can be off by a range of 0 to 429.4967295 seconds (or 7 - * minutes, 9 seconds, and 496730 microseconds). - * - * Astute observers might note this value directly corresponds to 2^32 - 1, - * or 0xffffffff. The local identifier is 32-bits, and we have set each of - * these bits to 0, so the maximum range of timestamp drift is 0x00000000 - * to 0xffffffff (counted in 100-nanosecond intervals). - * * @link https://publications.opengroup.org/c311 DCE 1.1: Authentication and Security Services * @link https://publications.opengroup.org/c706 DCE 1.1: Remote Procedure Call * @link https://pubs.opengroup.org/onlinepubs/9696989899/chap5.htm#tagcjh_08_02_01_01 DCE 1.1: Auth & Sec, §5.2.1.1 @@ -52,8 +47,6 @@ use function hexdec; */ final class UuidV2 extends Uuid implements UuidInterface { - use TimeTrait; - /** * Creates a version 2 (DCE Security) UUID * @@ -81,6 +74,41 @@ final class UuidV2 extends Uuid implements UuidInterface parent::__construct($fields, $numberConverter, $codec, $timeConverter); } + /** + * Returns a DateTimeInterface object representing the timestamp associated + * with the UUID + * + * It is important to note that a version 2 UUID suffers from some loss of + * fidelity of the timestamp, due to replacing the time_low field with the + * local identifier. When constructing the timestamp value for date + * purposes, we replace the local identifier bits with zeros. As a result, + * the timestamp can be off by a range of 0 to 429.4967295 seconds (or 7 + * minutes, 9 seconds, and 496730 microseconds). + * + * Astute observers might note this value directly corresponds to 2^32 - 1, + * or 0xffffffff. The local identifier is 32-bits, and we have set each of + * these bits to 0, so the maximum range of timestamp drift is 0x00000000 + * to 0xffffffff (counted in 100-nanosecond intervals). + * + * @return DateTimeImmutable A PHP DateTimeImmutable instance representing + * the timestamp of a version 2 UUID + */ + public function getDateTime(): DateTimeInterface + { + $time = $this->timeConverter->convertTime($this->fields->getTimestamp()); + + try { + return new DateTimeImmutable( + '@' + . $time->getSeconds()->toString() + . '.' + . str_pad($time->getMicroseconds()->toString(), 6, '0', STR_PAD_LEFT) + ); + } catch (Throwable $e) { + throw new DateTimeException($e->getMessage(), (int) $e->getCode(), $e); + } + } + /** * Returns the local domain used to create this version 2 UUID */ diff --git a/vendor/ramsey/uuid/src/Rfc4122/UuidV6.php b/vendor/ramsey/uuid/src/Rfc4122/UuidV6.php deleted file mode 100644 index 7e374339..00000000 --- a/vendor/ramsey/uuid/src/Rfc4122/UuidV6.php +++ /dev/null @@ -1,29 +0,0 @@ - - * @license http://opensource.org/licenses/MIT MIT - */ - -declare(strict_types=1); - -namespace Ramsey\Uuid\Rfc4122; - -use Ramsey\Uuid\Nonstandard\UuidV6 as NonstandardUuidV6; - -/** - * Reordered time, or version 6, UUIDs include timestamp, clock sequence, and - * node values that are combined into a 128-bit unsigned integer - * - * @link https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis-00#section-5.6 UUID Version 6 - * - * @psalm-immutable - */ -final class UuidV6 extends NonstandardUuidV6 implements UuidInterface -{ -} diff --git a/vendor/ramsey/uuid/src/Rfc4122/UuidV7.php b/vendor/ramsey/uuid/src/Rfc4122/UuidV7.php deleted file mode 100644 index 5b524c48..00000000 --- a/vendor/ramsey/uuid/src/Rfc4122/UuidV7.php +++ /dev/null @@ -1,62 +0,0 @@ - - * @license http://opensource.org/licenses/MIT MIT - */ - -declare(strict_types=1); - -namespace Ramsey\Uuid\Rfc4122; - -use Ramsey\Uuid\Codec\CodecInterface; -use Ramsey\Uuid\Converter\NumberConverterInterface; -use Ramsey\Uuid\Converter\TimeConverterInterface; -use Ramsey\Uuid\Exception\InvalidArgumentException; -use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface; -use Ramsey\Uuid\Uuid; - -/** - * Unix Epoch time, or version 7, UUIDs include a timestamp in milliseconds - * since the Unix Epoch, along with random bytes - * - * @link https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis-00#section-5.7 UUID Version 7 - * - * @psalm-immutable - */ -final class UuidV7 extends Uuid implements UuidInterface -{ - use TimeTrait; - - /** - * Creates a version 7 (Unix Epoch time) UUID - * - * @param Rfc4122FieldsInterface $fields The fields from which to construct a UUID - * @param NumberConverterInterface $numberConverter The number converter to use - * for converting hex values to/from integers - * @param CodecInterface $codec The codec to use when encoding or decoding - * UUID strings - * @param TimeConverterInterface $timeConverter The time converter to use - * for converting timestamps extracted from a UUID to unix timestamps - */ - public function __construct( - Rfc4122FieldsInterface $fields, - NumberConverterInterface $numberConverter, - CodecInterface $codec, - TimeConverterInterface $timeConverter - ) { - if ($fields->getVersion() !== Uuid::UUID_TYPE_UNIX_TIME) { - throw new InvalidArgumentException( - 'Fields used to create a UuidV7 must represent a ' - . 'version 7 (Unix Epoch time) UUID' - ); - } - - parent::__construct($fields, $numberConverter, $codec, $timeConverter); - } -} diff --git a/vendor/ramsey/uuid/src/Rfc4122/UuidV8.php b/vendor/ramsey/uuid/src/Rfc4122/UuidV8.php deleted file mode 100644 index 78b0290c..00000000 --- a/vendor/ramsey/uuid/src/Rfc4122/UuidV8.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @license http://opensource.org/licenses/MIT MIT - */ - -declare(strict_types=1); - -namespace Ramsey\Uuid\Rfc4122; - -use Ramsey\Uuid\Codec\CodecInterface; -use Ramsey\Uuid\Converter\NumberConverterInterface; -use Ramsey\Uuid\Converter\TimeConverterInterface; -use Ramsey\Uuid\Exception\InvalidArgumentException; -use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface; -use Ramsey\Uuid\Uuid; - -/** - * Version 8, Custom UUIDs provide an RFC 4122 compatible format for - * experimental or vendor-specific uses - * - * The only requirement for version 8 UUIDs is that the version and variant bits - * must be set. Otherwise, implementations are free to set the other bits - * according to their needs. As a result, the uniqueness of version 8 UUIDs is - * implementation-specific and should not be assumed. - * - * @link https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis-00#section-5.8 UUID Version 8 - * - * @psalm-immutable - */ -final class UuidV8 extends Uuid implements UuidInterface -{ - /** - * Creates a version 8 (custom) UUID - * - * @param Rfc4122FieldsInterface $fields The fields from which to construct a UUID - * @param NumberConverterInterface $numberConverter The number converter to use - * for converting hex values to/from integers - * @param CodecInterface $codec The codec to use when encoding or decoding - * UUID strings - * @param TimeConverterInterface $timeConverter The time converter to use - * for converting timestamps extracted from a UUID to unix timestamps - */ - public function __construct( - Rfc4122FieldsInterface $fields, - NumberConverterInterface $numberConverter, - CodecInterface $codec, - TimeConverterInterface $timeConverter - ) { - if ($fields->getVersion() !== Uuid::UUID_TYPE_CUSTOM) { - throw new InvalidArgumentException( - 'Fields used to create a UuidV8 must represent a ' - . 'version 8 (custom) UUID' - ); - } - - parent::__construct($fields, $numberConverter, $codec, $timeConverter); - } -} diff --git a/vendor/ramsey/uuid/src/Rfc4122/Validator.php b/vendor/ramsey/uuid/src/Rfc4122/Validator.php index e82a11e6..ed43c982 100644 --- a/vendor/ramsey/uuid/src/Rfc4122/Validator.php +++ b/vendor/ramsey/uuid/src/Rfc4122/Validator.php @@ -28,7 +28,7 @@ use function str_replace; final class Validator implements ValidatorInterface { private const VALID_PATTERN = '\A[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-' - . '[1-8][0-9A-Fa-f]{3}-[ABab89][0-9A-Fa-f]{3}-[0-9A-Fa-f]{12}\z'; + . '[1-5]{1}[0-9A-Fa-f]{3}-[ABab89]{1}[0-9A-Fa-f]{3}-[0-9A-Fa-f]{12}\z'; /** * @psalm-return non-empty-string @@ -43,8 +43,7 @@ final class Validator implements ValidatorInterface public function validate(string $uuid): bool { $uuid = str_replace(['urn:', 'uuid:', 'URN:', 'UUID:', '{', '}'], '', $uuid); - $uuid = strtolower($uuid); - return $uuid === Uuid::NIL || $uuid === Uuid::MAX || preg_match('/' . self::VALID_PATTERN . '/Dms', $uuid); + return $uuid === Uuid::NIL || preg_match('/' . self::VALID_PATTERN . '/Dms', $uuid); } } diff --git a/vendor/ramsey/uuid/src/Rfc4122/VariantTrait.php b/vendor/ramsey/uuid/src/Rfc4122/VariantTrait.php index 1041de51..4c981658 100644 --- a/vendor/ramsey/uuid/src/Rfc4122/VariantTrait.php +++ b/vendor/ramsey/uuid/src/Rfc4122/VariantTrait.php @@ -19,8 +19,8 @@ use Ramsey\Uuid\Uuid; use function decbin; use function str_pad; -use function str_starts_with; use function strlen; +use function strpos; use function substr; use function unpack; @@ -58,13 +58,7 @@ trait VariantTrait throw new InvalidBytesException('Invalid number of bytes'); } - if ($this->isMax() || $this->isNil()) { - // RFC 4122 defines these special types of UUID, so we will consider - // them as belonging to the RFC 4122 variant. - return Uuid::RFC_4122; - } - - /** @var int[] $parts */ + /** @var array $parts */ $parts = unpack('n*', $this->getBytes()); // $parts[5] is a 16-bit, unsigned integer containing the variant bits @@ -73,7 +67,7 @@ trait VariantTrait // three characters (three most-significant bits) to determine the // variant. $binary = str_pad( - decbin($parts[5]), + decbin((int) $parts[5]), 16, '0', STR_PAD_LEFT @@ -82,13 +76,15 @@ trait VariantTrait $msb = substr($binary, 0, 3); if ($msb === '111') { - return Uuid::RESERVED_FUTURE; + $variant = Uuid::RESERVED_FUTURE; } elseif ($msb === '110') { - return Uuid::RESERVED_MICROSOFT; - } elseif (str_starts_with($msb, '10')) { - return Uuid::RFC_4122; + $variant = Uuid::RESERVED_MICROSOFT; + } elseif (strpos($msb, '10') === 0) { + $variant = Uuid::RFC_4122; + } else { + $variant = Uuid::RESERVED_NCS; } - return Uuid::RESERVED_NCS; + return $variant; } } diff --git a/vendor/ramsey/uuid/src/Rfc4122/VersionTrait.php b/vendor/ramsey/uuid/src/Rfc4122/VersionTrait.php index 0195e46c..cee55fbe 100644 --- a/vendor/ramsey/uuid/src/Rfc4122/VersionTrait.php +++ b/vendor/ramsey/uuid/src/Rfc4122/VersionTrait.php @@ -14,8 +14,6 @@ declare(strict_types=1); namespace Ramsey\Uuid\Rfc4122; -use Ramsey\Uuid\Uuid; - /** * Provides common functionality for handling the version, as defined by RFC 4122 * @@ -28,11 +26,6 @@ trait VersionTrait */ abstract public function getVersion(): ?int; - /** - * Returns true if these fields represent a max UUID - */ - abstract public function isMax(): bool; - /** * Returns true if these fields represent a nil UUID */ @@ -45,16 +38,20 @@ trait VersionTrait */ private function isCorrectVersion(): bool { - if ($this->isNil() || $this->isMax()) { + if ($this->isNil()) { return true; } - return match ($this->getVersion()) { - Uuid::UUID_TYPE_TIME, Uuid::UUID_TYPE_DCE_SECURITY, - Uuid::UUID_TYPE_HASH_MD5, Uuid::UUID_TYPE_RANDOM, - Uuid::UUID_TYPE_HASH_SHA1, Uuid::UUID_TYPE_REORDERED_TIME, - Uuid::UUID_TYPE_UNIX_TIME, Uuid::UUID_TYPE_CUSTOM => true, - default => false, - }; + switch ($this->getVersion()) { + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + return true; + } + + return false; } } diff --git a/vendor/ramsey/uuid/src/Type/Decimal.php b/vendor/ramsey/uuid/src/Type/Decimal.php index acc5e754..10f93845 100644 --- a/vendor/ramsey/uuid/src/Type/Decimal.php +++ b/vendor/ramsey/uuid/src/Type/Decimal.php @@ -19,7 +19,6 @@ use ValueError; use function is_numeric; use function sprintf; -use function str_starts_with; /** * A value object representing a decimal @@ -35,10 +34,20 @@ use function str_starts_with; */ final class Decimal implements NumberInterface { - private string $value; - private bool $isNegative = false; + /** + * @var string + */ + private $value; - public function __construct(float | int | string | self $value) + /** + * @var bool + */ + private $isNegative = false; + + /** + * @param mixed $value The decimal value to store + */ + public function __construct($value) { $value = (string) $value; @@ -50,7 +59,7 @@ final class Decimal implements NumberInterface } // Remove the leading +-symbol. - if (str_starts_with($value, '+')) { + if (strpos($value, '+') === 0) { $value = substr($value, 1); } @@ -59,7 +68,7 @@ final class Decimal implements NumberInterface $value = '0'; } - if (str_starts_with($value, '-')) { + if (strpos($value, '-') === 0) { $this->isNegative = true; } @@ -102,19 +111,18 @@ final class Decimal implements NumberInterface /** * Constructs the object from a serialized string representation * - * @param string $data The serialized string representation of the object + * @param string $serialized The serialized string representation of the object * + * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint * @psalm-suppress UnusedMethodCall */ - public function unserialize(string $data): void + public function unserialize($serialized): void { - $this->__construct($data); + $this->__construct($serialized); } /** - * @param array{string?: string} $data - * - * @psalm-suppress UnusedMethodCall + * @param array{string: string} $data */ public function __unserialize(array $data): void { diff --git a/vendor/ramsey/uuid/src/Type/Hexadecimal.php b/vendor/ramsey/uuid/src/Type/Hexadecimal.php index bf71ec4b..88adc2e7 100644 --- a/vendor/ramsey/uuid/src/Type/Hexadecimal.php +++ b/vendor/ramsey/uuid/src/Type/Hexadecimal.php @@ -17,8 +17,10 @@ namespace Ramsey\Uuid\Type; use Ramsey\Uuid\Exception\InvalidArgumentException; use ValueError; -use function preg_match; +use function ctype_xdigit; use function sprintf; +use function strpos; +use function strtolower; use function substr; /** @@ -32,14 +34,29 @@ use function substr; */ final class Hexadecimal implements TypeInterface { - private string $value; + /** + * @var string + */ + private $value; /** - * @param self|string $value The hexadecimal value to store + * @param string $value The hexadecimal value to store */ - public function __construct(self | string $value) + public function __construct(string $value) { - $this->value = $value instanceof self ? (string) $value : $this->prepareValue($value); + $value = strtolower($value); + + if (strpos($value, '0x') === 0) { + $value = substr($value, 2); + } + + if (!ctype_xdigit($value)) { + throw new InvalidArgumentException( + 'Value must be a hexadecimal number' + ); + } + + $this->value = $value; } public function toString(): string @@ -73,17 +90,18 @@ final class Hexadecimal implements TypeInterface /** * Constructs the object from a serialized string representation * - * @param string $data The serialized string representation of the object + * @param string $serialized The serialized string representation of the object * + * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint * @psalm-suppress UnusedMethodCall */ - public function unserialize(string $data): void + public function unserialize($serialized): void { - $this->__construct($data); + $this->__construct($serialized); } /** - * @param array{string?: string} $data + * @param array{string: string} $data */ public function __unserialize(array $data): void { @@ -95,21 +113,4 @@ final class Hexadecimal implements TypeInterface $this->unserialize($data['string']); } - - private function prepareValue(string $value): string - { - $value = strtolower($value); - - if (str_starts_with($value, '0x')) { - $value = substr($value, 2); - } - - if (!preg_match('/^[A-Fa-f0-9]+$/', $value)) { - throw new InvalidArgumentException( - 'Value must be a hexadecimal number' - ); - } - - return $value; - } } diff --git a/vendor/ramsey/uuid/src/Type/Integer.php b/vendor/ramsey/uuid/src/Type/Integer.php index 50dac993..7690f6cd 100644 --- a/vendor/ramsey/uuid/src/Type/Integer.php +++ b/vendor/ramsey/uuid/src/Type/Integer.php @@ -17,10 +17,10 @@ namespace Ramsey\Uuid\Type; use Ramsey\Uuid\Exception\InvalidArgumentException; use ValueError; -use function assert; -use function is_numeric; -use function preg_match; +use function ctype_digit; +use function ltrim; use function sprintf; +use function strpos; use function substr; /** @@ -40,13 +40,52 @@ final class Integer implements NumberInterface /** * @psalm-var numeric-string */ - private string $value; + private $value; - private bool $isNegative = false; + /** + * @var bool + */ + private $isNegative = false; - public function __construct(float | int | string | self $value) + /** + * @param mixed $value The integer value to store + */ + public function __construct($value) { - $this->value = $value instanceof self ? (string) $value : $this->prepareValue($value); + $value = (string) $value; + $sign = '+'; + + // If the value contains a sign, remove it for ctype_digit() check. + if (strpos($value, '-') === 0 || strpos($value, '+') === 0) { + $sign = substr($value, 0, 1); + $value = substr($value, 1); + } + + if (!ctype_digit($value)) { + throw new InvalidArgumentException( + 'Value must be a signed integer or a string containing only ' + . 'digits 0-9 and, optionally, a sign (+ or -)' + ); + } + + // Trim any leading zeros. + $value = ltrim($value, '0'); + + // Set to zero if the string is empty after trimming zeros. + if ($value === '') { + $value = '0'; + } + + // Add the negative sign back to the value. + if ($sign === '-' && $value !== '0') { + $value = $sign . $value; + $this->isNegative = true; + } + + /** @psalm-var numeric-string $numericValue */ + $numericValue = $value; + + $this->value = $numericValue; } public function isNegative(): bool @@ -62,9 +101,6 @@ final class Integer implements NumberInterface return $this->value; } - /** - * @psalm-return numeric-string - */ public function __toString(): string { return $this->toString(); @@ -91,17 +127,18 @@ final class Integer implements NumberInterface /** * Constructs the object from a serialized string representation * - * @param string $data The serialized string representation of the object + * @param string $serialized The serialized string representation of the object * + * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint * @psalm-suppress UnusedMethodCall */ - public function unserialize(string $data): void + public function unserialize($serialized): void { - $this->__construct($data); + $this->__construct($serialized); } /** - * @param array{string?: string} $data + * @param array{string: string} $data */ public function __unserialize(array $data): void { @@ -113,46 +150,4 @@ final class Integer implements NumberInterface $this->unserialize($data['string']); } - - /** - * @return numeric-string - */ - private function prepareValue(float | int | string $value): string - { - $value = (string) $value; - $sign = '+'; - - // If the value contains a sign, remove it for digit pattern check. - if (str_starts_with($value, '-') || str_starts_with($value, '+')) { - $sign = substr($value, 0, 1); - $value = substr($value, 1); - } - - if (!preg_match('/^\d+$/', $value)) { - throw new InvalidArgumentException( - 'Value must be a signed integer or a string containing only ' - . 'digits 0-9 and, optionally, a sign (+ or -)' - ); - } - - // Trim any leading zeros. - $value = ltrim($value, '0'); - - // Set to zero if the string is empty after trimming zeros. - if ($value === '') { - $value = '0'; - } - - // Add the negative sign back to the value. - if ($sign === '-' && $value !== '0') { - $value = $sign . $value; - - /** @psalm-suppress InaccessibleProperty */ - $this->isNegative = true; - } - - assert(is_numeric($value)); - - return $value; - } } diff --git a/vendor/ramsey/uuid/src/Type/Time.php b/vendor/ramsey/uuid/src/Type/Time.php index 0cedb447..dd1b8bc2 100644 --- a/vendor/ramsey/uuid/src/Type/Time.php +++ b/vendor/ramsey/uuid/src/Type/Time.php @@ -17,6 +17,7 @@ namespace Ramsey\Uuid\Type; use Ramsey\Uuid\Exception\UnsupportedOperationException; use Ramsey\Uuid\Type\Integer as IntegerObject; use ValueError; +use stdClass; use function json_decode; use function json_encode; @@ -33,13 +34,22 @@ use function sprintf; */ final class Time implements TypeInterface { - private IntegerObject $seconds; - private IntegerObject $microseconds; + /** + * @var IntegerObject + */ + private $seconds; - public function __construct( - float | int | string | IntegerObject $seconds, - float | int | string | IntegerObject $microseconds = 0, - ) { + /** + * @var IntegerObject + */ + private $microseconds; + + /** + * @param mixed $seconds + * @param mixed $microseconds + */ + public function __construct($seconds, $microseconds = 0) + { $this->seconds = new IntegerObject($seconds); $this->microseconds = new IntegerObject($microseconds); } @@ -56,7 +66,7 @@ final class Time implements TypeInterface public function toString(): string { - return $this->seconds->toString() . '.' . sprintf('%06s', $this->microseconds->toString()); + return $this->seconds->toString() . '.' . $this->microseconds->toString(); } public function __toString(): string @@ -94,26 +104,27 @@ final class Time implements TypeInterface /** * Constructs the object from a serialized string representation * - * @param string $data The serialized string representation of the object + * @param string $serialized The serialized string representation of the object * + * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint * @psalm-suppress UnusedMethodCall */ - public function unserialize(string $data): void + public function unserialize($serialized): void { - /** @var array{seconds?: int|float|string, microseconds?: int|float|string} $time */ - $time = json_decode($data, true); + /** @var stdClass $time */ + $time = json_decode($serialized); - if (!isset($time['seconds']) || !isset($time['microseconds'])) { + if (!isset($time->seconds) || !isset($time->microseconds)) { throw new UnsupportedOperationException( 'Attempted to unserialize an invalid value' ); } - $this->__construct($time['seconds'], $time['microseconds']); + $this->__construct($time->seconds, $time->microseconds); } /** - * @param array{seconds?: string, microseconds?: string} $data + * @param array{seconds: string, microseconds: string} $data */ public function __unserialize(array $data): void { diff --git a/vendor/ramsey/uuid/src/Uuid.php b/vendor/ramsey/uuid/src/Uuid.php index 144a7a04..945480ba 100644 --- a/vendor/ramsey/uuid/src/Uuid.php +++ b/vendor/ramsey/uuid/src/Uuid.php @@ -18,7 +18,6 @@ use DateTimeInterface; use Ramsey\Uuid\Codec\CodecInterface; use Ramsey\Uuid\Converter\NumberConverterInterface; use Ramsey\Uuid\Converter\TimeConverterInterface; -use Ramsey\Uuid\Exception\UnsupportedOperationException; use Ramsey\Uuid\Fields\FieldsInterface; use Ramsey\Uuid\Lazy\LazyUuidFromString; use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface; @@ -28,7 +27,6 @@ use ValueError; use function assert; use function bin2hex; -use function method_exists; use function preg_match; use function sprintf; use function str_replace; @@ -84,14 +82,6 @@ class Uuid implements UuidInterface */ public const NIL = '00000000-0000-0000-0000-000000000000'; - /** - * The max UUID is a special form of UUID that is specified to have all 128 - * bits set to one - * - * @link https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis-00#section-5.10 Max UUID - */ - public const MAX = 'ffffffff-ffff-ffff-ffff-ffffffffffff'; - /** * Variant: reserved, NCS backward compatibility * @@ -126,7 +116,7 @@ class Uuid implements UuidInterface public const VALID_PATTERN = '^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$'; /** - * Version 1 (Gregorian time) UUID + * Version 1 (time-based) UUID * * @link https://tools.ietf.org/html/rfc4122#section-4.1.3 RFC 4122, § 4.1.3: Version */ @@ -166,29 +156,16 @@ class Uuid implements UuidInterface public const UUID_TYPE_HASH_SHA1 = 5; /** - * @deprecated Use {@see Uuid::UUID_TYPE_REORDERED_TIME} instead. + * Version 6 (ordered-time) UUID + * + * This is named `UUID_TYPE_PEABODY`, since the specification is still in + * draft form, and the primary author/editor's name is Brad Peabody. + * + * @link https://github.com/uuid6/uuid6-ietf-draft UUID version 6 IETF draft + * @link http://gh.peabody.io/uuidv6/ "Version 6" UUIDs */ public const UUID_TYPE_PEABODY = 6; - /** - * Version 6 (reordered time) UUID - * - * @link https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis-00#section-5.6 UUID Version 6 - */ - public const UUID_TYPE_REORDERED_TIME = 6; - - /** - * Version 7 (Unix Epoch time) UUID - * - * @link https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis-00#section-5.7 UUID Version 7 - */ - public const UUID_TYPE_UNIX_TIME = 7; - - /** - * @link https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis-00#section-5.8 UUID Version 8 - */ - public const UUID_TYPE_CUSTOM = 8; - /** * DCE Security principal domain * @@ -221,19 +198,38 @@ class Uuid implements UuidInterface self::DCE_DOMAIN_ORG => 'org', ]; - private static ?UuidFactoryInterface $factory = null; + /** + * @var UuidFactoryInterface|null + */ + private static $factory = null; /** - * @var bool flag to detect if the UUID factory was replaced internally, - * which disables all optimizations for the default/happy path internal - * scenarios + * @var bool flag to detect if the UUID factory was replaced internally, which disables all optimizations + * for the default/happy path internal scenarios */ - private static bool $factoryReplaced = false; + private static $factoryReplaced = false; - protected CodecInterface $codec; - protected NumberConverterInterface $numberConverter; - protected Rfc4122FieldsInterface $fields; - protected TimeConverterInterface $timeConverter; + /** + * @var CodecInterface + */ + protected $codec; + + /** + * The fields that make up this UUID + * + * @var Rfc4122FieldsInterface + */ + protected $fields; + + /** + * @var NumberConverterInterface + */ + protected $numberConverter; + + /** + * @var TimeConverterInterface + */ + protected $timeConverter; /** * Creates a universally unique identifier (UUID) from an array of fields @@ -306,17 +302,19 @@ class Uuid implements UuidInterface /** * Re-constructs the object from its serialized form * - * @param string $data The serialized PHP string to unserialize into + * @param string $serialized The serialized PHP string to unserialize into * a UuidInterface instance + * + * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint */ - public function unserialize(string $data): void + public function unserialize($serialized): void { - if (strlen($data) === 16) { + if (strlen($serialized) === 16) { /** @var Uuid $uuid */ - $uuid = self::getFactory()->fromBytes($data); + $uuid = self::getFactory()->fromBytes($serialized); } else { /** @var Uuid $uuid */ - $uuid = self::getFactory()->fromString($data); + $uuid = self::getFactory()->fromString($serialized); } $this->codec = $uuid->codec; @@ -326,7 +324,7 @@ class Uuid implements UuidInterface } /** - * @param array{bytes?: string} $data + * @param array{bytes: string} $data */ public function __unserialize(array $data): void { @@ -386,11 +384,6 @@ class Uuid implements UuidInterface return new IntegerObject($this->numberConverter->fromHex($this->getHex()->toString())); } - public function getUrn(): string - { - return 'urn:uuid:' . $this->toString(); - } - /** * @psalm-return non-empty-string */ @@ -483,11 +476,10 @@ class Uuid implements UuidInterface */ public static function fromString(string $uuid): UuidInterface { - $uuid = strtolower($uuid); if (! self::$factoryReplaced && preg_match(LazyUuidFromString::VALID_REGEX, $uuid) === 1) { assert($uuid !== ''); - return new LazyUuidFromString($uuid); + return new LazyUuidFromString(strtolower($uuid)); } return self::getFactory()->fromString($uuid); @@ -539,8 +531,6 @@ class Uuid implements UuidInterface * * @psalm-pure note: changing the internal factory is an edge case not covered by purity invariants, * but under constant factory setups, this method operates in functionally pure manners - * - * @psalm-assert-if-true non-empty-string $uuid */ public static function isValid(string $uuid): bool { @@ -548,7 +538,7 @@ class Uuid implements UuidInterface } /** - * Returns a version 1 (Gregorian time) UUID from a host ID, sequence number, + * Returns a version 1 (time-based) UUID from a host ID, sequence number, * and the current time * * @param Hexadecimal|int|string|null $node A 48-bit number representing the @@ -653,7 +643,7 @@ class Uuid implements UuidInterface } /** - * Returns a version 6 (reordered time) UUID from a host ID, sequence number, + * Returns a version 6 (ordered-time) UUID from a host ID, sequence number, * and the current time * * @param Hexadecimal|null $node A 48-bit number representing the hardware @@ -671,58 +661,4 @@ class Uuid implements UuidInterface ): UuidInterface { return self::getFactory()->uuid6($node, $clockSeq); } - - /** - * Returns a version 7 (Unix Epoch time) UUID - * - * @param DateTimeInterface|null $dateTime An optional date/time from which - * to create the version 7 UUID. If not provided, the UUID is generated - * using the current date/time. - * - * @return UuidInterface A UuidInterface instance that represents a - * version 7 UUID - */ - public static function uuid7(?DateTimeInterface $dateTime = null): UuidInterface - { - $factory = self::getFactory(); - - if (method_exists($factory, 'uuid7')) { - /** @var UuidInterface */ - return $factory->uuid7($dateTime); - } - - throw new UnsupportedOperationException( - 'The provided factory does not support the uuid7() method', - ); - } - - /** - * Returns a version 8 (custom) UUID - * - * The bytes provided may contain any value according to your application's - * needs. Be aware, however, that other applications may not understand the - * semantics of the value. - * - * @param string $bytes A 16-byte octet string. This is an open blob - * of data that you may fill with 128 bits of information. Be aware, - * however, bits 48 through 51 will be replaced with the UUID version - * field, and bits 64 and 65 will be replaced with the UUID variant. You - * MUST NOT rely on these bits for your application needs. - * - * @return UuidInterface A UuidInterface instance that represents a - * version 8 UUID - */ - public static function uuid8(string $bytes): UuidInterface - { - $factory = self::getFactory(); - - if (method_exists($factory, 'uuid8')) { - /** @var UuidInterface */ - return $factory->uuid8($bytes); - } - - throw new UnsupportedOperationException( - 'The provided factory does not support the uuid8() method', - ); - } } diff --git a/vendor/ramsey/uuid/src/UuidFactory.php b/vendor/ramsey/uuid/src/UuidFactory.php index fae8fbbd..6f2cea06 100644 --- a/vendor/ramsey/uuid/src/UuidFactory.php +++ b/vendor/ramsey/uuid/src/UuidFactory.php @@ -24,7 +24,6 @@ use Ramsey\Uuid\Generator\DefaultTimeGenerator; use Ramsey\Uuid\Generator\NameGeneratorInterface; use Ramsey\Uuid\Generator\RandomGeneratorInterface; use Ramsey\Uuid\Generator\TimeGeneratorInterface; -use Ramsey\Uuid\Generator\UnixTimeGenerator; use Ramsey\Uuid\Lazy\LazyUuidFromString; use Ramsey\Uuid\Provider\NodeProviderInterface; use Ramsey\Uuid\Provider\Time\FixedTimeProvider; @@ -46,26 +45,61 @@ use const STR_PAD_LEFT; class UuidFactory implements UuidFactoryInterface { - private CodecInterface $codec; - private DceSecurityGeneratorInterface $dceSecurityGenerator; - private NameGeneratorInterface $nameGenerator; - private NodeProviderInterface $nodeProvider; - private NumberConverterInterface $numberConverter; - private RandomGeneratorInterface $randomGenerator; - private TimeConverterInterface $timeConverter; - private TimeGeneratorInterface $timeGenerator; - private TimeGeneratorInterface $unixTimeGenerator; - private UuidBuilderInterface $uuidBuilder; - private ValidatorInterface $validator; - /** - * @var bool whether the feature set was provided from outside, or we can - * operate under "default" assumptions + * @var CodecInterface */ - private bool $isDefaultFeatureSet; + private $codec; /** - * @param FeatureSet|null $features A set of available features in the current environment + * @var DceSecurityGeneratorInterface + */ + private $dceSecurityGenerator; + + /** + * @var NameGeneratorInterface + */ + private $nameGenerator; + + /** + * @var NodeProviderInterface + */ + private $nodeProvider; + + /** + * @var NumberConverterInterface + */ + private $numberConverter; + + /** + * @var RandomGeneratorInterface + */ + private $randomGenerator; + + /** + * @var TimeConverterInterface + */ + private $timeConverter; + + /** + * @var TimeGeneratorInterface + */ + private $timeGenerator; + + /** + * @var UuidBuilderInterface + */ + private $uuidBuilder; + + /** + * @var ValidatorInterface + */ + private $validator; + + /** @var bool whether the feature set was provided from outside, or we can operate under "default" assumptions */ + private $isDefaultFeatureSet; + + /** + * @param FeatureSet $features A set of available features in the current environment */ public function __construct(?FeatureSet $features = null) { @@ -83,7 +117,6 @@ class UuidFactory implements UuidFactoryInterface $this->timeGenerator = $features->getTimeGenerator(); $this->uuidBuilder = $features->getBuilder(); $this->validator = $features->getValidator(); - $this->unixTimeGenerator = $features->getUnixTimeGenerator(); } /** @@ -309,7 +342,7 @@ class UuidFactory implements UuidFactoryInterface $bytes = $timeGenerator->generate($nodeHex, $clockSeq); - return $this->uuidFromBytesAndVersion($bytes, Uuid::UUID_TYPE_TIME); + return $this->uuidFromBytesAndVersion($bytes, 1); } /** @@ -319,7 +352,7 @@ class UuidFactory implements UuidFactoryInterface { $bytes = $this->timeGenerator->generate($node, $clockSeq); - return $this->uuidFromBytesAndVersion($bytes, Uuid::UUID_TYPE_TIME); + return $this->uuidFromBytesAndVersion($bytes, 1); } public function uuid2( @@ -335,7 +368,7 @@ class UuidFactory implements UuidFactoryInterface $clockSeq ); - return $this->uuidFromBytesAndVersion($bytes, Uuid::UUID_TYPE_DCE_SECURITY); + return $this->uuidFromBytesAndVersion($bytes, 2); } /** @@ -344,14 +377,14 @@ class UuidFactory implements UuidFactoryInterface */ public function uuid3($ns, string $name): UuidInterface { - return $this->uuidFromNsAndName($ns, $name, Uuid::UUID_TYPE_HASH_MD5, 'md5'); + return $this->uuidFromNsAndName($ns, $name, 3, 'md5'); } public function uuid4(): UuidInterface { $bytes = $this->randomGenerator->generate(16); - return $this->uuidFromBytesAndVersion($bytes, Uuid::UUID_TYPE_RANDOM); + return $this->uuidFromBytesAndVersion($bytes, 4); } /** @@ -360,7 +393,7 @@ class UuidFactory implements UuidFactoryInterface */ public function uuid5($ns, string $name): UuidInterface { - return $this->uuidFromNsAndName($ns, $name, Uuid::UUID_TYPE_HASH_SHA1, 'sha1'); + return $this->uuidFromNsAndName($ns, $name, 5, 'sha1'); } public function uuid6(?Hexadecimal $node = null, ?int $clockSeq = null): UuidInterface @@ -379,46 +412,7 @@ class UuidFactory implements UuidFactoryInterface $v6Bytes = hex2bin(substr($v6, 1, 12) . '0' . substr($v6, -3)); $v6Bytes .= substr($bytes, 8); - return $this->uuidFromBytesAndVersion($v6Bytes, Uuid::UUID_TYPE_REORDERED_TIME); - } - - /** - * Returns a version 7 (Unix Epoch time) UUID - * - * @param DateTimeInterface|null $dateTime An optional date/time from which - * to create the version 7 UUID. If not provided, the UUID is generated - * using the current date/time. - * - * @return UuidInterface A UuidInterface instance that represents a - * version 7 UUID - */ - public function uuid7(?DateTimeInterface $dateTime = null): UuidInterface - { - assert($this->unixTimeGenerator instanceof UnixTimeGenerator); - $bytes = $this->unixTimeGenerator->generate(null, null, $dateTime); - - return $this->uuidFromBytesAndVersion($bytes, Uuid::UUID_TYPE_UNIX_TIME); - } - - /** - * Returns a version 8 (Custom) UUID - * - * The bytes provided may contain any value according to your application's - * needs. Be aware, however, that other applications may not understand the - * semantics of the value. - * - * @param string $bytes A 16-byte octet string. This is an open blob - * of data that you may fill with 128 bits of information. Be aware, - * however, bits 48 through 51 will be replaced with the UUID version - * field, and bits 64 and 65 will be replaced with the UUID variant. You - * MUST NOT rely on these bits for your application needs. - * - * @return UuidInterface A UuidInterface instance that represents a - * version 8 UUID - */ - public function uuid8(string $bytes): UuidInterface - { - return $this->uuidFromBytesAndVersion($bytes, Uuid::UUID_TYPE_CUSTOM); + return $this->uuidFromBytesAndVersion($v6Bytes, 6); } /** @@ -453,12 +447,8 @@ class UuidFactory implements UuidFactoryInterface * * @psalm-pure */ - private function uuidFromNsAndName( - UuidInterface | string $ns, - string $name, - int $version, - string $hashAlgorithm - ): UuidInterface { + private function uuidFromNsAndName($ns, string $name, int $version, string $hashAlgorithm): UuidInterface + { if (!($ns instanceof UuidInterface)) { $ns = $this->fromString($ns); } diff --git a/vendor/ramsey/uuid/src/UuidFactoryInterface.php b/vendor/ramsey/uuid/src/UuidFactoryInterface.php index d99fc9d5..468cc637 100644 --- a/vendor/ramsey/uuid/src/UuidFactoryInterface.php +++ b/vendor/ramsey/uuid/src/UuidFactoryInterface.php @@ -25,61 +25,6 @@ use Ramsey\Uuid\Validator\ValidatorInterface; */ interface UuidFactoryInterface { - /** - * Creates a UUID from a byte string - * - * @param string $bytes A binary string - * - * @return UuidInterface A UuidInterface instance created from a binary - * string representation - * - * @psalm-pure - */ - public function fromBytes(string $bytes): UuidInterface; - - /** - * Creates a UUID from a DateTimeInterface instance - * - * @param DateTimeInterface $dateTime The date and time - * @param Hexadecimal|null $node A 48-bit number representing the hardware - * address - * @param int|null $clockSeq A 14-bit number used to help avoid duplicates - * that could arise when the clock is set backwards in time or if the - * node ID changes - * - * @return UuidInterface A UuidInterface instance that represents a - * version 1 UUID created from a DateTimeInterface instance - */ - public function fromDateTime( - DateTimeInterface $dateTime, - ?Hexadecimal $node = null, - ?int $clockSeq = null - ): UuidInterface; - - /** - * Creates a UUID from a 128-bit integer string - * - * @param string $integer String representation of 128-bit integer - * - * @return UuidInterface A UuidInterface instance created from the string - * representation of a 128-bit integer - * - * @psalm-pure - */ - public function fromInteger(string $integer): UuidInterface; - - /** - * Creates a UUID from the string standard representation - * - * @param string $uuid A hexadecimal string - * - * @return UuidInterface A UuidInterface instance created from a hexadecimal - * string representation - * - * @psalm-pure - */ - public function fromString(string $uuid): UuidInterface; - /** * Returns the validator to use for the factory * @@ -88,7 +33,7 @@ interface UuidFactoryInterface public function getValidator(): ValidatorInterface; /** - * Returns a version 1 (Gregorian time) UUID from a host ID, sequence number, + * Returns a version 1 (time-based) UUID from a host ID, sequence number, * and the current time * * @param Hexadecimal|int|string|null $node A 48-bit number representing the @@ -166,7 +111,7 @@ interface UuidFactoryInterface public function uuid5($ns, string $name): UuidInterface; /** - * Returns a version 6 (reordered time) UUID from a host ID, sequence number, + * Returns a version 6 (ordered-time) UUID from a host ID, sequence number, * and the current time * * @param Hexadecimal|null $node A 48-bit number representing the hardware @@ -179,4 +124,59 @@ interface UuidFactoryInterface * version 6 UUID */ public function uuid6(?Hexadecimal $node = null, ?int $clockSeq = null): UuidInterface; + + /** + * Creates a UUID from a byte string + * + * @param string $bytes A binary string + * + * @return UuidInterface A UuidInterface instance created from a binary + * string representation + * + * @psalm-pure + */ + public function fromBytes(string $bytes): UuidInterface; + + /** + * Creates a UUID from the string standard representation + * + * @param string $uuid A hexadecimal string + * + * @return UuidInterface A UuidInterface instance created from a hexadecimal + * string representation + * + * @psalm-pure + */ + public function fromString(string $uuid): UuidInterface; + + /** + * Creates a UUID from a 128-bit integer string + * + * @param string $integer String representation of 128-bit integer + * + * @return UuidInterface A UuidInterface instance created from the string + * representation of a 128-bit integer + * + * @psalm-pure + */ + public function fromInteger(string $integer): UuidInterface; + + /** + * Creates a UUID from a DateTimeInterface instance + * + * @param DateTimeInterface $dateTime The date and time + * @param Hexadecimal|null $node A 48-bit number representing the hardware + * address + * @param int|null $clockSeq A 14-bit number used to help avoid duplicates + * that could arise when the clock is set backwards in time or if the + * node ID changes + * + * @return UuidInterface A UuidInterface instance that represents a + * version 1 UUID created from a DateTimeInterface instance + */ + public function fromDateTime( + DateTimeInterface $dateTime, + ?Hexadecimal $node = null, + ?int $clockSeq = null + ): UuidInterface; } diff --git a/vendor/ramsey/uuid/src/UuidInterface.php b/vendor/ramsey/uuid/src/UuidInterface.php index 5f41675b..f22eb0f9 100644 --- a/vendor/ramsey/uuid/src/UuidInterface.php +++ b/vendor/ramsey/uuid/src/UuidInterface.php @@ -83,14 +83,6 @@ interface UuidInterface extends */ public function getInteger(): IntegerObject; - /** - * Returns the string standard representation of the UUID as a URN - * - * @link http://en.wikipedia.org/wiki/Uniform_Resource_Name Uniform Resource Name - * @link https://tools.ietf.org/html/rfc4122#section-3 RFC 4122, § 3: Namespace Registration Template - */ - public function getUrn(): string; - /** * Returns the string standard representation of the UUID * diff --git a/vendor/ramsey/uuid/src/functions.php b/vendor/ramsey/uuid/src/functions.php index 2adf214c..f5df1488 100644 --- a/vendor/ramsey/uuid/src/functions.php +++ b/vendor/ramsey/uuid/src/functions.php @@ -15,18 +15,17 @@ declare(strict_types=1); namespace Ramsey\Uuid; -use DateTimeInterface; use Ramsey\Uuid\Type\Hexadecimal; use Ramsey\Uuid\Type\Integer as IntegerObject; /** - * Returns a version 1 (Gregorian time) UUID from a host ID, sequence number, + * Returns a version 1 (time-based) UUID from a host ID, sequence number, * and the current time * * @param Hexadecimal|int|string|null $node A 48-bit number representing the * hardware address; this number may be represented as an integer or a * hexadecimal string - * @param int|null $clockSeq A 14-bit number used to help avoid duplicates that + * @param int $clockSeq A 14-bit number used to help avoid duplicates that * could arise when the clock is set backwards in time or if the node ID * changes * @@ -107,12 +106,12 @@ function v5($ns, string $name): string } /** - * Returns a version 6 (reordered time) UUID from a host ID, sequence number, + * Returns a version 6 (ordered-time) UUID from a host ID, sequence number, * and the current time * * @param Hexadecimal|null $node A 48-bit number representing the hardware * address - * @param int|null $clockSeq A 14-bit number used to help avoid duplicates that + * @param int $clockSeq A 14-bit number used to help avoid duplicates that * could arise when the clock is set backwards in time or if the node ID * changes * @@ -122,37 +121,3 @@ function v6(?Hexadecimal $node = null, ?int $clockSeq = null): string { return Uuid::uuid6($node, $clockSeq)->toString(); } - -/** - * Returns a version 7 (Unix Epoch time) UUID - * - * @param DateTimeInterface|null $dateTime An optional date/time from which - * to create the version 7 UUID. If not provided, the UUID is generated - * using the current date/time. - * - * @return non-empty-string Version 7 UUID as a string - */ -function v7(?DateTimeInterface $dateTime = null): string -{ - return Uuid::uuid7($dateTime)->toString(); -} - -/** - * Returns a version 8 (custom) UUID - * - * The bytes provided may contain any value according to your application's - * needs. Be aware, however, that other applications may not understand the - * semantics of the value. - * - * @param string $bytes A 16-byte octet string. This is an open blob - * of data that you may fill with 128 bits of information. Be aware, - * however, bits 48 through 51 will be replaced with the UUID version - * field, and bits 64 and 65 will be replaced with the UUID variant. You - * MUST NOT rely on these bits for your application needs. - * - * @return non-empty-string Version 7 UUID as a string - */ -function v8(string $bytes): string -{ - return Uuid::uuid8($bytes)->toString(); -} diff --git a/vendor/swiftmailer/swiftmailer/lib/swiftmailer_generate_mimes_config.php b/vendor/swiftmailer/swiftmailer/lib/swiftmailer_generate_mimes_config.php old mode 100755 new mode 100644 diff --git a/vendor/symfony/cache-contracts/CacheInterface.php b/vendor/symfony/cache-contracts/CacheInterface.php index 0840a8fa..67e4dfd3 100644 --- a/vendor/symfony/cache-contracts/CacheInterface.php +++ b/vendor/symfony/cache-contracts/CacheInterface.php @@ -38,9 +38,11 @@ interface CacheInterface * See https://en.wikipedia.org/wiki/Cache_stampede#Probabilistic_early_expiration * @param array &$metadata The metadata of the cached item {@see ItemInterface::getMetadata()} * + * @return mixed + * * @throws InvalidArgumentException When $key is not valid or when $beta is negative */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed; + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null); /** * Removes an item from the pool. diff --git a/vendor/symfony/cache-contracts/CacheTrait.php b/vendor/symfony/cache-contracts/CacheTrait.php index 9ac5a6df..d340e069 100644 --- a/vendor/symfony/cache-contracts/CacheTrait.php +++ b/vendor/symfony/cache-contracts/CacheTrait.php @@ -27,8 +27,10 @@ trait CacheTrait { /** * {@inheritdoc} + * + * @return mixed */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) { return $this->doGet($this, $key, $callback, $beta, $metadata); } @@ -41,9 +43,9 @@ trait CacheTrait return $this->deleteItem($key); } - private function doGet(CacheItemPoolInterface $pool, string $key, callable $callback, ?float $beta, array &$metadata = null, LoggerInterface $logger = null): mixed + private function doGet(CacheItemPoolInterface $pool, string $key, callable $callback, ?float $beta, array &$metadata = null, LoggerInterface $logger = null) { - if (0 > $beta ??= 1.0) { + if (0 > $beta = $beta ?? 1.0) { throw new class(sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', static::class, $beta)) extends \InvalidArgumentException implements InvalidArgumentException { }; } @@ -58,7 +60,7 @@ trait CacheTrait if ($recompute = $ctime && $expiry && $expiry <= ($now = microtime(true)) - $ctime / 1000 * $beta * log(random_int(1, \PHP_INT_MAX) / \PHP_INT_MAX)) { // force applying defaultLifetime to expiry $item->expiresAt(null); - $logger?->info('Item "{key}" elected for early recomputation {delta}s before its expiration', [ + $logger && $logger->info('Item "{key}" elected for early recomputation {delta}s before its expiration', [ 'key' => $key, 'delta' => sprintf('%.1f', $expiry - $now), ]); diff --git a/vendor/symfony/cache-contracts/CallbackInterface.php b/vendor/symfony/cache-contracts/CallbackInterface.php index 437a3c93..7dae2aac 100644 --- a/vendor/symfony/cache-contracts/CallbackInterface.php +++ b/vendor/symfony/cache-contracts/CallbackInterface.php @@ -26,5 +26,5 @@ interface CallbackInterface * * @return mixed The computed value for the passed item */ - public function __invoke(CacheItemInterface $item, bool &$save): mixed; + public function __invoke(CacheItemInterface $item, bool &$save); } diff --git a/vendor/symfony/cache-contracts/ItemInterface.php b/vendor/symfony/cache-contracts/ItemInterface.php index 8c4c5125..10c04889 100644 --- a/vendor/symfony/cache-contracts/ItemInterface.php +++ b/vendor/symfony/cache-contracts/ItemInterface.php @@ -54,7 +54,7 @@ interface ItemInterface extends CacheItemInterface * @throws InvalidArgumentException When $tag is not valid * @throws CacheException When the item comes from a pool that is not tag-aware */ - public function tag(string|iterable $tags): static; + public function tag($tags): self; /** * Returns a list of metadata info that were saved alongside with the cached value. diff --git a/vendor/symfony/cache-contracts/TagAwareCacheInterface.php b/vendor/symfony/cache-contracts/TagAwareCacheInterface.php index 8e0b6be8..7c4cf111 100644 --- a/vendor/symfony/cache-contracts/TagAwareCacheInterface.php +++ b/vendor/symfony/cache-contracts/TagAwareCacheInterface.php @@ -34,5 +34,5 @@ interface TagAwareCacheInterface extends CacheInterface * * @throws InvalidArgumentException When $tags is not valid */ - public function invalidateTags(array $tags): bool; + public function invalidateTags(array $tags); } diff --git a/vendor/symfony/cache-contracts/composer.json b/vendor/symfony/cache-contracts/composer.json index 2582e5af..9f45e178 100644 --- a/vendor/symfony/cache-contracts/composer.json +++ b/vendor/symfony/cache-contracts/composer.json @@ -16,8 +16,8 @@ } ], "require": { - "php": ">=8.1", - "psr/cache": "^3.0" + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0|^3.0" }, "suggest": { "symfony/cache-implementation": "" @@ -28,7 +28,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", diff --git a/vendor/symfony/cache/Adapter/AbstractAdapter.php b/vendor/symfony/cache/Adapter/AbstractAdapter.php index 8025e681..3d014092 100644 --- a/vendor/symfony/cache/Adapter/AbstractAdapter.php +++ b/vendor/symfony/cache/Adapter/AbstractAdapter.php @@ -49,7 +49,15 @@ abstract class AbstractAdapter implements AdapterInterface, CacheInterface, Logg $item->key = $key; $item->value = $v = $value; $item->isHit = $isHit; - $item->unpack(); + // Detect wrapped values that encode for their expiry and creation duration + // For compactness, these values are packed in the key of an array using + // magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F + if (\is_array($v) && 1 === \count($v) && 10 === \strlen($k = (string) array_key_first($v)) && "\x9D" === $k[0] && "\0" === $k[5] && "\x5F" === $k[9]) { + $item->value = $v[$k]; + $v = unpack('Ve/Nc', substr($k, 1, -1)); + $item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET; + $item->metadata[CacheItem::METADATA_CTIME] = $v['c']; + } return $item; }, @@ -72,7 +80,11 @@ abstract class AbstractAdapter implements AdapterInterface, CacheInterface, Logg $expiredIds[] = $getId($key); continue; } - $byLifetime[$ttl][$getId($key)] = $item->pack(); + if (isset(($metadata = $item->newMetadata)[CacheItem::METADATA_TAGS])) { + unset($metadata[CacheItem::METADATA_TAGS]); + } + // For compactness, expiry and creation duration are packed in the key of an array, using magic numbers as separators + $byLifetime[$ttl][$getId($key)] = $metadata ? ["\x9D".pack('VN', (int) (0.1 + $metadata[self::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[self::METADATA_CTIME])."\x5F" => $item->value] : $item->value; } return $byLifetime; @@ -86,8 +98,10 @@ abstract class AbstractAdapter implements AdapterInterface, CacheInterface, Logg * Returns the best possible adapter that your runtime supports. * * Using ApcuAdapter makes system caches compatible with read-only filesystems. + * + * @return AdapterInterface */ - public static function createSystemCache(string $namespace, int $defaultLifetime, string $version, string $directory, LoggerInterface $logger = null): AdapterInterface + public static function createSystemCache(string $namespace, int $defaultLifetime, string $version, string $directory, LoggerInterface $logger = null) { $opcache = new PhpFilesAdapter($namespace, $defaultLifetime, $directory, true); if (null !== $logger) { @@ -118,7 +132,7 @@ abstract class AbstractAdapter implements AdapterInterface, CacheInterface, Logg if (str_starts_with($dsn, 'memcached:')) { return MemcachedAdapter::createConnection($dsn, $options); } - if (str_starts_with($dsn, 'couchbase:')) { + if (0 === strpos($dsn, 'couchbase:')) { if (CouchbaseBucketAdapter::isSupported()) { return CouchbaseBucketAdapter::createConnection($dsn, $options); } @@ -131,11 +145,13 @@ abstract class AbstractAdapter implements AdapterInterface, CacheInterface, Logg /** * {@inheritdoc} + * + * @return bool */ - public function commit(): bool + public function commit() { $ok = true; - $byLifetime = (self::$mergeByLifetime)($this->deferred, $this->namespace, $expiredIds, $this->getId(...), $this->defaultLifetime); + $byLifetime = (self::$mergeByLifetime)($this->deferred, $this->namespace, $expiredIds, \Closure::fromCallable([$this, 'getId']), $this->defaultLifetime); $retry = $this->deferred = []; if ($expiredIds) { diff --git a/vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.php b/vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.php index e775bbf1..a384b16a 100644 --- a/vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.php +++ b/vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.php @@ -56,7 +56,7 @@ abstract class AbstractTagAwareAdapter implements TagAwareAdapterInterface, TagA $item->isHit = $isHit; // Extract value, tags and meta data from the cache value $item->value = $value['value']; - $item->metadata[CacheItem::METADATA_TAGS] = isset($value['tags']) ? array_combine($value['tags'], $value['tags']) : []; + $item->metadata[CacheItem::METADATA_TAGS] = $value['tags'] ?? []; if (isset($value['meta'])) { // For compactness these values are packed, & expiry is offset to reduce size $v = unpack('Ve/Nc', $value['meta']); @@ -95,19 +95,18 @@ abstract class AbstractTagAwareAdapter implements TagAwareAdapterInterface, TagA if ($metadata) { // For compactness, expiry and creation duration are packed, using magic numbers as separators - $value['meta'] = pack('VN', (int) (0.1 + $metadata[CacheItem::METADATA_EXPIRY] - CacheItem::METADATA_EXPIRY_OFFSET), $metadata[CacheItem::METADATA_CTIME]); + $value['meta'] = pack('VN', (int) (0.1 + $metadata[self::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[self::METADATA_CTIME]); } // Extract tag changes, these should be removed from values in doSave() $value['tag-operations'] = ['add' => [], 'remove' => []]; $oldTags = $item->metadata[CacheItem::METADATA_TAGS] ?? []; - foreach (array_diff_key($value['tags'], $oldTags) as $addedTag) { + foreach (array_diff($value['tags'], $oldTags) as $addedTag) { $value['tag-operations']['add'][] = $getId($tagPrefix.$addedTag); } - foreach (array_diff_key($oldTags, $value['tags']) as $removedTag) { + foreach (array_diff($oldTags, $value['tags']) as $removedTag) { $value['tag-operations']['remove'][] = $getId($tagPrefix.$removedTag); } - $value['tags'] = array_keys($value['tags']); $byLifetime[$ttl][$getId($key)] = $value; $item->metadata = $item->newMetadata; @@ -136,8 +135,10 @@ abstract class AbstractTagAwareAdapter implements TagAwareAdapterInterface, TagA * Removes multiple items from the pool and their corresponding tags. * * @param array $ids An array of identifiers that should be removed from the pool + * + * @return bool */ - abstract protected function doDelete(array $ids): bool; + abstract protected function doDelete(array $ids); /** * Removes relations between tags and deleted items. @@ -171,7 +172,7 @@ abstract class AbstractTagAwareAdapter implements TagAwareAdapterInterface, TagA public function commit(): bool { $ok = true; - $byLifetime = (self::$mergeByLifetime)($this->deferred, $expiredIds, $this->getId(...), self::TAGS_PREFIX, $this->defaultLifetime); + $byLifetime = (self::$mergeByLifetime)($this->deferred, $expiredIds, \Closure::fromCallable([$this, 'getId']), self::TAGS_PREFIX, $this->defaultLifetime); $retry = $this->deferred = []; if ($expiredIds) { @@ -253,7 +254,7 @@ abstract class AbstractTagAwareAdapter implements TagAwareAdapterInterface, TagA $tagData[$this->getId(self::TAGS_PREFIX.$tag)][] = $id; } } - } catch (\Exception) { + } catch (\Exception $e) { $ok = false; } @@ -261,7 +262,7 @@ abstract class AbstractTagAwareAdapter implements TagAwareAdapterInterface, TagA if ((!$tagData || $this->doDeleteTagRelations($tagData)) && $ok) { return true; } - } catch (\Exception) { + } catch (\Exception $e) { } // When bulk-delete failed, retry each item individually @@ -284,7 +285,7 @@ abstract class AbstractTagAwareAdapter implements TagAwareAdapterInterface, TagA /** * {@inheritdoc} */ - public function invalidateTags(array $tags): bool + public function invalidateTags(array $tags) { if (empty($tags)) { return false; diff --git a/vendor/symfony/cache/Adapter/AdapterInterface.php b/vendor/symfony/cache/Adapter/AdapterInterface.php index 7b0771b7..f8dce866 100644 --- a/vendor/symfony/cache/Adapter/AdapterInterface.php +++ b/vendor/symfony/cache/Adapter/AdapterInterface.php @@ -26,18 +26,22 @@ interface AdapterInterface extends CacheItemPoolInterface { /** * {@inheritdoc} + * + * @return CacheItem */ - public function getItem(mixed $key): CacheItem; + public function getItem($key); /** * {@inheritdoc} * - * @return iterable + * @return \Traversable */ - public function getItems(array $keys = []): iterable; + public function getItems(array $keys = []); /** * {@inheritdoc} + * + * @return bool */ - public function clear(string $prefix = ''): bool; + public function clear(string $prefix = ''); } diff --git a/vendor/symfony/cache/Adapter/ApcuAdapter.php b/vendor/symfony/cache/Adapter/ApcuAdapter.php index 47656c92..270a139e 100644 --- a/vendor/symfony/cache/Adapter/ApcuAdapter.php +++ b/vendor/symfony/cache/Adapter/ApcuAdapter.php @@ -20,7 +20,7 @@ use Symfony\Component\Cache\Marshaller\MarshallerInterface; */ class ApcuAdapter extends AbstractAdapter { - private ?MarshallerInterface $marshaller; + private $marshaller; /** * @throws CacheException if APCu is not enabled @@ -55,12 +55,19 @@ class ApcuAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doFetch(array $ids): iterable + protected function doFetch(array $ids) { $unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback'); try { $values = []; - foreach (apcu_fetch($ids, $ok) ?: [] as $k => $v) { + $ids = array_flip($ids); + foreach (apcu_fetch(array_keys($ids), $ok) ?: [] as $k => $v) { + if (!isset($ids[$k])) { + // work around https://github.com/krakjoe/apcu/issues/247 + $k = key($ids); + } + unset($ids[$k]); + if (null !== $v || $ok) { $values[$k] = null !== $this->marshaller ? $this->marshaller->unmarshall($v) : $v; } @@ -77,7 +84,7 @@ class ApcuAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doHave(string $id): bool + protected function doHave(string $id) { return apcu_exists($id); } @@ -85,7 +92,7 @@ class ApcuAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doClear(string $namespace): bool + protected function doClear(string $namespace) { return isset($namespace[0]) && class_exists(\APCUIterator::class, false) && ('cli' !== \PHP_SAPI || filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOLEAN)) ? apcu_delete(new \APCUIterator(sprintf('/^%s/', preg_quote($namespace, '/')), \APC_ITER_KEY)) @@ -95,7 +102,7 @@ class ApcuAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doDelete(array $ids): bool + protected function doDelete(array $ids) { foreach ($ids as $id) { apcu_delete($id); @@ -107,7 +114,7 @@ class ApcuAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doSave(array $values, int $lifetime): array|bool + protected function doSave(array $values, int $lifetime) { if (null !== $this->marshaller && (!$values = $this->marshaller->marshall($values, $failed))) { return $failed; diff --git a/vendor/symfony/cache/Adapter/ArrayAdapter.php b/vendor/symfony/cache/Adapter/ArrayAdapter.php index ca2feaec..d8695b74 100644 --- a/vendor/symfony/cache/Adapter/ArrayAdapter.php +++ b/vendor/symfony/cache/Adapter/ArrayAdapter.php @@ -30,15 +30,14 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter { use LoggerAwareTrait; - private bool $storeSerialized; - private array $values = []; - private array $tags = []; - private array $expiries = []; - private int $defaultLifetime; - private float $maxLifetime; - private int $maxItems; + private $storeSerialized; + private $values = []; + private $expiries = []; + private $defaultLifetime; + private $maxLifetime; + private $maxItems; - private static \Closure $createCacheItem; + private static $createCacheItem; /** * @param bool $storeSerialized Disabling serialization can lead to cache corruptions when storing mutable values but increases performance otherwise @@ -58,14 +57,11 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter $this->maxLifetime = $maxLifetime; $this->maxItems = $maxItems; self::$createCacheItem ?? self::$createCacheItem = \Closure::bind( - static function ($key, $value, $isHit, $tags) { + static function ($key, $value, $isHit) { $item = new CacheItem(); $item->key = $key; $item->value = $value; $item->isHit = $isHit; - if (null !== $tags) { - $item->metadata[CacheItem::METADATA_TAGS] = $tags; - } return $item; }, @@ -77,7 +73,7 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter /** * {@inheritdoc} */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) { $item = $this->getItem($key); $metadata = $item->getMetadata(); @@ -104,8 +100,10 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter /** * {@inheritdoc} + * + * @return bool */ - public function hasItem(mixed $key): bool + public function hasItem($key) { if (\is_string($key) && isset($this->expiries[$key]) && $this->expiries[$key] > microtime(true)) { if ($this->maxItems) { @@ -125,7 +123,7 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter /** * {@inheritdoc} */ - public function getItem(mixed $key): CacheItem + public function getItem($key) { if (!$isHit = $this->hasItem($key)) { $value = null; @@ -138,13 +136,13 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter $value = $this->storeSerialized ? $this->unfreeze($key, $isHit) : $this->values[$key]; } - return (self::$createCacheItem)($key, $value, $isHit, $this->tags[$key] ?? null); + return (self::$createCacheItem)($key, $value, $isHit); } /** * {@inheritdoc} */ - public function getItems(array $keys = []): iterable + public function getItems(array $keys = []) { \assert(self::validateKeys($keys)); @@ -153,19 +151,23 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter /** * {@inheritdoc} + * + * @return bool */ - public function deleteItem(mixed $key): bool + public function deleteItem($key) { \assert('' !== CacheItem::validateKey($key)); - unset($this->values[$key], $this->tags[$key], $this->expiries[$key]); + unset($this->values[$key], $this->expiries[$key]); return true; } /** * {@inheritdoc} + * + * @return bool */ - public function deleteItems(array $keys): bool + public function deleteItems(array $keys) { foreach ($keys as $key) { $this->deleteItem($key); @@ -176,8 +178,10 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter /** * {@inheritdoc} + * + * @return bool */ - public function save(CacheItemInterface $item): bool + public function save(CacheItemInterface $item) { if (!$item instanceof CacheItem) { return false; @@ -209,7 +213,7 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter } if ($this->maxItems) { - unset($this->values[$key], $this->tags[$key]); + unset($this->values[$key]); // Iterate items and vacuum expired ones while we are at it foreach ($this->values as $k => $v) { @@ -217,47 +221,49 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter break; } - unset($this->values[$k], $this->tags[$k], $this->expiries[$k]); + unset($this->values[$k], $this->expiries[$k]); } } $this->values[$key] = $value; $this->expiries[$key] = $expiry ?? \PHP_INT_MAX; - if (null === $this->tags[$key] = $item["\0*\0newMetadata"][CacheItem::METADATA_TAGS] ?? null) { - unset($this->tags[$key]); - } - return true; } /** * {@inheritdoc} + * + * @return bool */ - public function saveDeferred(CacheItemInterface $item): bool + public function saveDeferred(CacheItemInterface $item) { return $this->save($item); } /** * {@inheritdoc} + * + * @return bool */ - public function commit(): bool + public function commit() { return true; } /** * {@inheritdoc} + * + * @return bool */ - public function clear(string $prefix = ''): bool + public function clear(string $prefix = '') { if ('' !== $prefix) { $now = microtime(true); foreach ($this->values as $key => $value) { - if (!isset($this->expiries[$key]) || $this->expiries[$key] <= $now || str_starts_with($key, $prefix)) { - unset($this->values[$key], $this->tags[$key], $this->expiries[$key]); + if (!isset($this->expiries[$key]) || $this->expiries[$key] <= $now || 0 === strpos($key, $prefix)) { + unset($this->values[$key], $this->expiries[$key]); } } @@ -266,15 +272,17 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter } } - $this->values = $this->tags = $this->expiries = []; + $this->values = $this->expiries = []; return true; } /** * Returns all cached values, with cache miss as null. + * + * @return array */ - public function getValues(): array + public function getValues() { if (!$this->storeSerialized) { return $this->values; @@ -323,7 +331,7 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter } unset($keys[$i]); - yield $key => $f($key, $value, $isHit, $this->tags[$key] ?? null); + yield $key => $f($key, $value, $isHit); } foreach ($keys as $key) { @@ -345,7 +353,7 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter try { $serialized = serialize($value); } catch (\Exception $e) { - unset($this->values[$key], $this->tags[$key]); + unset($this->values[$key]); $type = get_debug_type($value); $message = sprintf('Failed to save key "{key}" of type %s: %s', $type, $e->getMessage()); CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); diff --git a/vendor/symfony/cache/Adapter/ChainAdapter.php b/vendor/symfony/cache/Adapter/ChainAdapter.php index 01c65536..059c0ed2 100644 --- a/vendor/symfony/cache/Adapter/ChainAdapter.php +++ b/vendor/symfony/cache/Adapter/ChainAdapter.php @@ -33,11 +33,11 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa { use ContractsTrait; - private array $adapters = []; - private int $adapterCount; - private int $defaultLifetime; + private $adapters = []; + private $adapterCount; + private $defaultLifetime; - private static \Closure $syncItem; + private static $syncItem; /** * @param CacheItemPoolInterface[] $adapters The ordered list of adapters used to fetch cached items @@ -66,10 +66,11 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa $this->adapterCount = \count($this->adapters); $this->defaultLifetime = $defaultLifetime; - self::$syncItem ??= \Closure::bind( + self::$syncItem ?? self::$syncItem = \Closure::bind( static function ($sourceItem, $item, $defaultLifetime, $sourceMetadata = null) { $sourceItem->isTaggable = false; - $sourceMetadata ??= $sourceItem->metadata; + $sourceMetadata = $sourceMetadata ?? $sourceItem->metadata; + unset($sourceMetadata[CacheItem::METADATA_TAGS]); $item->value = $sourceItem->value; $item->isHit = $sourceItem->isHit; @@ -91,7 +92,7 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) { $doSave = true; $callback = static function (CacheItem $item, bool &$save) use ($callback, &$doSave) { @@ -115,7 +116,7 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa $value = $this->doGet($adapter, $key, $callback, $beta, $metadata); } if (null !== $item) { - (self::$syncItem)($lastItem ??= $item, $item, $this->defaultLifetime, $metadata); + (self::$syncItem)($lastItem = $lastItem ?? $item, $item, $this->defaultLifetime, $metadata); } $save = $doSave; @@ -128,7 +129,7 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} */ - public function getItem(mixed $key): CacheItem + public function getItem($key) { $syncItem = self::$syncItem; $misses = []; @@ -153,7 +154,7 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} */ - public function getItems(array $keys = []): iterable + public function getItems(array $keys = []) { return $this->generateItems($this->adapters[0]->getItems($keys), 0); } @@ -191,8 +192,10 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} + * + * @return bool */ - public function hasItem(mixed $key): bool + public function hasItem($key) { foreach ($this->adapters as $adapter) { if ($adapter->hasItem($key)) { @@ -205,8 +208,10 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} + * + * @return bool */ - public function clear(string $prefix = ''): bool + public function clear(string $prefix = '') { $cleared = true; $i = $this->adapterCount; @@ -224,8 +229,10 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} + * + * @return bool */ - public function deleteItem(mixed $key): bool + public function deleteItem($key) { $deleted = true; $i = $this->adapterCount; @@ -239,8 +246,10 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} + * + * @return bool */ - public function deleteItems(array $keys): bool + public function deleteItems(array $keys) { $deleted = true; $i = $this->adapterCount; @@ -254,8 +263,10 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} + * + * @return bool */ - public function save(CacheItemInterface $item): bool + public function save(CacheItemInterface $item) { $saved = true; $i = $this->adapterCount; @@ -269,8 +280,10 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} + * + * @return bool */ - public function saveDeferred(CacheItemInterface $item): bool + public function saveDeferred(CacheItemInterface $item) { $saved = true; $i = $this->adapterCount; @@ -284,8 +297,10 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} + * + * @return bool */ - public function commit(): bool + public function commit() { $committed = true; $i = $this->adapterCount; @@ -300,7 +315,7 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} */ - public function prune(): bool + public function prune() { $pruned = true; diff --git a/vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.php b/vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.php index 98711d28..36d5249b 100644 --- a/vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.php +++ b/vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.php @@ -36,8 +36,8 @@ class CouchbaseBucketAdapter extends AbstractAdapter 'durabilityTimeout', ]; - private \CouchbaseBucket $bucket; - private MarshallerInterface $marshaller; + private $bucket; + private $marshaller; public function __construct(\CouchbaseBucket $bucket, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) { @@ -54,10 +54,15 @@ class CouchbaseBucketAdapter extends AbstractAdapter $this->marshaller = $marshaller ?? new DefaultMarshaller(); } - public static function createConnection(array|string $servers, array $options = []): \CouchbaseBucket + /** + * @param array|string $servers + */ + public static function createConnection($servers, array $options = []): \CouchbaseBucket { if (\is_string($servers)) { $servers = [$servers]; + } elseif (!\is_array($servers)) { + throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be array or string, "%s" given.', __METHOD__, get_debug_type($servers))); } if (!static::isSupported()) { @@ -77,7 +82,7 @@ class CouchbaseBucketAdapter extends AbstractAdapter $password = $options['password']; foreach ($servers as $dsn) { - if (!str_starts_with($dsn, 'couchbase:')) { + if (0 !== strpos($dsn, 'couchbase:')) { throw new InvalidArgumentException(sprintf('Invalid Couchbase DSN: "%s" does not start with "couchbase:".', $dsn)); } @@ -159,7 +164,7 @@ class CouchbaseBucketAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doFetch(array $ids): iterable + protected function doFetch(array $ids) { $resultsCouchbase = $this->bucket->get($ids); @@ -216,7 +221,7 @@ class CouchbaseBucketAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doSave(array $values, int $lifetime): array|bool + protected function doSave(array $values, int $lifetime) { if (!$values = $this->marshaller->marshall($values, $failed)) { return $failed; diff --git a/vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php b/vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php index 03fc8acd..79f64853 100644 --- a/vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php +++ b/vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php @@ -29,8 +29,9 @@ class CouchbaseCollectionAdapter extends AbstractAdapter { private const MAX_KEY_LENGTH = 250; - private Collection $connection; - private MarshallerInterface $marshaller; + /** @var Collection */ + private $connection; + private $marshaller; public function __construct(Collection $connection, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) { @@ -47,10 +48,17 @@ class CouchbaseCollectionAdapter extends AbstractAdapter $this->marshaller = $marshaller ?? new DefaultMarshaller(); } - public static function createConnection(array|string $dsn, array $options = []): Bucket|Collection + /** + * @param array|string $dsn + * + * @return Bucket|Collection + */ + public static function createConnection($dsn, array $options = []) { if (\is_string($dsn)) { $dsn = [$dsn]; + } elseif (!\is_array($dsn)) { + throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be array or string, "%s" given.', __METHOD__, get_debug_type($dsn))); } if (!static::isSupported()) { @@ -70,7 +78,7 @@ class CouchbaseCollectionAdapter extends AbstractAdapter $password = $options['password'] ?? ''; foreach ($dsn as $server) { - if (!str_starts_with($server, 'couchbase:')) { + if (0 !== strpos($server, 'couchbase:')) { throw new InvalidArgumentException(sprintf('Invalid Couchbase DSN: "%s" does not start with "couchbase:".', $server)); } @@ -140,7 +148,7 @@ class CouchbaseCollectionAdapter extends AbstractAdapter foreach ($ids as $id) { try { $resultCouchbase = $this->connection->get($id); - } catch (DocumentNotFoundException) { + } catch (DocumentNotFoundException $exception) { continue; } @@ -181,7 +189,7 @@ class CouchbaseCollectionAdapter extends AbstractAdapter if (null === $result->mutationToken()) { $idsErrors[] = $id; } - } catch (DocumentNotFoundException) { + } catch (DocumentNotFoundException $exception) { } } @@ -191,7 +199,7 @@ class CouchbaseCollectionAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doSave(array $values, $lifetime): array|bool + protected function doSave(array $values, $lifetime) { if (!$values = $this->marshaller->marshall($values, $failed)) { return $failed; @@ -204,7 +212,7 @@ class CouchbaseCollectionAdapter extends AbstractAdapter foreach ($values as $key => $value) { try { $this->connection->upsert($key, $value, $upsertOptions); - } catch (\Exception) { + } catch (\Exception $exception) { $ko[$key] = ''; } } diff --git a/vendor/symfony/cache/Adapter/DoctrineAdapter.php b/vendor/symfony/cache/Adapter/DoctrineAdapter.php new file mode 100644 index 00000000..efa30c84 --- /dev/null +++ b/vendor/symfony/cache/Adapter/DoctrineAdapter.php @@ -0,0 +1,110 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Doctrine\Common\Cache\CacheProvider; +use Doctrine\Common\Cache\Psr6\CacheAdapter; + +/** + * @author Nicolas Grekas + * + * @deprecated Since Symfony 5.4, use Doctrine\Common\Cache\Psr6\CacheAdapter instead + */ +class DoctrineAdapter extends AbstractAdapter +{ + private $provider; + + public function __construct(CacheProvider $provider, string $namespace = '', int $defaultLifetime = 0) + { + trigger_deprecation('symfony/cache', '5.4', '"%s" is deprecated, use "%s" instead.', __CLASS__, CacheAdapter::class); + + parent::__construct('', $defaultLifetime); + $this->provider = $provider; + $provider->setNamespace($namespace); + } + + /** + * {@inheritdoc} + */ + public function reset() + { + parent::reset(); + $this->provider->setNamespace($this->provider->getNamespace()); + } + + /** + * {@inheritdoc} + */ + protected function doFetch(array $ids) + { + $unserializeCallbackHandler = ini_set('unserialize_callback_func', parent::class.'::handleUnserializeCallback'); + try { + return $this->provider->fetchMultiple($ids); + } catch (\Error $e) { + $trace = $e->getTrace(); + + if (isset($trace[0]['function']) && !isset($trace[0]['class'])) { + switch ($trace[0]['function']) { + case 'unserialize': + case 'apcu_fetch': + case 'apc_fetch': + throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine()); + } + } + + throw $e; + } finally { + ini_set('unserialize_callback_func', $unserializeCallbackHandler); + } + } + + /** + * {@inheritdoc} + */ + protected function doHave(string $id) + { + return $this->provider->contains($id); + } + + /** + * {@inheritdoc} + */ + protected function doClear(string $namespace) + { + $namespace = $this->provider->getNamespace(); + + return isset($namespace[0]) + ? $this->provider->deleteAll() + : $this->provider->flushAll(); + } + + /** + * {@inheritdoc} + */ + protected function doDelete(array $ids) + { + $ok = true; + foreach ($ids as $id) { + $ok = $this->provider->delete($id) && $ok; + } + + return $ok; + } + + /** + * {@inheritdoc} + */ + protected function doSave(array $values, int $lifetime) + { + return $this->provider->saveMultiple($values, $lifetime); + } +} diff --git a/vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php b/vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php index bc8cbb6b..73f0ea6b 100644 --- a/vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php +++ b/vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php @@ -27,16 +27,16 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface { protected $maxIdLength = 255; - private MarshallerInterface $marshaller; - private Connection $conn; - private string $platformName; - private string $serverVersion; - private string $table = 'cache_items'; - private string $idCol = 'item_id'; - private string $dataCol = 'item_data'; - private string $lifetimeCol = 'item_lifetime'; - private string $timeCol = 'item_time'; - private string $namespace; + private $marshaller; + private $conn; + private $platformName; + private $serverVersion; + private $table = 'cache_items'; + private $idCol = 'item_id'; + private $dataCol = 'item_data'; + private $lifetimeCol = 'item_lifetime'; + private $timeCol = 'item_time'; + private $namespace; /** * You can either pass an existing database Doctrine DBAL Connection or @@ -52,9 +52,11 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface * * db_lifetime_col: The column where to store the lifetime [default: item_lifetime] * * db_time_col: The column where to store the timestamp [default: item_time] * + * @param Connection|string $connOrDsn + * * @throws InvalidArgumentException When namespace contains invalid characters */ - public function __construct(Connection|string $connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], MarshallerInterface $marshaller = null) + public function __construct($connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], MarshallerInterface $marshaller = null) { if (isset($namespace[0]) && preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) { throw new InvalidArgumentException(sprintf('Namespace contains "%s" but only characters in [-+.A-Za-z0-9] are allowed.', $match[0])); @@ -62,11 +64,13 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface if ($connOrDsn instanceof Connection) { $this->conn = $connOrDsn; - } else { + } elseif (\is_string($connOrDsn)) { if (!class_exists(DriverManager::class)) { throw new InvalidArgumentException(sprintf('Failed to parse the DSN "%s". Try running "composer require doctrine/dbal".', $connOrDsn)); } $this->conn = DriverManager::getConnection(['url' => $connOrDsn]); + } else { + throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be "%s" or string, "%s" given.', __METHOD__, Connection::class, get_debug_type($connOrDsn))); } $this->table = $options['db_table'] ?? $this->table; @@ -88,7 +92,7 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface * * @throws DBALException When the table already exists */ - public function createTable(): void + public function createTable() { $schema = new Schema(); $this->addTableToSchema($schema); @@ -132,7 +136,7 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface try { $this->conn->executeStatement($deleteSql, $params, $paramTypes); - } catch (TableNotFoundException) { + } catch (TableNotFoundException $e) { } return true; @@ -209,7 +213,7 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface try { $this->conn->executeStatement($sql); - } catch (TableNotFoundException) { + } catch (TableNotFoundException $e) { } return true; @@ -223,7 +227,7 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface $sql = "DELETE FROM $this->table WHERE $this->idCol IN (?)"; try { $this->conn->executeStatement($sql, [array_values($ids)], [Connection::PARAM_STR_ARRAY]); - } catch (TableNotFoundException) { + } catch (TableNotFoundException $e) { } return true; @@ -232,7 +236,7 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doSave(array $values, int $lifetime): array|bool + protected function doSave(array $values, int $lifetime) { if (!$values = $this->marshaller->marshall($values, $failed)) { return $failed; @@ -274,7 +278,7 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface $lifetime = $lifetime ?: null; try { $stmt = $this->conn->prepare($sql); - } catch (TableNotFoundException) { + } catch (TableNotFoundException $e) { if (!$this->conn->isTransactionActive() || \in_array($platformName, ['pgsql', 'sqlite', 'sqlsrv'], true)) { $this->createTable(); } @@ -312,7 +316,7 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface foreach ($values as $id => $data) { try { $rowCount = $stmt->executeStatement(); - } catch (TableNotFoundException) { + } catch (TableNotFoundException $e) { if (!$this->conn->isTransactionActive() || \in_array($platformName, ['pgsql', 'sqlite', 'sqlsrv'], true)) { $this->createTable(); } @@ -321,7 +325,7 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface if (null === $platformName && 0 === $rowCount) { try { $insertStmt->executeStatement(); - } catch (DBALException) { + } catch (DBALException $e) { // A concurrent write won, let it be } } @@ -338,17 +342,28 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface $platform = $this->conn->getDatabasePlatform(); - return match (true) { - $platform instanceof \Doctrine\DBAL\Platforms\MySQLPlatform, - $platform instanceof \Doctrine\DBAL\Platforms\MySQL57Platform => $this->platformName = 'mysql', - $platform instanceof \Doctrine\DBAL\Platforms\SqlitePlatform => $this->platformName = 'sqlite', - $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQLPlatform, - $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQL94Platform => $this->platformName = 'pgsql', - $platform instanceof \Doctrine\DBAL\Platforms\OraclePlatform => $this->platformName = 'oci', - $platform instanceof \Doctrine\DBAL\Platforms\SQLServerPlatform, - $platform instanceof \Doctrine\DBAL\Platforms\SQLServer2012Platform => $this->platformName = 'sqlsrv', - default => $this->platformName = \get_class($platform), - }; + switch (true) { + case $platform instanceof \Doctrine\DBAL\Platforms\MySQLPlatform: + case $platform instanceof \Doctrine\DBAL\Platforms\MySQL57Platform: + return $this->platformName = 'mysql'; + + case $platform instanceof \Doctrine\DBAL\Platforms\SqlitePlatform: + return $this->platformName = 'sqlite'; + + case $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQLPlatform: + case $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQL94Platform: + return $this->platformName = 'pgsql'; + + case $platform instanceof \Doctrine\DBAL\Platforms\OraclePlatform: + return $this->platformName = 'oci'; + + case $platform instanceof \Doctrine\DBAL\Platforms\SQLServerPlatform: + case $platform instanceof \Doctrine\DBAL\Platforms\SQLServer2012Platform: + return $this->platformName = 'sqlsrv'; + + default: + return $this->platformName = \get_class($platform); + } } private function getServerVersion(): string diff --git a/vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php b/vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php index 2b5677d3..afde8437 100644 --- a/vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php +++ b/vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php @@ -44,7 +44,7 @@ class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements Prune /** * {@inheritdoc} */ - protected function doClear(string $namespace): bool + protected function doClear(string $namespace) { $ok = $this->doClearCache($namespace); @@ -140,7 +140,7 @@ class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements Prune continue; } - if (!@unlink($file)) { + if ((\PHP_VERSION_ID >= 70300 || '\\' !== \DIRECTORY_SEPARATOR) && !@unlink($file)) { fclose($h); continue; } @@ -159,12 +159,16 @@ class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements Prune try { yield $id => '' === $meta ? [] : $this->marshaller->unmarshall($meta); - } catch (\Exception) { + } catch (\Exception $e) { yield $id => []; } } fclose($h); + + if (\PHP_VERSION_ID < 70300 && '\\' === \DIRECTORY_SEPARATOR) { + @unlink($file); + } } } diff --git a/vendor/symfony/cache/Adapter/MemcachedAdapter.php b/vendor/symfony/cache/Adapter/MemcachedAdapter.php index 7730f7e0..5c2933fc 100644 --- a/vendor/symfony/cache/Adapter/MemcachedAdapter.php +++ b/vendor/symfony/cache/Adapter/MemcachedAdapter.php @@ -39,9 +39,9 @@ class MemcachedAdapter extends AbstractAdapter \Memcached::OPT_SERIALIZER => \Memcached::SERIALIZER_PHP, ]; - private MarshallerInterface $marshaller; - private \Memcached $client; - private \Memcached $lazyClient; + private $marshaller; + private $client; + private $lazyClient; /** * Using a MemcachedAdapter with a TagAwareAdapter for storing tags is discouraged. @@ -90,9 +90,11 @@ class MemcachedAdapter extends AbstractAdapter * * @param array[]|string|string[] $servers An array of servers, a DSN, or an array of DSNs * + * @return \Memcached + * * @throws \ErrorException When invalid options or servers are provided */ - public static function createConnection(array|string $servers, array $options = []): \Memcached + public static function createConnection($servers, array $options = []) { if (\is_string($servers)) { $servers = [$servers]; @@ -240,7 +242,7 @@ class MemcachedAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doSave(array $values, int $lifetime): array|bool + protected function doSave(array $values, int $lifetime) { if (!$values = $this->marshaller->marshall($values, $failed)) { return $failed; @@ -261,7 +263,7 @@ class MemcachedAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doFetch(array $ids): iterable + protected function doFetch(array $ids) { try { $encodedIds = array_map([__CLASS__, 'encodeKey'], $ids); @@ -282,7 +284,7 @@ class MemcachedAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doHave(string $id): bool + protected function doHave(string $id) { return false !== $this->getClient()->get(self::encodeKey($id)) || $this->checkResultCode(\Memcached::RES_SUCCESS === $this->client->getResultCode()); } @@ -290,7 +292,7 @@ class MemcachedAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doDelete(array $ids): bool + protected function doDelete(array $ids) { $ok = true; $encodedIds = array_map([__CLASS__, 'encodeKey'], $ids); @@ -306,12 +308,12 @@ class MemcachedAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doClear(string $namespace): bool + protected function doClear(string $namespace) { return '' === $namespace && $this->getClient()->flush(); } - private function checkResultCode(mixed $result) + private function checkResultCode($result) { $code = $this->client->getResultCode(); @@ -324,7 +326,7 @@ class MemcachedAdapter extends AbstractAdapter private function getClient(): \Memcached { - if (isset($this->client)) { + if ($this->client) { return $this->client; } diff --git a/vendor/symfony/cache/Adapter/NullAdapter.php b/vendor/symfony/cache/Adapter/NullAdapter.php index 7827000b..15f7f8c4 100644 --- a/vendor/symfony/cache/Adapter/NullAdapter.php +++ b/vendor/symfony/cache/Adapter/NullAdapter.php @@ -40,7 +40,7 @@ class NullAdapter implements AdapterInterface, CacheInterface /** * {@inheritdoc} */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) { $save = true; @@ -50,7 +50,7 @@ class NullAdapter implements AdapterInterface, CacheInterface /** * {@inheritdoc} */ - public function getItem(mixed $key): CacheItem + public function getItem($key) { return (self::$createCacheItem)($key); } @@ -58,63 +58,77 @@ class NullAdapter implements AdapterInterface, CacheInterface /** * {@inheritdoc} */ - public function getItems(array $keys = []): iterable + public function getItems(array $keys = []) { return $this->generateItems($keys); } /** * {@inheritdoc} + * + * @return bool */ - public function hasItem(mixed $key): bool + public function hasItem($key) { return false; } /** * {@inheritdoc} + * + * @return bool */ - public function clear(string $prefix = ''): bool + public function clear(string $prefix = '') { return true; } /** * {@inheritdoc} + * + * @return bool */ - public function deleteItem(mixed $key): bool + public function deleteItem($key) { return true; } /** * {@inheritdoc} + * + * @return bool */ - public function deleteItems(array $keys): bool + public function deleteItems(array $keys) { return true; } /** * {@inheritdoc} + * + * @return bool */ - public function save(CacheItemInterface $item): bool + public function save(CacheItemInterface $item) { return true; } /** * {@inheritdoc} + * + * @return bool */ - public function saveDeferred(CacheItemInterface $item): bool + public function saveDeferred(CacheItemInterface $item) { return true; } /** * {@inheritdoc} + * + * @return bool */ - public function commit(): bool + public function commit() { return true; } diff --git a/vendor/symfony/cache/Adapter/PdoAdapter.php b/vendor/symfony/cache/Adapter/PdoAdapter.php index 8bf72210..5d107244 100644 --- a/vendor/symfony/cache/Adapter/PdoAdapter.php +++ b/vendor/symfony/cache/Adapter/PdoAdapter.php @@ -12,6 +12,9 @@ namespace Symfony\Component\Cache\Adapter; use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Schema\Schema; +use Psr\Cache\CacheItemInterface; +use Psr\Log\LoggerInterface; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\Marshaller\DefaultMarshaller; use Symfony\Component\Cache\Marshaller\MarshallerInterface; @@ -21,20 +24,22 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface { protected $maxIdLength = 255; - private MarshallerInterface $marshaller; - private \PDO|Connection $conn; - private string $dsn; - private string $driver; - private string $serverVersion; - private mixed $table = 'cache_items'; - private mixed $idCol = 'item_id'; - private mixed $dataCol = 'item_data'; - private mixed $lifetimeCol = 'item_lifetime'; - private mixed $timeCol = 'item_time'; - private mixed $username = ''; - private mixed $password = ''; - private mixed $connectionOptions = []; - private string $namespace; + private $marshaller; + private $conn; + private $dsn; + private $driver; + private $serverVersion; + private $table = 'cache_items'; + private $idCol = 'item_id'; + private $dataCol = 'item_data'; + private $lifetimeCol = 'item_lifetime'; + private $timeCol = 'item_time'; + private $username = ''; + private $password = ''; + private $connectionOptions = []; + private $namespace; + + private $dbalAdapter; /** * You can either pass an existing database connection as PDO instance or @@ -51,14 +56,19 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface * * db_password: The password when lazy-connect [default: ''] * * db_connection_options: An array of driver-specific connection options [default: []] * + * @param \PDO|string $connOrDsn + * * @throws InvalidArgumentException When first argument is not PDO nor Connection nor string * @throws InvalidArgumentException When PDO error mode is not PDO::ERRMODE_EXCEPTION * @throws InvalidArgumentException When namespace contains invalid characters */ - public function __construct(\PDO|string $connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], MarshallerInterface $marshaller = null) + public function __construct($connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], MarshallerInterface $marshaller = null) { - if (\is_string($connOrDsn) && str_contains($connOrDsn, '://')) { - throw new InvalidArgumentException(sprintf('Usage of Doctrine DBAL URL with "%s" is not supported. Use a PDO DSN or "%s" instead. Got "%s".', __CLASS__, DoctrineDbalAdapter::class, $connOrDsn)); + if ($connOrDsn instanceof Connection || (\is_string($connOrDsn) && str_contains($connOrDsn, '://'))) { + trigger_deprecation('symfony/cache', '5.4', 'Usage of a DBAL Connection with "%s" is deprecated and will be removed in symfony 6.0. Use "%s" instead.', __CLASS__, DoctrineDbalAdapter::class); + $this->dbalAdapter = new DoctrineDbalAdapter($connOrDsn, $namespace, $defaultLifetime, $options, $marshaller); + + return; } if (isset($namespace[0]) && preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) { @@ -71,8 +81,10 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface } $this->conn = $connOrDsn; - } else { + } elseif (\is_string($connOrDsn)) { $this->dsn = $connOrDsn; + } else { + throw new InvalidArgumentException(sprintf('"%s" requires PDO or Doctrine\DBAL\Connection instance or DSN string as first argument, "%s" given.', __CLASS__, get_debug_type($connOrDsn))); } $this->table = $options['db_table'] ?? $this->table; @@ -89,6 +101,166 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface parent::__construct($namespace, $defaultLifetime); } + /** + * {@inheritDoc} + */ + public function getItem($key) + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->getItem($key); + } + + return parent::getItem($key); + } + + /** + * {@inheritDoc} + */ + public function getItems(array $keys = []) + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->getItems($keys); + } + + return parent::getItems($keys); + } + + /** + * {@inheritDoc} + */ + public function hasItem($key) + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->hasItem($key); + } + + return parent::hasItem($key); + } + + /** + * {@inheritDoc} + */ + public function deleteItem($key) + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->deleteItem($key); + } + + return parent::deleteItem($key); + } + + /** + * {@inheritDoc} + */ + public function deleteItems(array $keys) + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->deleteItems($keys); + } + + return parent::deleteItems($keys); + } + + /** + * {@inheritDoc} + */ + public function clear(string $prefix = '') + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->clear($prefix); + } + + return parent::clear($prefix); + } + + /** + * {@inheritDoc} + */ + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->get($key, $callback, $beta, $metadata); + } + + return parent::get($key, $callback, $beta, $metadata); + } + + /** + * {@inheritDoc} + */ + public function delete(string $key): bool + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->delete($key); + } + + return parent::delete($key); + } + + /** + * {@inheritDoc} + */ + public function save(CacheItemInterface $item) + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->save($item); + } + + return parent::save($item); + } + + /** + * {@inheritDoc} + */ + public function saveDeferred(CacheItemInterface $item) + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->saveDeferred($item); + } + + return parent::saveDeferred($item); + } + + /** + * {@inheritDoc} + */ + public function setLogger(LoggerInterface $logger): void + { + if (isset($this->dbalAdapter)) { + $this->dbalAdapter->setLogger($logger); + + return; + } + + parent::setLogger($logger); + } + + /** + * {@inheritDoc} + */ + public function commit() + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->commit(); + } + + return parent::commit(); + } + + /** + * {@inheritDoc} + */ + public function reset() + { + if (isset($this->dbalAdapter)) { + $this->dbalAdapter->reset(); + + return; + } + + parent::reset(); + } + /** * Creates the table to store cache items which can be called once for setup. * @@ -100,31 +272,64 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface */ public function createTable() { + if (isset($this->dbalAdapter)) { + $this->dbalAdapter->createTable(); + + return; + } + // connect if we are not yet $conn = $this->getConnection(); - $sql = match ($this->driver) { - // We use varbinary for the ID column because it prevents unwanted conversions: - // - character set conversions between server and client - // - trailing space removal - // - case-insensitivity - // - language processing like é == e - 'mysql' => "CREATE TABLE $this->table ($this->idCol VARBINARY(255) NOT NULL PRIMARY KEY, $this->dataCol MEDIUMBLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED, $this->timeCol INTEGER UNSIGNED NOT NULL) COLLATE utf8mb4_bin, ENGINE = InnoDB", - 'sqlite' => "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)", - 'pgsql' => "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)", - 'oci' => "CREATE TABLE $this->table ($this->idCol VARCHAR2(255) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)", - 'sqlsrv' => "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol VARBINARY(MAX) NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)", - default => throw new \DomainException(sprintf('Creating the cache table is currently not implemented for PDO driver "%s".', $this->driver)), - }; + switch ($this->driver) { + case 'mysql': + // We use varbinary for the ID column because it prevents unwanted conversions: + // - character set conversions between server and client + // - trailing space removal + // - case-insensitivity + // - language processing like é == e + $sql = "CREATE TABLE $this->table ($this->idCol VARBINARY(255) NOT NULL PRIMARY KEY, $this->dataCol MEDIUMBLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED, $this->timeCol INTEGER UNSIGNED NOT NULL) COLLATE utf8mb4_bin, ENGINE = InnoDB"; + break; + case 'sqlite': + $sql = "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)"; + break; + case 'pgsql': + $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)"; + break; + case 'oci': + $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR2(255) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)"; + break; + case 'sqlsrv': + $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol VARBINARY(MAX) NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)"; + break; + default: + throw new \DomainException(sprintf('Creating the cache table is currently not implemented for PDO driver "%s".', $this->driver)); + } $conn->exec($sql); } + /** + * Adds the Table to the Schema if the adapter uses this Connection. + * + * @deprecated since symfony/cache 5.4 use DoctrineDbalAdapter instead + */ + public function configureSchema(Schema $schema, Connection $forConnection): void + { + if (isset($this->dbalAdapter)) { + $this->dbalAdapter->configureSchema($schema, $forConnection); + } + } + /** * {@inheritdoc} */ - public function prune(): bool + public function prune() { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->prune(); + } + $deleteSql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= :time"; if ('' !== $this->namespace) { @@ -135,7 +340,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface try { $delete = $connection->prepare($deleteSql); - } catch (\PDOException) { + } catch (\PDOException $e) { return true; } $delete->bindValue(':time', time(), \PDO::PARAM_INT); @@ -145,7 +350,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface } try { return $delete->execute(); - } catch (\PDOException) { + } catch (\PDOException $e) { return true; } } @@ -153,7 +358,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doFetch(array $ids): iterable + protected function doFetch(array $ids) { $connection = $this->getConnection(); @@ -199,7 +404,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doHave(string $id): bool + protected function doHave(string $id) { $connection = $this->getConnection(); @@ -216,7 +421,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doClear(string $namespace): bool + protected function doClear(string $namespace) { $conn = $this->getConnection(); @@ -232,7 +437,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface try { $conn->exec($sql); - } catch (\PDOException) { + } catch (\PDOException $e) { } return true; @@ -241,14 +446,14 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doDelete(array $ids): bool + protected function doDelete(array $ids) { $sql = str_pad('', (\count($ids) << 1) - 1, '?,'); $sql = "DELETE FROM $this->table WHERE $this->idCol IN ($sql)"; try { $stmt = $this->getConnection()->prepare($sql); $stmt->execute(array_values($ids)); - } catch (\PDOException) { + } catch (\PDOException $e) { } return true; @@ -257,7 +462,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doSave(array $values, int $lifetime): array|bool + protected function doSave(array $values, int $lifetime) { if (!$values = $this->marshaller->marshall($values, $failed)) { return $failed; @@ -301,7 +506,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface $lifetime = $lifetime ?: null; try { $stmt = $conn->prepare($sql); - } catch (\PDOException) { + } catch (\PDOException $e) { if (!$conn->inTransaction() || \in_array($this->driver, ['pgsql', 'sqlite', 'sqlsrv'], true)) { $this->createTable(); } @@ -336,7 +541,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface foreach ($values as $id => $data) { try { $stmt->execute(); - } catch (\PDOException) { + } catch (\PDOException $e) { if (!$conn->inTransaction() || \in_array($this->driver, ['pgsql', 'sqlite', 'sqlsrv'], true)) { $this->createTable(); } @@ -345,7 +550,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface if (null === $driver && !$stmt->rowCount()) { try { $insertStmt->execute(); - } catch (\PDOException) { + } catch (\PDOException $e) { // A concurrent write won, let it be } } @@ -356,17 +561,23 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface private function getConnection(): \PDO { - if (!isset($this->conn)) { + if (null === $this->conn) { $this->conn = new \PDO($this->dsn, $this->username, $this->password, $this->connectionOptions); $this->conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); } - $this->driver ??= $this->conn->getAttribute(\PDO::ATTR_DRIVER_NAME); + if (null === $this->driver) { + $this->driver = $this->conn->getAttribute(\PDO::ATTR_DRIVER_NAME); + } return $this->conn; } private function getServerVersion(): string { - return $this->serverVersion ??= $this->conn->getAttribute(\PDO::ATTR_SERVER_VERSION); + if (null === $this->serverVersion) { + $this->serverVersion = $this->conn->getAttribute(\PDO::ATTR_SERVER_VERSION); + } + + return $this->serverVersion; } } diff --git a/vendor/symfony/cache/Adapter/PhpArrayAdapter.php b/vendor/symfony/cache/Adapter/PhpArrayAdapter.php index 72a3692c..8c8fb916 100644 --- a/vendor/symfony/cache/Adapter/PhpArrayAdapter.php +++ b/vendor/symfony/cache/Adapter/PhpArrayAdapter.php @@ -34,12 +34,12 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte use ContractsTrait; use ProxyTrait; - private string $file; - private array $keys; - private array $values; + private $file; + private $keys; + private $values; - private static \Closure $createCacheItem; - private static array $valuesCache = []; + private static $createCacheItem; + private static $valuesCache = []; /** * @param string $file The PHP file were values are cached @@ -68,8 +68,10 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte * * @param string $file The PHP file were values are cached * @param CacheItemPoolInterface $fallbackPool A pool to fallback on when an item is not hit + * + * @return CacheItemPoolInterface */ - public static function create(string $file, CacheItemPoolInterface $fallbackPool): CacheItemPoolInterface + public static function create(string $file, CacheItemPoolInterface $fallbackPool) { if (!$fallbackPool instanceof AdapterInterface) { $fallbackPool = new ProxyAdapter($fallbackPool); @@ -81,9 +83,9 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) { - if (!isset($this->values)) { + if (null === $this->values) { $this->initialize(); } if (!isset($this->keys[$key])) { @@ -103,7 +105,7 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte if ($value instanceof \Closure) { return $value(); } - } catch (\Throwable) { + } catch (\Throwable $e) { unset($this->keys[$key]); goto get_from_pool; } @@ -114,12 +116,12 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} */ - public function getItem(mixed $key): CacheItem + public function getItem($key) { if (!\is_string($key)) { throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); } - if (!isset($this->values)) { + if (null === $this->values) { $this->initialize(); } if (!isset($this->keys[$key])) { @@ -134,7 +136,7 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte } elseif ($value instanceof \Closure) { try { $value = $value(); - } catch (\Throwable) { + } catch (\Throwable $e) { $value = null; $isHit = false; } @@ -146,14 +148,14 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} */ - public function getItems(array $keys = []): iterable + public function getItems(array $keys = []) { foreach ($keys as $key) { if (!\is_string($key)) { throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); } } - if (!isset($this->values)) { + if (null === $this->values) { $this->initialize(); } @@ -162,13 +164,15 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} + * + * @return bool */ - public function hasItem(mixed $key): bool + public function hasItem($key) { if (!\is_string($key)) { throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); } - if (!isset($this->values)) { + if (null === $this->values) { $this->initialize(); } @@ -177,13 +181,15 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} + * + * @return bool */ - public function deleteItem(mixed $key): bool + public function deleteItem($key) { if (!\is_string($key)) { throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); } - if (!isset($this->values)) { + if (null === $this->values) { $this->initialize(); } @@ -192,8 +198,10 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} + * + * @return bool */ - public function deleteItems(array $keys): bool + public function deleteItems(array $keys) { $deleted = true; $fallbackKeys = []; @@ -209,7 +217,7 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte $fallbackKeys[] = $key; } } - if (!isset($this->values)) { + if (null === $this->values) { $this->initialize(); } @@ -222,10 +230,12 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} + * + * @return bool */ - public function save(CacheItemInterface $item): bool + public function save(CacheItemInterface $item) { - if (!isset($this->values)) { + if (null === $this->values) { $this->initialize(); } @@ -234,10 +244,12 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} + * + * @return bool */ - public function saveDeferred(CacheItemInterface $item): bool + public function saveDeferred(CacheItemInterface $item) { - if (!isset($this->values)) { + if (null === $this->values) { $this->initialize(); } @@ -246,16 +258,20 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} + * + * @return bool */ - public function commit(): bool + public function commit() { return $this->pool->commit(); } /** * {@inheritdoc} + * + * @return bool */ - public function clear(string $prefix = ''): bool + public function clear(string $prefix = '') { $this->keys = $this->values = []; @@ -276,7 +292,7 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte * * @return string[] A list of classes to preload on PHP 7.4+ */ - public function warmUp(array $values): array + public function warmUp(array $values) { if (file_exists($this->file)) { if (!is_file($this->file)) { @@ -401,7 +417,7 @@ EOF; } elseif ($value instanceof \Closure) { try { yield $key => $f($key, $value(), true); - } catch (\Throwable) { + } catch (\Throwable $e) { yield $key => $f($key, null, false); } } else { diff --git a/vendor/symfony/cache/Adapter/PhpFilesAdapter.php b/vendor/symfony/cache/Adapter/PhpFilesAdapter.php index 39468ce6..2fb08375 100644 --- a/vendor/symfony/cache/Adapter/PhpFilesAdapter.php +++ b/vendor/symfony/cache/Adapter/PhpFilesAdapter.php @@ -29,13 +29,13 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface doDelete as private doCommonDelete; } - private \Closure $includeHandler; - private bool $appendOnly; - private array $values = []; - private array $files = []; + private $includeHandler; + private $appendOnly; + private $values = []; + private $files = []; - private static int $startTime; - private static array $valuesCache = []; + private static $startTime; + private static $valuesCache = []; /** * @param $appendOnly Set to `true` to gain extra performance when the items stored in this pool never expire. @@ -61,7 +61,10 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface return \function_exists('opcache_invalidate') && filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOLEAN) && (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) || filter_var(\ini_get('opcache.enable_cli'), \FILTER_VALIDATE_BOOLEAN)); } - public function prune(): bool + /** + * @return bool + */ + public function prune() { $time = time(); $pruned = true; @@ -92,7 +95,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doFetch(array $ids): iterable + protected function doFetch(array $ids) { if ($this->appendOnly) { $now = 0; @@ -135,7 +138,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface foreach ($missingIds as $k => $id) { try { - $file = $this->files[$id] ??= $this->getFile($id); + $file = $this->files[$id] ?? $this->files[$id] = $this->getFile($id); if (isset(self::$valuesCache[$file])) { [$expiresAt, $this->values[$id]] = self::$valuesCache[$file]; @@ -168,7 +171,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doHave(string $id): bool + protected function doHave(string $id) { if ($this->appendOnly && isset($this->values[$id])) { return true; @@ -176,7 +179,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface set_error_handler($this->includeHandler); try { - $file = $this->files[$id] ??= $this->getFile($id); + $file = $this->files[$id] ?? $this->files[$id] = $this->getFile($id); $getExpiry = true; if (isset(self::$valuesCache[$file])) { @@ -190,7 +193,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface } elseif ($this->appendOnly) { $value = new LazyValue($file); } - } catch (\ErrorException) { + } catch (\ErrorException $e) { return false; } finally { restore_error_handler(); @@ -208,7 +211,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doSave(array $values, int $lifetime): array|bool + protected function doSave(array $values, int $lifetime) { $ok = true; $expiry = $lifetime ? time() + $lifetime : 'PHP_INT_MAX'; @@ -270,7 +273,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doClear(string $namespace): bool + protected function doClear(string $namespace) { $this->values = []; @@ -280,7 +283,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doDelete(array $ids): bool + protected function doDelete(array $ids) { foreach ($ids as $id) { unset($this->values[$id]); @@ -318,7 +321,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface */ class LazyValue { - public string $file; + public $file; public function __construct(string $file) { diff --git a/vendor/symfony/cache/Adapter/ProxyAdapter.php b/vendor/symfony/cache/Adapter/ProxyAdapter.php index d2cd0b94..c715cade 100644 --- a/vendor/symfony/cache/Adapter/ProxyAdapter.php +++ b/vendor/symfony/cache/Adapter/ProxyAdapter.php @@ -28,25 +28,25 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa use ContractsTrait; use ProxyTrait; - private string $namespace = ''; - private int $namespaceLen; - private string $poolHash; - private int $defaultLifetime; + private $namespace = ''; + private $namespaceLen; + private $poolHash; + private $defaultLifetime; - private static \Closure $createCacheItem; - private static \Closure $setInnerItem; + private static $createCacheItem; + private static $setInnerItem; public function __construct(CacheItemPoolInterface $pool, string $namespace = '', int $defaultLifetime = 0) { $this->pool = $pool; - $this->poolHash = spl_object_hash($pool); + $this->poolHash = $poolHash = spl_object_hash($pool); if ('' !== $namespace) { \assert('' !== CacheItem::validateKey($namespace)); $this->namespace = $namespace; } $this->namespaceLen = \strlen($namespace); $this->defaultLifetime = $defaultLifetime; - self::$createCacheItem ??= \Closure::bind( + self::$createCacheItem ?? self::$createCacheItem = \Closure::bind( static function ($key, $innerItem, $poolHash) { $item = new CacheItem(); $item->key = $key; @@ -55,12 +55,20 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa return $item; } - $item->value = $innerItem->get(); + $item->value = $v = $innerItem->get(); $item->isHit = $innerItem->isHit(); $item->innerItem = $innerItem; $item->poolHash = $poolHash; - if (!$item->unpack() && $innerItem instanceof CacheItem) { + // Detect wrapped values that encode for their expiry and creation duration + // For compactness, these values are packed in the key of an array using + // magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F + if (\is_array($v) && 1 === \count($v) && 10 === \strlen($k = (string) array_key_first($v)) && "\x9D" === $k[0] && "\0" === $k[5] && "\x5F" === $k[9]) { + $item->value = $v[$k]; + $v = unpack('Ve/Nc', substr($k, 1, -1)); + $item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET; + $item->metadata[CacheItem::METADATA_CTIME] = $v['c']; + } elseif ($innerItem instanceof CacheItem) { $item->metadata = $innerItem->metadata; } $innerItem->set(null); @@ -70,10 +78,21 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa null, CacheItem::class ); - self::$setInnerItem ??= \Closure::bind( - static function (CacheItemInterface $innerItem, CacheItem $item, $expiry = null) { - $innerItem->set($item->pack()); - $innerItem->expiresAt(($expiry ?? $item->expiry) ? \DateTime::createFromFormat('U.u', sprintf('%.6F', $expiry ?? $item->expiry)) : null); + self::$setInnerItem ?? self::$setInnerItem = \Closure::bind( + /** + * @param array $item A CacheItem cast to (array); accessing protected properties requires adding the "\0*\0" PHP prefix + */ + static function (CacheItemInterface $innerItem, array $item) { + // Tags are stored separately, no need to account for them when considering this item's newly set metadata + if (isset(($metadata = $item["\0*\0newMetadata"])[CacheItem::METADATA_TAGS])) { + unset($metadata[CacheItem::METADATA_TAGS]); + } + if ($metadata) { + // For compactness, expiry and creation duration are packed in the key of an array, using magic numbers as separators + $item["\0*\0value"] = ["\x9D".pack('VN', (int) (0.1 + $metadata[self::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[self::METADATA_CTIME])."\x5F" => $item["\0*\0value"]]; + } + $innerItem->set($item["\0*\0value"]); + $innerItem->expiresAt(null !== $item["\0*\0expiry"] ? \DateTime::createFromFormat('U.u', sprintf('%.6F', $item["\0*\0expiry"])) : null); }, null, CacheItem::class @@ -83,7 +102,7 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) { if (!$this->pool instanceof CacheInterface) { return $this->doGet($this, $key, $callback, $beta, $metadata); @@ -92,7 +111,7 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa return $this->pool->get($this->getId($key), function ($innerItem, bool &$save) use ($key, $callback) { $item = (self::$createCacheItem)($key, $innerItem, $this->poolHash); $item->set($value = $callback($item, $save)); - (self::$setInnerItem)($innerItem, $item); + (self::$setInnerItem)($innerItem, (array) $item); return $value; }, $beta, $metadata); @@ -101,7 +120,7 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} */ - public function getItem(mixed $key): CacheItem + public function getItem($key) { $item = $this->pool->getItem($this->getId($key)); @@ -111,7 +130,7 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} */ - public function getItems(array $keys = []): iterable + public function getItems(array $keys = []) { if ($this->namespaceLen) { foreach ($keys as $i => $key) { @@ -124,16 +143,20 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} + * + * @return bool */ - public function hasItem(mixed $key): bool + public function hasItem($key) { return $this->pool->hasItem($this->getId($key)); } /** * {@inheritdoc} + * + * @return bool */ - public function clear(string $prefix = ''): bool + public function clear(string $prefix = '') { if ($this->pool instanceof AdapterInterface) { return $this->pool->clear($this->namespace.$prefix); @@ -144,16 +167,20 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} + * + * @return bool */ - public function deleteItem(mixed $key): bool + public function deleteItem($key) { return $this->pool->deleteItem($this->getId($key)); } /** * {@inheritdoc} + * + * @return bool */ - public function deleteItems(array $keys): bool + public function deleteItems(array $keys) { if ($this->namespaceLen) { foreach ($keys as $i => $key) { @@ -166,50 +193,55 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} + * + * @return bool */ - public function save(CacheItemInterface $item): bool + public function save(CacheItemInterface $item) { return $this->doSave($item, __FUNCTION__); } /** * {@inheritdoc} + * + * @return bool */ - public function saveDeferred(CacheItemInterface $item): bool + public function saveDeferred(CacheItemInterface $item) { return $this->doSave($item, __FUNCTION__); } /** * {@inheritdoc} + * + * @return bool */ - public function commit(): bool + public function commit() { return $this->pool->commit(); } - private function doSave(CacheItemInterface $item, string $method): bool + private function doSave(CacheItemInterface $item, string $method) { if (!$item instanceof CacheItem) { return false; } - $castItem = (array) $item; - - if (null === $castItem["\0*\0expiry"] && 0 < $this->defaultLifetime) { - $castItem["\0*\0expiry"] = microtime(true) + $this->defaultLifetime; + $item = (array) $item; + if (null === $item["\0*\0expiry"] && 0 < $this->defaultLifetime) { + $item["\0*\0expiry"] = microtime(true) + $this->defaultLifetime; } - if ($castItem["\0*\0poolHash"] === $this->poolHash && $castItem["\0*\0innerItem"]) { - $innerItem = $castItem["\0*\0innerItem"]; + if ($item["\0*\0poolHash"] === $this->poolHash && $item["\0*\0innerItem"]) { + $innerItem = $item["\0*\0innerItem"]; } elseif ($this->pool instanceof AdapterInterface) { // this is an optimization specific for AdapterInterface implementations // so we can save a round-trip to the backend by just creating a new item - $innerItem = (self::$createCacheItem)($this->namespace.$castItem["\0*\0key"], null, $this->poolHash); + $innerItem = (self::$createCacheItem)($this->namespace.$item["\0*\0key"], null, $this->poolHash); } else { - $innerItem = $this->pool->getItem($this->namespace.$castItem["\0*\0key"]); + $innerItem = $this->pool->getItem($this->namespace.$item["\0*\0key"]); } - (self::$setInnerItem)($innerItem, $item, $castItem["\0*\0expiry"]); + (self::$setInnerItem)($innerItem, $item); return $this->pool->$method($innerItem); } @@ -227,7 +259,7 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa } } - private function getId(mixed $key): string + private function getId($key): string { \assert('' !== CacheItem::validateKey($key)); diff --git a/vendor/symfony/cache/Adapter/Psr16Adapter.php b/vendor/symfony/cache/Adapter/Psr16Adapter.php index 664c18bb..a56aa393 100644 --- a/vendor/symfony/cache/Adapter/Psr16Adapter.php +++ b/vendor/symfony/cache/Adapter/Psr16Adapter.php @@ -30,7 +30,7 @@ class Psr16Adapter extends AbstractAdapter implements PruneableInterface, Resett */ protected const NS_SEPARATOR = '_'; - private object $miss; + private $miss; public function __construct(CacheInterface $pool, string $namespace = '', int $defaultLifetime = 0) { @@ -43,7 +43,7 @@ class Psr16Adapter extends AbstractAdapter implements PruneableInterface, Resett /** * {@inheritdoc} */ - protected function doFetch(array $ids): iterable + protected function doFetch(array $ids) { foreach ($this->pool->getMultiple($ids, $this->miss) as $key => $value) { if ($this->miss !== $value) { @@ -55,7 +55,7 @@ class Psr16Adapter extends AbstractAdapter implements PruneableInterface, Resett /** * {@inheritdoc} */ - protected function doHave(string $id): bool + protected function doHave(string $id) { return $this->pool->has($id); } @@ -63,7 +63,7 @@ class Psr16Adapter extends AbstractAdapter implements PruneableInterface, Resett /** * {@inheritdoc} */ - protected function doClear(string $namespace): bool + protected function doClear(string $namespace) { return $this->pool->clear(); } @@ -71,7 +71,7 @@ class Psr16Adapter extends AbstractAdapter implements PruneableInterface, Resett /** * {@inheritdoc} */ - protected function doDelete(array $ids): bool + protected function doDelete(array $ids) { return $this->pool->deleteMultiple($ids); } @@ -79,7 +79,7 @@ class Psr16Adapter extends AbstractAdapter implements PruneableInterface, Resett /** * {@inheritdoc} */ - protected function doSave(array $values, int $lifetime): array|bool + protected function doSave(array $values, int $lifetime) { return $this->pool->setMultiple($values, 0 === $lifetime ? null : $lifetime); } diff --git a/vendor/symfony/cache/Adapter/RedisAdapter.php b/vendor/symfony/cache/Adapter/RedisAdapter.php index 45bc3400..eb5950e5 100644 --- a/vendor/symfony/cache/Adapter/RedisAdapter.php +++ b/vendor/symfony/cache/Adapter/RedisAdapter.php @@ -20,7 +20,12 @@ class RedisAdapter extends AbstractAdapter { use RedisTrait; - public function __construct(\Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) + /** + * @param \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis The redis client + * @param string $namespace The default namespace + * @param int $defaultLifetime The default lifetime + */ + public function __construct($redis, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) { $this->init($redis, $namespace, $defaultLifetime, $marshaller); } diff --git a/vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php b/vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php index ef2154d6..186b32e7 100644 --- a/vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php +++ b/vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php @@ -56,12 +56,17 @@ class RedisTagAwareAdapter extends AbstractTagAwareAdapter private const DEFAULT_CACHE_TTL = 8640000; /** - * detected eviction policy used on Redis server. + * @var string|null detected eviction policy used on Redis server */ - private string $redisEvictionPolicy; - private string $namespace; + private $redisEvictionPolicy; + private $namespace; - public function __construct(\Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) + /** + * @param \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis The redis client + * @param string $namespace The default namespace + * @param int $defaultLifetime The default lifetime + */ + public function __construct($redis, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) { if ($redis instanceof \Predis\ClientInterface && $redis->getConnection() instanceof ClusterInterface && !$redis->getConnection() instanceof PredisCluster) { throw new InvalidArgumentException(sprintf('Unsupported Predis cluster connection: only "%s" is, "%s" given.', PredisCluster::class, get_debug_type($redis->getConnection()))); @@ -170,7 +175,7 @@ EOLUA; try { yield $id => !\is_string($result) || '' === $result ? [] : $this->marshaller->unmarshall($result); - } catch (\Exception) { + } catch (\Exception $e) { yield $id => []; } } @@ -292,7 +297,7 @@ EOLUA; private function getRedisEvictionPolicy(): string { - if (isset($this->redisEvictionPolicy)) { + if (null !== $this->redisEvictionPolicy) { return $this->redisEvictionPolicy; } diff --git a/vendor/symfony/cache/Adapter/TagAwareAdapter.php b/vendor/symfony/cache/Adapter/TagAwareAdapter.php index b12ebfef..ff22e5a8 100644 --- a/vendor/symfony/cache/Adapter/TagAwareAdapter.php +++ b/vendor/symfony/cache/Adapter/TagAwareAdapter.php @@ -19,73 +19,70 @@ use Symfony\Component\Cache\CacheItem; use Symfony\Component\Cache\PruneableInterface; use Symfony\Component\Cache\ResettableInterface; use Symfony\Component\Cache\Traits\ContractsTrait; +use Symfony\Component\Cache\Traits\ProxyTrait; use Symfony\Contracts\Cache\TagAwareCacheInterface; /** - * Implements simple and robust tag-based invalidation suitable for use with volatile caches. - * - * This adapter works by storing a version for each tags. When saving an item, it is stored together with its tags and - * their corresponding versions. When retrieving an item, those tag versions are compared to the current version of - * each tags. Invalidation is achieved by deleting tags, thereby ensuring that their versions change even when the - * storage is out of space. When versions of non-existing tags are requested for item commits, this adapter assigns a - * new random version to them. - * * @author Nicolas Grekas - * @author Sergey Belyshkin */ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface, PruneableInterface, ResettableInterface, LoggerAwareInterface { use ContractsTrait; use LoggerAwareTrait; + use ProxyTrait; public const TAGS_PREFIX = "\0tags\0"; - private array $deferred = []; - private AdapterInterface $pool; - private AdapterInterface $tags; - private array $knownTagVersions = []; - private float $knownTagVersionsTtl; + private $deferred = []; + private $tags; + private $knownTagVersions = []; + private $knownTagVersionsTtl; - private static \Closure $setCacheItemTags; - private static \Closure $setTagVersions; - private static \Closure $getTagsByKey; - private static \Closure $saveTags; + private static $createCacheItem; + private static $setCacheItemTags; + private static $getTagsByKey; + private static $saveTags; public function __construct(AdapterInterface $itemsPool, AdapterInterface $tagsPool = null, float $knownTagVersionsTtl = 0.15) { $this->pool = $itemsPool; - $this->tags = $tagsPool ?? $itemsPool; + $this->tags = $tagsPool ?: $itemsPool; $this->knownTagVersionsTtl = $knownTagVersionsTtl; - self::$setCacheItemTags ??= \Closure::bind( - static function (array $items, array $itemTags) { - foreach ($items as $key => $item) { - $item->isTaggable = true; + self::$createCacheItem ?? self::$createCacheItem = \Closure::bind( + static function ($key, $value, CacheItem $protoItem) { + $item = new CacheItem(); + $item->key = $key; + $item->value = $value; + $item->expiry = $protoItem->expiry; + $item->poolHash = $protoItem->poolHash; - if (isset($itemTags[$key])) { - $tags = array_keys($itemTags[$key]); - $item->metadata[CacheItem::METADATA_TAGS] = array_combine($tags, $tags); - } else { - $item->value = null; - $item->isHit = false; - $item->metadata = []; + return $item; + }, + null, + CacheItem::class + ); + self::$setCacheItemTags ?? self::$setCacheItemTags = \Closure::bind( + static function (CacheItem $item, $key, array &$itemTags) { + $item->isTaggable = true; + if (!$item->isHit) { + return $item; + } + if (isset($itemTags[$key])) { + foreach ($itemTags[$key] as $tag => $version) { + $item->metadata[CacheItem::METADATA_TAGS][$tag] = $tag; } + unset($itemTags[$key]); + } else { + $item->value = null; + $item->isHit = false; } - return $items; + return $item; }, null, CacheItem::class ); - self::$setTagVersions ??= \Closure::bind( - static function (array $items, array $tagVersions) { - foreach ($items as $item) { - $item->newMetadata[CacheItem::METADATA_TAGS] = array_intersect_key($tagVersions, $item->newMetadata[CacheItem::METADATA_TAGS] ?? []); - } - }, - null, - CacheItem::class - ); - self::$getTagsByKey ??= \Closure::bind( + self::$getTagsByKey ?? self::$getTagsByKey = \Closure::bind( static function ($deferred) { $tagsByKey = []; foreach ($deferred as $key => $item) { @@ -98,7 +95,7 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac null, CacheItem::class ); - self::$saveTags ??= \Closure::bind( + self::$saveTags ?? self::$saveTags = \Closure::bind( static function (AdapterInterface $tagsAdapter, array $tags) { ksort($tags); @@ -117,7 +114,7 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac /** * {@inheritdoc} */ - public function invalidateTags(array $tags): bool + public function invalidateTags(array $tags) { $ids = []; foreach ($tags as $tag) { @@ -131,26 +128,54 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac /** * {@inheritdoc} + * + * @return bool */ - public function hasItem(mixed $key): bool + public function hasItem($key) { - return $this->getItem($key)->isHit(); + if (\is_string($key) && isset($this->deferred[$key])) { + $this->commit(); + } + + if (!$this->pool->hasItem($key)) { + return false; + } + + $itemTags = $this->pool->getItem(static::TAGS_PREFIX.$key); + + if (!$itemTags->isHit()) { + return false; + } + + if (!$itemTags = $itemTags->get()) { + return true; + } + + foreach ($this->getTagVersions([$itemTags]) as $tag => $version) { + if ($itemTags[$tag] !== $version) { + return false; + } + } + + return true; } /** * {@inheritdoc} */ - public function getItem(mixed $key): CacheItem + public function getItem($key) { foreach ($this->getItems([$key]) as $item) { return $item; } + + return null; } /** * {@inheritdoc} */ - public function getItems(array $keys = []): iterable + public function getItems(array $keys = []) { $tagKeys = []; $commit = false; @@ -159,7 +184,7 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac if ('' !== $key && \is_string($key)) { $commit = $commit || isset($this->deferred[$key]); $key = static::TAGS_PREFIX.$key; - $tagKeys[$key] = $key; // BC with pools populated before v6.1 + $tagKeys[$key] = $key; } } @@ -175,41 +200,15 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac throw $e; } - $bufferedItems = $itemTags = []; - - foreach ($items as $key => $item) { - if (isset($tagKeys[$key])) { // BC with pools populated before v6.1 - if ($item->isHit()) { - $itemTags[substr($key, \strlen(static::TAGS_PREFIX))] = $item->get() ?: []; - } - continue; - } - - if (null !== $tags = $item->getMetadata()[CacheItem::METADATA_TAGS] ?? null) { - $itemTags[$key] = $tags; - } - - $bufferedItems[$key] = $item; - } - - $tagVersions = $this->getTagVersions($itemTags, false); - foreach ($itemTags as $key => $tags) { - foreach ($tags as $tag => $version) { - if ($tagVersions[$tag] !== $version) { - unset($itemTags[$key]); - continue 2; - } - } - } - $tagVersions = null; - - return (self::$setCacheItemTags)($bufferedItems, $itemTags); + return $this->generateItems($items, $tagKeys); } /** * {@inheritdoc} + * + * @return bool */ - public function clear(string $prefix = ''): bool + public function clear(string $prefix = '') { if ('' !== $prefix) { foreach ($this->deferred as $key => $item) { @@ -230,20 +229,24 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac /** * {@inheritdoc} + * + * @return bool */ - public function deleteItem(mixed $key): bool + public function deleteItem($key) { return $this->deleteItems([$key]); } /** * {@inheritdoc} + * + * @return bool */ - public function deleteItems(array $keys): bool + public function deleteItems(array $keys) { foreach ($keys as $key) { if ('' !== $key && \is_string($key)) { - $keys[] = static::TAGS_PREFIX.$key; // BC with pools populated before v6.1 + $keys[] = static::TAGS_PREFIX.$key; } } @@ -252,8 +255,10 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac /** * {@inheritdoc} + * + * @return bool */ - public function save(CacheItemInterface $item): bool + public function save(CacheItemInterface $item) { if (!$item instanceof CacheItem) { return false; @@ -265,8 +270,10 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac /** * {@inheritdoc} + * + * @return bool */ - public function saveDeferred(CacheItemInterface $item): bool + public function saveDeferred(CacheItemInterface $item) { if (!$item instanceof CacheItem) { return false; @@ -278,52 +285,41 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac /** * {@inheritdoc} + * + * @return bool */ - public function commit(): bool + public function commit() { - if (!$items = $this->deferred) { + if (!$this->deferred) { return true; } - $tagVersions = $this->getTagVersions((self::$getTagsByKey)($items), true); - (self::$setTagVersions)($items, $tagVersions); - $ok = true; - foreach ($items as $key => $item) { - if ($this->pool->saveDeferred($item)) { + foreach ($this->deferred as $key => $item) { + if (!$this->pool->saveDeferred($item)) { unset($this->deferred[$key]); - } else { $ok = false; } } - $ok = $this->pool->commit() && $ok; - $tagVersions = array_keys($tagVersions); - (self::$setTagVersions)($items, array_combine($tagVersions, $tagVersions)); + $items = $this->deferred; + $tagsByKey = (self::$getTagsByKey)($items); + $this->deferred = []; - return $ok; + $tagVersions = $this->getTagVersions($tagsByKey); + $f = self::$createCacheItem; + + foreach ($tagsByKey as $key => $tags) { + $this->pool->saveDeferred($f(static::TAGS_PREFIX.$key, array_intersect_key($tagVersions, $tags), $items[$key])); + } + + return $this->pool->commit() && $ok; } /** - * {@inheritdoc} + * @return array */ - public function prune(): bool - { - return $this->pool instanceof PruneableInterface && $this->pool->prune(); - } - - /** - * {@inheritdoc} - */ - public function reset() - { - $this->commit(); - $this->knownTagVersions = []; - $this->pool instanceof ResettableInterface && $this->pool->reset(); - $this->tags instanceof ResettableInterface && $this->tags->reset(); - } - - public function __sleep(): array + public function __sleep() { throw new \BadMethodCallException('Cannot serialize '.__CLASS__); } @@ -338,19 +334,59 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac $this->commit(); } - private function getTagVersions(array $tagsByKey, bool $persistTags): array + private function generateItems(iterable $items, array $tagKeys): \Generator + { + $bufferedItems = $itemTags = []; + $f = self::$setCacheItemTags; + + foreach ($items as $key => $item) { + if (!$tagKeys) { + yield $key => $f($item, static::TAGS_PREFIX.$key, $itemTags); + continue; + } + if (!isset($tagKeys[$key])) { + $bufferedItems[$key] = $item; + continue; + } + + unset($tagKeys[$key]); + + if ($item->isHit()) { + $itemTags[$key] = $item->get() ?: []; + } + + if (!$tagKeys) { + $tagVersions = $this->getTagVersions($itemTags); + + foreach ($itemTags as $key => $tags) { + foreach ($tags as $tag => $version) { + if ($tagVersions[$tag] !== $version) { + unset($itemTags[$key]); + continue 2; + } + } + } + $tagVersions = $tagKeys = null; + + foreach ($bufferedItems as $key => $item) { + yield $key => $f($item, static::TAGS_PREFIX.$key, $itemTags); + } + $bufferedItems = null; + } + } + } + + private function getTagVersions(array $tagsByKey) { $tagVersions = []; - $fetchTagVersions = $persistTags; + $fetchTagVersions = false; foreach ($tagsByKey as $tags) { $tagVersions += $tags; - if ($fetchTagVersions) { - continue; - } + foreach ($tags as $tag => $version) { if ($tagVersions[$tag] !== $version) { - $fetchTagVersions = true; + unset($this->knownTagVersions[$tag]); } } } @@ -363,9 +399,8 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac $tags = []; foreach ($tagVersions as $tag => $version) { $tags[$tag.static::TAGS_PREFIX] = $tag; - $knownTagVersion = $this->knownTagVersions[$tag] ?? [0, null]; - if ($fetchTagVersions || $now > $knownTagVersion[0] || $knownTagVersion[1] !== $version) { - // reuse previously fetched tag versions until the expiration + if ($fetchTagVersions || ($this->knownTagVersions[$tag][1] ?? null) !== $version || $now - $this->knownTagVersions[$tag][0] >= $this->knownTagVersionsTtl) { + // reuse previously fetched tag versions up to the ttl $fetchTagVersions = true; } } @@ -376,26 +411,18 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac $newTags = []; $newVersion = null; - $expiration = $now + $this->knownTagVersionsTtl; foreach ($this->tags->getItems(array_keys($tags)) as $tag => $version) { - unset($this->knownTagVersions[$tag = $tags[$tag]]); // update FIFO - if (null !== $tagVersions[$tag] = $version->get()) { - $this->knownTagVersions[$tag] = [$expiration, $tagVersions[$tag]]; - } elseif ($persistTags) { - $newTags[$tag] = $version->set($newVersion ??= random_bytes(6)); - $tagVersions[$tag] = $newVersion; - $this->knownTagVersions[$tag] = [$expiration, $newVersion]; + if (!$version->isHit()) { + $newTags[$tag] = $version->set($newVersion ?? $newVersion = random_int(\PHP_INT_MIN, \PHP_INT_MAX)); } + $tagVersions[$tag = $tags[$tag]] = $version->get(); + $this->knownTagVersions[$tag] = [$now, $tagVersions[$tag]]; } if ($newTags) { (self::$saveTags)($this->tags, $newTags); } - while ($now > ($this->knownTagVersions[$tag = array_key_first($this->knownTagVersions)][0] ?? \INF)) { - unset($this->knownTagVersions[$tag]); - } - return $tagVersions; } } diff --git a/vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php b/vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php index 9242779c..afa18d3b 100644 --- a/vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php +++ b/vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php @@ -25,7 +25,9 @@ interface TagAwareAdapterInterface extends AdapterInterface * * @param string[] $tags An array of tags to invalidate * + * @return bool + * * @throws InvalidArgumentException When $tags is not valid */ - public function invalidateTags(array $tags): bool; + public function invalidateTags(array $tags); } diff --git a/vendor/symfony/cache/Adapter/TraceableAdapter.php b/vendor/symfony/cache/Adapter/TraceableAdapter.php index 0b577aa0..4b06557f 100644 --- a/vendor/symfony/cache/Adapter/TraceableAdapter.php +++ b/vendor/symfony/cache/Adapter/TraceableAdapter.php @@ -28,7 +28,7 @@ use Symfony\Contracts\Service\ResetInterface; class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface { protected $pool; - private array $calls = []; + private $calls = []; public function __construct(AdapterInterface $pool) { @@ -38,7 +38,7 @@ class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInt /** * {@inheritdoc} */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) { if (!$this->pool instanceof CacheInterface) { throw new \BadMethodCallException(sprintf('Cannot call "%s::get()": this class doesn\'t implement "%s".', get_debug_type($this->pool), CacheInterface::class)); @@ -70,7 +70,7 @@ class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInt /** * {@inheritdoc} */ - public function getItem(mixed $key): CacheItem + public function getItem($key) { $event = $this->start(__FUNCTION__); try { @@ -89,8 +89,10 @@ class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInt /** * {@inheritdoc} + * + * @return bool */ - public function hasItem(mixed $key): bool + public function hasItem($key) { $event = $this->start(__FUNCTION__); try { @@ -102,8 +104,10 @@ class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInt /** * {@inheritdoc} + * + * @return bool */ - public function deleteItem(mixed $key): bool + public function deleteItem($key) { $event = $this->start(__FUNCTION__); try { @@ -115,8 +119,10 @@ class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInt /** * {@inheritdoc} + * + * @return bool */ - public function save(CacheItemInterface $item): bool + public function save(CacheItemInterface $item) { $event = $this->start(__FUNCTION__); try { @@ -128,8 +134,10 @@ class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInt /** * {@inheritdoc} + * + * @return bool */ - public function saveDeferred(CacheItemInterface $item): bool + public function saveDeferred(CacheItemInterface $item) { $event = $this->start(__FUNCTION__); try { @@ -142,7 +150,7 @@ class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInt /** * {@inheritdoc} */ - public function getItems(array $keys = []): iterable + public function getItems(array $keys = []) { $event = $this->start(__FUNCTION__); try { @@ -167,8 +175,10 @@ class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInt /** * {@inheritdoc} + * + * @return bool */ - public function clear(string $prefix = ''): bool + public function clear(string $prefix = '') { $event = $this->start(__FUNCTION__); try { @@ -184,8 +194,10 @@ class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInt /** * {@inheritdoc} + * + * @return bool */ - public function deleteItems(array $keys): bool + public function deleteItems(array $keys) { $event = $this->start(__FUNCTION__); $event->result['keys'] = $keys; @@ -198,8 +210,10 @@ class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInt /** * {@inheritdoc} + * + * @return bool */ - public function commit(): bool + public function commit() { $event = $this->start(__FUNCTION__); try { @@ -212,7 +226,7 @@ class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInt /** * {@inheritdoc} */ - public function prune(): bool + public function prune() { if (!$this->pool instanceof PruneableInterface) { return false; @@ -270,15 +284,12 @@ class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInt } } -/** - * @internal - */ class TraceableAdapterEvent { - public string $name; - public float $start; - public float $end; - public array|bool $result; - public int $hits = 0; - public int $misses = 0; + public $name; + public $start; + public $end; + public $result; + public $hits = 0; + public $misses = 0; } diff --git a/vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php b/vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php index 35506339..69461b8b 100644 --- a/vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php +++ b/vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php @@ -26,7 +26,7 @@ class TraceableTagAwareAdapter extends TraceableAdapter implements TagAwareAdapt /** * {@inheritdoc} */ - public function invalidateTags(array $tags): bool + public function invalidateTags(array $tags) { $event = $this->start(__FUNCTION__); try { diff --git a/vendor/symfony/cache/CHANGELOG.md b/vendor/symfony/cache/CHANGELOG.md index 902d0ef2..60a86274 100644 --- a/vendor/symfony/cache/CHANGELOG.md +++ b/vendor/symfony/cache/CHANGELOG.md @@ -1,18 +1,6 @@ CHANGELOG ========= -6.1 ---- - - * Add support for ACL auth in RedisAdapter - * Improve reliability and performance of `TagAwareAdapter` by making tag versions an integral part of item value - -6.0 ---- - - * Remove `DoctrineProvider` and `DoctrineAdapter` - * Remove support of Doctrine DBAL in `PdoAdapter` - 5.4 --- diff --git a/vendor/symfony/cache/CacheItem.php b/vendor/symfony/cache/CacheItem.php index 0d3d9f1b..091d9e9b 100644 --- a/vendor/symfony/cache/CacheItem.php +++ b/vendor/symfony/cache/CacheItem.php @@ -22,17 +22,16 @@ use Symfony\Contracts\Cache\ItemInterface; final class CacheItem implements ItemInterface { private const METADATA_EXPIRY_OFFSET = 1527506807; - private const VALUE_WRAPPER = "\xA9"; - protected string $key; - protected mixed $value = null; - protected bool $isHit = false; - protected float|int|null $expiry = null; - protected array $metadata = []; - protected array $newMetadata = []; - protected ?ItemInterface $innerItem = null; - protected ?string $poolHash = null; - protected bool $isTaggable = false; + protected $key; + protected $value; + protected $isHit = false; + protected $expiry; + protected $metadata = []; + protected $newMetadata = []; + protected $innerItem; + protected $poolHash; + protected $isTaggable = false; /** * {@inheritdoc} @@ -44,8 +43,10 @@ final class CacheItem implements ItemInterface /** * {@inheritdoc} + * + * @return mixed */ - public function get(): mixed + public function get() { return $this->value; } @@ -63,7 +64,7 @@ final class CacheItem implements ItemInterface * * @return $this */ - public function set($value): static + public function set($value): self { $this->value = $value; @@ -75,9 +76,15 @@ final class CacheItem implements ItemInterface * * @return $this */ - public function expiresAt(?\DateTimeInterface $expiration): static + public function expiresAt($expiration): self { - $this->expiry = null !== $expiration ? (float) $expiration->format('U.u') : null; + if (null === $expiration) { + $this->expiry = null; + } elseif ($expiration instanceof \DateTimeInterface) { + $this->expiry = (float) $expiration->format('U.u'); + } else { + throw new InvalidArgumentException(sprintf('Expiration date must implement DateTimeInterface or be null, "%s" given.', get_debug_type($expiration))); + } return $this; } @@ -87,7 +94,7 @@ final class CacheItem implements ItemInterface * * @return $this */ - public function expiresAfter(mixed $time): static + public function expiresAfter($time): self { if (null === $time) { $this->expiry = null; @@ -105,17 +112,17 @@ final class CacheItem implements ItemInterface /** * {@inheritdoc} */ - public function tag(mixed $tags): static + public function tag($tags): ItemInterface { if (!$this->isTaggable) { throw new LogicException(sprintf('Cache item "%s" comes from a non tag-aware pool: you cannot tag it.', $this->key)); } - if (!\is_array($tags) && !$tags instanceof \Traversable) { // don't use is_iterable(), it's slow + if (!is_iterable($tags)) { $tags = [$tags]; } foreach ($tags as $tag) { - if (!\is_string($tag) && !$tag instanceof \Stringable) { - throw new InvalidArgumentException(sprintf('Cache tag must be string or object that implements __toString(), "%s" given.', get_debug_type($tag))); + if (!\is_string($tag) && !(\is_object($tag) && method_exists($tag, '__toString'))) { + throw new InvalidArgumentException(sprintf('Cache tag must be string or object that implements __toString(), "%s" given.', \is_object($tag) ? \get_class($tag) : \gettype($tag))); } $tag = (string) $tag; if (isset($this->newMetadata[self::METADATA_TAGS][$tag])) { @@ -182,38 +189,4 @@ final class CacheItem implements ItemInterface @trigger_error(strtr($message, $replace), \E_USER_WARNING); } } - - private function pack(): mixed - { - if (!$m = $this->newMetadata) { - return $this->value; - } - $valueWrapper = self::VALUE_WRAPPER; - - return new $valueWrapper($this->value, $m + ['expiry' => $this->expiry]); - } - - private function unpack(): bool - { - $v = $this->value; - $valueWrapper = self::VALUE_WRAPPER; - - if ($v instanceof $valueWrapper) { - $this->value = $v->value; - $this->metadata = $v->metadata; - - return true; - } - - if (!\is_array($v) || 1 !== \count($v) || 10 !== \strlen($k = (string) array_key_first($v)) || "\x9D" !== $k[0] || "\0" !== $k[5] || "\x5F" !== $k[9]) { - return false; - } - - // BC with pools populated before v6.1 - $this->value = $v[$k]; - $this->metadata = unpack('Vexpiry/Nctime', substr($k, 1, -1)); - $this->metadata['expiry'] += self::METADATA_EXPIRY_OFFSET; - - return true; - } } diff --git a/vendor/symfony/cache/DataCollector/CacheDataCollector.php b/vendor/symfony/cache/DataCollector/CacheDataCollector.php index 4fb700bb..9590436d 100644 --- a/vendor/symfony/cache/DataCollector/CacheDataCollector.php +++ b/vendor/symfony/cache/DataCollector/CacheDataCollector.php @@ -29,7 +29,7 @@ class CacheDataCollector extends DataCollector implements LateDataCollectorInter /** * @var TraceableAdapter[] */ - private array $instances = []; + private $instances = []; public function addInstance(string $name, TraceableAdapter $instance) { @@ -90,8 +90,10 @@ class CacheDataCollector extends DataCollector implements LateDataCollectorInter /** * Method returns all logged Cache call objects. + * + * @return mixed */ - public function getCalls(): mixed + public function getCalls() { return $this->data['instances']['calls']; } diff --git a/vendor/symfony/cache/DependencyInjection/CacheCollectorPass.php b/vendor/symfony/cache/DependencyInjection/CacheCollectorPass.php index 33b3b6ec..843232e4 100644 --- a/vendor/symfony/cache/DependencyInjection/CacheCollectorPass.php +++ b/vendor/symfony/cache/DependencyInjection/CacheCollectorPass.php @@ -26,16 +26,31 @@ use Symfony\Component\DependencyInjection\Reference; */ class CacheCollectorPass implements CompilerPassInterface { + private $dataCollectorCacheId; + private $cachePoolTag; + private $cachePoolRecorderInnerSuffix; + + public function __construct(string $dataCollectorCacheId = 'data_collector.cache', string $cachePoolTag = 'cache.pool', string $cachePoolRecorderInnerSuffix = '.recorder_inner') + { + if (0 < \func_num_args()) { + trigger_deprecation('symfony/cache', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); + } + + $this->dataCollectorCacheId = $dataCollectorCacheId; + $this->cachePoolTag = $cachePoolTag; + $this->cachePoolRecorderInnerSuffix = $cachePoolRecorderInnerSuffix; + } + /** * {@inheritdoc} */ public function process(ContainerBuilder $container) { - if (!$container->hasDefinition('data_collector.cache')) { + if (!$container->hasDefinition($this->dataCollectorCacheId)) { return; } - foreach ($container->findTaggedServiceIds('cache.pool') as $id => $attributes) { + foreach ($container->findTaggedServiceIds($this->cachePoolTag) as $id => $attributes) { $poolName = $attributes[0]['name'] ?? $id; $this->addToCollector($id, $poolName, $container); @@ -49,13 +64,13 @@ class CacheCollectorPass implements CompilerPassInterface return; } - $collectorDefinition = $container->getDefinition('data_collector.cache'); + $collectorDefinition = $container->getDefinition($this->dataCollectorCacheId); $recorder = new Definition(is_subclass_of($definition->getClass(), TagAwareAdapterInterface::class) ? TraceableTagAwareAdapter::class : TraceableAdapter::class); $recorder->setTags($definition->getTags()); if (!$definition->isPublic() || !$definition->isPrivate()) { $recorder->setPublic($definition->isPublic()); } - $recorder->setArguments([new Reference($innerId = $id.'.recorder_inner')]); + $recorder->setArguments([new Reference($innerId = $id.$this->cachePoolRecorderInnerSuffix)]); foreach ($definition->getMethodCalls() as [$method, $args]) { if ('setCallbackWrapper' !== $method || !$args[0] instanceof Definition || !($args[0]->getArguments()[2] ?? null) instanceof Definition) { diff --git a/vendor/symfony/cache/DependencyInjection/CachePoolClearerPass.php b/vendor/symfony/cache/DependencyInjection/CachePoolClearerPass.php index 76dd19d2..c9b04add 100644 --- a/vendor/symfony/cache/DependencyInjection/CachePoolClearerPass.php +++ b/vendor/symfony/cache/DependencyInjection/CachePoolClearerPass.php @@ -20,6 +20,17 @@ use Symfony\Component\DependencyInjection\Reference; */ class CachePoolClearerPass implements CompilerPassInterface { + private $cachePoolClearerTag; + + public function __construct(string $cachePoolClearerTag = 'cache.pool.clearer') + { + if (0 < \func_num_args()) { + trigger_deprecation('symfony/cache', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); + } + + $this->cachePoolClearerTag = $cachePoolClearerTag; + } + /** * {@inheritdoc} */ @@ -27,7 +38,7 @@ class CachePoolClearerPass implements CompilerPassInterface { $container->getParameterBag()->remove('cache.prefix.seed'); - foreach ($container->findTaggedServiceIds('cache.pool.clearer') as $id => $attr) { + foreach ($container->findTaggedServiceIds($this->cachePoolClearerTag) as $id => $attr) { $clearer = $container->getDefinition($id); $pools = []; foreach ($clearer->getArgument(0) as $name => $ref) { diff --git a/vendor/symfony/cache/DependencyInjection/CachePoolPass.php b/vendor/symfony/cache/DependencyInjection/CachePoolPass.php index e292e318..14ac2bde 100644 --- a/vendor/symfony/cache/DependencyInjection/CachePoolPass.php +++ b/vendor/symfony/cache/DependencyInjection/CachePoolPass.php @@ -29,6 +29,33 @@ use Symfony\Component\DependencyInjection\Reference; */ class CachePoolPass implements CompilerPassInterface { + private $cachePoolTag; + private $kernelResetTag; + private $cacheClearerId; + private $cachePoolClearerTag; + private $cacheSystemClearerId; + private $cacheSystemClearerTag; + private $reverseContainerId; + private $reversibleTag; + private $messageHandlerId; + + public function __construct(string $cachePoolTag = 'cache.pool', string $kernelResetTag = 'kernel.reset', string $cacheClearerId = 'cache.global_clearer', string $cachePoolClearerTag = 'cache.pool.clearer', string $cacheSystemClearerId = 'cache.system_clearer', string $cacheSystemClearerTag = 'kernel.cache_clearer', string $reverseContainerId = 'reverse_container', string $reversibleTag = 'container.reversible', string $messageHandlerId = 'cache.early_expiration_handler') + { + if (0 < \func_num_args()) { + trigger_deprecation('symfony/cache', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); + } + + $this->cachePoolTag = $cachePoolTag; + $this->kernelResetTag = $kernelResetTag; + $this->cacheClearerId = $cacheClearerId; + $this->cachePoolClearerTag = $cachePoolClearerTag; + $this->cacheSystemClearerId = $cacheSystemClearerId; + $this->cacheSystemClearerTag = $cacheSystemClearerTag; + $this->reverseContainerId = $reverseContainerId; + $this->reversibleTag = $reversibleTag; + $this->messageHandlerId = $messageHandlerId; + } + /** * {@inheritdoc} */ @@ -52,7 +79,7 @@ class CachePoolPass implements CompilerPassInterface 'early_expiration_message_bus', 'reset', ]; - foreach ($container->findTaggedServiceIds('cache.pool') as $id => $tags) { + foreach ($container->findTaggedServiceIds($this->cachePoolTag) as $id => $tags) { $adapter = $pool = $container->getDefinition($id); if ($pool->isAbstract()) { continue; @@ -61,7 +88,7 @@ class CachePoolPass implements CompilerPassInterface while ($adapter instanceof ChildDefinition) { $adapter = $container->findDefinition($adapter->getParent()); $class = $class ?: $adapter->getClass(); - if ($t = $adapter->getTag('cache.pool')) { + if ($t = $adapter->getTag($this->cachePoolTag)) { $tags[0] += $t[0]; } } @@ -103,7 +130,7 @@ class CachePoolPass implements CompilerPassInterface while ($adapter instanceof ChildDefinition) { $adapter = $container->findDefinition($adapter->getParent()); $chainedClass = $chainedClass ?: $adapter->getClass(); - if ($t = $adapter->getTag('cache.pool')) { + if ($t = $adapter->getTag($this->cachePoolTag)) { $chainedTags[0] += $t[0]; } } @@ -141,19 +168,19 @@ class CachePoolPass implements CompilerPassInterface // no-op } elseif ('reset' === $attr) { if ($tags[0][$attr]) { - $pool->addTag('kernel.reset', ['method' => $tags[0][$attr]]); + $pool->addTag($this->kernelResetTag, ['method' => $tags[0][$attr]]); } } elseif ('early_expiration_message_bus' === $attr) { $needsMessageHandler = true; $pool->addMethodCall('setCallbackWrapper', [(new Definition(EarlyExpirationDispatcher::class)) ->addArgument(new Reference($tags[0]['early_expiration_message_bus'])) - ->addArgument(new Reference('reverse_container')) + ->addArgument(new Reference($this->reverseContainerId)) ->addArgument((new Definition('callable')) ->setFactory([new Reference($id), 'setCallbackWrapper']) ->addArgument(null) ), ]); - $pool->addTag('container.reversible'); + $pool->addTag($this->reversibleTag); } elseif ('namespace' !== $attr || !\in_array($class, [ArrayAdapter::class, NullAdapter::class], true)) { $argument = $tags[0][$attr]; @@ -167,7 +194,7 @@ class CachePoolPass implements CompilerPassInterface unset($tags[0][$attr]); } if (!empty($tags[0])) { - throw new InvalidArgumentException(sprintf('Invalid "cache.pool" tag for service "%s": accepted attributes are "clearer", "provider", "name", "namespace", "default_lifetime", "early_expiration_message_bus" and "reset", found "%s".', $id, implode('", "', array_keys($tags[0])))); + throw new InvalidArgumentException(sprintf('Invalid "%s" tag for service "%s": accepted attributes are "clearer", "provider", "name", "namespace", "default_lifetime", "early_expiration_message_bus" and "reset", found "%s".', $this->cachePoolTag, $id, implode('", "', array_keys($tags[0])))); } if (null !== $clearer) { @@ -178,14 +205,14 @@ class CachePoolPass implements CompilerPassInterface } if (!$needsMessageHandler) { - $container->removeDefinition('cache.early_expiration_handler'); + $container->removeDefinition($this->messageHandlerId); } - $notAliasedCacheClearerId = $aliasedCacheClearerId = 'cache.global_clearer'; - while ($container->hasAlias('cache.global_clearer')) { - $aliasedCacheClearerId = (string) $container->getAlias('cache.global_clearer'); + $notAliasedCacheClearerId = $this->cacheClearerId; + while ($container->hasAlias($this->cacheClearerId)) { + $this->cacheClearerId = (string) $container->getAlias($this->cacheClearerId); } - if ($container->hasDefinition($aliasedCacheClearerId)) { + if ($container->hasDefinition($this->cacheClearerId)) { $clearers[$notAliasedCacheClearerId] = $allPools; } @@ -196,10 +223,10 @@ class CachePoolPass implements CompilerPassInterface } else { $clearer->setArgument(0, $pools); } - $clearer->addTag('cache.pool.clearer'); + $clearer->addTag($this->cachePoolClearerTag); - if ('cache.system_clearer' === $id) { - $clearer->addTag('kernel.cache_clearer'); + if ($this->cacheSystemClearerId === $id) { + $clearer->addTag($this->cacheSystemClearerTag); } } diff --git a/vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.php b/vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.php index 3bbc4b84..86a1906a 100644 --- a/vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.php +++ b/vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.php @@ -23,18 +23,31 @@ use Symfony\Component\DependencyInjection\Reference; */ class CachePoolPrunerPass implements CompilerPassInterface { + private $cacheCommandServiceId; + private $cachePoolTag; + + public function __construct(string $cacheCommandServiceId = 'console.command.cache_pool_prune', string $cachePoolTag = 'cache.pool') + { + if (0 < \func_num_args()) { + trigger_deprecation('symfony/cache', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); + } + + $this->cacheCommandServiceId = $cacheCommandServiceId; + $this->cachePoolTag = $cachePoolTag; + } + /** * {@inheritdoc} */ public function process(ContainerBuilder $container) { - if (!$container->hasDefinition('console.command.cache_pool_prune')) { + if (!$container->hasDefinition($this->cacheCommandServiceId)) { return; } $services = []; - foreach ($container->findTaggedServiceIds('cache.pool') as $id => $tags) { + foreach ($container->findTaggedServiceIds($this->cachePoolTag) as $id => $tags) { $class = $container->getParameterBag()->resolveValue($container->getDefinition($id)->getClass()); if (!$reflection = $container->getReflectionClass($class)) { @@ -46,6 +59,6 @@ class CachePoolPrunerPass implements CompilerPassInterface } } - $container->getDefinition('console.command.cache_pool_prune')->replaceArgument(0, new IteratorArgument($services)); + $container->getDefinition($this->cacheCommandServiceId)->replaceArgument(0, new IteratorArgument($services)); } } diff --git a/vendor/symfony/cache/DoctrineProvider.php b/vendor/symfony/cache/DoctrineProvider.php new file mode 100644 index 00000000..7b55aae2 --- /dev/null +++ b/vendor/symfony/cache/DoctrineProvider.php @@ -0,0 +1,124 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache; + +use Doctrine\Common\Cache\CacheProvider; +use Psr\Cache\CacheItemPoolInterface; +use Symfony\Contracts\Service\ResetInterface; + +if (!class_exists(CacheProvider::class)) { + return; +} + +/** + * @author Nicolas Grekas + * + * @deprecated Use Doctrine\Common\Cache\Psr6\DoctrineProvider instead + */ +class DoctrineProvider extends CacheProvider implements PruneableInterface, ResettableInterface +{ + private $pool; + + public function __construct(CacheItemPoolInterface $pool) + { + trigger_deprecation('symfony/cache', '5.4', '"%s" is deprecated, use "Doctrine\Common\Cache\Psr6\DoctrineProvider" instead.', __CLASS__); + + $this->pool = $pool; + } + + /** + * {@inheritdoc} + */ + public function prune() + { + return $this->pool instanceof PruneableInterface && $this->pool->prune(); + } + + /** + * {@inheritdoc} + */ + public function reset() + { + if ($this->pool instanceof ResetInterface) { + $this->pool->reset(); + } + $this->setNamespace($this->getNamespace()); + } + + /** + * {@inheritdoc} + * + * @return mixed + */ + protected function doFetch($id) + { + $item = $this->pool->getItem(rawurlencode($id)); + + return $item->isHit() ? $item->get() : false; + } + + /** + * {@inheritdoc} + * + * @return bool + */ + protected function doContains($id) + { + return $this->pool->hasItem(rawurlencode($id)); + } + + /** + * {@inheritdoc} + * + * @return bool + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $item = $this->pool->getItem(rawurlencode($id)); + + if (0 < $lifeTime) { + $item->expiresAfter($lifeTime); + } + + return $this->pool->save($item->set($data)); + } + + /** + * {@inheritdoc} + * + * @return bool + */ + protected function doDelete($id) + { + return $this->pool->deleteItem(rawurlencode($id)); + } + + /** + * {@inheritdoc} + * + * @return bool + */ + protected function doFlush() + { + return $this->pool->clear(); + } + + /** + * {@inheritdoc} + * + * @return array|null + */ + protected function doGetStats() + { + return null; + } +} diff --git a/vendor/symfony/cache/LockRegistry.php b/vendor/symfony/cache/LockRegistry.php index c263a1c5..65f20bb7 100644 --- a/vendor/symfony/cache/LockRegistry.php +++ b/vendor/symfony/cache/LockRegistry.php @@ -43,6 +43,7 @@ final class LockRegistry __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ChainAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'CouchbaseBucketAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'CouchbaseCollectionAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'DoctrineAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'DoctrineDbalAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'FilesystemAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'FilesystemTagAwareAdapter.php', @@ -96,8 +97,8 @@ final class LockRegistry return $callback($item, $save); } - self::$signalingException ??= unserialize("O:9:\"Exception\":1:{s:16:\"\0Exception\0trace\";a:0:{}}"); - self::$signalingCallback ??= function () { throw self::$signalingException; }; + self::$signalingException ?? self::$signalingException = unserialize("O:9:\"Exception\":1:{s:16:\"\0Exception\0trace\";a:0:{}}"); + self::$signalingCallback ?? self::$signalingCallback = function () { throw self::$signalingException; }; while (true) { try { @@ -106,7 +107,7 @@ final class LockRegistry $locked = flock($lock, \LOCK_EX | \LOCK_NB, $wouldBlock); if ($locked || !$wouldBlock) { - $logger?->info(sprintf('Lock %s, now computing item "{key}"', $locked ? 'acquired' : 'not supported'), ['key' => $item->getKey()]); + $logger && $logger->info(sprintf('Lock %s, now computing item "{key}"', $locked ? 'acquired' : 'not supported'), ['key' => $item->getKey()]); self::$lockedFiles[$key] = true; $value = $callback($item, $save); @@ -123,7 +124,7 @@ final class LockRegistry return $value; } // if we failed the race, retry locking in blocking mode to wait for the winner - $logger?->info('Item "{key}" is locked, waiting for it to be released', ['key' => $item->getKey()]); + $logger && $logger->info('Item "{key}" is locked, waiting for it to be released', ['key' => $item->getKey()]); flock($lock, \LOCK_SH); } finally { flock($lock, \LOCK_UN); @@ -132,7 +133,7 @@ final class LockRegistry try { $value = $pool->get($item->getKey(), self::$signalingCallback, 0); - $logger?->info('Item "{key}" retrieved after lock was released', ['key' => $item->getKey()]); + $logger && $logger->info('Item "{key}" retrieved after lock was released', ['key' => $item->getKey()]); $save = false; return $value; @@ -140,7 +141,7 @@ final class LockRegistry if (self::$signalingException !== $e) { throw $e; } - $logger?->info('Item "{key}" not found while lock was released, now retrying', ['key' => $item->getKey()]); + $logger && $logger->info('Item "{key}" not found while lock was released, now retrying', ['key' => $item->getKey()]); } } diff --git a/vendor/symfony/cache/Marshaller/DefaultMarshaller.php b/vendor/symfony/cache/Marshaller/DefaultMarshaller.php index 5c34fb2e..3202dd69 100644 --- a/vendor/symfony/cache/Marshaller/DefaultMarshaller.php +++ b/vendor/symfony/cache/Marshaller/DefaultMarshaller.php @@ -20,15 +20,15 @@ use Symfony\Component\Cache\Exception\CacheException; */ class DefaultMarshaller implements MarshallerInterface { - private bool $useIgbinarySerialize = true; - private bool $throwOnSerializationFailure = false; + private $useIgbinarySerialize = true; + private $throwOnSerializationFailure; public function __construct(bool $useIgbinarySerialize = null, bool $throwOnSerializationFailure = false) { if (null === $useIgbinarySerialize) { - $useIgbinarySerialize = \extension_loaded('igbinary') && version_compare('3.1.6', phpversion('igbinary'), '<='); - } elseif ($useIgbinarySerialize && (!\extension_loaded('igbinary') || version_compare('3.1.6', phpversion('igbinary'), '>'))) { - throw new CacheException(\extension_loaded('igbinary') ? 'Please upgrade the "igbinary" PHP extension to v3.1.6 or higher.' : 'The "igbinary" PHP extension is not loaded.'); + $useIgbinarySerialize = \extension_loaded('igbinary') && (\PHP_VERSION_ID < 70400 || version_compare('3.1.6', phpversion('igbinary'), '<=')); + } elseif ($useIgbinarySerialize && (!\extension_loaded('igbinary') || (\PHP_VERSION_ID >= 70400 && version_compare('3.1.6', phpversion('igbinary'), '>')))) { + throw new CacheException(\extension_loaded('igbinary') && \PHP_VERSION_ID >= 70400 ? 'Please upgrade the "igbinary" PHP extension to v3.1.6 or higher.' : 'The "igbinary" PHP extension is not loaded.'); } $this->useIgbinarySerialize = $useIgbinarySerialize; $this->throwOnSerializationFailure = $throwOnSerializationFailure; @@ -62,7 +62,7 @@ class DefaultMarshaller implements MarshallerInterface /** * {@inheritdoc} */ - public function unmarshall(string $value): mixed + public function unmarshall(string $value) { if ('b:0;' === $value) { return false; @@ -71,7 +71,7 @@ class DefaultMarshaller implements MarshallerInterface return null; } static $igbinaryNull; - if ($value === $igbinaryNull ??= \extension_loaded('igbinary') ? igbinary_serialize(null) : false) { + if ($value === ($igbinaryNull ?? $igbinaryNull = \extension_loaded('igbinary') ? igbinary_serialize(null) : false)) { return null; } $unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback'); diff --git a/vendor/symfony/cache/Marshaller/DeflateMarshaller.php b/vendor/symfony/cache/Marshaller/DeflateMarshaller.php index 95e3d320..55448061 100644 --- a/vendor/symfony/cache/Marshaller/DeflateMarshaller.php +++ b/vendor/symfony/cache/Marshaller/DeflateMarshaller.php @@ -20,7 +20,7 @@ use Symfony\Component\Cache\Exception\CacheException; */ class DeflateMarshaller implements MarshallerInterface { - private MarshallerInterface $marshaller; + private $marshaller; public function __construct(MarshallerInterface $marshaller) { @@ -42,7 +42,7 @@ class DeflateMarshaller implements MarshallerInterface /** * {@inheritdoc} */ - public function unmarshall(string $value): mixed + public function unmarshall(string $value) { if (false !== $inflatedValue = @gzinflate($value)) { $value = $inflatedValue; diff --git a/vendor/symfony/cache/Marshaller/MarshallerInterface.php b/vendor/symfony/cache/Marshaller/MarshallerInterface.php index 5b81aad2..cdd6c402 100644 --- a/vendor/symfony/cache/Marshaller/MarshallerInterface.php +++ b/vendor/symfony/cache/Marshaller/MarshallerInterface.php @@ -32,7 +32,9 @@ interface MarshallerInterface /** * Unserializes a single value and throws an exception if anything goes wrong. * + * @return mixed + * * @throws \Exception Whenever unserialization fails */ - public function unmarshall(string $value): mixed; + public function unmarshall(string $value); } diff --git a/vendor/symfony/cache/Marshaller/SodiumMarshaller.php b/vendor/symfony/cache/Marshaller/SodiumMarshaller.php index 4d8a04ee..dbf486a7 100644 --- a/vendor/symfony/cache/Marshaller/SodiumMarshaller.php +++ b/vendor/symfony/cache/Marshaller/SodiumMarshaller.php @@ -21,8 +21,8 @@ use Symfony\Component\Cache\Exception\InvalidArgumentException; */ class SodiumMarshaller implements MarshallerInterface { - private MarshallerInterface $marshaller; - private array $decryptionKeys; + private $marshaller; + private $decryptionKeys; /** * @param string[] $decryptionKeys The key at index "0" is required and is used to decrypt and encrypt values; @@ -66,7 +66,7 @@ class SodiumMarshaller implements MarshallerInterface /** * {@inheritdoc} */ - public function unmarshall(string $value): mixed + public function unmarshall(string $value) { foreach ($this->decryptionKeys as $k) { if (false !== $decryptedValue = @sodium_crypto_box_seal_open($value, $k)) { diff --git a/vendor/symfony/cache/Marshaller/TagAwareMarshaller.php b/vendor/symfony/cache/Marshaller/TagAwareMarshaller.php index 576ccc11..f7eeb783 100644 --- a/vendor/symfony/cache/Marshaller/TagAwareMarshaller.php +++ b/vendor/symfony/cache/Marshaller/TagAwareMarshaller.php @@ -18,7 +18,7 @@ namespace Symfony\Component\Cache\Marshaller; */ class TagAwareMarshaller implements MarshallerInterface { - private MarshallerInterface $marshaller; + private $marshaller; public function __construct(MarshallerInterface $marshaller = null) { @@ -67,7 +67,7 @@ class TagAwareMarshaller implements MarshallerInterface /** * {@inheritdoc} */ - public function unmarshall(string $value): mixed + public function unmarshall(string $value) { // detect the compact format used in marshall() using magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F if (13 >= \strlen($value) || "\x9D" !== $value[0] || "\0" !== $value[5] || "\x5F" !== $value[9]) { diff --git a/vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php b/vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php index 9b94c4f1..6f11b8b5 100644 --- a/vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php +++ b/vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php @@ -23,22 +23,22 @@ use Symfony\Component\Messenger\Stamp\HandledStamp; */ class EarlyExpirationDispatcher { - private MessageBusInterface $bus; - private ReverseContainer $reverseContainer; - private ?\Closure $callbackWrapper; + private $bus; + private $reverseContainer; + private $callbackWrapper; public function __construct(MessageBusInterface $bus, ReverseContainer $reverseContainer, callable $callbackWrapper = null) { $this->bus = $bus; $this->reverseContainer = $reverseContainer; - $this->callbackWrapper = null === $callbackWrapper ? null : $callbackWrapper(...); + $this->callbackWrapper = $callbackWrapper; } public function __invoke(callable $callback, CacheItem $item, bool &$save, AdapterInterface $pool, \Closure $setMetadata, LoggerInterface $logger = null) { if (!$item->isHit() || null === $message = EarlyExpirationMessage::create($this->reverseContainer, $callback, $item, $pool)) { // The item is stale or the callback cannot be reversed: we must compute the value now - $logger?->info('Computing item "{key}" online: '.($item->isHit() ? 'callback cannot be reversed' : 'item is stale'), ['key' => $item->getKey()]); + $logger && $logger->info('Computing item "{key}" online: '.($item->isHit() ? 'callback cannot be reversed' : 'item is stale'), ['key' => $item->getKey()]); return null !== $this->callbackWrapper ? ($this->callbackWrapper)($callback, $item, $save, $pool, $setMetadata, $logger) : $callback($item, $save); } diff --git a/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php b/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php index 9d2aaecc..1f0bd565 100644 --- a/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php +++ b/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php @@ -20,8 +20,8 @@ use Symfony\Component\Messenger\Handler\MessageHandlerInterface; */ class EarlyExpirationHandler implements MessageHandlerInterface { - private ReverseContainer $reverseContainer; - private array $processedNonces = []; + private $reverseContainer; + private $processedNonces = []; public function __construct(ReverseContainer $reverseContainer) { @@ -59,7 +59,7 @@ class EarlyExpirationHandler implements MessageHandlerInterface static $setMetadata; - $setMetadata ??= \Closure::bind( + $setMetadata ?? $setMetadata = \Closure::bind( function (CacheItem $item, float $startTime) { if ($item->expiry > $endTime = microtime(true)) { $item->newMetadata[CacheItem::METADATA_EXPIRY] = $item->expiry; diff --git a/vendor/symfony/cache/Messenger/EarlyExpirationMessage.php b/vendor/symfony/cache/Messenger/EarlyExpirationMessage.php index 6056ebab..e25c07e9 100644 --- a/vendor/symfony/cache/Messenger/EarlyExpirationMessage.php +++ b/vendor/symfony/cache/Messenger/EarlyExpirationMessage.php @@ -20,16 +20,16 @@ use Symfony\Component\DependencyInjection\ReverseContainer; */ final class EarlyExpirationMessage { - private CacheItem $item; - private string $pool; - private string|array $callback; + private $item; + private $pool; + private $callback; public static function create(ReverseContainer $reverseContainer, callable $callback, CacheItem $item, AdapterInterface $pool): ?self { try { $item = clone $item; $item->set(null); - } catch (\Exception) { + } catch (\Exception $e) { return null; } @@ -66,10 +66,7 @@ final class EarlyExpirationMessage return $this->pool; } - /** - * @return string|string[] - */ - public function getCallback(): string|array + public function getCallback() { return $this->callback; } @@ -91,7 +88,7 @@ final class EarlyExpirationMessage return $callback; } - private function __construct(CacheItem $item, string $pool, string|array $callback) + private function __construct(CacheItem $item, string $pool, $callback) { $this->item = $item; $this->pool = $pool; diff --git a/vendor/symfony/cache/PruneableInterface.php b/vendor/symfony/cache/PruneableInterface.php index 3095c80f..42615253 100644 --- a/vendor/symfony/cache/PruneableInterface.php +++ b/vendor/symfony/cache/PruneableInterface.php @@ -16,5 +16,8 @@ namespace Symfony\Component\Cache; */ interface PruneableInterface { - public function prune(): bool; + /** + * @return bool + */ + public function prune(); } diff --git a/vendor/symfony/cache/Psr16Cache.php b/vendor/symfony/cache/Psr16Cache.php index e36646ef..28c7de60 100644 --- a/vendor/symfony/cache/Psr16Cache.php +++ b/vendor/symfony/cache/Psr16Cache.php @@ -19,6 +19,10 @@ use Symfony\Component\Cache\Adapter\AdapterInterface; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\Traits\ProxyTrait; +if (null !== (new \ReflectionMethod(CacheInterface::class, 'get'))->getReturnType()) { + throw new \LogicException('psr/simple-cache 3.0+ is not compatible with this version of symfony/cache. Please upgrade symfony/cache to 6.0+ or downgrade psr/simple-cache to 1.x or 2.x.'); +} + /** * Turns a PSR-6 cache into a PSR-16 one. * @@ -28,9 +32,10 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf { use ProxyTrait; - private ?\Closure $createCacheItem = null; - private ?CacheItem $cacheItemPrototype = null; - private static \Closure $packCacheItem; + private const METADATA_EXPIRY_OFFSET = 1527506807; + + private $createCacheItem; + private $cacheItemPrototype; public function __construct(CacheItemPoolInterface $pool) { @@ -66,21 +71,14 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf return $createCacheItem($key, null, $allowInt)->set($value); }; - self::$packCacheItem ??= \Closure::bind( - static function (CacheItem $item) { - $item->newMetadata = $item->metadata; - - return $item->pack(); - }, - null, - CacheItem::class - ); } /** * {@inheritdoc} + * + * @return mixed */ - public function get($key, $default = null): mixed + public function get($key, $default = null) { try { $item = $this->pool->getItem($key); @@ -99,8 +97,10 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf /** * {@inheritdoc} + * + * @return bool */ - public function set($key, $value, $ttl = null): bool + public function set($key, $value, $ttl = null) { try { if (null !== $f = $this->createCacheItem) { @@ -122,8 +122,10 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf /** * {@inheritdoc} + * + * @return bool */ - public function delete($key): bool + public function delete($key) { try { return $this->pool->deleteItem($key); @@ -136,16 +138,20 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf /** * {@inheritdoc} + * + * @return bool */ - public function clear(): bool + public function clear() { return $this->pool->clear(); } /** * {@inheritdoc} + * + * @return iterable */ - public function getMultiple($keys, $default = null): iterable + public function getMultiple($keys, $default = null) { if ($keys instanceof \Traversable) { $keys = iterator_to_array($keys, false); @@ -171,7 +177,20 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf } foreach ($items as $key => $item) { - $values[$key] = $item->isHit() ? (self::$packCacheItem)($item) : $default; + if (!$item->isHit()) { + $values[$key] = $default; + continue; + } + $values[$key] = $item->get(); + + if (!$metadata = $item->getMetadata()) { + continue; + } + unset($metadata[CacheItem::METADATA_TAGS]); + + if ($metadata) { + $values[$key] = ["\x9D".pack('VN', (int) (0.1 + $metadata[CacheItem::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[CacheItem::METADATA_CTIME])."\x5F" => $values[$key]]; + } } return $values; @@ -179,8 +198,10 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf /** * {@inheritdoc} + * + * @return bool */ - public function setMultiple($values, $ttl = null): bool + public function setMultiple($values, $ttl = null) { $valuesIsArray = \is_array($values); if (!$valuesIsArray && !$values instanceof \Traversable) { @@ -230,8 +251,10 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf /** * {@inheritdoc} + * + * @return bool */ - public function deleteMultiple($keys): bool + public function deleteMultiple($keys) { if ($keys instanceof \Traversable) { $keys = iterator_to_array($keys, false); @@ -250,8 +273,10 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf /** * {@inheritdoc} + * + * @return bool */ - public function has($key): bool + public function has($key) { try { return $this->pool->hasItem($key); diff --git a/vendor/symfony/cache/Traits/AbstractAdapterTrait.php b/vendor/symfony/cache/Traits/AbstractAdapterTrait.php index 9bddc458..a6814b5f 100644 --- a/vendor/symfony/cache/Traits/AbstractAdapterTrait.php +++ b/vendor/symfony/cache/Traits/AbstractAdapterTrait.php @@ -26,21 +26,21 @@ trait AbstractAdapterTrait use LoggerAwareTrait; /** - * needs to be set by class, signature is function(string , mixed , bool ). + * @var \Closure needs to be set by class, signature is function(string , mixed , bool ) */ - private static \Closure $createCacheItem; + private static $createCacheItem; /** - * needs to be set by class, signature is function(array , string , array <&expiredIds>). + * @var \Closure needs to be set by class, signature is function(array , string , array <&expiredIds>) */ - private static \Closure $mergeByLifetime; + private static $mergeByLifetime; - private string $namespace = ''; - private int $defaultLifetime; - private string $namespaceVersion = ''; - private bool $versioningIsEnabled = false; - private array $deferred = []; - private array $ids = []; + private $namespace = ''; + private $defaultLifetime; + private $namespaceVersion = ''; + private $versioningIsEnabled = false; + private $deferred = []; + private $ids = []; /** * @var int|null The maximum length to enforce for identifiers or null when no limit applies @@ -54,28 +54,34 @@ trait AbstractAdapterTrait * * @return array|\Traversable */ - abstract protected function doFetch(array $ids): iterable; + abstract protected function doFetch(array $ids); /** * Confirms if the cache contains specified cache item. * * @param string $id The identifier for which to check existence + * + * @return bool */ - abstract protected function doHave(string $id): bool; + abstract protected function doHave(string $id); /** * Deletes all items in the pool. * * @param string $namespace The prefix used for all identifiers managed by this pool + * + * @return bool */ - abstract protected function doClear(string $namespace): bool; + abstract protected function doClear(string $namespace); /** * Removes multiple items from the pool. * * @param array $ids An array of identifiers that should be removed from the pool + * + * @return bool */ - abstract protected function doDelete(array $ids): bool; + abstract protected function doDelete(array $ids); /** * Persists several cache items immediately. @@ -85,12 +91,14 @@ trait AbstractAdapterTrait * * @return array|bool The identifiers that failed to be cached or a boolean stating if caching succeeded or not */ - abstract protected function doSave(array $values, int $lifetime): array|bool; + abstract protected function doSave(array $values, int $lifetime); /** * {@inheritdoc} + * + * @return bool */ - public function hasItem(mixed $key): bool + public function hasItem($key) { $id = $this->getId($key); @@ -109,8 +117,10 @@ trait AbstractAdapterTrait /** * {@inheritdoc} + * + * @return bool */ - public function clear(string $prefix = ''): bool + public function clear(string $prefix = '') { $this->deferred = []; if ($cleared = $this->versioningIsEnabled) { @@ -148,16 +158,20 @@ trait AbstractAdapterTrait /** * {@inheritdoc} + * + * @return bool */ - public function deleteItem(mixed $key): bool + public function deleteItem($key) { return $this->deleteItems([$key]); } /** * {@inheritdoc} + * + * @return bool */ - public function deleteItems(array $keys): bool + public function deleteItems(array $keys) { $ids = []; @@ -170,7 +184,7 @@ trait AbstractAdapterTrait if ($this->doDelete($ids)) { return true; } - } catch (\Exception) { + } catch (\Exception $e) { } $ok = true; @@ -195,7 +209,7 @@ trait AbstractAdapterTrait /** * {@inheritdoc} */ - public function getItem(mixed $key): CacheItem + public function getItem($key) { $id = $this->getId($key); @@ -222,7 +236,7 @@ trait AbstractAdapterTrait /** * {@inheritdoc} */ - public function getItems(array $keys = []): iterable + public function getItems(array $keys = []) { $ids = []; $commit = false; @@ -249,8 +263,10 @@ trait AbstractAdapterTrait /** * {@inheritdoc} + * + * @return bool */ - public function save(CacheItemInterface $item): bool + public function save(CacheItemInterface $item) { if (!$item instanceof CacheItem) { return false; @@ -262,8 +278,10 @@ trait AbstractAdapterTrait /** * {@inheritdoc} + * + * @return bool */ - public function saveDeferred(CacheItemInterface $item): bool + public function saveDeferred(CacheItemInterface $item) { if (!$item instanceof CacheItem) { return false; @@ -283,7 +301,7 @@ trait AbstractAdapterTrait * * @return bool the previous state of versioning */ - public function enableVersioning(bool $enable = true): bool + public function enableVersioning(bool $enable = true) { $wasEnabled = $this->versioningIsEnabled; $this->versioningIsEnabled = $enable; @@ -305,7 +323,10 @@ trait AbstractAdapterTrait $this->ids = []; } - public function __sleep(): array + /** + * @return array + */ + public function __sleep() { throw new \BadMethodCallException('Cannot serialize '.__CLASS__); } @@ -344,7 +365,7 @@ trait AbstractAdapterTrait } } - private function getId(mixed $key) + private function getId($key) { if ($this->versioningIsEnabled && '' === $this->namespaceVersion) { $this->ids = []; diff --git a/vendor/symfony/cache/Traits/ContractsTrait.php b/vendor/symfony/cache/Traits/ContractsTrait.php index a8e347a3..9a491adb 100644 --- a/vendor/symfony/cache/Traits/ContractsTrait.php +++ b/vendor/symfony/cache/Traits/ContractsTrait.php @@ -31,8 +31,8 @@ trait ContractsTrait doGet as private contractsGet; } - private \Closure $callbackWrapper; - private array $computing = []; + private $callbackWrapper; + private $computing = []; /** * Wraps the callback passed to ->get() in a callable. @@ -42,17 +42,13 @@ trait ContractsTrait public function setCallbackWrapper(?callable $callbackWrapper): callable { if (!isset($this->callbackWrapper)) { - $this->callbackWrapper = LockRegistry::compute(...); + $this->callbackWrapper = \Closure::fromCallable([LockRegistry::class, 'compute']); if (\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true)) { $this->setCallbackWrapper(null); } } - if (null !== $callbackWrapper && !$callbackWrapper instanceof \Closure) { - $callbackWrapper = $callbackWrapper(...); - } - $previousWrapper = $this->callbackWrapper; $this->callbackWrapper = $callbackWrapper ?? static function (callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, \Closure $setMetadata, ?LoggerInterface $logger) { return $callback($item, $save); @@ -63,27 +59,25 @@ trait ContractsTrait private function doGet(AdapterInterface $pool, string $key, callable $callback, ?float $beta, array &$metadata = null) { - if (0 > $beta ??= 1.0) { + if (0 > $beta = $beta ?? 1.0) { throw new InvalidArgumentException(sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', static::class, $beta)); } static $setMetadata; - $setMetadata ??= \Closure::bind( + $setMetadata ?? $setMetadata = \Closure::bind( static function (CacheItem $item, float $startTime, ?array &$metadata) { if ($item->expiry > $endTime = microtime(true)) { $item->newMetadata[CacheItem::METADATA_EXPIRY] = $metadata[CacheItem::METADATA_EXPIRY] = $item->expiry; $item->newMetadata[CacheItem::METADATA_CTIME] = $metadata[CacheItem::METADATA_CTIME] = (int) ceil(1000 * ($endTime - $startTime)); } else { - unset($metadata[CacheItem::METADATA_EXPIRY], $metadata[CacheItem::METADATA_CTIME], $metadata[CacheItem::METADATA_TAGS]); + unset($metadata[CacheItem::METADATA_EXPIRY], $metadata[CacheItem::METADATA_CTIME]); } }, null, CacheItem::class ); - $this->callbackWrapper ??= LockRegistry::compute(...); - return $this->contractsGet($pool, $key, function (CacheItem $item, bool &$save) use ($pool, $callback, $setMetadata, &$metadata, $key) { // don't wrap nor save recursive calls if (isset($this->computing[$key])) { diff --git a/vendor/symfony/cache/Traits/FilesystemCommonTrait.php b/vendor/symfony/cache/Traits/FilesystemCommonTrait.php index 8e30a552..c06cc309 100644 --- a/vendor/symfony/cache/Traits/FilesystemCommonTrait.php +++ b/vendor/symfony/cache/Traits/FilesystemCommonTrait.php @@ -20,8 +20,8 @@ use Symfony\Component\Cache\Exception\InvalidArgumentException; */ trait FilesystemCommonTrait { - private string $directory; - private string $tmp; + private $directory; + private $tmp; private function init(string $namespace, ?string $directory) { @@ -53,7 +53,7 @@ trait FilesystemCommonTrait /** * {@inheritdoc} */ - protected function doClear(string $namespace): bool + protected function doClear(string $namespace) { $ok = true; @@ -71,7 +71,7 @@ trait FilesystemCommonTrait /** * {@inheritdoc} */ - protected function doDelete(array $ids): bool + protected function doDelete(array $ids) { $ok = true; @@ -92,7 +92,7 @@ trait FilesystemCommonTrait { set_error_handler(__CLASS__.'::throwError'); try { - if (!isset($this->tmp)) { + if (null === $this->tmp) { $this->tmp = $this->directory.bin2hex(random_bytes(6)); } try { @@ -171,7 +171,10 @@ trait FilesystemCommonTrait throw new \ErrorException($message, 0, $type, $file, $line); } - public function __sleep(): array + /** + * @return array + */ + public function __sleep() { throw new \BadMethodCallException('Cannot serialize '.__CLASS__); } @@ -186,7 +189,7 @@ trait FilesystemCommonTrait if (method_exists(parent::class, '__destruct')) { parent::__destruct(); } - if (isset($this->tmp) && is_file($this->tmp)) { + if (null !== $this->tmp && is_file($this->tmp)) { unlink($this->tmp); } } diff --git a/vendor/symfony/cache/Traits/FilesystemTrait.php b/vendor/symfony/cache/Traits/FilesystemTrait.php index 05ad8ed6..38b741f1 100644 --- a/vendor/symfony/cache/Traits/FilesystemTrait.php +++ b/vendor/symfony/cache/Traits/FilesystemTrait.php @@ -12,7 +12,6 @@ namespace Symfony\Component\Cache\Traits; use Symfony\Component\Cache\Exception\CacheException; -use Symfony\Component\Cache\Marshaller\MarshallerInterface; /** * @author Nicolas Grekas @@ -24,9 +23,12 @@ trait FilesystemTrait { use FilesystemCommonTrait; - private MarshallerInterface $marshaller; + private $marshaller; - public function prune(): bool + /** + * @return bool + */ + public function prune() { $time = time(); $pruned = true; @@ -50,7 +52,7 @@ trait FilesystemTrait /** * {@inheritdoc} */ - protected function doFetch(array $ids): iterable + protected function doFetch(array $ids) { $values = []; $now = time(); @@ -79,7 +81,7 @@ trait FilesystemTrait /** * {@inheritdoc} */ - protected function doHave(string $id): bool + protected function doHave(string $id) { $file = $this->getFile($id); @@ -89,7 +91,7 @@ trait FilesystemTrait /** * {@inheritdoc} */ - protected function doSave(array $values, int $lifetime): array|bool + protected function doSave(array $values, int $lifetime) { $expiresAt = $lifetime ? (time() + $lifetime) : 0; $values = $this->marshaller->marshall($values, $failed); diff --git a/vendor/symfony/cache/Traits/ProxyTrait.php b/vendor/symfony/cache/Traits/ProxyTrait.php index ba6f8cba..c86f360a 100644 --- a/vendor/symfony/cache/Traits/ProxyTrait.php +++ b/vendor/symfony/cache/Traits/ProxyTrait.php @@ -21,12 +21,12 @@ use Symfony\Contracts\Service\ResetInterface; */ trait ProxyTrait { - private object $pool; + private $pool; /** * {@inheritdoc} */ - public function prune(): bool + public function prune() { return $this->pool instanceof PruneableInterface && $this->pool->prune(); } diff --git a/vendor/symfony/cache/Traits/RedisClusterNodeProxy.php b/vendor/symfony/cache/Traits/RedisClusterNodeProxy.php index afcfb3a1..deba74f6 100644 --- a/vendor/symfony/cache/Traits/RedisClusterNodeProxy.php +++ b/vendor/symfony/cache/Traits/RedisClusterNodeProxy.php @@ -24,10 +24,13 @@ namespace Symfony\Component\Cache\Traits; */ class RedisClusterNodeProxy { - private array $host; - private \RedisCluster|RedisClusterProxy $redis; + private $host; + private $redis; - public function __construct(array $host, \RedisCluster|RedisClusterProxy $redis) + /** + * @param \RedisCluster|RedisClusterProxy $redis + */ + public function __construct(array $host, $redis) { $this->host = $host; $this->redis = $redis; diff --git a/vendor/symfony/cache/Traits/RedisClusterProxy.php b/vendor/symfony/cache/Traits/RedisClusterProxy.php index b4b750cf..73c6a4fd 100644 --- a/vendor/symfony/cache/Traits/RedisClusterProxy.php +++ b/vendor/symfony/cache/Traits/RedisClusterProxy.php @@ -18,8 +18,8 @@ namespace Symfony\Component\Cache\Traits; */ class RedisClusterProxy { - private \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy $redis; - private \Closure $initializer; + private $redis; + private $initializer; public function __construct(\Closure $initializer) { @@ -28,35 +28,35 @@ class RedisClusterProxy public function __call(string $method, array $args) { - $this->redis ??= ($this->initializer)(); + $this->redis ?: $this->redis = $this->initializer->__invoke(); return $this->redis->{$method}(...$args); } public function hscan($strKey, &$iIterator, $strPattern = null, $iCount = null) { - $this->redis ??= ($this->initializer)(); + $this->redis ?: $this->redis = $this->initializer->__invoke(); return $this->redis->hscan($strKey, $iIterator, $strPattern, $iCount); } public function scan(&$iIterator, $strPattern = null, $iCount = null) { - $this->redis ??= ($this->initializer)(); + $this->redis ?: $this->redis = $this->initializer->__invoke(); return $this->redis->scan($iIterator, $strPattern, $iCount); } public function sscan($strKey, &$iIterator, $strPattern = null, $iCount = null) { - $this->redis ??= ($this->initializer)(); + $this->redis ?: $this->redis = $this->initializer->__invoke(); return $this->redis->sscan($strKey, $iIterator, $strPattern, $iCount); } public function zscan($strKey, &$iIterator, $strPattern = null, $iCount = null) { - $this->redis ??= ($this->initializer)(); + $this->redis ?: $this->redis = $this->initializer->__invoke(); return $this->redis->zscan($strKey, $iIterator, $strPattern, $iCount); } diff --git a/vendor/symfony/cache/Traits/RedisProxy.php b/vendor/symfony/cache/Traits/RedisProxy.php index a477dc87..ec5cfabb 100644 --- a/vendor/symfony/cache/Traits/RedisProxy.php +++ b/vendor/symfony/cache/Traits/RedisProxy.php @@ -18,9 +18,9 @@ namespace Symfony\Component\Cache\Traits; */ class RedisProxy { - private \Redis $redis; - private \Closure $initializer; - private bool $ready = false; + private $redis; + private $initializer; + private $ready = false; public function __construct(\Redis $redis, \Closure $initializer) { diff --git a/vendor/symfony/cache/Traits/RedisTrait.php b/vendor/symfony/cache/Traits/RedisTrait.php index c745deb6..accee44b 100644 --- a/vendor/symfony/cache/Traits/RedisTrait.php +++ b/vendor/symfony/cache/Traits/RedisTrait.php @@ -30,7 +30,7 @@ use Symfony\Component\Cache\Marshaller\MarshallerInterface; */ trait RedisTrait { - private static array $defaultConnectionOptions = [ + private static $defaultConnectionOptions = [ 'class' => null, 'persistent' => 0, 'persistent_id' => null, @@ -45,10 +45,13 @@ trait RedisTrait 'failover' => 'none', 'ssl' => null, // see https://php.net/context.ssl ]; - private \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis; - private MarshallerInterface $marshaller; + private $redis; + private $marshaller; - private function init(\Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis, string $namespace, int $defaultLifetime, ?MarshallerInterface $marshaller) + /** + * @param \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis + */ + private function init($redis, string $namespace, int $defaultLifetime, ?MarshallerInterface $marshaller) { parent::__construct($namespace, $defaultLifetime); @@ -56,6 +59,10 @@ trait RedisTrait throw new InvalidArgumentException(sprintf('RedisAdapter namespace contains "%s" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0])); } + if (!$redis instanceof \Redis && !$redis instanceof \RedisArray && !$redis instanceof \RedisCluster && !$redis instanceof \Predis\ClientInterface && !$redis instanceof RedisProxy && !$redis instanceof RedisClusterProxy) { + throw new InvalidArgumentException(sprintf('"%s()" expects parameter 1 to be Redis, RedisArray, RedisCluster or Predis\ClientInterface, "%s" given.', __METHOD__, get_debug_type($redis))); + } + if ($redis instanceof \Predis\ClientInterface && $redis->getOptions()->exceptions) { $options = clone $redis->getOptions(); \Closure::bind(function () { $this->options['exceptions'] = false; }, $options, $options)(); @@ -78,9 +85,11 @@ trait RedisTrait * * @param array $options See self::$defaultConnectionOptions * + * @return \Redis|\RedisArray|\RedisCluster|RedisClusterProxy|RedisProxy|\Predis\ClientInterface According to the "class" option + * * @throws InvalidArgumentException when the DSN is invalid */ - public static function createConnection(string $dsn, array $options = []): \Redis|\RedisArray|\RedisCluster|RedisClusterProxy|RedisProxy|\Predis\ClientInterface + public static function createConnection(string $dsn, array $options = []) { if (str_starts_with($dsn, 'redis:')) { $scheme = 'redis'; @@ -94,13 +103,9 @@ trait RedisTrait throw new CacheException(sprintf('Cannot find the "redis" extension nor the "predis/predis" package: "%s".', $dsn)); } - $params = preg_replace_callback('#^'.$scheme.':(//)?(?:(?:(?[^:@]*+):)?(?[^@]*+)@)?#', function ($m) use (&$auth) { - if (isset($m['password'])) { - if (\in_array($m['user'], ['', 'default'], true)) { - $auth = $m['password']; - } else { - $auth = [$m['user'], $m['password']]; - } + $params = preg_replace_callback('#^'.$scheme.':(//)?(?:(?:[^:@]*+:)?([^@]*+)@)?#', function ($m) use (&$auth) { + if (isset($m[2])) { + $auth = $m[2]; if ('' === $auth) { $auth = null; @@ -251,11 +256,11 @@ trait RedisTrait } } elseif (is_a($class, \RedisArray::class, true)) { foreach ($hosts as $i => $host) { - $hosts[$i] = match ($host['scheme']) { - 'tcp' => $host['host'].':'.$host['port'], - 'tls' => 'tls://'.$host['host'].':'.$host['port'], - default => $host['path'], - }; + switch ($host['scheme']) { + case 'tcp': $hosts[$i] = $host['host'].':'.$host['port']; break; + case 'tls': $hosts[$i] = 'tls://'.$host['host'].':'.$host['port']; break; + default: $hosts[$i] = $host['path']; + } } $params['lazy_connect'] = $params['lazy'] ?? true; $params['connect_timeout'] = $params['timeout']; @@ -272,11 +277,11 @@ trait RedisTrait } elseif (is_a($class, \RedisCluster::class, true)) { $initializer = static function () use ($class, $params, $dsn, $hosts) { foreach ($hosts as $i => $host) { - $hosts[$i] = match ($host['scheme']) { - 'tcp' => $host['host'].':'.$host['port'], - 'tls' => 'tls://'.$host['host'].':'.$host['port'], - default => $host['path'], - }; + switch ($host['scheme']) { + case 'tcp': $hosts[$i] = $host['host'].':'.$host['port']; break; + case 'tls': $hosts[$i] = 'tls://'.$host['host'].':'.$host['port']; break; + default: $hosts[$i] = $host['path']; + } } try { @@ -316,13 +321,7 @@ trait RedisTrait $params['parameters']['database'] = $params['dbindex']; } if (null !== $auth) { - if (\is_array($auth)) { - // ACL - $params['parameters']['username'] = $auth[0]; - $params['parameters']['password'] = $auth[1]; - } else { - $params['parameters']['password'] = $auth; - } + $params['parameters']['password'] = $auth; } if (1 === \count($hosts) && !($params['redis_cluster'] || $params['redis_sentinel'])) { $hosts = $hosts[0]; @@ -348,7 +347,7 @@ trait RedisTrait /** * {@inheritdoc} */ - protected function doFetch(array $ids): iterable + protected function doFetch(array $ids) { if (!$ids) { return []; @@ -384,7 +383,7 @@ trait RedisTrait /** * {@inheritdoc} */ - protected function doHave(string $id): bool + protected function doHave(string $id) { return (bool) $this->redis->exists($id); } @@ -392,7 +391,7 @@ trait RedisTrait /** * {@inheritdoc} */ - protected function doClear(string $namespace): bool + protected function doClear(string $namespace) { if ($this->redis instanceof \Predis\ClientInterface) { $prefix = $this->redis->getOptions()->prefix ? $this->redis->getOptions()->prefix->getPrefix() : ''; @@ -456,7 +455,7 @@ trait RedisTrait /** * {@inheritdoc} */ - protected function doDelete(array $ids): bool + protected function doDelete(array $ids) { if (!$ids) { return true; @@ -464,7 +463,7 @@ trait RedisTrait if ($this->redis instanceof \Predis\ClientInterface && $this->redis->getConnection() instanceof ClusterInterface) { static $del; - $del ??= (class_exists(UNLINK::class) ? 'unlink' : 'del'); + $del = $del ?? (class_exists(UNLINK::class) ? 'unlink' : 'del'); $this->pipeline(function () use ($ids, $del) { foreach ($ids as $id) { @@ -477,7 +476,7 @@ trait RedisTrait if ($unlink) { try { $unlink = false !== $this->redis->unlink($ids); - } catch (\Throwable) { + } catch (\Throwable $e) { $unlink = false; } } @@ -493,7 +492,7 @@ trait RedisTrait /** * {@inheritdoc} */ - protected function doSave(array $values, int $lifetime): array|bool + protected function doSave(array $values, int $lifetime) { if (!$values = $this->marshaller->marshall($values, $failed)) { return $failed; @@ -521,7 +520,7 @@ trait RedisTrait private function pipeline(\Closure $generator, object $redis = null): \Generator { $ids = []; - $redis ??= $this->redis; + $redis = $redis ?? $this->redis; if ($redis instanceof RedisClusterProxy || $redis instanceof \RedisCluster || ($redis instanceof \Predis\ClientInterface && $redis->getConnection() instanceof RedisCluster)) { // phpredis & predis don't support pipelining with RedisCluster diff --git a/vendor/symfony/cache/Traits/ValueWrapper.php b/vendor/symfony/cache/Traits/ValueWrapper.php deleted file mode 100644 index 78c98f8d..00000000 --- a/vendor/symfony/cache/Traits/ValueWrapper.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. - */ - -/** - * A short namespace-less class to serialize items with metadata. - * - * @author Nicolas Grekas - * - * @internal - */ -class © -{ - private const EXPIRY_OFFSET = 1648206727; - private const INT32_MAX = 2147483647; - - public readonly mixed $value; - public readonly array $metadata; - - public function __construct(mixed $value, array $metadata) - { - $this->value = $value; - $this->metadata = $metadata; - } - - public function __serialize(): array - { - // pack 31-bits ctime into 14bits - $c = $this->metadata['ctime'] ?? 0; - $c = match (true) { - $c > self::INT32_MAX - 2 => self::INT32_MAX, - $c > 0 => 1 + $c, - default => 1, - }; - $e = 0; - while (!(0x40000000 & $c)) { - $c <<= 1; - ++$e; - } - $c = (0x7FE0 & ($c >> 16)) | $e; - - $pack = pack('Vn', (int) (0.1 + ($this->metadata['expiry'] ?: self::INT32_MAX + self::EXPIRY_OFFSET) - self::EXPIRY_OFFSET), $c); - - if (isset($this->metadata['tags'])) { - $pack[4] = $pack[4] | "\x80"; - } - - return [$pack => $this->value] + ($this->metadata['tags'] ?? []); - } - - public function __unserialize(array $data) - { - $pack = array_key_first($data); - $this->value = $data[$pack]; - - if ($hasTags = "\x80" === ($pack[4] & "\x80")) { - unset($data[$pack]); - $pack[4] = $pack[4] & "\x7F"; - } - - $metadata = unpack('Vexpiry/nctime', $pack); - $metadata['expiry'] += self::EXPIRY_OFFSET; - - if (!$metadata['ctime'] = ((0x4000 | $metadata['ctime']) << 16 >> (0x1F & $metadata['ctime'])) - 1) { - unset($metadata['ctime']); - } - - if ($hasTags) { - $metadata['tags'] = $data; - } - - $this->metadata = $metadata; - } -} diff --git a/vendor/symfony/cache/composer.json b/vendor/symfony/cache/composer.json index 09dd1bbe..91296b04 100644 --- a/vendor/symfony/cache/composer.json +++ b/vendor/symfony/cache/composer.json @@ -16,41 +16,42 @@ } ], "provide": { - "psr/cache-implementation": "2.0|3.0", - "psr/simple-cache-implementation": "1.0|2.0|3.0", - "symfony/cache-implementation": "1.1|2.0|3.0" + "psr/cache-implementation": "1.0|2.0", + "psr/simple-cache-implementation": "1.0|2.0", + "symfony/cache-implementation": "1.0|2.0" }, "require": { - "php": ">=8.1", - "psr/cache": "^2.0|^3.0", + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^1.1.7|^2|^3", + "symfony/cache-contracts": "^1.1.7|^2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2|^3", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/var-exporter": "^4.4|^5.0|^6.0" }, "require-dev": { "cache/integration-tests": "dev-master", + "doctrine/cache": "^1.6|^2.0", "doctrine/dbal": "^2.13.1|^3.0", "predis/predis": "^1.1", - "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/filesystem": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "psr/simple-cache": "^1.0|^2.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "conflict": { "doctrine/dbal": "<2.13.1", - "symfony/dependency-injection": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/var-dumper": "<5.4" + "symfony/dependency-injection": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/var-dumper": "<4.4" }, "autoload": { "psr-4": { "Symfony\\Component\\Cache\\": "" }, - "classmap": [ - "Traits/ValueWrapper.php" - ], "exclude-from-classmap": [ "/Tests/" ] diff --git a/vendor/symfony/css-selector/CssSelectorConverter.php b/vendor/symfony/css-selector/CssSelectorConverter.php index 7120a295..bbb6afe2 100644 --- a/vendor/symfony/css-selector/CssSelectorConverter.php +++ b/vendor/symfony/css-selector/CssSelectorConverter.php @@ -26,11 +26,11 @@ use Symfony\Component\CssSelector\XPath\Translator; */ class CssSelectorConverter { - private Translator $translator; - private array $cache; + private $translator; + private $cache; - private static array $xmlCache = []; - private static array $htmlCache = []; + private static $xmlCache = []; + private static $htmlCache = []; /** * @param bool $html Whether HTML support should be enabled. Disable it for XML documents @@ -59,9 +59,11 @@ class CssSelectorConverter * * Optionally, a prefix can be added to the resulting XPath * expression with the $prefix parameter. + * + * @return string */ - public function toXPath(string $cssExpr, string $prefix = 'descendant-or-self::'): string + public function toXPath(string $cssExpr, string $prefix = 'descendant-or-self::') { - return $this->cache[$prefix][$cssExpr] ??= $this->translator->cssToXPath($cssExpr, $prefix); + return $this->cache[$prefix][$cssExpr] ?? $this->cache[$prefix][$cssExpr] = $this->translator->cssToXPath($cssExpr, $prefix); } } diff --git a/vendor/symfony/css-selector/Exception/SyntaxErrorException.php b/vendor/symfony/css-selector/Exception/SyntaxErrorException.php index f73860ce..7deacf9c 100644 --- a/vendor/symfony/css-selector/Exception/SyntaxErrorException.php +++ b/vendor/symfony/css-selector/Exception/SyntaxErrorException.php @@ -23,27 +23,42 @@ use Symfony\Component\CssSelector\Parser\Token; */ class SyntaxErrorException extends ParseException { - public static function unexpectedToken(string $expectedValue, Token $foundToken): self + /** + * @return self + */ + public static function unexpectedToken(string $expectedValue, Token $foundToken) { return new self(sprintf('Expected %s, but %s found.', $expectedValue, $foundToken)); } - public static function pseudoElementFound(string $pseudoElement, string $unexpectedLocation): self + /** + * @return self + */ + public static function pseudoElementFound(string $pseudoElement, string $unexpectedLocation) { return new self(sprintf('Unexpected pseudo-element "::%s" found %s.', $pseudoElement, $unexpectedLocation)); } - public static function unclosedString(int $position): self + /** + * @return self + */ + public static function unclosedString(int $position) { return new self(sprintf('Unclosed/invalid string at %s.', $position)); } - public static function nestedNot(): self + /** + * @return self + */ + public static function nestedNot() { return new self('Got nested ::not().'); } - public static function stringAsFunctionArgument(): self + /** + * @return self + */ + public static function stringAsFunctionArgument() { return new self('String not allowed as function argument.'); } diff --git a/vendor/symfony/css-selector/Node/AbstractNode.php b/vendor/symfony/css-selector/Node/AbstractNode.php index d99e80a8..1306aeac 100644 --- a/vendor/symfony/css-selector/Node/AbstractNode.php +++ b/vendor/symfony/css-selector/Node/AbstractNode.php @@ -23,10 +23,17 @@ namespace Symfony\Component\CssSelector\Node; */ abstract class AbstractNode implements NodeInterface { - private string $nodeName; + /** + * @var string + */ + private $nodeName; public function getNodeName(): string { - return $this->nodeName ??= preg_replace('~.*\\\\([^\\\\]+)Node$~', '$1', static::class); + if (null === $this->nodeName) { + $this->nodeName = preg_replace('~.*\\\\([^\\\\]+)Node$~', '$1', static::class); + } + + return $this->nodeName; } } diff --git a/vendor/symfony/css-selector/Node/AttributeNode.php b/vendor/symfony/css-selector/Node/AttributeNode.php index bca9db70..0b6e0ee0 100644 --- a/vendor/symfony/css-selector/Node/AttributeNode.php +++ b/vendor/symfony/css-selector/Node/AttributeNode.php @@ -23,11 +23,11 @@ namespace Symfony\Component\CssSelector\Node; */ class AttributeNode extends AbstractNode { - private NodeInterface $selector; - private ?string $namespace; - private string $attribute; - private string $operator; - private ?string $value; + private $selector; + private $namespace; + private $attribute; + private $operator; + private $value; public function __construct(NodeInterface $selector, ?string $namespace, string $attribute, string $operator, ?string $value) { diff --git a/vendor/symfony/css-selector/Node/ClassNode.php b/vendor/symfony/css-selector/Node/ClassNode.php index b9284073..1efca808 100644 --- a/vendor/symfony/css-selector/Node/ClassNode.php +++ b/vendor/symfony/css-selector/Node/ClassNode.php @@ -23,8 +23,8 @@ namespace Symfony\Component\CssSelector\Node; */ class ClassNode extends AbstractNode { - private NodeInterface $selector; - private string $name; + private $selector; + private $name; public function __construct(NodeInterface $selector, string $name) { diff --git a/vendor/symfony/css-selector/Node/CombinedSelectorNode.php b/vendor/symfony/css-selector/Node/CombinedSelectorNode.php index 33889948..a217a45e 100644 --- a/vendor/symfony/css-selector/Node/CombinedSelectorNode.php +++ b/vendor/symfony/css-selector/Node/CombinedSelectorNode.php @@ -23,9 +23,9 @@ namespace Symfony\Component\CssSelector\Node; */ class CombinedSelectorNode extends AbstractNode { - private NodeInterface $selector; - private string $combinator; - private NodeInterface $subSelector; + private $selector; + private $combinator; + private $subSelector; public function __construct(NodeInterface $selector, string $combinator, NodeInterface $subSelector) { diff --git a/vendor/symfony/css-selector/Node/ElementNode.php b/vendor/symfony/css-selector/Node/ElementNode.php index b05164fe..fbf8ea0f 100644 --- a/vendor/symfony/css-selector/Node/ElementNode.php +++ b/vendor/symfony/css-selector/Node/ElementNode.php @@ -23,8 +23,8 @@ namespace Symfony\Component\CssSelector\Node; */ class ElementNode extends AbstractNode { - private ?string $namespace; - private ?string $element; + private $namespace; + private $element; public function __construct(string $namespace = null, string $element = null) { diff --git a/vendor/symfony/css-selector/Node/FunctionNode.php b/vendor/symfony/css-selector/Node/FunctionNode.php index 5bfca184..c464cf7c 100644 --- a/vendor/symfony/css-selector/Node/FunctionNode.php +++ b/vendor/symfony/css-selector/Node/FunctionNode.php @@ -25,9 +25,9 @@ use Symfony\Component\CssSelector\Parser\Token; */ class FunctionNode extends AbstractNode { - private NodeInterface $selector; - private string $name; - private array $arguments; + private $selector; + private $name; + private $arguments; /** * @param Token[] $arguments diff --git a/vendor/symfony/css-selector/Node/HashNode.php b/vendor/symfony/css-selector/Node/HashNode.php index 5f5923fb..94114c09 100644 --- a/vendor/symfony/css-selector/Node/HashNode.php +++ b/vendor/symfony/css-selector/Node/HashNode.php @@ -23,8 +23,8 @@ namespace Symfony\Component\CssSelector\Node; */ class HashNode extends AbstractNode { - private NodeInterface $selector; - private string $id; + private $selector; + private $id; public function __construct(NodeInterface $selector, string $id) { diff --git a/vendor/symfony/css-selector/Node/NegationNode.php b/vendor/symfony/css-selector/Node/NegationNode.php index c75d052b..f00522fb 100644 --- a/vendor/symfony/css-selector/Node/NegationNode.php +++ b/vendor/symfony/css-selector/Node/NegationNode.php @@ -23,8 +23,8 @@ namespace Symfony\Component\CssSelector\Node; */ class NegationNode extends AbstractNode { - private NodeInterface $selector; - private NodeInterface $subSelector; + private $selector; + private $subSelector; public function __construct(NodeInterface $selector, NodeInterface $subSelector) { diff --git a/vendor/symfony/css-selector/Node/PseudoNode.php b/vendor/symfony/css-selector/Node/PseudoNode.php index 6825f3a3..12b7bd26 100644 --- a/vendor/symfony/css-selector/Node/PseudoNode.php +++ b/vendor/symfony/css-selector/Node/PseudoNode.php @@ -23,8 +23,8 @@ namespace Symfony\Component\CssSelector\Node; */ class PseudoNode extends AbstractNode { - private NodeInterface $selector; - private string $identifier; + private $selector; + private $identifier; public function __construct(NodeInterface $selector, string $identifier) { diff --git a/vendor/symfony/css-selector/Node/SelectorNode.php b/vendor/symfony/css-selector/Node/SelectorNode.php index b1d6c58e..6e52b2fa 100644 --- a/vendor/symfony/css-selector/Node/SelectorNode.php +++ b/vendor/symfony/css-selector/Node/SelectorNode.php @@ -23,8 +23,8 @@ namespace Symfony\Component\CssSelector\Node; */ class SelectorNode extends AbstractNode { - private NodeInterface $tree; - private ?string $pseudoElement; + private $tree; + private $pseudoElement; public function __construct(NodeInterface $tree, string $pseudoElement = null) { diff --git a/vendor/symfony/css-selector/Node/Specificity.php b/vendor/symfony/css-selector/Node/Specificity.php index bb8e5e34..b00f6d28 100644 --- a/vendor/symfony/css-selector/Node/Specificity.php +++ b/vendor/symfony/css-selector/Node/Specificity.php @@ -29,9 +29,9 @@ class Specificity public const B_FACTOR = 10; public const C_FACTOR = 1; - private int $a; - private int $b; - private int $c; + private $a; + private $b; + private $c; public function __construct(int $a, int $b, int $c) { diff --git a/vendor/symfony/css-selector/Parser/Handler/HashHandler.php b/vendor/symfony/css-selector/Parser/Handler/HashHandler.php index cde8cda2..7ae9b438 100644 --- a/vendor/symfony/css-selector/Parser/Handler/HashHandler.php +++ b/vendor/symfony/css-selector/Parser/Handler/HashHandler.php @@ -29,8 +29,8 @@ use Symfony\Component\CssSelector\Parser\TokenStream; */ class HashHandler implements HandlerInterface { - private TokenizerPatterns $patterns; - private TokenizerEscaping $escaping; + private $patterns; + private $escaping; public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping) { diff --git a/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php b/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php index 2b9e02e0..7b2a14e2 100644 --- a/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php +++ b/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php @@ -29,8 +29,8 @@ use Symfony\Component\CssSelector\Parser\TokenStream; */ class IdentifierHandler implements HandlerInterface { - private TokenizerPatterns $patterns; - private TokenizerEscaping $escaping; + private $patterns; + private $escaping; public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping) { diff --git a/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php b/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php index d3bbe5f4..8291a68d 100644 --- a/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php +++ b/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php @@ -28,7 +28,7 @@ use Symfony\Component\CssSelector\Parser\TokenStream; */ class NumberHandler implements HandlerInterface { - private TokenizerPatterns $patterns; + private $patterns; public function __construct(TokenizerPatterns $patterns) { diff --git a/vendor/symfony/css-selector/Parser/Handler/StringHandler.php b/vendor/symfony/css-selector/Parser/Handler/StringHandler.php index 341c75fc..6ce83cdc 100644 --- a/vendor/symfony/css-selector/Parser/Handler/StringHandler.php +++ b/vendor/symfony/css-selector/Parser/Handler/StringHandler.php @@ -31,8 +31,8 @@ use Symfony\Component\CssSelector\Parser\TokenStream; */ class StringHandler implements HandlerInterface { - private TokenizerPatterns $patterns; - private TokenizerEscaping $escaping; + private $patterns; + private $escaping; public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping) { diff --git a/vendor/symfony/css-selector/Parser/Parser.php b/vendor/symfony/css-selector/Parser/Parser.php index df77e2ce..d73489ed 100644 --- a/vendor/symfony/css-selector/Parser/Parser.php +++ b/vendor/symfony/css-selector/Parser/Parser.php @@ -27,7 +27,7 @@ use Symfony\Component\CssSelector\Parser\Tokenizer\Tokenizer; */ class Parser implements ParserInterface { - private Tokenizer $tokenizer; + private $tokenizer; public function __construct(Tokenizer $tokenizer = null) { diff --git a/vendor/symfony/css-selector/Parser/Reader.php b/vendor/symfony/css-selector/Parser/Reader.php index c0b6923a..4b43effe 100644 --- a/vendor/symfony/css-selector/Parser/Reader.php +++ b/vendor/symfony/css-selector/Parser/Reader.php @@ -23,9 +23,9 @@ namespace Symfony\Component\CssSelector\Parser; */ class Reader { - private string $source; - private int $length; - private int $position = 0; + private $source; + private $length; + private $position = 0; public function __construct(string $source) { @@ -60,7 +60,10 @@ class Reader return false === $position ? false : $position - $this->position; } - public function findPattern(string $pattern): array|false + /** + * @return array|false + */ + public function findPattern(string $pattern) { $source = substr($this->source, $this->position); diff --git a/vendor/symfony/css-selector/Parser/Token.php b/vendor/symfony/css-selector/Parser/Token.php index a538d07f..a053203c 100644 --- a/vendor/symfony/css-selector/Parser/Token.php +++ b/vendor/symfony/css-selector/Parser/Token.php @@ -31,9 +31,9 @@ class Token public const TYPE_NUMBER = 'number'; public const TYPE_STRING = 'string'; - private ?string $type; - private ?string $value; - private ?int $position; + private $type; + private $value; + private $position; public function __construct(?string $type, ?string $value, ?int $position) { diff --git a/vendor/symfony/css-selector/Parser/TokenStream.php b/vendor/symfony/css-selector/Parser/TokenStream.php index 69f77780..2085f2dd 100644 --- a/vendor/symfony/css-selector/Parser/TokenStream.php +++ b/vendor/symfony/css-selector/Parser/TokenStream.php @@ -29,23 +29,34 @@ class TokenStream /** * @var Token[] */ - private array $tokens = []; + private $tokens = []; /** * @var Token[] */ - private array $used = []; + private $used = []; - private int $cursor = 0; - private ?Token $peeked; - private bool $peeking = false; + /** + * @var int + */ + private $cursor = 0; + + /** + * @var Token|null + */ + private $peeked; + + /** + * @var bool + */ + private $peeking = false; /** * Pushes a token. * * @return $this */ - public function push(Token $token): static + public function push(Token $token): self { $this->tokens[] = $token; @@ -57,7 +68,7 @@ class TokenStream * * @return $this */ - public function freeze(): static + public function freeze(): self { return $this; } diff --git a/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php b/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php index 35c96a48..e0dcc5bf 100644 --- a/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php +++ b/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php @@ -31,7 +31,7 @@ class Tokenizer /** * @var Handler\HandlerInterface[] */ - private array $handlers; + private $handlers; public function __construct() { diff --git a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php index 8c4b9f74..013e827d 100644 --- a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php +++ b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php @@ -23,7 +23,7 @@ namespace Symfony\Component\CssSelector\Parser\Tokenizer; */ class TokenizerEscaping { - private TokenizerPatterns $patterns; + private $patterns; public function __construct(TokenizerPatterns $patterns) { diff --git a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php index 0b2767a8..5f16ac48 100644 --- a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php +++ b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php @@ -23,18 +23,18 @@ namespace Symfony\Component\CssSelector\Parser\Tokenizer; */ class TokenizerPatterns { - private string $unicodeEscapePattern; - private string $simpleEscapePattern; - private string $newLineEscapePattern; - private string $escapePattern; - private string $stringEscapePattern; - private string $nonAsciiPattern; - private string $nmCharPattern; - private string $nmStartPattern; - private string $identifierPattern; - private string $hashPattern; - private string $numberPattern; - private string $quotedStringPattern; + private $unicodeEscapePattern; + private $simpleEscapePattern; + private $newLineEscapePattern; + private $escapePattern; + private $stringEscapePattern; + private $nonAsciiPattern; + private $nmCharPattern; + private $nmStartPattern; + private $identifierPattern; + private $hashPattern; + private $numberPattern; + private $quotedStringPattern; public function __construct() { diff --git a/vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php b/vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php index b40a86bf..a9879f1b 100644 --- a/vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php +++ b/vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php @@ -32,14 +32,14 @@ class AttributeMatchingExtension extends AbstractExtension public function getAttributeMatchingTranslators(): array { return [ - 'exists' => $this->translateExists(...), - '=' => $this->translateEquals(...), - '~=' => $this->translateIncludes(...), - '|=' => $this->translateDashMatch(...), - '^=' => $this->translatePrefixMatch(...), - '$=' => $this->translateSuffixMatch(...), - '*=' => $this->translateSubstringMatch(...), - '!=' => $this->translateDifferent(...), + 'exists' => [$this, 'translateExists'], + '=' => [$this, 'translateEquals'], + '~=' => [$this, 'translateIncludes'], + '|=' => [$this, 'translateDashMatch'], + '^=' => [$this, 'translatePrefixMatch'], + '$=' => [$this, 'translateSuffixMatch'], + '*=' => [$this, 'translateSubstringMatch'], + '!=' => [$this, 'translateDifferent'], ]; } diff --git a/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php b/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php index e75da8b4..aee976e9 100644 --- a/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php +++ b/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php @@ -31,10 +31,10 @@ class CombinationExtension extends AbstractExtension public function getCombinationTranslators(): array { return [ - ' ' => $this->translateDescendant(...), - '>' => $this->translateChild(...), - '+' => $this->translateDirectAdjacent(...), - '~' => $this->translateIndirectAdjacent(...), + ' ' => [$this, 'translateDescendant'], + '>' => [$this, 'translateChild'], + '+' => [$this, 'translateDirectAdjacent'], + '~' => [$this, 'translateIndirectAdjacent'], ]; } diff --git a/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php b/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php index 4ed9c239..d3f7222a 100644 --- a/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php +++ b/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php @@ -36,12 +36,12 @@ class FunctionExtension extends AbstractExtension public function getFunctionTranslators(): array { return [ - 'nth-child' => $this->translateNthChild(...), - 'nth-last-child' => $this->translateNthLastChild(...), - 'nth-of-type' => $this->translateNthOfType(...), - 'nth-last-of-type' => $this->translateNthLastOfType(...), - 'contains' => $this->translateContains(...), - 'lang' => $this->translateLang(...), + 'nth-child' => [$this, 'translateNthChild'], + 'nth-last-child' => [$this, 'translateNthLastChild'], + 'nth-of-type' => [$this, 'translateNthOfType'], + 'nth-last-of-type' => [$this, 'translateNthLastOfType'], + 'contains' => [$this, 'translateContains'], + 'lang' => [$this, 'translateLang'], ]; } diff --git a/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php b/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php index 95289818..6edc0858 100644 --- a/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php +++ b/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php @@ -42,14 +42,14 @@ class HtmlExtension extends AbstractExtension public function getPseudoClassTranslators(): array { return [ - 'checked' => $this->translateChecked(...), - 'link' => $this->translateLink(...), - 'disabled' => $this->translateDisabled(...), - 'enabled' => $this->translateEnabled(...), - 'selected' => $this->translateSelected(...), - 'invalid' => $this->translateInvalid(...), - 'hover' => $this->translateHover(...), - 'visited' => $this->translateVisited(...), + 'checked' => [$this, 'translateChecked'], + 'link' => [$this, 'translateLink'], + 'disabled' => [$this, 'translateDisabled'], + 'enabled' => [$this, 'translateEnabled'], + 'selected' => [$this, 'translateSelected'], + 'invalid' => [$this, 'translateInvalid'], + 'hover' => [$this, 'translateHover'], + 'visited' => [$this, 'translateVisited'], ]; } @@ -59,7 +59,7 @@ class HtmlExtension extends AbstractExtension public function getFunctionTranslators(): array { return [ - 'lang' => $this->translateLang(...), + 'lang' => [$this, 'translateLang'], ]; } diff --git a/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php b/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php index 70f287b5..aa6f3f70 100644 --- a/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php +++ b/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php @@ -31,7 +31,7 @@ class NodeExtension extends AbstractExtension public const ATTRIBUTE_NAME_IN_LOWER_CASE = 2; public const ATTRIBUTE_VALUE_IN_LOWER_CASE = 4; - private int $flags; + private $flags; public function __construct(int $flags = 0) { @@ -41,7 +41,7 @@ class NodeExtension extends AbstractExtension /** * @return $this */ - public function setFlag(int $flag, bool $on): static + public function setFlag(int $flag, bool $on): self { if ($on && !$this->hasFlag($flag)) { $this->flags += $flag; @@ -65,15 +65,15 @@ class NodeExtension extends AbstractExtension public function getNodeTranslators(): array { return [ - 'Selector' => $this->translateSelector(...), - 'CombinedSelector' => $this->translateCombinedSelector(...), - 'Negation' => $this->translateNegation(...), - 'Function' => $this->translateFunction(...), - 'Pseudo' => $this->translatePseudo(...), - 'Attribute' => $this->translateAttribute(...), - 'Class' => $this->translateClass(...), - 'Hash' => $this->translateHash(...), - 'Element' => $this->translateElement(...), + 'Selector' => [$this, 'translateSelector'], + 'CombinedSelector' => [$this, 'translateCombinedSelector'], + 'Negation' => [$this, 'translateNegation'], + 'Function' => [$this, 'translateFunction'], + 'Pseudo' => [$this, 'translatePseudo'], + 'Attribute' => [$this, 'translateAttribute'], + 'Class' => [$this, 'translateClass'], + 'Hash' => [$this, 'translateHash'], + 'Element' => [$this, 'translateElement'], ]; } diff --git a/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php b/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php index a9b6abc4..a50b0486 100644 --- a/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php +++ b/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php @@ -32,14 +32,14 @@ class PseudoClassExtension extends AbstractExtension public function getPseudoClassTranslators(): array { return [ - 'root' => $this->translateRoot(...), - 'first-child' => $this->translateFirstChild(...), - 'last-child' => $this->translateLastChild(...), - 'first-of-type' => $this->translateFirstOfType(...), - 'last-of-type' => $this->translateLastOfType(...), - 'only-child' => $this->translateOnlyChild(...), - 'only-of-type' => $this->translateOnlyOfType(...), - 'empty' => $this->translateEmpty(...), + 'root' => [$this, 'translateRoot'], + 'first-child' => [$this, 'translateFirstChild'], + 'last-child' => [$this, 'translateLastChild'], + 'first-of-type' => [$this, 'translateFirstOfType'], + 'last-of-type' => [$this, 'translateLastOfType'], + 'only-child' => [$this, 'translateOnlyChild'], + 'only-of-type' => [$this, 'translateOnlyOfType'], + 'empty' => [$this, 'translateEmpty'], ]; } diff --git a/vendor/symfony/css-selector/XPath/Translator.php b/vendor/symfony/css-selector/XPath/Translator.php index 128a4a93..8ce47303 100644 --- a/vendor/symfony/css-selector/XPath/Translator.php +++ b/vendor/symfony/css-selector/XPath/Translator.php @@ -30,23 +30,23 @@ use Symfony\Component\CssSelector\Parser\ParserInterface; */ class Translator implements TranslatorInterface { - private ParserInterface $mainParser; + private $mainParser; /** * @var ParserInterface[] */ - private array $shortcutParsers = []; + private $shortcutParsers = []; /** * @var Extension\ExtensionInterface[] */ - private array $extensions = []; + private $extensions = []; - private array $nodeTranslators = []; - private array $combinationTranslators = []; - private array $functionTranslators = []; - private array $pseudoClassTranslators = []; - private array $attributeMatchingTranslators = []; + private $nodeTranslators = []; + private $combinationTranslators = []; + private $functionTranslators = []; + private $pseudoClassTranslators = []; + private $attributeMatchingTranslators = []; public function __construct(ParserInterface $parser = null) { @@ -117,7 +117,7 @@ class Translator implements TranslatorInterface /** * @return $this */ - public function registerExtension(Extension\ExtensionInterface $extension): static + public function registerExtension(Extension\ExtensionInterface $extension): self { $this->extensions[$extension->getName()] = $extension; @@ -145,7 +145,7 @@ class Translator implements TranslatorInterface /** * @return $this */ - public function registerParserShortcut(ParserInterface $shortcut): static + public function registerParserShortcut(ParserInterface $shortcut): self { $this->shortcutParsers[] = $shortcut; diff --git a/vendor/symfony/css-selector/XPath/XPathExpr.php b/vendor/symfony/css-selector/XPath/XPathExpr.php index a76e30be..e45ce7d8 100644 --- a/vendor/symfony/css-selector/XPath/XPathExpr.php +++ b/vendor/symfony/css-selector/XPath/XPathExpr.php @@ -23,9 +23,9 @@ namespace Symfony\Component\CssSelector\XPath; */ class XPathExpr { - private string $path; - private string $element; - private string $condition; + private $path; + private $element; + private $condition; public function __construct(string $path = '', string $element = '*', string $condition = '', bool $starPrefix = false) { @@ -46,7 +46,7 @@ class XPathExpr /** * @return $this */ - public function addCondition(string $condition): static + public function addCondition(string $condition): self { $this->condition = $this->condition ? sprintf('(%s) and (%s)', $this->condition, $condition) : $condition; @@ -61,7 +61,7 @@ class XPathExpr /** * @return $this */ - public function addNameTest(): static + public function addNameTest(): self { if ('*' !== $this->element) { $this->addCondition('name() = '.Translator::getXpathLiteral($this->element)); @@ -74,7 +74,7 @@ class XPathExpr /** * @return $this */ - public function addStarPrefix(): static + public function addStarPrefix(): self { $this->path .= '*/'; @@ -86,7 +86,7 @@ class XPathExpr * * @return $this */ - public function join(string $combiner, self $expr): static + public function join(string $combiner, self $expr): self { $path = $this->__toString().$combiner; diff --git a/vendor/symfony/css-selector/composer.json b/vendor/symfony/css-selector/composer.json index c08fdc2c..f0b71249 100644 --- a/vendor/symfony/css-selector/composer.json +++ b/vendor/symfony/css-selector/composer.json @@ -20,7 +20,8 @@ } ], "require": { - "php": ">=8.1" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "autoload": { "psr-4": { "Symfony\\Component\\CssSelector\\": "" }, diff --git a/vendor/symfony/deprecation-contracts/composer.json b/vendor/symfony/deprecation-contracts/composer.json index f5de4eb4..cc7cc123 100644 --- a/vendor/symfony/deprecation-contracts/composer.json +++ b/vendor/symfony/deprecation-contracts/composer.json @@ -15,7 +15,7 @@ } ], "require": { - "php": ">=8.1" + "php": ">=7.1" }, "autoload": { "files": [ @@ -25,7 +25,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", diff --git a/vendor/symfony/deprecation-contracts/function.php b/vendor/symfony/deprecation-contracts/function.php index 2d56512b..d4371504 100644 --- a/vendor/symfony/deprecation-contracts/function.php +++ b/vendor/symfony/deprecation-contracts/function.php @@ -20,7 +20,7 @@ if (!function_exists('trigger_deprecation')) { * * @author Nicolas Grekas */ - function trigger_deprecation(string $package, string $version, string $message, mixed ...$args): void + function trigger_deprecation(string $package, string $version, string $message, ...$args): void { @trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), \E_USER_DEPRECATED); } diff --git a/vendor/symfony/event-dispatcher-contracts/Event.php b/vendor/symfony/event-dispatcher-contracts/Event.php index 384a650b..46dcb2ba 100644 --- a/vendor/symfony/event-dispatcher-contracts/Event.php +++ b/vendor/symfony/event-dispatcher-contracts/Event.php @@ -30,7 +30,7 @@ use Psr\EventDispatcher\StoppableEventInterface; */ class Event implements StoppableEventInterface { - private bool $propagationStopped = false; + private $propagationStopped = false; /** * {@inheritdoc} diff --git a/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php b/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php index 610d6ac0..351dc513 100644 --- a/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php +++ b/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php @@ -21,13 +21,11 @@ interface EventDispatcherInterface extends PsrEventDispatcherInterface /** * Dispatches an event to all registered listeners. * - * @template T of object - * - * @param T $event The event to pass to the event handlers/listeners + * @param object $event The event to pass to the event handlers/listeners * @param string|null $eventName The name of the event to dispatch. If not supplied, * the class of $event should be used instead. * - * @return T The passed $event MUST be returned + * @return object The passed $event MUST be returned */ public function dispatch(object $event, string $eventName = null): object; } diff --git a/vendor/symfony/event-dispatcher-contracts/composer.json b/vendor/symfony/event-dispatcher-contracts/composer.json index 03ce8e45..660df81a 100644 --- a/vendor/symfony/event-dispatcher-contracts/composer.json +++ b/vendor/symfony/event-dispatcher-contracts/composer.json @@ -16,7 +16,7 @@ } ], "require": { - "php": ">=8.1", + "php": ">=7.2.5", "psr/event-dispatcher": "^1" }, "suggest": { @@ -28,7 +28,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", diff --git a/vendor/symfony/event-dispatcher/CHANGELOG.md b/vendor/symfony/event-dispatcher/CHANGELOG.md index 76b2eab6..0f985989 100644 --- a/vendor/symfony/event-dispatcher/CHANGELOG.md +++ b/vendor/symfony/event-dispatcher/CHANGELOG.md @@ -1,11 +1,6 @@ CHANGELOG ========= -6.0 ---- - - * Remove `LegacyEventDispatcherProxy` - 5.4 --- diff --git a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php index 5005067e..acfbf619 100644 --- a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php +++ b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php @@ -13,7 +13,6 @@ namespace Symfony\Component\EventDispatcher\Debug; use Psr\EventDispatcher\StoppableEventInterface; use Psr\Log\LoggerInterface; -use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\Request; @@ -34,27 +33,29 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa protected $stopwatch; /** - * @var \SplObjectStorage|null + * @var \SplObjectStorage */ - private ?\SplObjectStorage $callStack = null; - private EventDispatcherInterface $dispatcher; - private array $wrappedListeners = []; - private array $orphanedEvents = []; - private ?RequestStack $requestStack; - private string $currentRequestHash = ''; + private $callStack; + private $dispatcher; + private $wrappedListeners; + private $orphanedEvents; + private $requestStack; + private $currentRequestHash = ''; public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, LoggerInterface $logger = null, RequestStack $requestStack = null) { $this->dispatcher = $dispatcher; $this->stopwatch = $stopwatch; $this->logger = $logger; + $this->wrappedListeners = []; + $this->orphanedEvents = []; $this->requestStack = $requestStack; } /** * {@inheritdoc} */ - public function addListener(string $eventName, callable|array $listener, int $priority = 0) + public function addListener(string $eventName, $listener, int $priority = 0) { $this->dispatcher->addListener($eventName, $listener, $priority); } @@ -70,7 +71,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa /** * {@inheritdoc} */ - public function removeListener(string $eventName, callable|array $listener) + public function removeListener(string $eventName, $listener) { if (isset($this->wrappedListeners[$eventName])) { foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) { @@ -96,7 +97,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa /** * {@inheritdoc} */ - public function getListeners(string $eventName = null): array + public function getListeners(string $eventName = null) { return $this->dispatcher->getListeners($eventName); } @@ -104,7 +105,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa /** * {@inheritdoc} */ - public function getListenerPriority(string $eventName, callable|array $listener): ?int + public function getListenerPriority(string $eventName, $listener) { // we might have wrapped listeners for the event (if called while dispatching) // in that case get the priority by wrapper @@ -122,7 +123,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa /** * {@inheritdoc} */ - public function hasListeners(string $eventName = null): bool + public function hasListeners(string $eventName = null) { return $this->dispatcher->hasListeners($eventName); } @@ -132,7 +133,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa */ public function dispatch(object $event, string $eventName = null): object { - $eventName ??= \get_class($event); + $eventName = $eventName ?? \get_class($event); if (null === $this->callStack) { $this->callStack = new \SplObjectStorage(); @@ -167,7 +168,10 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa return $event; } - public function getCalledListeners(Request $request = null): array + /** + * @return array + */ + public function getCalledListeners(Request $request = null) { if (null === $this->callStack) { return []; @@ -185,12 +189,17 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa return $called; } - public function getNotCalledListeners(Request $request = null): array + /** + * @return array + */ + public function getNotCalledListeners(Request $request = null) { try { - $allListeners = $this->dispatcher instanceof EventDispatcher ? $this->getListenersWithPriority() : $this->getListenersWithoutPriority(); + $allListeners = $this->getListeners(); } catch (\Exception $e) { - $this->logger?->info('An exception was thrown while getting the uncalled listeners.', ['exception' => $e]); + if (null !== $this->logger) { + $this->logger->info('An exception was thrown while getting the uncalled listeners.', ['exception' => $e]); + } // unable to retrieve the uncalled listeners return []; @@ -210,19 +219,18 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa } $notCalled = []; - foreach ($allListeners as $eventName => $listeners) { - foreach ($listeners as [$listener, $priority]) { + foreach ($listeners as $listener) { if (!\in_array($listener, $calledListeners, true)) { if (!$listener instanceof WrappedListener) { - $listener = new WrappedListener($listener, null, $this->stopwatch, $this, $priority); + $listener = new WrappedListener($listener, null, $this->stopwatch, $this); } $notCalled[] = $listener->getInfo($eventName); } } } - uasort($notCalled, $this->sortNotCalledListeners(...)); + uasort($notCalled, [$this, 'sortNotCalledListeners']); return $notCalled; } @@ -252,8 +260,10 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa * * @param string $method The method name * @param array $arguments The method arguments + * + * @return mixed */ - public function __call(string $method, array $arguments): mixed + public function __call(string $method, array $arguments) { return $this->dispatcher->{$method}(...$arguments); } @@ -308,7 +318,9 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa } if ($listener->wasCalled()) { - $this->logger?->debug('Notified event "{event}" to listener "{listener}".', $context); + if (null !== $this->logger) { + $this->logger->debug('Notified event "{event}" to listener "{listener}".', $context); + } } else { $this->callStack->detach($listener); } @@ -318,14 +330,16 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa } if ($listener->stoppedPropagation()) { - $this->logger?->debug('Listener "{listener}" stopped propagation of the event "{event}".', $context); + if (null !== $this->logger) { + $this->logger->debug('Listener "{listener}" stopped propagation of the event "{event}".', $context); + } $skipped = true; } } } - private function sortNotCalledListeners(array $a, array $b): int + private function sortNotCalledListeners(array $a, array $b) { if (0 !== $cmp = strcmp($a['event'], $b['event'])) { return $cmp; @@ -349,35 +363,4 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa return 1; } - - private function getListenersWithPriority(): array - { - $result = []; - - $allListeners = new \ReflectionProperty(EventDispatcher::class, 'listeners'); - $allListeners->setAccessible(true); - - foreach ($allListeners->getValue($this->dispatcher) as $eventName => $listenersByPriority) { - foreach ($listenersByPriority as $priority => $listeners) { - foreach ($listeners as $listener) { - $result[$eventName][] = [$listener, $priority]; - } - } - } - - return $result; - } - - private function getListenersWithoutPriority(): array - { - $result = []; - - foreach ($this->getListeners() as $eventName => $listeners) { - foreach ($listeners as $listener) { - $result[$eventName][] = [$listener, null]; - } - } - - return $result; - } } diff --git a/vendor/symfony/event-dispatcher/Debug/WrappedListener.php b/vendor/symfony/event-dispatcher/Debug/WrappedListener.php index 88329e2a..3916716e 100644 --- a/vendor/symfony/event-dispatcher/Debug/WrappedListener.php +++ b/vendor/symfony/event-dispatcher/Debug/WrappedListener.php @@ -21,31 +21,30 @@ use Symfony\Component\VarDumper\Caster\ClassStub; */ final class WrappedListener { - private string|array|object $listener; - private ?\Closure $optimizedListener; - private string $name; - private bool $called = false; - private bool $stoppedPropagation = false; - private Stopwatch $stopwatch; - private ?EventDispatcherInterface $dispatcher; - private string $pretty; - private string $callableRef; - private ClassStub|string $stub; - private ?int $priority = null; - private static bool $hasClassStub; + private $listener; + private $optimizedListener; + private $name; + private $called; + private $stoppedPropagation; + private $stopwatch; + private $dispatcher; + private $pretty; + private $stub; + private $priority; + private static $hasClassStub; - public function __construct(callable|array $listener, ?string $name, Stopwatch $stopwatch, EventDispatcherInterface $dispatcher = null, int $priority = null) + public function __construct($listener, ?string $name, Stopwatch $stopwatch, EventDispatcherInterface $dispatcher = null) { $this->listener = $listener; - $this->optimizedListener = $listener instanceof \Closure ? $listener : (\is_callable($listener) ? $listener(...) : null); + $this->optimizedListener = $listener instanceof \Closure ? $listener : (\is_callable($listener) ? \Closure::fromCallable($listener) : null); $this->stopwatch = $stopwatch; $this->dispatcher = $dispatcher; - $this->priority = $priority; + $this->called = false; + $this->stoppedPropagation = false; if (\is_array($listener)) { - [$this->name, $this->callableRef] = $this->parseListener($listener); + $this->name = \is_object($listener[0]) ? get_debug_type($listener[0]) : $listener[0]; $this->pretty = $this->name.'::'.$listener[1]; - $this->callableRef .= '::'.$listener[1]; } elseif ($listener instanceof \Closure) { $r = new \ReflectionFunction($listener); if (str_contains($r->name, '{closure}')) { @@ -61,17 +60,18 @@ final class WrappedListener } else { $this->name = get_debug_type($listener); $this->pretty = $this->name.'::__invoke'; - $this->callableRef = \get_class($listener).'::__invoke'; } if (null !== $name) { $this->name = $name; } - self::$hasClassStub ??= class_exists(ClassStub::class); + if (null === self::$hasClassStub) { + self::$hasClassStub = class_exists(ClassStub::class); + } } - public function getWrappedListener(): callable|array + public function getWrappedListener() { return $this->listener; } @@ -93,11 +93,13 @@ final class WrappedListener public function getInfo(string $eventName): array { - $this->stub ??= self::$hasClassStub ? new ClassStub($this->pretty.'()', $this->callableRef ?? $this->listener) : $this->pretty.'()'; + if (null === $this->stub) { + $this->stub = self::$hasClassStub ? new ClassStub($this->pretty.'()', $this->listener) : $this->pretty.'()'; + } return [ 'event' => $eventName, - 'priority' => $this->priority ??= $this->dispatcher?->getListenerPriority($eventName, $this->listener), + 'priority' => null !== $this->priority ? $this->priority : (null !== $this->dispatcher ? $this->dispatcher->getListenerPriority($eventName, $this->listener) : null), 'pretty' => $this->pretty, 'stub' => $this->stub, ]; @@ -108,7 +110,7 @@ final class WrappedListener $dispatcher = $this->dispatcher ?: $dispatcher; $this->called = true; - $this->priority ??= $dispatcher->getListenerPriority($eventName, $this->listener); + $this->priority = $dispatcher->getListenerPriority($eventName, $this->listener); $e = $this->stopwatch->start($this->name, 'event_listener'); @@ -122,21 +124,4 @@ final class WrappedListener $this->stoppedPropagation = true; } } - - private function parseListener(array $listener): array - { - if ($listener[0] instanceof \Closure) { - foreach ((new \ReflectionFunction($listener[0]))->getAttributes(\Closure::class) as $attribute) { - if ($name = $attribute->getArguments()['name'] ?? false) { - return [$name, $attribute->getArguments()['class'] ?? $name]; - } - } - } - - if (\is_object($listener[0])) { - return [get_debug_type($listener[0]), \get_class($listener[0])]; - } - - return [$listener[0], $listener[0]]; - } } diff --git a/vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php b/vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php index 13b4336a..6e7292b4 100644 --- a/vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php +++ b/vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php @@ -21,19 +21,25 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; */ class AddEventAliasesPass implements CompilerPassInterface { - private array $eventAliases; + private $eventAliases; + private $eventAliasesParameter; - public function __construct(array $eventAliases) + public function __construct(array $eventAliases, string $eventAliasesParameter = 'event_dispatcher.event_aliases') { + if (1 < \func_num_args()) { + trigger_deprecation('symfony/event-dispatcher', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); + } + $this->eventAliases = $eventAliases; + $this->eventAliasesParameter = $eventAliasesParameter; } public function process(ContainerBuilder $container): void { - $eventAliases = $container->hasParameter('event_dispatcher.event_aliases') ? $container->getParameter('event_dispatcher.event_aliases') : []; + $eventAliases = $container->hasParameter($this->eventAliasesParameter) ? $container->getParameter($this->eventAliasesParameter) : []; $container->setParameter( - 'event_dispatcher.event_aliases', + $this->eventAliasesParameter, array_merge($eventAliases, $this->eventAliases) ); } diff --git a/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php b/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php index 90bdeb4f..8eabe7d7 100644 --- a/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php +++ b/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php @@ -25,51 +25,80 @@ use Symfony\Contracts\EventDispatcher\Event; */ class RegisterListenersPass implements CompilerPassInterface { - private array $hotPathEvents = []; - private array $noPreloadEvents = []; + protected $dispatcherService; + protected $listenerTag; + protected $subscriberTag; + protected $eventAliasesParameter; + + private $hotPathEvents = []; + private $hotPathTagName = 'container.hot_path'; + private $noPreloadEvents = []; + private $noPreloadTagName = 'container.no_preload'; + + public function __construct(string $dispatcherService = 'event_dispatcher', string $listenerTag = 'kernel.event_listener', string $subscriberTag = 'kernel.event_subscriber', string $eventAliasesParameter = 'event_dispatcher.event_aliases') + { + if (0 < \func_num_args()) { + trigger_deprecation('symfony/event-dispatcher', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); + } + + $this->dispatcherService = $dispatcherService; + $this->listenerTag = $listenerTag; + $this->subscriberTag = $subscriberTag; + $this->eventAliasesParameter = $eventAliasesParameter; + } /** * @return $this */ - public function setHotPathEvents(array $hotPathEvents): static + public function setHotPathEvents(array $hotPathEvents) { $this->hotPathEvents = array_flip($hotPathEvents); + if (1 < \func_num_args()) { + trigger_deprecation('symfony/event-dispatcher', '5.4', 'Configuring "$tagName" in "%s" is deprecated.', __METHOD__); + $this->hotPathTagName = func_get_arg(1); + } + return $this; } /** * @return $this */ - public function setNoPreloadEvents(array $noPreloadEvents): static + public function setNoPreloadEvents(array $noPreloadEvents): self { $this->noPreloadEvents = array_flip($noPreloadEvents); + if (1 < \func_num_args()) { + trigger_deprecation('symfony/event-dispatcher', '5.4', 'Configuring "$tagName" in "%s" is deprecated.', __METHOD__); + $this->noPreloadTagName = func_get_arg(1); + } + return $this; } public function process(ContainerBuilder $container) { - if (!$container->hasDefinition('event_dispatcher') && !$container->hasAlias('event_dispatcher')) { + if (!$container->hasDefinition($this->dispatcherService) && !$container->hasAlias($this->dispatcherService)) { return; } $aliases = []; - if ($container->hasParameter('event_dispatcher.event_aliases')) { - $aliases = $container->getParameter('event_dispatcher.event_aliases'); + if ($container->hasParameter($this->eventAliasesParameter)) { + $aliases = $container->getParameter($this->eventAliasesParameter); } - $globalDispatcherDefinition = $container->findDefinition('event_dispatcher'); + $globalDispatcherDefinition = $container->findDefinition($this->dispatcherService); - foreach ($container->findTaggedServiceIds('kernel.event_listener', true) as $id => $events) { + foreach ($container->findTaggedServiceIds($this->listenerTag, true) as $id => $events) { $noPreload = 0; foreach ($events as $event) { $priority = $event['priority'] ?? 0; if (!isset($event['event'])) { - if ($container->getDefinition($id)->hasTag('kernel.event_subscriber')) { + if ($container->getDefinition($id)->hasTag($this->subscriberTag)) { continue; } @@ -99,20 +128,20 @@ class RegisterListenersPass implements CompilerPassInterface $dispatcherDefinition->addMethodCall('addListener', [$event['event'], [new ServiceClosureArgument(new Reference($id)), $event['method']], $priority]); if (isset($this->hotPathEvents[$event['event']])) { - $container->getDefinition($id)->addTag('container.hot_path'); + $container->getDefinition($id)->addTag($this->hotPathTagName); } elseif (isset($this->noPreloadEvents[$event['event']])) { ++$noPreload; } } if ($noPreload && \count($events) === $noPreload) { - $container->getDefinition($id)->addTag('container.no_preload'); + $container->getDefinition($id)->addTag($this->noPreloadTagName); } } $extractingDispatcher = new ExtractingEventDispatcher(); - foreach ($container->findTaggedServiceIds('kernel.event_subscriber', true) as $id => $tags) { + foreach ($container->findTaggedServiceIds($this->subscriberTag, true) as $id => $tags) { $def = $container->getDefinition($id); // We must assume that the class value has been correctly filled, even if the service is created by a factory @@ -150,13 +179,13 @@ class RegisterListenersPass implements CompilerPassInterface } if (isset($this->hotPathEvents[$args[0]])) { - $container->getDefinition($id)->addTag('container.hot_path'); + $container->getDefinition($id)->addTag($this->hotPathTagName); } elseif (isset($this->noPreloadEvents[$args[0]])) { ++$noPreload; } } if ($noPreload && \count($extractingDispatcher->listeners) === $noPreload) { - $container->getDefinition($id)->addTag('container.no_preload'); + $container->getDefinition($id)->addTag($this->noPreloadTagName); } $extractingDispatcher->listeners = []; ExtractingEventDispatcher::$aliases = []; @@ -174,7 +203,7 @@ class RegisterListenersPass implements CompilerPassInterface || $type->isBuiltin() || Event::class === ($name = $type->getName()) ) { - throw new InvalidArgumentException(sprintf('Service "%s" must define the "event" attribute on "kernel.event_listener" tags.', $id)); + throw new InvalidArgumentException(sprintf('Service "%s" must define the "event" attribute on "%s" tags.', $id, $this->listenerTag)); } return $name; @@ -186,12 +215,12 @@ class RegisterListenersPass implements CompilerPassInterface */ class ExtractingEventDispatcher extends EventDispatcher implements EventSubscriberInterface { - public array $listeners = []; + public $listeners = []; - public static array $aliases = []; - public static string $subscriber; + public static $aliases = []; + public static $subscriber; - public function addListener(string $eventName, callable|array $listener, int $priority = 0) + public function addListener(string $eventName, $listener, int $priority = 0) { $this->listeners[] = [$eventName, $listener[1], $priority]; } diff --git a/vendor/symfony/event-dispatcher/EventDispatcher.php b/vendor/symfony/event-dispatcher/EventDispatcher.php index 28ab1081..8fe8fb5c 100644 --- a/vendor/symfony/event-dispatcher/EventDispatcher.php +++ b/vendor/symfony/event-dispatcher/EventDispatcher.php @@ -31,9 +31,9 @@ use Symfony\Component\EventDispatcher\Debug\WrappedListener; */ class EventDispatcher implements EventDispatcherInterface { - private array $listeners = []; - private array $sorted = []; - private array $optimized; + private $listeners = []; + private $sorted = []; + private $optimized; public function __construct() { @@ -47,9 +47,9 @@ class EventDispatcher implements EventDispatcherInterface */ public function dispatch(object $event, string $eventName = null): object { - $eventName ??= \get_class($event); + $eventName = $eventName ?? \get_class($event); - if (isset($this->optimized)) { + if (null !== $this->optimized) { $listeners = $this->optimized[$eventName] ?? (empty($this->listeners[$eventName]) ? [] : $this->optimizeListeners($eventName)); } else { $listeners = $this->getListeners($eventName); @@ -65,7 +65,7 @@ class EventDispatcher implements EventDispatcherInterface /** * {@inheritdoc} */ - public function getListeners(string $eventName = null): array + public function getListeners(string $eventName = null) { if (null !== $eventName) { if (empty($this->listeners[$eventName])) { @@ -91,7 +91,7 @@ class EventDispatcher implements EventDispatcherInterface /** * {@inheritdoc} */ - public function getListenerPriority(string $eventName, callable|array $listener): ?int + public function getListenerPriority(string $eventName, $listener) { if (empty($this->listeners[$eventName])) { return null; @@ -99,14 +99,14 @@ class EventDispatcher implements EventDispatcherInterface if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { $listener[0] = $listener[0](); - $listener[1] ??= '__invoke'; + $listener[1] = $listener[1] ?? '__invoke'; } foreach ($this->listeners[$eventName] as $priority => &$listeners) { foreach ($listeners as &$v) { if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure && 2 >= \count($v)) { $v[0] = $v[0](); - $v[1] ??= '__invoke'; + $v[1] = $v[1] ?? '__invoke'; } if ($v === $listener || ($listener instanceof \Closure && $v == $listener)) { return $priority; @@ -120,7 +120,7 @@ class EventDispatcher implements EventDispatcherInterface /** * {@inheritdoc} */ - public function hasListeners(string $eventName = null): bool + public function hasListeners(string $eventName = null) { if (null !== $eventName) { return !empty($this->listeners[$eventName]); @@ -138,7 +138,7 @@ class EventDispatcher implements EventDispatcherInterface /** * {@inheritdoc} */ - public function addListener(string $eventName, callable|array $listener, int $priority = 0) + public function addListener(string $eventName, $listener, int $priority = 0) { $this->listeners[$eventName][$priority][] = $listener; unset($this->sorted[$eventName], $this->optimized[$eventName]); @@ -147,7 +147,7 @@ class EventDispatcher implements EventDispatcherInterface /** * {@inheritdoc} */ - public function removeListener(string $eventName, callable|array $listener) + public function removeListener(string $eventName, $listener) { if (empty($this->listeners[$eventName])) { return; @@ -155,14 +155,14 @@ class EventDispatcher implements EventDispatcherInterface if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { $listener[0] = $listener[0](); - $listener[1] ??= '__invoke'; + $listener[1] = $listener[1] ?? '__invoke'; } foreach ($this->listeners[$eventName] as $priority => &$listeners) { foreach ($listeners as $k => &$v) { if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure && 2 >= \count($v)) { $v[0] = $v[0](); - $v[1] ??= '__invoke'; + $v[1] = $v[1] ?? '__invoke'; } if ($v === $listener || ($listener instanceof \Closure && $v == $listener)) { unset($listeners[$k], $this->sorted[$eventName], $this->optimized[$eventName]); @@ -240,10 +240,10 @@ class EventDispatcher implements EventDispatcherInterface $this->sorted[$eventName] = []; foreach ($this->listeners[$eventName] as &$listeners) { - foreach ($listeners as &$listener) { + foreach ($listeners as $k => &$listener) { if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { $listener[0] = $listener[0](); - $listener[1] ??= '__invoke'; + $listener[1] = $listener[1] ?? '__invoke'; } $this->sorted[$eventName][] = $listener; } @@ -265,12 +265,12 @@ class EventDispatcher implements EventDispatcherInterface $closure = static function (...$args) use (&$listener, &$closure) { if ($listener[0] instanceof \Closure) { $listener[0] = $listener[0](); - $listener[1] ??= '__invoke'; + $listener[1] = $listener[1] ?? '__invoke'; } - ($closure = $listener(...))(...$args); + ($closure = \Closure::fromCallable($listener))(...$args); }; } else { - $closure = $listener instanceof WrappedListener ? $listener : $listener(...); + $closure = $listener instanceof \Closure || $listener instanceof WrappedListener ? $listener : \Closure::fromCallable($listener); } } } diff --git a/vendor/symfony/event-dispatcher/EventDispatcherInterface.php b/vendor/symfony/event-dispatcher/EventDispatcherInterface.php index 97a3017a..cc324e1c 100644 --- a/vendor/symfony/event-dispatcher/EventDispatcherInterface.php +++ b/vendor/symfony/event-dispatcher/EventDispatcherInterface.php @@ -50,17 +50,21 @@ interface EventDispatcherInterface extends ContractsEventDispatcherInterface * * @return array */ - public function getListeners(string $eventName = null): array; + public function getListeners(string $eventName = null); /** * Gets the listener priority for a specific event. * * Returns null if the event or the listener does not exist. + * + * @return int|null */ - public function getListenerPriority(string $eventName, callable $listener): ?int; + public function getListenerPriority(string $eventName, callable $listener); /** * Checks whether an event has any registered listeners. + * + * @return bool */ - public function hasListeners(string $eventName = null): bool; + public function hasListeners(string $eventName = null); } diff --git a/vendor/symfony/event-dispatcher/GenericEvent.php b/vendor/symfony/event-dispatcher/GenericEvent.php index 68a20306..b32a301a 100644 --- a/vendor/symfony/event-dispatcher/GenericEvent.php +++ b/vendor/symfony/event-dispatcher/GenericEvent.php @@ -34,7 +34,7 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate * @param mixed $subject The subject of the event, usually an object or a callable * @param array $arguments Arguments to store in the event */ - public function __construct(mixed $subject = null, array $arguments = []) + public function __construct($subject = null, array $arguments = []) { $this->subject = $subject; $this->arguments = $arguments; @@ -42,8 +42,10 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate /** * Getter for subject property. + * + * @return mixed */ - public function getSubject(): mixed + public function getSubject() { return $this->subject; } @@ -51,9 +53,11 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate /** * Get argument by key. * + * @return mixed + * * @throws \InvalidArgumentException if key is not found */ - public function getArgument(string $key): mixed + public function getArgument(string $key) { if ($this->hasArgument($key)) { return $this->arguments[$key]; @@ -65,9 +69,11 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate /** * Add argument to event. * + * @param mixed $value Value + * * @return $this */ - public function setArgument(string $key, mixed $value): static + public function setArgument(string $key, $value) { $this->arguments[$key] = $value; @@ -76,8 +82,10 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate /** * Getter for all arguments. + * + * @return array */ - public function getArguments(): array + public function getArguments() { return $this->arguments; } @@ -87,7 +95,7 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate * * @return $this */ - public function setArguments(array $args = []): static + public function setArguments(array $args = []) { $this->arguments = $args; @@ -96,8 +104,10 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate /** * Has argument. + * + * @return bool */ - public function hasArgument(string $key): bool + public function hasArgument(string $key) { return \array_key_exists($key, $this->arguments); } @@ -107,9 +117,12 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate * * @param string $key Array key * + * @return mixed + * * @throws \InvalidArgumentException if key does not exist in $this->args */ - public function offsetGet(mixed $key): mixed + #[\ReturnTypeWillChange] + public function offsetGet($key) { return $this->getArgument($key); } @@ -117,9 +130,13 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate /** * ArrayAccess for argument setter. * - * @param string $key Array key to set + * @param string $key Array key to set + * @param mixed $value Value + * + * @return void */ - public function offsetSet(mixed $key, mixed $value): void + #[\ReturnTypeWillChange] + public function offsetSet($key, $value) { $this->setArgument($key, $value); } @@ -128,8 +145,11 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate * ArrayAccess for unset argument. * * @param string $key Array key + * + * @return void */ - public function offsetUnset(mixed $key): void + #[\ReturnTypeWillChange] + public function offsetUnset($key) { if ($this->hasArgument($key)) { unset($this->arguments[$key]); @@ -140,8 +160,11 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate * ArrayAccess has argument. * * @param string $key Array key + * + * @return bool */ - public function offsetExists(mixed $key): bool + #[\ReturnTypeWillChange] + public function offsetExists($key) { return $this->hasArgument($key); } @@ -151,7 +174,8 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate * * @return \ArrayIterator */ - public function getIterator(): \ArrayIterator + #[\ReturnTypeWillChange] + public function getIterator() { return new \ArrayIterator($this->arguments); } diff --git a/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php b/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php index a5435828..568d79c3 100644 --- a/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php +++ b/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php @@ -18,7 +18,7 @@ namespace Symfony\Component\EventDispatcher; */ class ImmutableEventDispatcher implements EventDispatcherInterface { - private EventDispatcherInterface $dispatcher; + private $dispatcher; public function __construct(EventDispatcherInterface $dispatcher) { @@ -36,7 +36,7 @@ class ImmutableEventDispatcher implements EventDispatcherInterface /** * {@inheritdoc} */ - public function addListener(string $eventName, callable|array $listener, int $priority = 0) + public function addListener(string $eventName, $listener, int $priority = 0) { throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); } @@ -52,7 +52,7 @@ class ImmutableEventDispatcher implements EventDispatcherInterface /** * {@inheritdoc} */ - public function removeListener(string $eventName, callable|array $listener) + public function removeListener(string $eventName, $listener) { throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); } @@ -68,7 +68,7 @@ class ImmutableEventDispatcher implements EventDispatcherInterface /** * {@inheritdoc} */ - public function getListeners(string $eventName = null): array + public function getListeners(string $eventName = null) { return $this->dispatcher->getListeners($eventName); } @@ -76,7 +76,7 @@ class ImmutableEventDispatcher implements EventDispatcherInterface /** * {@inheritdoc} */ - public function getListenerPriority(string $eventName, callable|array $listener): ?int + public function getListenerPriority(string $eventName, $listener) { return $this->dispatcher->getListenerPriority($eventName, $listener); } @@ -84,7 +84,7 @@ class ImmutableEventDispatcher implements EventDispatcherInterface /** * {@inheritdoc} */ - public function hasListeners(string $eventName = null): bool + public function hasListeners(string $eventName = null) { return $this->dispatcher->hasListeners($eventName); } diff --git a/vendor/symfony/event-dispatcher/LegacyEventDispatcherProxy.php b/vendor/symfony/event-dispatcher/LegacyEventDispatcherProxy.php new file mode 100644 index 00000000..6e17c8fc --- /dev/null +++ b/vendor/symfony/event-dispatcher/LegacyEventDispatcherProxy.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher; + +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; + +trigger_deprecation('symfony/event-dispatcher', '5.1', '%s is deprecated, use the event dispatcher without the proxy.', LegacyEventDispatcherProxy::class); + +/** + * A helper class to provide BC/FC with the legacy signature of EventDispatcherInterface::dispatch(). + * + * @author Nicolas Grekas + * + * @deprecated since Symfony 5.1 + */ +final class LegacyEventDispatcherProxy +{ + public static function decorate(?EventDispatcherInterface $dispatcher): ?EventDispatcherInterface + { + return $dispatcher; + } +} diff --git a/vendor/symfony/event-dispatcher/composer.json b/vendor/symfony/event-dispatcher/composer.json index c05373f3..32b42e40 100644 --- a/vendor/symfony/event-dispatcher/composer.json +++ b/vendor/symfony/event-dispatcher/composer.json @@ -16,25 +16,27 @@ } ], "require": { - "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2|^3" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", + "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/config": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^5.4|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", "psr/log": "^1|^2|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<4.4" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0|3.0" + "symfony/event-dispatcher-implementation": "2.0" }, "suggest": { "symfony/dependency-injection": "", diff --git a/vendor/symfony/options-resolver/CHANGELOG.md b/vendor/symfony/options-resolver/CHANGELOG.md index 791a402f..84c45946 100644 --- a/vendor/symfony/options-resolver/CHANGELOG.md +++ b/vendor/symfony/options-resolver/CHANGELOG.md @@ -1,11 +1,6 @@ CHANGELOG ========= -6.0 ---- - - * Remove `OptionsResolverIntrospector::getDeprecationMessage()` - 5.3 --- diff --git a/vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.php b/vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.php index 837fae08..95909f32 100644 --- a/vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.php +++ b/vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.php @@ -41,9 +41,11 @@ class OptionsResolverIntrospector } /** + * @return mixed + * * @throws NoConfigurationException on no configured value */ - public function getDefault(string $option): mixed + public function getDefault(string $option) { return ($this->get)('defaults', $option, sprintf('No default value was set for the "%s" option.', $option)); } @@ -94,6 +96,20 @@ class OptionsResolverIntrospector return ($this->get)('normalizers', $option, sprintf('No normalizer was set for the "%s" option.', $option)); } + /** + * @return string|\Closure + * + * @throws NoConfigurationException on no configured deprecation + * + * @deprecated since Symfony 5.1, use "getDeprecation()" instead. + */ + public function getDeprecationMessage(string $option) + { + trigger_deprecation('symfony/options-resolver', '5.1', 'The "%s()" method is deprecated, use "getDeprecation()" instead.', __METHOD__); + + return $this->getDeprecation($option)['message']; + } + /** * @throws NoConfigurationException on no configured deprecation */ diff --git a/vendor/symfony/options-resolver/OptionConfigurator.php b/vendor/symfony/options-resolver/OptionConfigurator.php index 37d51384..62f03d06 100644 --- a/vendor/symfony/options-resolver/OptionConfigurator.php +++ b/vendor/symfony/options-resolver/OptionConfigurator.php @@ -32,7 +32,7 @@ final class OptionConfigurator * * @throws AccessException If called from a lazy option or normalizer */ - public function allowedTypes(string ...$types): static + public function allowedTypes(string ...$types): self { $this->resolver->setAllowedTypes($this->name, $types); @@ -48,7 +48,7 @@ final class OptionConfigurator * * @throws AccessException If called from a lazy option or normalizer */ - public function allowedValues(mixed ...$values): static + public function allowedValues(...$values): self { $this->resolver->setAllowedValues($this->name, $values); @@ -58,11 +58,13 @@ final class OptionConfigurator /** * Sets the default value for this option. * + * @param mixed $value The default value of the option + * * @return $this * * @throws AccessException If called from a lazy option or normalizer */ - public function default(mixed $value): static + public function default($value): self { $this->resolver->setDefault($this->name, $value); @@ -86,7 +88,7 @@ final class OptionConfigurator * * @return $this */ - public function deprecated(string $package, string $version, string|\Closure $message = 'The option "%name%" is deprecated.'): static + public function deprecated(string $package, string $version, $message = 'The option "%name%" is deprecated.'): self { $this->resolver->setDeprecated($this->name, $package, $version, $message); @@ -100,7 +102,7 @@ final class OptionConfigurator * * @throws AccessException If called from a lazy option or normalizer */ - public function normalize(\Closure $normalizer): static + public function normalize(\Closure $normalizer): self { $this->resolver->setNormalizer($this->name, $normalizer); @@ -114,7 +116,7 @@ final class OptionConfigurator * * @throws AccessException If called from a lazy option or normalizer */ - public function required(): static + public function required(): self { $this->resolver->setRequired($this->name); @@ -128,7 +130,7 @@ final class OptionConfigurator * * @throws AccessException If called from a lazy option or normalizer */ - public function info(string $info): static + public function info(string $info): self { $this->resolver->setInfo($this->name, $info); diff --git a/vendor/symfony/options-resolver/OptionsResolver.php b/vendor/symfony/options-resolver/OptionsResolver.php index 205c15b4..3db291f9 100644 --- a/vendor/symfony/options-resolver/OptionsResolver.php +++ b/vendor/symfony/options-resolver/OptionsResolver.php @@ -187,11 +187,14 @@ class OptionsResolver implements Options * // 'default' === $parent['connection'] * } * + * @param string $option The name of the option + * @param mixed $value The default value of the option + * * @return $this * * @throws AccessException If called from a lazy option or normalizer */ - public function setDefault(string $option, mixed $value): static + public function setDefault(string $option, $value) { // Setting is not possible once resolving starts, because then lazy // options could manipulate the state of the object, leading to @@ -262,7 +265,7 @@ class OptionsResolver implements Options * * @throws AccessException If called from a lazy option or normalizer */ - public function setDefaults(array $defaults): static + public function setDefaults(array $defaults) { foreach ($defaults as $option => $value) { $this->setDefault($option, $value); @@ -276,8 +279,10 @@ class OptionsResolver implements Options * * Returns true if {@link setDefault()} was called for this option. * An option is also considered set if it was set to null. + * + * @return bool */ - public function hasDefault(string $option): bool + public function hasDefault(string $option) { return \array_key_exists($option, $this->defaults); } @@ -291,7 +296,7 @@ class OptionsResolver implements Options * * @throws AccessException If called from a lazy option or normalizer */ - public function setRequired(string|array $optionNames): static + public function setRequired($optionNames) { if ($this->locked) { throw new AccessException('Options cannot be made required from a lazy option or normalizer.'); @@ -309,8 +314,10 @@ class OptionsResolver implements Options * Returns whether an option is required. * * An option is required if it was passed to {@link setRequired()}. + * + * @return bool */ - public function isRequired(string $option): bool + public function isRequired(string $option) { return isset($this->required[$option]); } @@ -322,7 +329,7 @@ class OptionsResolver implements Options * * @see isRequired() */ - public function getRequiredOptions(): array + public function getRequiredOptions() { return array_keys($this->required); } @@ -333,8 +340,10 @@ class OptionsResolver implements Options * An option is missing if it was passed to {@link setRequired()}, but not * to {@link setDefault()}. This option must be passed explicitly to * {@link resolve()}, otherwise an exception will be thrown. + * + * @return bool */ - public function isMissing(string $option): bool + public function isMissing(string $option) { return isset($this->required[$option]) && !\array_key_exists($option, $this->defaults); } @@ -344,7 +353,7 @@ class OptionsResolver implements Options * * @return string[] */ - public function getMissingOptions(): array + public function getMissingOptions() { return array_keys(array_diff_key($this->required, $this->defaults)); } @@ -362,7 +371,7 @@ class OptionsResolver implements Options * * @throws AccessException If called from a lazy option or normalizer */ - public function setDefined(string|array $optionNames): static + public function setDefined($optionNames) { if ($this->locked) { throw new AccessException('Options cannot be defined from a lazy option or normalizer.'); @@ -380,8 +389,10 @@ class OptionsResolver implements Options * * Returns true for any option passed to {@link setDefault()}, * {@link setRequired()} or {@link setDefined()}. + * + * @return bool */ - public function isDefined(string $option): bool + public function isDefined(string $option) { return isset($this->defined[$option]); } @@ -393,7 +404,7 @@ class OptionsResolver implements Options * * @see isDefined() */ - public function getDefinedOptions(): array + public function getDefinedOptions() { return array_keys($this->defined); } @@ -426,7 +437,7 @@ class OptionsResolver implements Options * * @return $this */ - public function setDeprecated(string $option, string $package, string $version, string|\Closure $message = 'The option "%name%" is deprecated.'): static + public function setDeprecated(string $option/* , string $package, string $version, $message = 'The option "%name%" is deprecated.' */): self { if ($this->locked) { throw new AccessException('Options cannot be deprecated from a lazy option or normalizer.'); @@ -436,6 +447,19 @@ class OptionsResolver implements Options throw new UndefinedOptionsException(sprintf('The option "%s" does not exist, defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined)))); } + $args = \func_get_args(); + + if (\func_num_args() < 3) { + trigger_deprecation('symfony/options-resolver', '5.1', 'The signature of method "%s()" requires 2 new arguments: "string $package, string $version", not defining them is deprecated.', __METHOD__); + + $message = $args[1] ?? 'The option "%name%" is deprecated.'; + $package = $version = ''; + } else { + $package = $args[1]; + $version = $args[2]; + $message = $args[3] ?? 'The option "%name%" is deprecated.'; + } + if (!\is_string($message) && !$message instanceof \Closure) { throw new InvalidArgumentException(sprintf('Invalid type for deprecation message argument, expected string or \Closure, but got "%s".', get_debug_type($message))); } @@ -526,7 +550,7 @@ class OptionsResolver implements Options * @throws UndefinedOptionsException If the option is undefined * @throws AccessException If called from a lazy option or normalizer */ - public function addNormalizer(string $option, \Closure $normalizer, bool $forcePrepend = false): static + public function addNormalizer(string $option, \Closure $normalizer, bool $forcePrepend = false): self { if ($this->locked) { throw new AccessException('Normalizers cannot be set from a lazy option or normalizer.'); @@ -562,14 +586,15 @@ class OptionsResolver implements Options * The closure receives the value as argument and should return true to * accept the value and false to reject the value. * - * @param mixed $allowedValues One or more acceptable values/closures + * @param string $option The option name + * @param mixed $allowedValues One or more acceptable values/closures * * @return $this * * @throws UndefinedOptionsException If the option is undefined * @throws AccessException If called from a lazy option or normalizer */ - public function setAllowedValues(string $option, mixed $allowedValues) + public function setAllowedValues(string $option, $allowedValues) { if ($this->locked) { throw new AccessException('Allowed values cannot be set from a lazy option or normalizer.'); @@ -602,14 +627,15 @@ class OptionsResolver implements Options * The closure receives the value as argument and should return true to * accept the value and false to reject the value. * - * @param mixed $allowedValues One or more acceptable values/closures + * @param string $option The option name + * @param mixed $allowedValues One or more acceptable values/closures * * @return $this * * @throws UndefinedOptionsException If the option is undefined * @throws AccessException If called from a lazy option or normalizer */ - public function addAllowedValues(string $option, mixed $allowedValues) + public function addAllowedValues(string $option, $allowedValues) { if ($this->locked) { throw new AccessException('Allowed values cannot be added from a lazy option or normalizer.'); @@ -649,7 +675,7 @@ class OptionsResolver implements Options * @throws UndefinedOptionsException If the option is undefined * @throws AccessException If called from a lazy option or normalizer */ - public function setAllowedTypes(string $option, string|array $allowedTypes) + public function setAllowedTypes(string $option, $allowedTypes) { if ($this->locked) { throw new AccessException('Allowed types cannot be set from a lazy option or normalizer.'); @@ -683,7 +709,7 @@ class OptionsResolver implements Options * @throws UndefinedOptionsException If the option is undefined * @throws AccessException If called from a lazy option or normalizer */ - public function addAllowedTypes(string $option, string|array $allowedTypes) + public function addAllowedTypes(string $option, $allowedTypes) { if ($this->locked) { throw new AccessException('Allowed types cannot be added from a lazy option or normalizer.'); @@ -725,7 +751,7 @@ class OptionsResolver implements Options * @throws UndefinedOptionsException If the option is undefined * @throws AccessException If called from a lazy option or normalizer */ - public function setInfo(string $option, string $info): static + public function setInfo(string $option, string $info): self { if ($this->locked) { throw new AccessException('The Info message cannot be set from a lazy option or normalizer.'); @@ -759,7 +785,7 @@ class OptionsResolver implements Options * * @throws AccessException If called from a lazy option, a normalizer or a root definition */ - public function setPrototype(bool $prototype): static + public function setPrototype(bool $prototype): self { if ($this->locked) { throw new AccessException('The prototype property cannot be set from a lazy option or normalizer.'); @@ -790,7 +816,7 @@ class OptionsResolver implements Options * * @throws AccessException If called from a lazy option or normalizer */ - public function remove(string|array $optionNames): static + public function remove($optionNames) { if ($this->locked) { throw new AccessException('Options cannot be removed from a lazy option or normalizer.'); @@ -811,7 +837,7 @@ class OptionsResolver implements Options * * @throws AccessException If called from a lazy option or normalizer */ - public function clear(): static + public function clear() { if ($this->locked) { throw new AccessException('Options cannot be cleared from a lazy option or normalizer.'); @@ -843,6 +869,8 @@ class OptionsResolver implements Options * - Options have invalid types; * - Options have invalid values. * + * @return array + * * @throws UndefinedOptionsException If an option name is undefined * @throws InvalidOptionsException If an option doesn't fulfill the * specified validation rules @@ -852,7 +880,7 @@ class OptionsResolver implements Options * @throws NoSuchOptionException If a lazy option reads an unavailable option * @throws AccessException If called from a lazy option or normalizer */ - public function resolve(array $options = []): array + public function resolve(array $options = []) { if ($this->locked) { throw new AccessException('Options cannot be resolved from a lazy option or normalizer.'); @@ -904,6 +932,8 @@ class OptionsResolver implements Options * * @param bool $triggerDeprecation Whether to trigger the deprecation or not (true by default) * + * @return mixed + * * @throws AccessException If accessing this method outside of * {@link resolve()} * @throws NoSuchOptionException If the option is not set @@ -912,7 +942,8 @@ class OptionsResolver implements Options * @throws OptionDefinitionException If there is a cyclic dependency between * lazy options and/or normalizers */ - public function offsetGet(mixed $option, bool $triggerDeprecation = true): mixed + #[\ReturnTypeWillChange] + public function offsetGet($option, bool $triggerDeprecation = true) { if (!$this->locked) { throw new AccessException('Array access is only supported within closures of lazy options and normalizers.'); @@ -1132,9 +1163,9 @@ class OptionsResolver implements Options return $value; } - private function verifyTypes(string $type, mixed $value, array &$invalidTypes, int $level = 0): bool + private function verifyTypes(string $type, $value, array &$invalidTypes, int $level = 0): bool { - if (\is_array($value) && str_ends_with($type, '[]')) { + if (\is_array($value) && '[]' === substr($type, -2)) { $type = substr($type, 0, -2); $valid = true; @@ -1161,11 +1192,16 @@ class OptionsResolver implements Options /** * Returns whether a resolved option with the given name exists. * + * @param string $option The option name + * + * @return bool + * * @throws AccessException If accessing this method outside of {@link resolve()} * * @see \ArrayAccess::offsetExists() */ - public function offsetExists(mixed $option): bool + #[\ReturnTypeWillChange] + public function offsetExists($option) { if (!$this->locked) { throw new AccessException('Array access is only supported within closures of lazy options and normalizers.'); @@ -1177,9 +1213,12 @@ class OptionsResolver implements Options /** * Not supported. * + * @return void + * * @throws AccessException */ - public function offsetSet(mixed $option, mixed $value): void + #[\ReturnTypeWillChange] + public function offsetSet($option, $value) { throw new AccessException('Setting options via array access is not supported. Use setDefault() instead.'); } @@ -1187,9 +1226,12 @@ class OptionsResolver implements Options /** * Not supported. * + * @return void + * * @throws AccessException */ - public function offsetUnset(mixed $option): void + #[\ReturnTypeWillChange] + public function offsetUnset($option) { throw new AccessException('Removing options via array access is not supported. Use remove() instead.'); } @@ -1199,11 +1241,14 @@ class OptionsResolver implements Options * * This may be only a subset of the defined options. * + * @return int + * * @throws AccessException If accessing this method outside of {@link resolve()} * * @see \Countable::count() */ - public function count(): int + #[\ReturnTypeWillChange] + public function count() { if (!$this->locked) { throw new AccessException('Counting is only supported within closures of lazy options and normalizers.'); @@ -1218,8 +1263,10 @@ class OptionsResolver implements Options * This method returns the equivalent PHP tokens for most scalar types * (i.e. "false" for false, "1" for 1 etc.). Strings are always wrapped * in double quotes ("). + * + * @param mixed $value The value to format as string */ - private function formatValue(mixed $value): string + private function formatValue($value): string { if (\is_object($value)) { return \get_class($value); diff --git a/vendor/symfony/options-resolver/composer.json b/vendor/symfony/options-resolver/composer.json index 3355b24e..a38d1bd0 100644 --- a/vendor/symfony/options-resolver/composer.json +++ b/vendor/symfony/options-resolver/composer.json @@ -16,8 +16,10 @@ } ], "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.16" }, "autoload": { "psr-4": { "Symfony\\Component\\OptionsResolver\\": "" }, diff --git a/vendor/symfony/string/AbstractString.php b/vendor/symfony/string/AbstractString.php index 29322127..13567c7b 100644 --- a/vendor/symfony/string/AbstractString.php +++ b/vendor/symfony/string/AbstractString.php @@ -74,7 +74,7 @@ abstract class AbstractString implements \Stringable, \JsonSerializable foreach ($values as $k => $v) { if (\is_string($k) && '' !== $k && $k !== $j = (string) new static($k)) { - $keys ??= array_keys($values); + $keys = $keys ?? array_keys($values); $keys[$i] = $j; } @@ -92,17 +92,15 @@ abstract class AbstractString implements \Stringable, \JsonSerializable /** * @param string|string[] $needle + * + * @return static */ - public function after(string|iterable $needle, bool $includeNeedle = false, int $offset = 0): static + public function after($needle, bool $includeNeedle = false, int $offset = 0): self { $str = clone $this; $i = \PHP_INT_MAX; - if (\is_string($needle)) { - $needle = [$needle]; - } - - foreach ($needle as $n) { + foreach ((array) $needle as $n) { $n = (string) $n; $j = $this->indexOf($n, $offset); @@ -125,17 +123,15 @@ abstract class AbstractString implements \Stringable, \JsonSerializable /** * @param string|string[] $needle + * + * @return static */ - public function afterLast(string|iterable $needle, bool $includeNeedle = false, int $offset = 0): static + public function afterLast($needle, bool $includeNeedle = false, int $offset = 0): self { $str = clone $this; $i = null; - if (\is_string($needle)) { - $needle = [$needle]; - } - - foreach ($needle as $n) { + foreach ((array) $needle as $n) { $n = (string) $n; $j = $this->indexOfLast($n, $offset); @@ -156,21 +152,22 @@ abstract class AbstractString implements \Stringable, \JsonSerializable return $this->slice($i); } - abstract public function append(string ...$suffix): static; + /** + * @return static + */ + abstract public function append(string ...$suffix): self; /** * @param string|string[] $needle + * + * @return static */ - public function before(string|iterable $needle, bool $includeNeedle = false, int $offset = 0): static + public function before($needle, bool $includeNeedle = false, int $offset = 0): self { $str = clone $this; $i = \PHP_INT_MAX; - if (\is_string($needle)) { - $needle = [$needle]; - } - - foreach ($needle as $n) { + foreach ((array) $needle as $n) { $n = (string) $n; $j = $this->indexOf($n, $offset); @@ -193,17 +190,15 @@ abstract class AbstractString implements \Stringable, \JsonSerializable /** * @param string|string[] $needle + * + * @return static */ - public function beforeLast(string|iterable $needle, bool $includeNeedle = false, int $offset = 0): static + public function beforeLast($needle, bool $includeNeedle = false, int $offset = 0): self { $str = clone $this; $i = null; - if (\is_string($needle)) { - $needle = [$needle]; - } - - foreach ($needle as $n) { + foreach ((array) $needle as $n) { $n = (string) $n; $j = $this->indexOfLast($n, $offset); @@ -234,14 +229,20 @@ abstract class AbstractString implements \Stringable, \JsonSerializable return '' === $str->string ? [] : array_values(unpack('C*', $str->string)); } - abstract public function camel(): static; + /** + * @return static + */ + abstract public function camel(): self; /** * @return static[] */ abstract public function chunk(int $length = 1): array; - public function collapseWhitespace(): static + /** + * @return static + */ + public function collapseWhitespace(): self { $str = clone $this; $str->string = trim(preg_replace("/(?:[ \n\r\t\x0C]{2,}+|[\n\r\t\x0C])/", ' ', $str->string), " \n\r\t\x0C"); @@ -252,7 +253,7 @@ abstract class AbstractString implements \Stringable, \JsonSerializable /** * @param string|string[] $needle */ - public function containsAny(string|iterable $needle): bool + public function containsAny($needle): bool { return null !== $this->indexOf($needle); } @@ -260,9 +261,9 @@ abstract class AbstractString implements \Stringable, \JsonSerializable /** * @param string|string[] $suffix */ - public function endsWith(string|iterable $suffix): bool + public function endsWith($suffix): bool { - if (\is_string($suffix)) { + if (!\is_array($suffix) && !$suffix instanceof \Traversable) { throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); } @@ -275,7 +276,10 @@ abstract class AbstractString implements \Stringable, \JsonSerializable return false; } - public function ensureEnd(string $suffix): static + /** + * @return static + */ + public function ensureEnd(string $suffix): self { if (!$this->endsWith($suffix)) { return $this->append($suffix); @@ -287,7 +291,10 @@ abstract class AbstractString implements \Stringable, \JsonSerializable return $this->replaceMatches($regex.($this->ignoreCase ? 'i' : ''), '$1'); } - public function ensureStart(string $prefix): static + /** + * @return static + */ + public function ensureStart(string $prefix): self { $prefix = new static($prefix); @@ -309,9 +316,9 @@ abstract class AbstractString implements \Stringable, \JsonSerializable /** * @param string|string[] $string */ - public function equalsTo(string|iterable $string): bool + public function equalsTo($string): bool { - if (\is_string($string)) { + if (!\is_array($string) && !$string instanceof \Traversable) { throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); } @@ -324,9 +331,15 @@ abstract class AbstractString implements \Stringable, \JsonSerializable return false; } - abstract public function folded(): static; + /** + * @return static + */ + abstract public function folded(): self; - public function ignoreCase(): static + /** + * @return static + */ + public function ignoreCase(): self { $str = clone $this; $str->ignoreCase = true; @@ -337,9 +350,9 @@ abstract class AbstractString implements \Stringable, \JsonSerializable /** * @param string|string[] $needle */ - public function indexOf(string|iterable $needle, int $offset = 0): ?int + public function indexOf($needle, int $offset = 0): ?int { - if (\is_string($needle)) { + if (!\is_array($needle) && !$needle instanceof \Traversable) { throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); } @@ -359,9 +372,9 @@ abstract class AbstractString implements \Stringable, \JsonSerializable /** * @param string|string[] $needle */ - public function indexOfLast(string|iterable $needle, int $offset = 0): ?int + public function indexOfLast($needle, int $offset = 0): ?int { - if (\is_string($needle)) { + if (!\is_array($needle) && !$needle instanceof \Traversable) { throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); } @@ -383,7 +396,10 @@ abstract class AbstractString implements \Stringable, \JsonSerializable return '' === $this->string; } - abstract public function join(array $strings, string $lastGlue = null): static; + /** + * @return static + */ + abstract public function join(array $strings, string $lastGlue = null): self; public function jsonSerialize(): string { @@ -392,7 +408,10 @@ abstract class AbstractString implements \Stringable, \JsonSerializable abstract public function length(): int; - abstract public function lower(): static; + /** + * @return static + */ + abstract public function lower(): self; /** * Matches the string using a regular expression. @@ -403,15 +422,30 @@ abstract class AbstractString implements \Stringable, \JsonSerializable */ abstract public function match(string $regexp, int $flags = 0, int $offset = 0): array; - abstract public function padBoth(int $length, string $padStr = ' '): static; + /** + * @return static + */ + abstract public function padBoth(int $length, string $padStr = ' '): self; - abstract public function padEnd(int $length, string $padStr = ' '): static; + /** + * @return static + */ + abstract public function padEnd(int $length, string $padStr = ' '): self; - abstract public function padStart(int $length, string $padStr = ' '): static; + /** + * @return static + */ + abstract public function padStart(int $length, string $padStr = ' '): self; - abstract public function prepend(string ...$prefix): static; + /** + * @return static + */ + abstract public function prepend(string ...$prefix): self; - public function repeat(int $multiplier): static + /** + * @return static + */ + public function repeat(int $multiplier): self { if (0 > $multiplier) { throw new InvalidArgumentException(sprintf('Multiplier must be positive, %d given.', $multiplier)); @@ -423,17 +457,37 @@ abstract class AbstractString implements \Stringable, \JsonSerializable return $str; } - abstract public function replace(string $from, string $to): static; + /** + * @return static + */ + abstract public function replace(string $from, string $to): self; - abstract public function replaceMatches(string $fromRegexp, string|callable $to): static; + /** + * @param string|callable $to + * + * @return static + */ + abstract public function replaceMatches(string $fromRegexp, $to): self; - abstract public function reverse(): static; + /** + * @return static + */ + abstract public function reverse(): self; - abstract public function slice(int $start = 0, int $length = null): static; + /** + * @return static + */ + abstract public function slice(int $start = 0, int $length = null): self; - abstract public function snake(): static; + /** + * @return static + */ + abstract public function snake(): self; - abstract public function splice(string $replacement, int $start = 0, int $length = null): static; + /** + * @return static + */ + abstract public function splice(string $replacement, int $start = 0, int $length = null): self; /** * @return static[] @@ -455,7 +509,7 @@ abstract class AbstractString implements \Stringable, \JsonSerializable $lastError = preg_last_error(); foreach (get_defined_constants(true)['pcre'] as $k => $v) { - if ($lastError === $v && str_ends_with($k, '_ERROR')) { + if ($lastError === $v && '_ERROR' === substr($k, -6)) { throw new RuntimeException('Splitting failed with '.$k.'.'); } } @@ -486,9 +540,9 @@ abstract class AbstractString implements \Stringable, \JsonSerializable /** * @param string|string[] $prefix */ - public function startsWith(string|iterable $prefix): bool + public function startsWith($prefix): bool { - if (\is_string($prefix)) { + if (!\is_array($prefix) && !$prefix instanceof \Traversable) { throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); } @@ -501,7 +555,10 @@ abstract class AbstractString implements \Stringable, \JsonSerializable return false; } - abstract public function title(bool $allWords = false): static; + /** + * @return static + */ + abstract public function title(bool $allWords = false): self; public function toByteString(string $toEncoding = null): ByteString { @@ -549,16 +606,24 @@ abstract class AbstractString implements \Stringable, \JsonSerializable return new UnicodeString($this->string); } - abstract public function trim(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static; + /** + * @return static + */ + abstract public function trim(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): self; - abstract public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static; + /** + * @return static + */ + abstract public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): self; /** * @param string|string[] $prefix + * + * @return static */ - public function trimPrefix($prefix): static + public function trimPrefix($prefix): self { - if (\is_array($prefix) || $prefix instanceof \Traversable) { // don't use is_iterable(), it's slow + if (\is_array($prefix) || $prefix instanceof \Traversable) { foreach ($prefix as $s) { $t = $this->trimPrefix($s); @@ -585,14 +650,19 @@ abstract class AbstractString implements \Stringable, \JsonSerializable return $str; } - abstract public function trimStart(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static; + /** + * @return static + */ + abstract public function trimStart(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): self; /** * @param string|string[] $suffix + * + * @return static */ - public function trimSuffix($suffix): static + public function trimSuffix($suffix): self { - if (\is_array($suffix) || $suffix instanceof \Traversable) { // don't use is_iterable(), it's slow + if (\is_array($suffix) || $suffix instanceof \Traversable) { foreach ($suffix as $s) { $t = $this->trimSuffix($s); @@ -619,7 +689,10 @@ abstract class AbstractString implements \Stringable, \JsonSerializable return $str; } - public function truncate(int $length, string $ellipsis = '', bool $cut = true): static + /** + * @return static + */ + public function truncate(int $length, string $ellipsis = '', bool $cut = true): self { $stringLength = $this->length(); @@ -646,14 +719,20 @@ abstract class AbstractString implements \Stringable, \JsonSerializable return $ellipsisLength ? $str->trimEnd()->append($ellipsis) : $str; } - abstract public function upper(): static; + /** + * @return static + */ + abstract public function upper(): self; /** * Returns the printable length on a terminal. */ abstract public function width(bool $ignoreAnsiDecoration = true): int; - public function wordwrap(int $width = 75, string $break = "\n", bool $cut = false): static + /** + * @return static + */ + public function wordwrap(int $width = 75, string $break = "\n", bool $cut = false): self { $lines = '' !== $break ? $this->split($break) : [clone $this]; $chars = []; diff --git a/vendor/symfony/string/AbstractUnicodeString.php b/vendor/symfony/string/AbstractUnicodeString.php index 68c59e34..1bc6f88f 100644 --- a/vendor/symfony/string/AbstractUnicodeString.php +++ b/vendor/symfony/string/AbstractUnicodeString.php @@ -52,7 +52,10 @@ abstract class AbstractUnicodeString extends AbstractString private static $tableZero; private static $tableWide; - public static function fromCodePoints(int ...$codes): static + /** + * @return static + */ + public static function fromCodePoints(int ...$codes): self { $string = ''; @@ -156,7 +159,7 @@ abstract class AbstractUnicodeString extends AbstractString return $str; } - public function camel(): static + public function camel(): parent { $str = clone $this; $str->string = str_replace(' ', '', preg_replace_callback('/\b.(?![A-Z]{2,})/u', static function ($m) use (&$i) { @@ -186,11 +189,11 @@ abstract class AbstractUnicodeString extends AbstractString return $codePoints; } - public function folded(bool $compat = true): static + public function folded(bool $compat = true): parent { $str = clone $this; - if (!$compat || !\defined('Normalizer::NFKC_CF')) { + if (!$compat || \PHP_VERSION_ID < 70300 || !\defined('Normalizer::NFKC_CF')) { $str->string = normalizer_normalize($str->string, $compat ? \Normalizer::NFKC : \Normalizer::NFC); $str->string = mb_strtolower(str_replace(self::FOLD_FROM, self::FOLD_TO, $this->string), 'UTF-8'); } else { @@ -200,7 +203,7 @@ abstract class AbstractUnicodeString extends AbstractString return $str; } - public function join(array $strings, string $lastGlue = null): static + public function join(array $strings, string $lastGlue = null): parent { $str = clone $this; @@ -214,7 +217,7 @@ abstract class AbstractUnicodeString extends AbstractString return $str; } - public function lower(): static + public function lower(): parent { $str = clone $this; $str->string = mb_strtolower(str_replace('İ', 'i̇', $str->string), 'UTF-8'); @@ -237,7 +240,7 @@ abstract class AbstractUnicodeString extends AbstractString $lastError = preg_last_error(); foreach (get_defined_constants(true)['pcre'] as $k => $v) { - if ($lastError === $v && str_ends_with($k, '_ERROR')) { + if ($lastError === $v && '_ERROR' === substr($k, -6)) { throw new RuntimeException('Matching failed with '.$k.'.'); } } @@ -251,7 +254,10 @@ abstract class AbstractUnicodeString extends AbstractString return $matches; } - public function normalize(int $form = self::NFC): static + /** + * @return static + */ + public function normalize(int $form = self::NFC): self { if (!\in_array($form, [self::NFC, self::NFD, self::NFKC, self::NFKD])) { throw new InvalidArgumentException('Unsupported normalization form.'); @@ -263,7 +269,7 @@ abstract class AbstractUnicodeString extends AbstractString return $str; } - public function padBoth(int $length, string $padStr = ' '): static + public function padBoth(int $length, string $padStr = ' '): parent { if ('' === $padStr || !preg_match('//u', $padStr)) { throw new InvalidArgumentException('Invalid UTF-8 string.'); @@ -275,7 +281,7 @@ abstract class AbstractUnicodeString extends AbstractString return $this->pad($length, $pad, \STR_PAD_BOTH); } - public function padEnd(int $length, string $padStr = ' '): static + public function padEnd(int $length, string $padStr = ' '): parent { if ('' === $padStr || !preg_match('//u', $padStr)) { throw new InvalidArgumentException('Invalid UTF-8 string.'); @@ -287,7 +293,7 @@ abstract class AbstractUnicodeString extends AbstractString return $this->pad($length, $pad, \STR_PAD_RIGHT); } - public function padStart(int $length, string $padStr = ' '): static + public function padStart(int $length, string $padStr = ' '): parent { if ('' === $padStr || !preg_match('//u', $padStr)) { throw new InvalidArgumentException('Invalid UTF-8 string.'); @@ -299,13 +305,17 @@ abstract class AbstractUnicodeString extends AbstractString return $this->pad($length, $pad, \STR_PAD_LEFT); } - public function replaceMatches(string $fromRegexp, string|callable $to): static + public function replaceMatches(string $fromRegexp, $to): parent { if ($this->ignoreCase) { $fromRegexp .= 'i'; } if (\is_array($to) || $to instanceof \Closure) { + if (!\is_callable($to)) { + throw new \TypeError(sprintf('Argument 2 passed to "%s::replaceMatches()" must be callable, array given.', static::class)); + } + $replace = 'preg_replace_callback'; $to = static function (array $m) use ($to): string { $to = $to($m); @@ -329,7 +339,7 @@ abstract class AbstractUnicodeString extends AbstractString $lastError = preg_last_error(); foreach (get_defined_constants(true)['pcre'] as $k => $v) { - if ($lastError === $v && str_ends_with($k, '_ERROR')) { + if ($lastError === $v && '_ERROR' === substr($k, -6)) { throw new RuntimeException('Matching failed with '.$k.'.'); } } @@ -346,7 +356,7 @@ abstract class AbstractUnicodeString extends AbstractString return $str; } - public function reverse(): static + public function reverse(): parent { $str = clone $this; $str->string = implode('', array_reverse(preg_split('/(\X)/u', $str->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY))); @@ -354,7 +364,7 @@ abstract class AbstractUnicodeString extends AbstractString return $str; } - public function snake(): static + public function snake(): parent { $str = $this->camel(); $str->string = mb_strtolower(preg_replace(['/(\p{Lu}+)(\p{Lu}\p{Ll})/u', '/([\p{Ll}0-9])(\p{Lu})/u'], '\1_\2', $str->string), 'UTF-8'); @@ -362,7 +372,7 @@ abstract class AbstractUnicodeString extends AbstractString return $str; } - public function title(bool $allWords = false): static + public function title(bool $allWords = false): parent { $str = clone $this; @@ -375,7 +385,7 @@ abstract class AbstractUnicodeString extends AbstractString return $str; } - public function trim(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static + public function trim(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): parent { if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) { throw new InvalidArgumentException('Invalid UTF-8 chars.'); @@ -388,7 +398,7 @@ abstract class AbstractUnicodeString extends AbstractString return $str; } - public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static + public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): parent { if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) { throw new InvalidArgumentException('Invalid UTF-8 chars.'); @@ -401,7 +411,7 @@ abstract class AbstractUnicodeString extends AbstractString return $str; } - public function trimPrefix($prefix): static + public function trimPrefix($prefix): parent { if (!$this->ignoreCase) { return parent::trimPrefix($prefix); @@ -421,7 +431,7 @@ abstract class AbstractUnicodeString extends AbstractString return $str; } - public function trimStart(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static + public function trimStart(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): parent { if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) { throw new InvalidArgumentException('Invalid UTF-8 chars.'); @@ -434,7 +444,7 @@ abstract class AbstractUnicodeString extends AbstractString return $str; } - public function trimSuffix($suffix): static + public function trimSuffix($suffix): parent { if (!$this->ignoreCase) { return parent::trimSuffix($suffix); @@ -454,11 +464,15 @@ abstract class AbstractUnicodeString extends AbstractString return $str; } - public function upper(): static + public function upper(): parent { $str = clone $this; $str->string = mb_strtoupper($str->string, 'UTF-8'); + if (\PHP_VERSION_ID < 70300) { + $str->string = str_replace(self::UPPER_FROM, self::UPPER_TO, $str->string); + } + return $str; } @@ -467,7 +481,7 @@ abstract class AbstractUnicodeString extends AbstractString $width = 0; $s = str_replace(["\x00", "\x05", "\x07"], '', $this->string); - if (str_contains($s, "\r")) { + if (false !== strpos($s, "\r")) { $s = str_replace(["\r\n", "\r"], "\n", $s); } @@ -494,7 +508,10 @@ abstract class AbstractUnicodeString extends AbstractString return $width; } - private function pad(int $len, self $pad, int $type): static + /** + * @return static + */ + private function pad(int $len, self $pad, int $type): parent { $sLen = $this->length(); diff --git a/vendor/symfony/string/ByteString.php b/vendor/symfony/string/ByteString.php index 1f8a76ea..626d8c1b 100644 --- a/vendor/symfony/string/ByteString.php +++ b/vendor/symfony/string/ByteString.php @@ -48,7 +48,7 @@ class ByteString extends AbstractString throw new InvalidArgumentException(sprintf('A strictly positive length is expected, "%d" given.', $length)); } - $alphabet ??= self::ALPHABET_ALPHANUMERIC; + $alphabet = $alphabet ?? self::ALPHABET_ALPHANUMERIC; $alphabetSize = \strlen($alphabet); $bits = (int) ceil(log($alphabetSize, 2.0)); if ($bits <= 0 || $bits > 56) { @@ -92,7 +92,7 @@ class ByteString extends AbstractString return '' === $str ? [] : [\ord($str)]; } - public function append(string ...$suffix): static + public function append(string ...$suffix): parent { $str = clone $this; $str->string .= 1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix); @@ -100,7 +100,7 @@ class ByteString extends AbstractString return $str; } - public function camel(): static + public function camel(): parent { $str = clone $this; @@ -132,23 +132,27 @@ class ByteString extends AbstractString return $chunks; } - public function endsWith(string|iterable|AbstractString $suffix): bool + public function endsWith($suffix): bool { - if ($suffix instanceof AbstractString) { + if ($suffix instanceof parent) { $suffix = $suffix->string; - } elseif (!\is_string($suffix)) { + } elseif (\is_array($suffix) || $suffix instanceof \Traversable) { return parent::endsWith($suffix); + } else { + $suffix = (string) $suffix; } return '' !== $suffix && \strlen($this->string) >= \strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\strlen($suffix), null, $this->ignoreCase); } - public function equalsTo(string|iterable|AbstractString $string): bool + public function equalsTo($string): bool { - if ($string instanceof AbstractString) { + if ($string instanceof parent) { $string = $string->string; - } elseif (!\is_string($string)) { + } elseif (\is_array($string) || $string instanceof \Traversable) { return parent::equalsTo($string); + } else { + $string = (string) $string; } if ('' !== $string && $this->ignoreCase) { @@ -158,7 +162,7 @@ class ByteString extends AbstractString return $string === $this->string; } - public function folded(): static + public function folded(): parent { $str = clone $this; $str->string = strtolower($str->string); @@ -166,12 +170,14 @@ class ByteString extends AbstractString return $str; } - public function indexOf(string|iterable|AbstractString $needle, int $offset = 0): ?int + public function indexOf($needle, int $offset = 0): ?int { - if ($needle instanceof AbstractString) { + if ($needle instanceof parent) { $needle = $needle->string; - } elseif (!\is_string($needle)) { + } elseif (\is_array($needle) || $needle instanceof \Traversable) { return parent::indexOf($needle, $offset); + } else { + $needle = (string) $needle; } if ('' === $needle) { @@ -183,12 +189,14 @@ class ByteString extends AbstractString return false === $i ? null : $i; } - public function indexOfLast(string|iterable|AbstractString $needle, int $offset = 0): ?int + public function indexOfLast($needle, int $offset = 0): ?int { - if ($needle instanceof AbstractString) { + if ($needle instanceof parent) { $needle = $needle->string; - } elseif (!\is_string($needle)) { + } elseif (\is_array($needle) || $needle instanceof \Traversable) { return parent::indexOfLast($needle, $offset); + } else { + $needle = (string) $needle; } if ('' === $needle) { @@ -205,7 +213,7 @@ class ByteString extends AbstractString return '' === $this->string || preg_match('//u', $this->string); } - public function join(array $strings, string $lastGlue = null): static + public function join(array $strings, string $lastGlue = null): parent { $str = clone $this; @@ -220,7 +228,7 @@ class ByteString extends AbstractString return \strlen($this->string); } - public function lower(): static + public function lower(): parent { $str = clone $this; $str->string = strtolower($str->string); @@ -243,7 +251,7 @@ class ByteString extends AbstractString $lastError = preg_last_error(); foreach (get_defined_constants(true)['pcre'] as $k => $v) { - if ($lastError === $v && str_ends_with($k, '_ERROR')) { + if ($lastError === $v && '_ERROR' === substr($k, -6)) { throw new RuntimeException('Matching failed with '.$k.'.'); } } @@ -257,7 +265,7 @@ class ByteString extends AbstractString return $matches; } - public function padBoth(int $length, string $padStr = ' '): static + public function padBoth(int $length, string $padStr = ' '): parent { $str = clone $this; $str->string = str_pad($this->string, $length, $padStr, \STR_PAD_BOTH); @@ -265,7 +273,7 @@ class ByteString extends AbstractString return $str; } - public function padEnd(int $length, string $padStr = ' '): static + public function padEnd(int $length, string $padStr = ' '): parent { $str = clone $this; $str->string = str_pad($this->string, $length, $padStr, \STR_PAD_RIGHT); @@ -273,7 +281,7 @@ class ByteString extends AbstractString return $str; } - public function padStart(int $length, string $padStr = ' '): static + public function padStart(int $length, string $padStr = ' '): parent { $str = clone $this; $str->string = str_pad($this->string, $length, $padStr, \STR_PAD_LEFT); @@ -281,7 +289,7 @@ class ByteString extends AbstractString return $str; } - public function prepend(string ...$prefix): static + public function prepend(string ...$prefix): parent { $str = clone $this; $str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$str->string; @@ -289,7 +297,7 @@ class ByteString extends AbstractString return $str; } - public function replace(string $from, string $to): static + public function replace(string $from, string $to): parent { $str = clone $this; @@ -300,13 +308,21 @@ class ByteString extends AbstractString return $str; } - public function replaceMatches(string $fromRegexp, string|callable $to): static + public function replaceMatches(string $fromRegexp, $to): parent { if ($this->ignoreCase) { $fromRegexp .= 'i'; } - $replace = \is_array($to) || $to instanceof \Closure ? 'preg_replace_callback' : 'preg_replace'; + if (\is_array($to)) { + if (!\is_callable($to)) { + throw new \TypeError(sprintf('Argument 2 passed to "%s::replaceMatches()" must be callable, array given.', static::class)); + } + + $replace = 'preg_replace_callback'; + } else { + $replace = $to instanceof \Closure ? 'preg_replace_callback' : 'preg_replace'; + } set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); @@ -315,7 +331,7 @@ class ByteString extends AbstractString $lastError = preg_last_error(); foreach (get_defined_constants(true)['pcre'] as $k => $v) { - if ($lastError === $v && str_ends_with($k, '_ERROR')) { + if ($lastError === $v && '_ERROR' === substr($k, -6)) { throw new RuntimeException('Matching failed with '.$k.'.'); } } @@ -332,7 +348,7 @@ class ByteString extends AbstractString return $str; } - public function reverse(): static + public function reverse(): parent { $str = clone $this; $str->string = strrev($str->string); @@ -340,7 +356,7 @@ class ByteString extends AbstractString return $str; } - public function slice(int $start = 0, int $length = null): static + public function slice(int $start = 0, int $length = null): parent { $str = clone $this; $str->string = (string) substr($this->string, $start, $length ?? \PHP_INT_MAX); @@ -348,7 +364,7 @@ class ByteString extends AbstractString return $str; } - public function snake(): static + public function snake(): parent { $str = $this->camel(); $str->string = strtolower(preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'], '\1_\2', $str->string)); @@ -356,7 +372,7 @@ class ByteString extends AbstractString return $str; } - public function splice(string $replacement, int $start = 0, int $length = null): static + public function splice(string $replacement, int $start = 0, int $length = null): parent { $str = clone $this; $str->string = substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX); @@ -366,7 +382,7 @@ class ByteString extends AbstractString public function split(string $delimiter, int $limit = null, int $flags = null): array { - if (1 > $limit ??= \PHP_INT_MAX) { + if (1 > $limit = $limit ?? \PHP_INT_MAX) { throw new InvalidArgumentException('Split limit must be a positive integer.'); } @@ -391,9 +407,9 @@ class ByteString extends AbstractString return $chunks; } - public function startsWith(string|iterable|AbstractString $prefix): bool + public function startsWith($prefix): bool { - if ($prefix instanceof AbstractString) { + if ($prefix instanceof parent) { $prefix = $prefix->string; } elseif (!\is_string($prefix)) { return parent::startsWith($prefix); @@ -402,7 +418,7 @@ class ByteString extends AbstractString return '' !== $prefix && 0 === ($this->ignoreCase ? strncasecmp($this->string, $prefix, \strlen($prefix)) : strncmp($this->string, $prefix, \strlen($prefix))); } - public function title(bool $allWords = false): static + public function title(bool $allWords = false): parent { $str = clone $this; $str->string = $allWords ? ucwords($str->string) : ucfirst($str->string); @@ -452,7 +468,7 @@ class ByteString extends AbstractString return $u; } - public function trim(string $chars = " \t\n\r\0\x0B\x0C"): static + public function trim(string $chars = " \t\n\r\0\x0B\x0C"): parent { $str = clone $this; $str->string = trim($str->string, $chars); @@ -460,7 +476,7 @@ class ByteString extends AbstractString return $str; } - public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C"): static + public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C"): parent { $str = clone $this; $str->string = rtrim($str->string, $chars); @@ -468,7 +484,7 @@ class ByteString extends AbstractString return $str; } - public function trimStart(string $chars = " \t\n\r\0\x0B\x0C"): static + public function trimStart(string $chars = " \t\n\r\0\x0B\x0C"): parent { $str = clone $this; $str->string = ltrim($str->string, $chars); @@ -476,7 +492,7 @@ class ByteString extends AbstractString return $str; } - public function upper(): static + public function upper(): parent { $str = clone $this; $str->string = strtoupper($str->string); diff --git a/vendor/symfony/string/CodePointString.php b/vendor/symfony/string/CodePointString.php index f5c900fb..8ab92094 100644 --- a/vendor/symfony/string/CodePointString.php +++ b/vendor/symfony/string/CodePointString.php @@ -33,7 +33,7 @@ class CodePointString extends AbstractUnicodeString $this->string = $string; } - public function append(string ...$suffix): static + public function append(string ...$suffix): AbstractString { $str = clone $this; $str->string .= 1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix); @@ -80,12 +80,14 @@ class CodePointString extends AbstractUnicodeString return '' === $str->string ? [] : [mb_ord($str->string, 'UTF-8')]; } - public function endsWith(string|iterable|AbstractString $suffix): bool + public function endsWith($suffix): bool { if ($suffix instanceof AbstractString) { $suffix = $suffix->string; - } elseif (!\is_string($suffix)) { + } elseif (\is_array($suffix) || $suffix instanceof \Traversable) { return parent::endsWith($suffix); + } else { + $suffix = (string) $suffix; } if ('' === $suffix || !preg_match('//u', $suffix)) { @@ -99,12 +101,14 @@ class CodePointString extends AbstractUnicodeString return \strlen($this->string) >= \strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\strlen($suffix)); } - public function equalsTo(string|iterable|AbstractString $string): bool + public function equalsTo($string): bool { if ($string instanceof AbstractString) { $string = $string->string; - } elseif (!\is_string($string)) { + } elseif (\is_array($string) || $string instanceof \Traversable) { return parent::equalsTo($string); + } else { + $string = (string) $string; } if ('' !== $string && $this->ignoreCase) { @@ -114,12 +118,14 @@ class CodePointString extends AbstractUnicodeString return $string === $this->string; } - public function indexOf(string|iterable|AbstractString $needle, int $offset = 0): ?int + public function indexOf($needle, int $offset = 0): ?int { if ($needle instanceof AbstractString) { $needle = $needle->string; - } elseif (!\is_string($needle)) { + } elseif (\is_array($needle) || $needle instanceof \Traversable) { return parent::indexOf($needle, $offset); + } else { + $needle = (string) $needle; } if ('' === $needle) { @@ -131,12 +137,14 @@ class CodePointString extends AbstractUnicodeString return false === $i ? null : $i; } - public function indexOfLast(string|iterable|AbstractString $needle, int $offset = 0): ?int + public function indexOfLast($needle, int $offset = 0): ?int { if ($needle instanceof AbstractString) { $needle = $needle->string; - } elseif (!\is_string($needle)) { + } elseif (\is_array($needle) || $needle instanceof \Traversable) { return parent::indexOfLast($needle, $offset); + } else { + $needle = (string) $needle; } if ('' === $needle) { @@ -153,7 +161,7 @@ class CodePointString extends AbstractUnicodeString return mb_strlen($this->string, 'UTF-8'); } - public function prepend(string ...$prefix): static + public function prepend(string ...$prefix): AbstractString { $str = clone $this; $str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$this->string; @@ -165,7 +173,7 @@ class CodePointString extends AbstractUnicodeString return $str; } - public function replace(string $from, string $to): static + public function replace(string $from, string $to): AbstractString { $str = clone $this; @@ -186,7 +194,7 @@ class CodePointString extends AbstractUnicodeString return $str; } - public function slice(int $start = 0, int $length = null): static + public function slice(int $start = 0, int $length = null): AbstractString { $str = clone $this; $str->string = mb_substr($this->string, $start, $length, 'UTF-8'); @@ -194,7 +202,7 @@ class CodePointString extends AbstractUnicodeString return $str; } - public function splice(string $replacement, int $start = 0, int $length = null): static + public function splice(string $replacement, int $start = 0, int $length = null): AbstractString { if (!preg_match('//u', $replacement)) { throw new InvalidArgumentException('Invalid UTF-8 string.'); @@ -210,7 +218,7 @@ class CodePointString extends AbstractUnicodeString public function split(string $delimiter, int $limit = null, int $flags = null): array { - if (1 > $limit ??= \PHP_INT_MAX) { + if (1 > $limit = $limit ?? \PHP_INT_MAX) { throw new InvalidArgumentException('Split limit must be a positive integer.'); } @@ -239,12 +247,14 @@ class CodePointString extends AbstractUnicodeString return $chunks; } - public function startsWith(string|iterable|AbstractString $prefix): bool + public function startsWith($prefix): bool { if ($prefix instanceof AbstractString) { $prefix = $prefix->string; - } elseif (!\is_string($prefix)) { + } elseif (\is_array($prefix) || $prefix instanceof \Traversable) { return parent::startsWith($prefix); + } else { + $prefix = (string) $prefix; } if ('' === $prefix || !preg_match('//u', $prefix)) { diff --git a/vendor/symfony/string/Inflector/EnglishInflector.php b/vendor/symfony/string/Inflector/EnglishInflector.php index d9cc8e3d..9f2fac67 100644 --- a/vendor/symfony/string/Inflector/EnglishInflector.php +++ b/vendor/symfony/string/Inflector/EnglishInflector.php @@ -384,7 +384,7 @@ final class EnglishInflector implements InflectorInterface if ($j === $suffixLength) { // Is there any character preceding the suffix in the plural string? if ($j < $pluralLength) { - $nextIsVocal = str_contains('aeiou', $lowerPluralRev[$j]); + $nextIsVocal = false !== strpos('aeiou', $lowerPluralRev[$j]); if (!$map[2] && $nextIsVocal) { // suffix may not succeed a vocal but next char is one @@ -464,7 +464,7 @@ final class EnglishInflector implements InflectorInterface if ($j === $suffixLength) { // Is there any character preceding the suffix in the plural string? if ($j < $singularLength) { - $nextIsVocal = str_contains('aeiou', $lowerSingularRev[$j]); + $nextIsVocal = false !== strpos('aeiou', $lowerSingularRev[$j]); if (!$map[2] && $nextIsVocal) { // suffix may not succeed a vocal but next char is one diff --git a/vendor/symfony/string/LazyString.php b/vendor/symfony/string/LazyString.php index 84fa7bf0..3b10595f 100644 --- a/vendor/symfony/string/LazyString.php +++ b/vendor/symfony/string/LazyString.php @@ -18,15 +18,17 @@ namespace Symfony\Component\String; */ class LazyString implements \Stringable, \JsonSerializable { - private \Closure|string $value; + private $value; /** * @param callable|array $callback A callable or a [Closure, method] lazy-callable + * + * @return static */ - public static function fromCallable(callable|array $callback, mixed ...$arguments): static + public static function fromCallable($callback, ...$arguments): self { - if (\is_array($callback) && !\is_callable($callback) && !(($callback[0] ?? null) instanceof \Closure || 2 < \count($callback))) { - throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be a callable or a [Closure, method] lazy-callable, "%s" given.', __METHOD__, '['.implode(', ', array_map('get_debug_type', $callback)).']')); + if (!\is_callable($callback) && !(\is_array($callback) && isset($callback[0]) && $callback[0] instanceof \Closure && 2 >= \count($callback))) { + throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be a callable or a [Closure, method] lazy-callable, "%s" given.', __METHOD__, get_debug_type($callback))); } $lazyString = new static(); @@ -47,8 +49,17 @@ class LazyString implements \Stringable, \JsonSerializable return $lazyString; } - public static function fromStringable(string|int|float|bool|\Stringable $value): static + /** + * @param string|int|float|bool|\Stringable $value + * + * @return static + */ + public static function fromStringable($value): self { + if (!self::isStringable($value)) { + throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be a scalar or a stringable object, "%s" given.', __METHOD__, get_debug_type($value))); + } + if (\is_object($value)) { return static::fromCallable([$value, '__toString']); } @@ -62,22 +73,27 @@ class LazyString implements \Stringable, \JsonSerializable /** * Tells whether the provided value can be cast to string. */ - final public static function isStringable(mixed $value): bool + final public static function isStringable($value): bool { - return \is_string($value) || $value instanceof \Stringable || \is_scalar($value); + return \is_string($value) || $value instanceof self || (\is_object($value) ? method_exists($value, '__toString') : \is_scalar($value)); } /** * Casts scalars and stringable objects to strings. * + * @param object|string|int|float|bool $value + * * @throws \TypeError When the provided value is not stringable */ - final public static function resolve(\Stringable|string|int|float|bool $value): string + final public static function resolve($value): string { return $value; } - public function __toString(): string + /** + * @return string + */ + public function __toString() { if (\is_string($this->value)) { return $this->value; @@ -95,6 +111,11 @@ class LazyString implements \Stringable, \JsonSerializable $e = new \TypeError(sprintf('Return value of %s() passed to %s::fromCallable() must be of the type string, %s returned.', $callback, static::class, $type)); } + if (\PHP_VERSION_ID < 70400) { + // leverage the ErrorHandler component with graceful fallback when it's not available + return trigger_error($e, \E_USER_ERROR); + } + throw $e; } } @@ -127,7 +148,7 @@ class LazyString implements \Stringable, \JsonSerializable } elseif ($callback instanceof \Closure) { $r = new \ReflectionFunction($callback); - if (str_contains($r->name, '{closure}') || !$class = $r->getClosureScopeClass()) { + if (false !== strpos($r->name, '{closure}') || !$class = $r->getClosureScopeClass()) { return $r->name; } diff --git a/vendor/symfony/string/Resources/functions.php b/vendor/symfony/string/Resources/functions.php index 7a970400..c950894f 100644 --- a/vendor/symfony/string/Resources/functions.php +++ b/vendor/symfony/string/Resources/functions.php @@ -31,7 +31,7 @@ if (!\function_exists(s::class)) { */ function s(?string $string = ''): AbstractString { - $string ??= ''; + $string = $string ?? ''; return preg_match('//u', $string) ? new UnicodeString($string) : new ByteString($string); } diff --git a/vendor/symfony/string/Slugger/AsciiSlugger.php b/vendor/symfony/string/Slugger/AsciiSlugger.php index d32e3051..5aecfeb5 100644 --- a/vendor/symfony/string/Slugger/AsciiSlugger.php +++ b/vendor/symfony/string/Slugger/AsciiSlugger.php @@ -54,8 +54,8 @@ class AsciiSlugger implements SluggerInterface, LocaleAwareInterface 'zh' => 'Han-Latin', ]; - private ?string $defaultLocale; - private \Closure|array $symbolsMap = [ + private $defaultLocale; + private $symbolsMap = [ 'en' => ['@' => 'at', '&' => 'and'], ]; @@ -64,10 +64,17 @@ class AsciiSlugger implements SluggerInterface, LocaleAwareInterface * * @var \Transliterator[] */ - private array $transliterators = []; + private $transliterators = []; - public function __construct(string $defaultLocale = null, array|\Closure $symbolsMap = null) + /** + * @param array|\Closure|null $symbolsMap + */ + public function __construct(string $defaultLocale = null, $symbolsMap = null) { + if (null !== $symbolsMap && !\is_array($symbolsMap) && !$symbolsMap instanceof \Closure) { + throw new \TypeError(sprintf('Argument 2 passed to "%s()" must be array, Closure or null, "%s" given.', __METHOD__, \gettype($symbolsMap))); + } + $this->defaultLocale = $defaultLocale; $this->symbolsMap = $symbolsMap ?? $this->symbolsMap; } @@ -75,7 +82,7 @@ class AsciiSlugger implements SluggerInterface, LocaleAwareInterface /** * {@inheritdoc} */ - public function setLocale(string $locale) + public function setLocale($locale) { $this->defaultLocale = $locale; } @@ -83,7 +90,7 @@ class AsciiSlugger implements SluggerInterface, LocaleAwareInterface /** * {@inheritdoc} */ - public function getLocale(): string + public function getLocale() { return $this->defaultLocale; } @@ -93,10 +100,10 @@ class AsciiSlugger implements SluggerInterface, LocaleAwareInterface */ public function slug(string $string, string $separator = '-', string $locale = null): AbstractUnicodeString { - $locale ??= $this->defaultLocale; + $locale = $locale ?? $this->defaultLocale; $transliterator = []; - if ($locale && ('de' === $locale || str_starts_with($locale, 'de_'))) { + if ($locale && ('de' === $locale || 0 === strpos($locale, 'de_'))) { // Use the shortcut for German in UnicodeString::ascii() if possible (faster and no requirement on intl) $transliterator = ['de-ASCII']; } elseif (\function_exists('transliterator_transliterate') && $locale) { diff --git a/vendor/symfony/string/UnicodeString.php b/vendor/symfony/string/UnicodeString.php index a64c6a9d..9b906c6f 100644 --- a/vendor/symfony/string/UnicodeString.php +++ b/vendor/symfony/string/UnicodeString.php @@ -41,7 +41,7 @@ class UnicodeString extends AbstractUnicodeString } } - public function append(string ...$suffix): static + public function append(string ...$suffix): AbstractString { $str = clone $this; $str->string = $this->string.(1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix)); @@ -82,12 +82,14 @@ class UnicodeString extends AbstractUnicodeString return $chunks; } - public function endsWith(string|iterable|AbstractString $suffix): bool + public function endsWith($suffix): bool { if ($suffix instanceof AbstractString) { $suffix = $suffix->string; - } elseif (!\is_string($suffix)) { + } elseif (\is_array($suffix) || $suffix instanceof \Traversable) { return parent::endsWith($suffix); + } else { + $suffix = (string) $suffix; } $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; @@ -104,12 +106,14 @@ class UnicodeString extends AbstractUnicodeString return $suffix === grapheme_extract($this->string, \strlen($suffix), \GRAPHEME_EXTR_MAXBYTES, \strlen($this->string) - \strlen($suffix)); } - public function equalsTo(string|iterable|AbstractString $string): bool + public function equalsTo($string): bool { if ($string instanceof AbstractString) { $string = $string->string; - } elseif (!\is_string($string)) { + } elseif (\is_array($string) || $string instanceof \Traversable) { return parent::equalsTo($string); + } else { + $string = (string) $string; } $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; @@ -122,12 +126,14 @@ class UnicodeString extends AbstractUnicodeString return $string === $this->string; } - public function indexOf(string|iterable|AbstractString $needle, int $offset = 0): ?int + public function indexOf($needle, int $offset = 0): ?int { if ($needle instanceof AbstractString) { $needle = $needle->string; - } elseif (!\is_string($needle)) { + } elseif (\is_array($needle) || $needle instanceof \Traversable) { return parent::indexOf($needle, $offset); + } else { + $needle = (string) $needle; } $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; @@ -139,19 +145,21 @@ class UnicodeString extends AbstractUnicodeString try { $i = $this->ignoreCase ? grapheme_stripos($this->string, $needle, $offset) : grapheme_strpos($this->string, $needle, $offset); - } catch (\ValueError) { + } catch (\ValueError $e) { return null; } return false === $i ? null : $i; } - public function indexOfLast(string|iterable|AbstractString $needle, int $offset = 0): ?int + public function indexOfLast($needle, int $offset = 0): ?int { if ($needle instanceof AbstractString) { $needle = $needle->string; - } elseif (!\is_string($needle)) { + } elseif (\is_array($needle) || $needle instanceof \Traversable) { return parent::indexOfLast($needle, $offset); + } else { + $needle = (string) $needle; } $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; @@ -176,7 +184,7 @@ class UnicodeString extends AbstractUnicodeString return false === $i ? null : $i; } - public function join(array $strings, string $lastGlue = null): static + public function join(array $strings, string $lastGlue = null): AbstractString { $str = parent::join($strings, $lastGlue); normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string); @@ -189,7 +197,10 @@ class UnicodeString extends AbstractUnicodeString return grapheme_strlen($this->string); } - public function normalize(int $form = self::NFC): static + /** + * @return static + */ + public function normalize(int $form = self::NFC): parent { $str = clone $this; @@ -205,7 +216,7 @@ class UnicodeString extends AbstractUnicodeString return $str; } - public function prepend(string ...$prefix): static + public function prepend(string ...$prefix): AbstractString { $str = clone $this; $str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$this->string; @@ -218,7 +229,7 @@ class UnicodeString extends AbstractUnicodeString return $str; } - public function replace(string $from, string $to): static + public function replace(string $from, string $to): AbstractString { $str = clone $this; normalizer_is_normalized($from) ?: $from = normalizer_normalize($from); @@ -245,7 +256,7 @@ class UnicodeString extends AbstractUnicodeString return $str; } - public function replaceMatches(string $fromRegexp, string|callable $to): static + public function replaceMatches(string $fromRegexp, $to): AbstractString { $str = parent::replaceMatches($fromRegexp, $to); normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string); @@ -253,19 +264,25 @@ class UnicodeString extends AbstractUnicodeString return $str; } - public function slice(int $start = 0, int $length = null): static + public function slice(int $start = 0, int $length = null): AbstractString { $str = clone $this; + if (\PHP_VERSION_ID < 80000 && 0 > $start && grapheme_strlen($this->string) < -$start) { + $start = 0; + } $str->string = (string) grapheme_substr($this->string, $start, $length ?? 2147483647); return $str; } - public function splice(string $replacement, int $start = 0, int $length = null): static + public function splice(string $replacement, int $start = 0, int $length = null): AbstractString { $str = clone $this; + if (\PHP_VERSION_ID < 80000 && 0 > $start && grapheme_strlen($this->string) < -$start) { + $start = 0; + } $start = $start ? \strlen(grapheme_substr($this->string, 0, $start)) : 0; $length = $length ? \strlen(grapheme_substr($this->string, $start, $length ?? 2147483647)) : $length; $str->string = substr_replace($this->string, $replacement, $start, $length ?? 2147483647); @@ -280,7 +297,7 @@ class UnicodeString extends AbstractUnicodeString public function split(string $delimiter, int $limit = null, int $flags = null): array { - if (1 > $limit ??= 2147483647) { + if (1 > $limit = $limit ?? 2147483647) { throw new InvalidArgumentException('Split limit must be a positive integer.'); } @@ -316,12 +333,14 @@ class UnicodeString extends AbstractUnicodeString return $chunks; } - public function startsWith(string|iterable|AbstractString $prefix): bool + public function startsWith($prefix): bool { if ($prefix instanceof AbstractString) { $prefix = $prefix->string; - } elseif (!\is_string($prefix)) { + } elseif (\is_array($prefix) || $prefix instanceof \Traversable) { return parent::startsWith($prefix); + } else { + $prefix = (string) $prefix; } $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; diff --git a/vendor/symfony/string/composer.json b/vendor/symfony/string/composer.json index 5e4febb5..2b88fd52 100644 --- a/vendor/symfony/string/composer.json +++ b/vendor/symfony/string/composer.json @@ -16,20 +16,21 @@ } ], "require": { - "php": ">=8.1", + "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/translation-contracts": "^2.0|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": ">=3.0" }, "autoload": { "psr-4": { "Symfony\\Component\\String\\": "" }, diff --git a/vendor/symfony/translation-contracts/LocaleAwareInterface.php b/vendor/symfony/translation-contracts/LocaleAwareInterface.php index 6923b977..693f92ba 100644 --- a/vendor/symfony/translation-contracts/LocaleAwareInterface.php +++ b/vendor/symfony/translation-contracts/LocaleAwareInterface.php @@ -16,12 +16,16 @@ interface LocaleAwareInterface /** * Sets the current locale. * + * @param string $locale The locale + * * @throws \InvalidArgumentException If the locale contains invalid characters */ public function setLocale(string $locale); /** * Returns the current locale. + * + * @return string */ - public function getLocale(): string; + public function getLocale(); } diff --git a/vendor/symfony/translation-contracts/Test/TranslatorTest.php b/vendor/symfony/translation-contracts/Test/TranslatorTest.php index 4e5999df..a3e9b20a 100644 --- a/vendor/symfony/translation-contracts/Test/TranslatorTest.php +++ b/vendor/symfony/translation-contracts/Test/TranslatorTest.php @@ -43,7 +43,10 @@ class TranslatorTest extends TestCase \Locale::setDefault($this->defaultLocale); } - public function getTranslator(): TranslatorInterface + /** + * @return TranslatorInterface + */ + public function getTranslator() { return new class() implements TranslatorInterface { use TranslatorTrait; @@ -314,8 +317,10 @@ class TranslatorTest extends TestCase * This array should contain all currently known langcodes. * * As it is impossible to have this ever complete we should try as hard as possible to have it almost complete. + * + * @return array */ - public function successLangcodes(): array + public function successLangcodes() { return [ ['1', ['ay', 'bo', 'cgg', 'dz', 'id', 'ja', 'jbo', 'ka', 'kk', 'km', 'ko', 'ky']], @@ -334,7 +339,7 @@ class TranslatorTest extends TestCase * * @return array with nplural together with langcodes */ - public function failingLangcodes(): array + public function failingLangcodes() { return [ ['1', ['fa']], @@ -348,10 +353,11 @@ class TranslatorTest extends TestCase /** * We validate only on the plural coverage. Thus the real rules is not tested. * - * @param string $nplural Plural expected - * @param array $matrix Containing langcodes and their plural index values + * @param string $nplural Plural expected + * @param array $matrix Containing langcodes and their plural index values + * @param bool $expectSuccess */ - protected function validateMatrix(string $nplural, array $matrix, bool $expectSuccess = true) + protected function validateMatrix($nplural, $matrix, $expectSuccess = true) { foreach ($matrix as $langCode => $data) { $indexes = array_flip($data); diff --git a/vendor/symfony/translation-contracts/TranslatorInterface.php b/vendor/symfony/translation-contracts/TranslatorInterface.php index 018db07e..77b7a9c5 100644 --- a/vendor/symfony/translation-contracts/TranslatorInterface.php +++ b/vendor/symfony/translation-contracts/TranslatorInterface.php @@ -13,6 +13,8 @@ namespace Symfony\Contracts\Translation; /** * @author Fabien Potencier + * + * @method string getLocale() Returns the default locale */ interface TranslatorInterface { @@ -57,12 +59,9 @@ interface TranslatorInterface * @param string|null $domain The domain for the message or null to use the default * @param string|null $locale The locale or null to use the default * + * @return string + * * @throws \InvalidArgumentException If the locale contains invalid characters */ - public function trans(string $id, array $parameters = [], string $domain = null, string $locale = null): string; - - /** - * Returns the default locale. - */ - public function getLocale(): string; + public function trans(string $id, array $parameters = [], string $domain = null, string $locale = null); } diff --git a/vendor/symfony/translation-contracts/TranslatorTrait.php b/vendor/symfony/translation-contracts/TranslatorTrait.php index 99a639ce..405ce8d7 100644 --- a/vendor/symfony/translation-contracts/TranslatorTrait.php +++ b/vendor/symfony/translation-contracts/TranslatorTrait.php @@ -20,7 +20,7 @@ use Symfony\Component\Translation\Exception\InvalidArgumentException; */ trait TranslatorTrait { - private ?string $locale = null; + private $locale; /** * {@inheritdoc} @@ -32,8 +32,10 @@ trait TranslatorTrait /** * {@inheritdoc} + * + * @return string */ - public function getLocale(): string + public function getLocale() { return $this->locale ?: (class_exists(\Locale::class) ? \Locale::getDefault() : 'en'); } @@ -140,92 +142,121 @@ EOF; { $number = abs($number); - return match ('pt_BR' !== $locale && 'en_US_POSIX' !== $locale && \strlen($locale) > 3 ? substr($locale, 0, strrpos($locale, '_')) : $locale) { - 'af', - 'bn', - 'bg', - 'ca', - 'da', - 'de', - 'el', - 'en', - 'en_US_POSIX', - 'eo', - 'es', - 'et', - 'eu', - 'fa', - 'fi', - 'fo', - 'fur', - 'fy', - 'gl', - 'gu', - 'ha', - 'he', - 'hu', - 'is', - 'it', - 'ku', - 'lb', - 'ml', - 'mn', - 'mr', - 'nah', - 'nb', - 'ne', - 'nl', - 'nn', - 'no', - 'oc', - 'om', - 'or', - 'pa', - 'pap', - 'ps', - 'pt', - 'so', - 'sq', - 'sv', - 'sw', - 'ta', - 'te', - 'tk', - 'ur', - 'zu' => (1 == $number) ? 0 : 1, - 'am', - 'bh', - 'fil', - 'fr', - 'gun', - 'hi', - 'hy', - 'ln', - 'mg', - 'nso', - 'pt_BR', - 'ti', - 'wa' => ($number < 2) ? 0 : 1, - 'be', - 'bs', - 'hr', - 'ru', - 'sh', - 'sr', - 'uk' => ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2), - 'cs', - 'sk' => (1 == $number) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2), - 'ga' => (1 == $number) ? 0 : ((2 == $number) ? 1 : 2), - 'lt' => ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2), - 'sl' => (1 == $number % 100) ? 0 : ((2 == $number % 100) ? 1 : (((3 == $number % 100) || (4 == $number % 100)) ? 2 : 3)), - 'mk' => (1 == $number % 10) ? 0 : 1, - 'mt' => (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3)), - 'lv' => (0 == $number) ? 0 : (((1 == $number % 10) && (11 != $number % 100)) ? 1 : 2), - 'pl' => (1 == $number) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2), - 'cy' => (1 == $number) ? 0 : ((2 == $number) ? 1 : (((8 == $number) || (11 == $number)) ? 2 : 3)), - 'ro' => (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2), - 'ar' => (0 == $number) ? 0 : ((1 == $number) ? 1 : ((2 == $number) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5)))), - default => 0, - }; + switch ('pt_BR' !== $locale && 'en_US_POSIX' !== $locale && \strlen($locale) > 3 ? substr($locale, 0, strrpos($locale, '_')) : $locale) { + case 'af': + case 'bn': + case 'bg': + case 'ca': + case 'da': + case 'de': + case 'el': + case 'en': + case 'en_US_POSIX': + case 'eo': + case 'es': + case 'et': + case 'eu': + case 'fa': + case 'fi': + case 'fo': + case 'fur': + case 'fy': + case 'gl': + case 'gu': + case 'ha': + case 'he': + case 'hu': + case 'is': + case 'it': + case 'ku': + case 'lb': + case 'ml': + case 'mn': + case 'mr': + case 'nah': + case 'nb': + case 'ne': + case 'nl': + case 'nn': + case 'no': + case 'oc': + case 'om': + case 'or': + case 'pa': + case 'pap': + case 'ps': + case 'pt': + case 'so': + case 'sq': + case 'sv': + case 'sw': + case 'ta': + case 'te': + case 'tk': + case 'ur': + case 'zu': + return (1 == $number) ? 0 : 1; + + case 'am': + case 'bh': + case 'fil': + case 'fr': + case 'gun': + case 'hi': + case 'hy': + case 'ln': + case 'mg': + case 'nso': + case 'pt_BR': + case 'ti': + case 'wa': + return ($number < 2) ? 0 : 1; + + case 'be': + case 'bs': + case 'hr': + case 'ru': + case 'sh': + case 'sr': + case 'uk': + return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); + + case 'cs': + case 'sk': + return (1 == $number) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2); + + case 'ga': + return (1 == $number) ? 0 : ((2 == $number) ? 1 : 2); + + case 'lt': + return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); + + case 'sl': + return (1 == $number % 100) ? 0 : ((2 == $number % 100) ? 1 : (((3 == $number % 100) || (4 == $number % 100)) ? 2 : 3)); + + case 'mk': + return (1 == $number % 10) ? 0 : 1; + + case 'mt': + return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3)); + + case 'lv': + return (0 == $number) ? 0 : (((1 == $number % 10) && (11 != $number % 100)) ? 1 : 2); + + case 'pl': + return (1 == $number) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2); + + case 'cy': + return (1 == $number) ? 0 : ((2 == $number) ? 1 : (((8 == $number) || (11 == $number)) ? 2 : 3)); + + case 'ro': + return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2); + + case 'ar': + return (0 == $number) ? 0 : ((1 == $number) ? 1 : ((2 == $number) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5)))); + + default: + return 0; + } } } diff --git a/vendor/symfony/translation-contracts/composer.json b/vendor/symfony/translation-contracts/composer.json index 5240ed0f..65fe243a 100644 --- a/vendor/symfony/translation-contracts/composer.json +++ b/vendor/symfony/translation-contracts/composer.json @@ -16,21 +16,18 @@ } ], "require": { - "php": ">=8.1" + "php": ">=7.2.5" }, "suggest": { "symfony/translation-implementation": "" }, "autoload": { - "psr-4": { "Symfony\\Contracts\\Translation\\": "" }, - "exclude-from-classmap": [ - "/Test/" - ] + "psr-4": { "Symfony\\Contracts\\Translation\\": "" } }, "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", diff --git a/vendor/symfony/translation/CHANGELOG.md b/vendor/symfony/translation/CHANGELOG.md index 720298d8..160b5e69 100644 --- a/vendor/symfony/translation/CHANGELOG.md +++ b/vendor/symfony/translation/CHANGELOG.md @@ -1,12 +1,6 @@ CHANGELOG ========= -6.1 ---- - - * Parameters implementing `TranslatableInterface` are processed - * Add the file extension to the `XliffFileDumper` constructor - 5.4 --- diff --git a/vendor/symfony/translation/Catalogue/AbstractOperation.php b/vendor/symfony/translation/Catalogue/AbstractOperation.php index 0691bf78..98d42e5b 100644 --- a/vendor/symfony/translation/Catalogue/AbstractOperation.php +++ b/vendor/symfony/translation/Catalogue/AbstractOperation.php @@ -80,7 +80,7 @@ abstract class AbstractOperation implements OperationInterface /** * {@inheritdoc} */ - public function getDomains(): array + public function getDomains() { if (null === $this->domains) { $domains = []; @@ -103,7 +103,7 @@ abstract class AbstractOperation implements OperationInterface /** * {@inheritdoc} */ - public function getMessages(string $domain): array + public function getMessages(string $domain) { if (!\in_array($domain, $this->getDomains())) { throw new InvalidArgumentException(sprintf('Invalid domain: "%s".', $domain)); @@ -119,7 +119,7 @@ abstract class AbstractOperation implements OperationInterface /** * {@inheritdoc} */ - public function getNewMessages(string $domain): array + public function getNewMessages(string $domain) { if (!\in_array($domain, $this->getDomains())) { throw new InvalidArgumentException(sprintf('Invalid domain: "%s".', $domain)); @@ -135,7 +135,7 @@ abstract class AbstractOperation implements OperationInterface /** * {@inheritdoc} */ - public function getObsoleteMessages(string $domain): array + public function getObsoleteMessages(string $domain) { if (!\in_array($domain, $this->getDomains())) { throw new InvalidArgumentException(sprintf('Invalid domain: "%s".', $domain)); @@ -151,7 +151,7 @@ abstract class AbstractOperation implements OperationInterface /** * {@inheritdoc} */ - public function getResult(): MessageCatalogueInterface + public function getResult() { foreach ($this->getDomains() as $domain) { if (!isset($this->messages[$domain])) { @@ -174,12 +174,12 @@ abstract class AbstractOperation implements OperationInterface foreach ($this->getDomains() as $domain) { $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; - $messages = match ($batch) { - self::OBSOLETE_BATCH => $this->getObsoleteMessages($domain), - self::NEW_BATCH => $this->getNewMessages($domain), - self::ALL_BATCH => $this->getMessages($domain), - default => throw new \InvalidArgumentException(sprintf('$batch argument must be one of ["%s", "%s", "%s"].', self::ALL_BATCH, self::NEW_BATCH, self::OBSOLETE_BATCH)), - }; + switch ($batch) { + case self::OBSOLETE_BATCH: $messages = $this->getObsoleteMessages($domain); break; + case self::NEW_BATCH: $messages = $this->getNewMessages($domain); break; + case self::ALL_BATCH: $messages = $this->getMessages($domain); break; + default: throw new \InvalidArgumentException(sprintf('$batch argument must be one of ["%s", "%s", "%s"].', self::ALL_BATCH, self::NEW_BATCH, self::OBSOLETE_BATCH)); + } if (!$messages || (!$this->source->all($intlDomain) && $this->source->all($domain))) { continue; diff --git a/vendor/symfony/translation/Catalogue/MergeOperation.php b/vendor/symfony/translation/Catalogue/MergeOperation.php index 7a67fdf7..87db2fb0 100644 --- a/vendor/symfony/translation/Catalogue/MergeOperation.php +++ b/vendor/symfony/translation/Catalogue/MergeOperation.php @@ -36,18 +36,6 @@ class MergeOperation extends AbstractOperation ]; $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; - foreach ($this->target->getCatalogueMetadata('', $domain) ?? [] as $key => $value) { - if (null === $this->result->getCatalogueMetadata($key, $domain)) { - $this->result->setCatalogueMetadata($key, $value, $domain); - } - } - - foreach ($this->target->getCatalogueMetadata('', $intlDomain) ?? [] as $key => $value) { - if (null === $this->result->getCatalogueMetadata($key, $intlDomain)) { - $this->result->setCatalogueMetadata($key, $value, $intlDomain); - } - } - foreach ($this->source->all($domain) as $id => $message) { $this->messages[$domain]['all'][$id] = $message; $d = $this->source->defines($id, $intlDomain) ? $intlDomain : $domain; diff --git a/vendor/symfony/translation/Catalogue/OperationInterface.php b/vendor/symfony/translation/Catalogue/OperationInterface.php index 1fe9534e..9ffac88d 100644 --- a/vendor/symfony/translation/Catalogue/OperationInterface.php +++ b/vendor/symfony/translation/Catalogue/OperationInterface.php @@ -36,26 +36,36 @@ interface OperationInterface { /** * Returns domains affected by operation. + * + * @return array */ - public function getDomains(): array; + public function getDomains(); /** * Returns all valid messages ('all') after operation. + * + * @return array */ - public function getMessages(string $domain): array; + public function getMessages(string $domain); /** * Returns new messages ('new') after operation. + * + * @return array */ - public function getNewMessages(string $domain): array; + public function getNewMessages(string $domain); /** * Returns obsolete messages ('obsolete') after operation. + * + * @return array */ - public function getObsoleteMessages(string $domain): array; + public function getObsoleteMessages(string $domain); /** * Returns resulting catalogue ('result'). + * + * @return MessageCatalogueInterface */ - public function getResult(): MessageCatalogueInterface; + public function getResult(); } diff --git a/vendor/symfony/translation/Catalogue/TargetOperation.php b/vendor/symfony/translation/Catalogue/TargetOperation.php index d42cfc34..682b5752 100644 --- a/vendor/symfony/translation/Catalogue/TargetOperation.php +++ b/vendor/symfony/translation/Catalogue/TargetOperation.php @@ -37,18 +37,6 @@ class TargetOperation extends AbstractOperation ]; $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; - foreach ($this->target->getCatalogueMetadata('', $domain) ?? [] as $key => $value) { - if (null === $this->result->getCatalogueMetadata($key, $domain)) { - $this->result->setCatalogueMetadata($key, $value, $domain); - } - } - - foreach ($this->target->getCatalogueMetadata('', $intlDomain) ?? [] as $key => $value) { - if (null === $this->result->getCatalogueMetadata($key, $intlDomain)) { - $this->result->setCatalogueMetadata($key, $value, $intlDomain); - } - } - // For 'all' messages, the code can't be simplified as ``$this->messages[$domain]['all'] = $target->all($domain);``, // because doing so will drop messages like {x: x ∈ source ∧ x ∉ target.all ∧ x ∈ target.fallback} // diff --git a/vendor/symfony/translation/CatalogueMetadataAwareInterface.php b/vendor/symfony/translation/CatalogueMetadataAwareInterface.php deleted file mode 100644 index 7e76857d..00000000 --- a/vendor/symfony/translation/CatalogueMetadataAwareInterface.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 Symfony\Component\Translation; - -/** - * This interface is used to get, set, and delete metadata about the Catalogue. - * - * @author Hugo Alliaume - */ -interface CatalogueMetadataAwareInterface -{ - /** - * Gets catalogue metadata for the given domain and key. - * - * Passing an empty domain will return an array with all catalogue metadata indexed by - * domain and then by key. Passing an empty key will return an array with all - * catalogue metadata for the given domain. - * - * @return mixed The value that was set or an array with the domains/keys or null - */ - public function getCatalogueMetadata(string $key = '', string $domain = 'messages'): mixed; - - /** - * Adds catalogue metadata to a message domain. - */ - public function setCatalogueMetadata(string $key, mixed $value, string $domain = 'messages'); - - /** - * Deletes catalogue metadata for the given key and domain. - * - * Passing an empty domain will delete all catalogue metadata. Passing an empty key will - * delete all metadata for the given domain. - */ - public function deleteCatalogueMetadata(string $key = '', string $domain = 'messages'); -} diff --git a/vendor/symfony/translation/Command/TranslationPullCommand.php b/vendor/symfony/translation/Command/TranslationPullCommand.php index d37dceac..e2e7c00d 100644 --- a/vendor/symfony/translation/Command/TranslationPullCommand.php +++ b/vendor/symfony/translation/Command/TranslationPullCommand.php @@ -11,7 +11,6 @@ namespace Symfony\Component\Translation\Command; -use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Completion\CompletionInput; use Symfony\Component\Console\Completion\CompletionSuggestions; @@ -29,17 +28,19 @@ use Symfony\Component\Translation\Writer\TranslationWriterInterface; /** * @author Mathieu Santostefano */ -#[AsCommand(name: 'translation:pull', description: 'Pull translations from a given provider.')] final class TranslationPullCommand extends Command { use TranslationTrait; - private TranslationProviderCollection $providerCollection; - private TranslationWriterInterface $writer; - private TranslationReaderInterface $reader; - private string $defaultLocale; - private array $transPaths; - private array $enabledLocales; + protected static $defaultName = 'translation:pull'; + protected static $defaultDescription = 'Pull translations from a given provider.'; + + private $providerCollection; + private $writer; + private $reader; + private $defaultLocale; + private $transPaths; + private $enabledLocales; public function __construct(TranslationProviderCollection $providerCollection, TranslationWriterInterface $writer, TranslationReaderInterface $reader, string $defaultLocale, array $transPaths = [], array $enabledLocales = []) { diff --git a/vendor/symfony/translation/Command/TranslationPushCommand.php b/vendor/symfony/translation/Command/TranslationPushCommand.php index d36cc4b0..bf6e8c94 100644 --- a/vendor/symfony/translation/Command/TranslationPushCommand.php +++ b/vendor/symfony/translation/Command/TranslationPushCommand.php @@ -11,7 +11,6 @@ namespace Symfony\Component\Translation\Command; -use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Completion\CompletionInput; use Symfony\Component\Console\Completion\CompletionSuggestions; @@ -29,15 +28,17 @@ use Symfony\Component\Translation\TranslatorBag; /** * @author Mathieu Santostefano */ -#[AsCommand(name: 'translation:push', description: 'Push translations to a given provider.')] final class TranslationPushCommand extends Command { use TranslationTrait; - private TranslationProviderCollection $providers; - private TranslationReaderInterface $reader; - private array $transPaths; - private array $enabledLocales; + protected static $defaultName = 'translation:push'; + protected static $defaultDescription = 'Push translations to a given provider.'; + + private $providers; + private $reader; + private $transPaths; + private $enabledLocales; public function __construct(TranslationProviderCollection $providers, TranslationReaderInterface $reader, array $transPaths = [], array $enabledLocales = []) { diff --git a/vendor/symfony/translation/Command/XliffLintCommand.php b/vendor/symfony/translation/Command/XliffLintCommand.php index 88057db4..fb2b5f31 100644 --- a/vendor/symfony/translation/Command/XliffLintCommand.php +++ b/vendor/symfony/translation/Command/XliffLintCommand.php @@ -11,7 +11,6 @@ namespace Symfony\Component\Translation\Command; -use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\CI\GithubActionReporter; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Completion\CompletionInput; @@ -32,21 +31,23 @@ use Symfony\Component\Translation\Util\XliffUtils; * @author Robin Chalas * @author Javier Eguiluz */ -#[AsCommand(name: 'lint:xliff', description: 'Lint an XLIFF file and outputs encountered errors')] class XliffLintCommand extends Command { - private string $format; - private bool $displayCorrectFiles; - private ?\Closure $directoryIteratorProvider; - private ?\Closure $isReadableProvider; - private bool $requireStrictFileNames; + protected static $defaultName = 'lint:xliff'; + protected static $defaultDescription = 'Lint an XLIFF file and outputs encountered errors'; + + private $format; + private $displayCorrectFiles; + private $directoryIteratorProvider; + private $isReadableProvider; + private $requireStrictFileNames; public function __construct(string $name = null, callable $directoryIteratorProvider = null, callable $isReadableProvider = null, bool $requireStrictFileNames = true) { parent::__construct($name); - $this->directoryIteratorProvider = null === $directoryIteratorProvider ? null : $directoryIteratorProvider(...); - $this->isReadableProvider = null === $isReadableProvider ? null : $isReadableProvider(...); + $this->directoryIteratorProvider = $directoryIteratorProvider; + $this->isReadableProvider = $isReadableProvider; $this->requireStrictFileNames = $requireStrictFileNames; } @@ -56,6 +57,7 @@ class XliffLintCommand extends Command protected function configure() { $this + ->setDescription(self::$defaultDescription) ->addArgument('filename', InputArgument::IS_ARRAY, 'A file, a directory or "-" for reading from STDIN') ->addOption('format', null, InputOption::VALUE_REQUIRED, 'The output format') ->setHelp(<<getArgument('filename'); @@ -156,12 +158,16 @@ EOF private function display(SymfonyStyle $io, array $files) { - return match ($this->format) { - 'txt' => $this->displayTxt($io, $files), - 'json' => $this->displayJson($io, $files), - 'github' => $this->displayTxt($io, $files, true), - default => throw new InvalidArgumentException(sprintf('The format "%s" is not supported.', $this->format)), - }; + switch ($this->format) { + case 'txt': + return $this->displayTxt($io, $files); + case 'json': + return $this->displayJson($io, $files); + case 'github': + return $this->displayTxt($io, $files, true); + default: + throw new InvalidArgumentException(sprintf('The format "%s" is not supported.', $this->format)); + } } private function displayTxt(SymfonyStyle $io, array $filesInfo, bool $errorAsGithubAnnotations = false) @@ -180,7 +186,9 @@ EOF // general document errors have a '-1' line number $line = -1 === $error['line'] ? null : $error['line']; - $githubReporter?->error($error['message'], $info['file'], $line, null !== $line ? $error['column'] : null); + if ($githubReporter) { + $githubReporter->error($error['message'], $info['file'], $line, null !== $line ? $error['column'] : null); + } return null === $line ? $error['message'] : sprintf('Line %d, Column %d: %s', $line, $error['column'], $error['message']); }, $info['messages'])); diff --git a/vendor/symfony/translation/DataCollector/TranslationDataCollector.php b/vendor/symfony/translation/DataCollector/TranslationDataCollector.php index 4244511e..379130a4 100644 --- a/vendor/symfony/translation/DataCollector/TranslationDataCollector.php +++ b/vendor/symfony/translation/DataCollector/TranslationDataCollector.php @@ -25,7 +25,7 @@ use Symfony\Component\VarDumper\Cloner\Data; */ class TranslationDataCollector extends DataCollector implements LateDataCollectorInterface { - private DataCollectorTranslator $translator; + private $translator; public function __construct(DataCollectorTranslator $translator) { @@ -62,7 +62,10 @@ class TranslationDataCollector extends DataCollector implements LateDataCollecto $this->data = []; } - public function getMessages(): array|Data + /** + * @return array|Data + */ + public function getMessages() { return $this->data['messages'] ?? []; } diff --git a/vendor/symfony/translation/DataCollectorTranslator.php b/vendor/symfony/translation/DataCollectorTranslator.php index cab98746..ea5a2dd5 100644 --- a/vendor/symfony/translation/DataCollectorTranslator.php +++ b/vendor/symfony/translation/DataCollectorTranslator.php @@ -25,8 +25,8 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter public const MESSAGE_MISSING = 1; public const MESSAGE_EQUALS_FALLBACK = 2; - private TranslatorInterface $translator; - private array $messages = []; + private $translator; + private $messages = []; /** * @param TranslatorInterface&TranslatorBagInterface&LocaleAwareInterface $translator @@ -43,7 +43,7 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter /** * {@inheritdoc} */ - public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null): string + public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null) { $trans = $this->translator->trans($id = (string) $id, $parameters, $domain, $locale); $this->collectMessage($locale, $domain, $id, $trans, $parameters); @@ -62,7 +62,7 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter /** * {@inheritdoc} */ - public function getLocale(): string + public function getLocale() { return $this->translator->getLocale(); } @@ -70,7 +70,7 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter /** * {@inheritdoc} */ - public function getCatalogue(string $locale = null): MessageCatalogueInterface + public function getCatalogue(string $locale = null) { return $this->translator->getCatalogue($locale); } @@ -88,7 +88,7 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter * * @return string[] */ - public function warmUp(string $cacheDir): array + public function warmUp(string $cacheDir) { if ($this->translator instanceof WarmableInterface) { return (array) $this->translator->warmUp($cacheDir); @@ -99,8 +99,10 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter /** * Gets the fallback locales. + * + * @return array */ - public function getFallbackLocales(): array + public function getFallbackLocales() { if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) { return $this->translator->getFallbackLocales(); @@ -117,7 +119,10 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter return $this->translator->{$method}(...$args); } - public function getCollectedMessages(): array + /** + * @return array + */ + public function getCollectedMessages() { return $this->messages; } diff --git a/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php b/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php index 4020a078..6d78342b 100644 --- a/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php +++ b/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php @@ -20,15 +20,28 @@ use Symfony\Component\DependencyInjection\Reference; */ class TranslationDumperPass implements CompilerPassInterface { + private $writerServiceId; + private $dumperTag; + + public function __construct(string $writerServiceId = 'translation.writer', string $dumperTag = 'translation.dumper') + { + if (1 < \func_num_args()) { + trigger_deprecation('symfony/translation', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); + } + + $this->writerServiceId = $writerServiceId; + $this->dumperTag = $dumperTag; + } + public function process(ContainerBuilder $container) { - if (!$container->hasDefinition('translation.writer')) { + if (!$container->hasDefinition($this->writerServiceId)) { return; } - $definition = $container->getDefinition('translation.writer'); + $definition = $container->getDefinition($this->writerServiceId); - foreach ($container->findTaggedServiceIds('translation.dumper', true) as $id => $attributes) { + foreach ($container->findTaggedServiceIds($this->dumperTag, true) as $id => $attributes) { $definition->addMethodCall('addDumper', [$attributes[0]['alias'], new Reference($id)]); } } diff --git a/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php b/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php index ee7c47ae..fab6b20a 100644 --- a/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php +++ b/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php @@ -21,15 +21,28 @@ use Symfony\Component\DependencyInjection\Reference; */ class TranslationExtractorPass implements CompilerPassInterface { + private $extractorServiceId; + private $extractorTag; + + public function __construct(string $extractorServiceId = 'translation.extractor', string $extractorTag = 'translation.extractor') + { + if (0 < \func_num_args()) { + trigger_deprecation('symfony/translation', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); + } + + $this->extractorServiceId = $extractorServiceId; + $this->extractorTag = $extractorTag; + } + public function process(ContainerBuilder $container) { - if (!$container->hasDefinition('translation.extractor')) { + if (!$container->hasDefinition($this->extractorServiceId)) { return; } - $definition = $container->getDefinition('translation.extractor'); + $definition = $container->getDefinition($this->extractorServiceId); - foreach ($container->findTaggedServiceIds('translation.extractor', true) as $id => $attributes) { + foreach ($container->findTaggedServiceIds($this->extractorTag, true) as $id => $attributes) { if (!isset($attributes[0]['alias'])) { throw new RuntimeException(sprintf('The alias for the tag "translation.extractor" of service "%s" must be set.', $id)); } diff --git a/vendor/symfony/translation/DependencyInjection/TranslatorPass.php b/vendor/symfony/translation/DependencyInjection/TranslatorPass.php index be79cdaf..e6a4b362 100644 --- a/vendor/symfony/translation/DependencyInjection/TranslatorPass.php +++ b/vendor/symfony/translation/DependencyInjection/TranslatorPass.php @@ -18,15 +18,34 @@ use Symfony\Component\DependencyInjection\Reference; class TranslatorPass implements CompilerPassInterface { + private $translatorServiceId; + private $readerServiceId; + private $loaderTag; + private $debugCommandServiceId; + private $updateCommandServiceId; + + public function __construct(string $translatorServiceId = 'translator.default', string $readerServiceId = 'translation.reader', string $loaderTag = 'translation.loader', string $debugCommandServiceId = 'console.command.translation_debug', string $updateCommandServiceId = 'console.command.translation_extract') + { + if (0 < \func_num_args()) { + trigger_deprecation('symfony/translation', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); + } + + $this->translatorServiceId = $translatorServiceId; + $this->readerServiceId = $readerServiceId; + $this->loaderTag = $loaderTag; + $this->debugCommandServiceId = $debugCommandServiceId; + $this->updateCommandServiceId = $updateCommandServiceId; + } + public function process(ContainerBuilder $container) { - if (!$container->hasDefinition('translator.default')) { + if (!$container->hasDefinition($this->translatorServiceId)) { return; } $loaders = []; $loaderRefs = []; - foreach ($container->findTaggedServiceIds('translation.loader', true) as $id => $attributes) { + foreach ($container->findTaggedServiceIds($this->loaderTag, true) as $id => $attributes) { $loaderRefs[$id] = new Reference($id); $loaders[$id][] = $attributes[0]['alias']; if (isset($attributes[0]['legacy-alias'])) { @@ -34,8 +53,8 @@ class TranslatorPass implements CompilerPassInterface } } - if ($container->hasDefinition('translation.reader')) { - $definition = $container->getDefinition('translation.reader'); + if ($container->hasDefinition($this->readerServiceId)) { + $definition = $container->getDefinition($this->readerServiceId); foreach ($loaders as $id => $formats) { foreach ($formats as $format) { $definition->addMethodCall('addLoader', [$format, $loaderRefs[$id]]); @@ -44,7 +63,7 @@ class TranslatorPass implements CompilerPassInterface } $container - ->findDefinition('translator.default') + ->findDefinition($this->translatorServiceId) ->replaceArgument(0, ServiceLocatorTagPass::register($container, $loaderRefs)) ->replaceArgument(3, $loaders) ; @@ -54,16 +73,16 @@ class TranslatorPass implements CompilerPassInterface } $paths = array_keys($container->getDefinition('twig.template_iterator')->getArgument(1)); - if ($container->hasDefinition('console.command.translation_debug')) { - $definition = $container->getDefinition('console.command.translation_debug'); + if ($container->hasDefinition($this->debugCommandServiceId)) { + $definition = $container->getDefinition($this->debugCommandServiceId); $definition->replaceArgument(4, $container->getParameter('twig.default_path')); if (\count($definition->getArguments()) > 6) { $definition->replaceArgument(6, $paths); } } - if ($container->hasDefinition('console.command.translation_extract')) { - $definition = $container->getDefinition('console.command.translation_extract'); + if ($container->hasDefinition($this->updateCommandServiceId)) { + $definition = $container->getDefinition($this->updateCommandServiceId); $definition->replaceArgument(5, $container->getParameter('twig.default_path')); if (\count($definition->getArguments()) > 7) { diff --git a/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php b/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php index b85c0662..18a71c45 100644 --- a/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php +++ b/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php @@ -22,26 +22,42 @@ use Symfony\Component\DependencyInjection\ServiceLocator; */ class TranslatorPathsPass extends AbstractRecursivePass { - private int $level = 0; + private $translatorServiceId; + private $debugCommandServiceId; + private $updateCommandServiceId; + private $resolverServiceId; + private $level = 0; /** * @var array */ - private array $paths = []; + private $paths = []; /** * @var array */ - private array $definitions = []; + private $definitions = []; /** * @var array> */ - private array $controllers = []; + private $controllers = []; + + public function __construct(string $translatorServiceId = 'translator', string $debugCommandServiceId = 'console.command.translation_debug', string $updateCommandServiceId = 'console.command.translation_extract', string $resolverServiceId = 'argument_resolver.service') + { + if (0 < \func_num_args()) { + trigger_deprecation('symfony/translation', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); + } + + $this->translatorServiceId = $translatorServiceId; + $this->debugCommandServiceId = $debugCommandServiceId; + $this->updateCommandServiceId = $updateCommandServiceId; + $this->resolverServiceId = $resolverServiceId; + } public function process(ContainerBuilder $container) { - if (!$container->hasDefinition('translator')) { + if (!$container->hasDefinition($this->translatorServiceId)) { return; } @@ -66,12 +82,12 @@ class TranslatorPathsPass extends AbstractRecursivePass } } if ($paths) { - if ($container->hasDefinition('console.command.translation_debug')) { - $definition = $container->getDefinition('console.command.translation_debug'); + if ($container->hasDefinition($this->debugCommandServiceId)) { + $definition = $container->getDefinition($this->debugCommandServiceId); $definition->replaceArgument(6, array_merge($definition->getArgument(6), $paths)); } - if ($container->hasDefinition('console.command.translation_extract')) { - $definition = $container->getDefinition('console.command.translation_extract'); + if ($container->hasDefinition($this->updateCommandServiceId)) { + $definition = $container->getDefinition($this->updateCommandServiceId); $definition->replaceArgument(7, array_merge($definition->getArgument(7), $paths)); } } @@ -82,10 +98,10 @@ class TranslatorPathsPass extends AbstractRecursivePass } } - protected function processValue(mixed $value, bool $isRoot = false): mixed + protected function processValue($value, bool $isRoot = false) { if ($value instanceof Reference) { - if ('translator' === (string) $value) { + if ((string) $value === $this->translatorServiceId) { for ($i = $this->level - 1; $i >= 0; --$i) { $class = $this->definitions[$i]->getClass(); @@ -120,8 +136,8 @@ class TranslatorPathsPass extends AbstractRecursivePass private function findControllerArguments(ContainerBuilder $container): array { - if ($container->hasDefinition('argument_resolver.service')) { - $argument = $container->getDefinition('argument_resolver.service')->getArgument(0); + if ($container->hasDefinition($this->resolverServiceId)) { + $argument = $container->getDefinition($this->resolverServiceId)->getArgument(0); if ($argument instanceof Reference) { $argument = $container->getDefinition($argument); } @@ -129,8 +145,8 @@ class TranslatorPathsPass extends AbstractRecursivePass return $argument->getArgument(0); } - if ($container->hasDefinition('debug.'.'argument_resolver.service')) { - $argument = $container->getDefinition('debug.'.'argument_resolver.service')->getArgument(0); + if ($container->hasDefinition('debug.'.$this->resolverServiceId)) { + $argument = $container->getDefinition('debug.'.$this->resolverServiceId)->getArgument(0); if ($argument instanceof Reference) { $argument = $container->getDefinition($argument); } diff --git a/vendor/symfony/translation/Dumper/CsvFileDumper.php b/vendor/symfony/translation/Dumper/CsvFileDumper.php index 0bd3f5e0..0c8589af 100644 --- a/vendor/symfony/translation/Dumper/CsvFileDumper.php +++ b/vendor/symfony/translation/Dumper/CsvFileDumper.php @@ -20,13 +20,13 @@ use Symfony\Component\Translation\MessageCatalogue; */ class CsvFileDumper extends FileDumper { - private string $delimiter = ';'; - private string $enclosure = '"'; + private $delimiter = ';'; + private $enclosure = '"'; /** * {@inheritdoc} */ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) { $handle = fopen('php://memory', 'r+'); @@ -53,7 +53,7 @@ class CsvFileDumper extends FileDumper /** * {@inheritdoc} */ - protected function getExtension(): string + protected function getExtension() { return 'csv'; } diff --git a/vendor/symfony/translation/Dumper/FileDumper.php b/vendor/symfony/translation/Dumper/FileDumper.php index 6bad4ff3..0e108451 100644 --- a/vendor/symfony/translation/Dumper/FileDumper.php +++ b/vendor/symfony/translation/Dumper/FileDumper.php @@ -86,13 +86,17 @@ abstract class FileDumper implements DumperInterface /** * Transforms a domain of a message catalogue to its string representation. + * + * @return string */ - abstract public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string; + abstract public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []); /** * Gets the file extension of the dumper. + * + * @return string */ - abstract protected function getExtension(): string; + abstract protected function getExtension(); /** * Gets the relative file path using the template. diff --git a/vendor/symfony/translation/Dumper/IcuResFileDumper.php b/vendor/symfony/translation/Dumper/IcuResFileDumper.php index f13f86c8..12a7a8cf 100644 --- a/vendor/symfony/translation/Dumper/IcuResFileDumper.php +++ b/vendor/symfony/translation/Dumper/IcuResFileDumper.php @@ -28,7 +28,7 @@ class IcuResFileDumper extends FileDumper /** * {@inheritdoc} */ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) { $data = $indexes = $resources = ''; @@ -97,7 +97,7 @@ class IcuResFileDumper extends FileDumper /** * {@inheritdoc} */ - protected function getExtension(): string + protected function getExtension() { return 'res'; } diff --git a/vendor/symfony/translation/Dumper/IniFileDumper.php b/vendor/symfony/translation/Dumper/IniFileDumper.php index 75032be1..93c900a4 100644 --- a/vendor/symfony/translation/Dumper/IniFileDumper.php +++ b/vendor/symfony/translation/Dumper/IniFileDumper.php @@ -23,7 +23,7 @@ class IniFileDumper extends FileDumper /** * {@inheritdoc} */ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) { $output = ''; @@ -38,7 +38,7 @@ class IniFileDumper extends FileDumper /** * {@inheritdoc} */ - protected function getExtension(): string + protected function getExtension() { return 'ini'; } diff --git a/vendor/symfony/translation/Dumper/JsonFileDumper.php b/vendor/symfony/translation/Dumper/JsonFileDumper.php index 11027303..34c0b569 100644 --- a/vendor/symfony/translation/Dumper/JsonFileDumper.php +++ b/vendor/symfony/translation/Dumper/JsonFileDumper.php @@ -23,7 +23,7 @@ class JsonFileDumper extends FileDumper /** * {@inheritdoc} */ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) { $flags = $options['json_encoding'] ?? \JSON_PRETTY_PRINT; @@ -33,7 +33,7 @@ class JsonFileDumper extends FileDumper /** * {@inheritdoc} */ - protected function getExtension(): string + protected function getExtension() { return 'json'; } diff --git a/vendor/symfony/translation/Dumper/MoFileDumper.php b/vendor/symfony/translation/Dumper/MoFileDumper.php index c0880101..f52206ee 100644 --- a/vendor/symfony/translation/Dumper/MoFileDumper.php +++ b/vendor/symfony/translation/Dumper/MoFileDumper.php @@ -24,7 +24,7 @@ class MoFileDumper extends FileDumper /** * {@inheritdoc} */ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) { $sources = $targets = $sourceOffsets = $targetOffsets = ''; $offsets = []; @@ -57,7 +57,7 @@ class MoFileDumper extends FileDumper .$this->writeLong($offset[2] + $sourcesStart + $sourcesSize); } - $output = implode('', array_map($this->writeLong(...), $header)) + $output = implode('', array_map([$this, 'writeLong'], $header)) .$sourceOffsets .$targetOffsets .$sources @@ -70,12 +70,12 @@ class MoFileDumper extends FileDumper /** * {@inheritdoc} */ - protected function getExtension(): string + protected function getExtension() { return 'mo'; } - private function writeLong(mixed $str): string + private function writeLong($str): string { return pack('V*', $str); } diff --git a/vendor/symfony/translation/Dumper/PhpFileDumper.php b/vendor/symfony/translation/Dumper/PhpFileDumper.php index 565d8937..6163b529 100644 --- a/vendor/symfony/translation/Dumper/PhpFileDumper.php +++ b/vendor/symfony/translation/Dumper/PhpFileDumper.php @@ -23,7 +23,7 @@ class PhpFileDumper extends FileDumper /** * {@inheritdoc} */ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) { return "all($domain), true).";\n"; } @@ -31,7 +31,7 @@ class PhpFileDumper extends FileDumper /** * {@inheritdoc} */ - protected function getExtension(): string + protected function getExtension() { return 'php'; } diff --git a/vendor/symfony/translation/Dumper/PoFileDumper.php b/vendor/symfony/translation/Dumper/PoFileDumper.php index 313e5045..0d822818 100644 --- a/vendor/symfony/translation/Dumper/PoFileDumper.php +++ b/vendor/symfony/translation/Dumper/PoFileDumper.php @@ -23,7 +23,7 @@ class PoFileDumper extends FileDumper /** * {@inheritdoc} */ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) { $output = 'msgid ""'."\n"; $output .= 'msgstr ""'."\n"; @@ -114,7 +114,7 @@ EOF; /** * {@inheritdoc} */ - protected function getExtension(): string + protected function getExtension() { return 'po'; } @@ -124,7 +124,7 @@ EOF; return addcslashes($str, "\0..\37\42\134"); } - private function formatComments(string|array $comments, string $prefix = ''): ?string + private function formatComments($comments, string $prefix = ''): ?string { $output = null; diff --git a/vendor/symfony/translation/Dumper/QtFileDumper.php b/vendor/symfony/translation/Dumper/QtFileDumper.php index 819409fc..406e9f00 100644 --- a/vendor/symfony/translation/Dumper/QtFileDumper.php +++ b/vendor/symfony/translation/Dumper/QtFileDumper.php @@ -23,7 +23,7 @@ class QtFileDumper extends FileDumper /** * {@inheritdoc} */ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) { $dom = new \DOMDocument('1.0', 'utf-8'); $dom->formatOutput = true; @@ -54,7 +54,7 @@ class QtFileDumper extends FileDumper /** * {@inheritdoc} */ - protected function getExtension(): string + protected function getExtension() { return 'ts'; } diff --git a/vendor/symfony/translation/Dumper/XliffFileDumper.php b/vendor/symfony/translation/Dumper/XliffFileDumper.php index d03d8146..f7dbdcdd 100644 --- a/vendor/symfony/translation/Dumper/XliffFileDumper.php +++ b/vendor/symfony/translation/Dumper/XliffFileDumper.php @@ -21,15 +21,10 @@ use Symfony\Component\Translation\MessageCatalogue; */ class XliffFileDumper extends FileDumper { - public function __construct( - private string $extension = 'xlf', - ) { - } - /** * {@inheritdoc} */ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) { $xliffVersion = '1.2'; if (\array_key_exists('xliff_version', $options)) { @@ -55,9 +50,9 @@ class XliffFileDumper extends FileDumper /** * {@inheritdoc} */ - protected function getExtension(): string + protected function getExtension() { - return $this->extension; + return 'xlf'; } private function dumpXliff1(string $defaultLocale, MessageCatalogue $messages, ?string $domain, array $options = []) @@ -86,15 +81,6 @@ class XliffFileDumper extends FileDumper $xliffTool->setAttribute($id, $value); } - if ($catalogueMetadata = $messages->getCatalogueMetadata('', $domain) ?? []) { - $xliffPropGroup = $xliffHead->appendChild($dom->createElement('prop-group')); - foreach ($catalogueMetadata as $key => $value) { - $xliffProp = $xliffPropGroup->appendChild($dom->createElement('prop')); - $xliffProp->setAttribute('prop-type', $key); - $xliffProp->appendChild($dom->createTextNode($value)); - } - } - $xliffBody = $xliffFile->appendChild($dom->createElement('body')); foreach ($messages->all($domain) as $source => $target) { $translation = $dom->createElement('trans-unit'); @@ -161,16 +147,6 @@ class XliffFileDumper extends FileDumper $xliffFile->setAttribute('id', $domain.'.'.$messages->getLocale()); } - if ($catalogueMetadata = $messages->getCatalogueMetadata('', $domain) ?? []) { - $xliff->setAttribute('xmlns:m', 'urn:oasis:names:tc:xliff:metadata:2.0'); - $xliffMetadata = $xliffFile->appendChild($dom->createElement('m:metadata')); - foreach ($catalogueMetadata as $key => $value) { - $xliffMeta = $xliffMetadata->appendChild($dom->createElement('prop')); - $xliffMeta->setAttribute('type', $key); - $xliffMeta->appendChild($dom->createTextNode($value)); - } - } - foreach ($messages->all($domain) as $source => $target) { $translation = $dom->createElement('unit'); $translation->setAttribute('id', strtr(substr(base64_encode(hash('sha256', $source, true)), 0, 7), '/+', '._')); diff --git a/vendor/symfony/translation/Dumper/YamlFileDumper.php b/vendor/symfony/translation/Dumper/YamlFileDumper.php index d0cfbefa..0b21e8c8 100644 --- a/vendor/symfony/translation/Dumper/YamlFileDumper.php +++ b/vendor/symfony/translation/Dumper/YamlFileDumper.php @@ -23,7 +23,7 @@ use Symfony\Component\Yaml\Yaml; */ class YamlFileDumper extends FileDumper { - private string $extension; + private $extension; public function __construct(string $extension = 'yml') { @@ -33,7 +33,7 @@ class YamlFileDumper extends FileDumper /** * {@inheritdoc} */ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) { if (!class_exists(Yaml::class)) { throw new LogicException('Dumping translations in the YAML format requires the Symfony Yaml component.'); @@ -55,7 +55,7 @@ class YamlFileDumper extends FileDumper /** * {@inheritdoc} */ - protected function getExtension(): string + protected function getExtension() { return $this->extension; } diff --git a/vendor/symfony/translation/Exception/ProviderException.php b/vendor/symfony/translation/Exception/ProviderException.php index 65883f85..571920da 100644 --- a/vendor/symfony/translation/Exception/ProviderException.php +++ b/vendor/symfony/translation/Exception/ProviderException.php @@ -18,8 +18,8 @@ use Symfony\Contracts\HttpClient\ResponseInterface; */ class ProviderException extends RuntimeException implements ProviderExceptionInterface { - private ResponseInterface $response; - private string $debug; + private $response; + private $debug; public function __construct(string $message, ResponseInterface $response, int $code = 0, \Exception $previous = null) { diff --git a/vendor/symfony/translation/Extractor/AbstractFileExtractor.php b/vendor/symfony/translation/Extractor/AbstractFileExtractor.php index 4c088b94..3bc87834 100644 --- a/vendor/symfony/translation/Extractor/AbstractFileExtractor.php +++ b/vendor/symfony/translation/Extractor/AbstractFileExtractor.php @@ -20,7 +20,12 @@ use Symfony\Component\Translation\Exception\InvalidArgumentException; */ abstract class AbstractFileExtractor { - protected function extractFiles(string|iterable $resource): iterable + /** + * @param string|iterable $resource Files, a file or a directory + * + * @return iterable + */ + protected function extractFiles($resource) { if (is_iterable($resource)) { $files = []; @@ -44,9 +49,11 @@ abstract class AbstractFileExtractor } /** + * @return bool + * * @throws InvalidArgumentException */ - protected function isFile(string $file): bool + protected function isFile(string $file) { if (!is_file($file)) { throw new InvalidArgumentException(sprintf('The "%s" file does not exist.', $file)); @@ -61,7 +68,9 @@ abstract class AbstractFileExtractor abstract protected function canBeExtracted(string $file); /** + * @param string|array $resource Files, a file or a directory + * * @return iterable */ - abstract protected function extractFromDirectory(string|array $resource); + abstract protected function extractFromDirectory($resource); } diff --git a/vendor/symfony/translation/Extractor/ChainExtractor.php b/vendor/symfony/translation/Extractor/ChainExtractor.php index e58e82f0..95dcf157 100644 --- a/vendor/symfony/translation/Extractor/ChainExtractor.php +++ b/vendor/symfony/translation/Extractor/ChainExtractor.php @@ -25,7 +25,7 @@ class ChainExtractor implements ExtractorInterface * * @var ExtractorInterface[] */ - private array $extractors = []; + private $extractors = []; /** * Adds a loader to the translation extractor. @@ -48,7 +48,7 @@ class ChainExtractor implements ExtractorInterface /** * {@inheritdoc} */ - public function extract(string|iterable $directory, MessageCatalogue $catalogue) + public function extract($directory, MessageCatalogue $catalogue) { foreach ($this->extractors as $extractor) { $extractor->extract($directory, $catalogue); diff --git a/vendor/symfony/translation/Extractor/ExtractorInterface.php b/vendor/symfony/translation/Extractor/ExtractorInterface.php index b76a7f20..e1db8a9c 100644 --- a/vendor/symfony/translation/Extractor/ExtractorInterface.php +++ b/vendor/symfony/translation/Extractor/ExtractorInterface.php @@ -26,7 +26,7 @@ interface ExtractorInterface * * @param string|iterable $resource Files, a file or a directory */ - public function extract(string|iterable $resource, MessageCatalogue $catalogue); + public function extract($resource, MessageCatalogue $catalogue); /** * Sets the prefix that should be used for new found messages. diff --git a/vendor/symfony/translation/Extractor/PhpExtractor.php b/vendor/symfony/translation/Extractor/PhpExtractor.php index 1b86cc59..38c08d54 100644 --- a/vendor/symfony/translation/Extractor/PhpExtractor.php +++ b/vendor/symfony/translation/Extractor/PhpExtractor.php @@ -28,7 +28,7 @@ class PhpExtractor extends AbstractFileExtractor implements ExtractorInterface /** * Prefix for new found message. */ - private string $prefix = ''; + private $prefix = ''; /** * The sequence that captures translation messages. @@ -131,7 +131,7 @@ class PhpExtractor extends AbstractFileExtractor implements ExtractorInterface /** * {@inheritdoc} */ - public function extract(string|iterable $resource, MessageCatalogue $catalog) + public function extract($resource, MessageCatalogue $catalog) { $files = $this->extractFiles($resource); foreach ($files as $file) { @@ -151,8 +151,12 @@ class PhpExtractor extends AbstractFileExtractor implements ExtractorInterface /** * Normalizes a token. + * + * @param mixed $token + * + * @return string|null */ - protected function normalizeToken(mixed $token): ?string + protected function normalizeToken($token) { if (isset($token[1]) && 'b"' !== $token) { return $token[1]; @@ -307,9 +311,11 @@ class PhpExtractor extends AbstractFileExtractor implements ExtractorInterface } /** + * @return bool + * * @throws \InvalidArgumentException */ - protected function canBeExtracted(string $file): bool + protected function canBeExtracted(string $file) { return $this->isFile($file) && 'php' === pathinfo($file, \PATHINFO_EXTENSION); } @@ -317,7 +323,7 @@ class PhpExtractor extends AbstractFileExtractor implements ExtractorInterface /** * {@inheritdoc} */ - protected function extractFromDirectory(string|array $directory): iterable + protected function extractFromDirectory($directory) { if (!class_exists(Finder::class)) { throw new \LogicException(sprintf('You cannot use "%s" as the "symfony/finder" package is not installed. Try running "composer require symfony/finder".', static::class)); diff --git a/vendor/symfony/translation/Extractor/PhpStringTokenParser.php b/vendor/symfony/translation/Extractor/PhpStringTokenParser.php index 7fbd37c6..d114cc73 100644 --- a/vendor/symfony/translation/Extractor/PhpStringTokenParser.php +++ b/vendor/symfony/translation/Extractor/PhpStringTokenParser.php @@ -64,8 +64,10 @@ class PhpStringTokenParser * Parses a string token. * * @param string $str String token content + * + * @return string */ - public static function parse(string $str): string + public static function parse(string $str) { $bLength = 0; if ('b' === $str[0]) { @@ -88,8 +90,10 @@ class PhpStringTokenParser * * @param string $str String without quotes * @param string|null $quote Quote type + * + * @return string */ - public static function parseEscapeSequences(string $str, string $quote = null): string + public static function parseEscapeSequences(string $str, string $quote = null) { if (null !== $quote) { $str = str_replace('\\'.$quote, $quote, $str); @@ -120,8 +124,10 @@ class PhpStringTokenParser * * @param string $startToken Doc string start token content (<<cache[$locale][$message] ?? null) { - if (!$this->hasMessageFormatter ??= class_exists(\MessageFormatter::class)) { + if (!($this->hasMessageFormatter ?? $this->hasMessageFormatter = class_exists(\MessageFormatter::class))) { throw new LogicException('Cannot parse message translation: please install the "intl" PHP extension or the "symfony/polyfill-intl-messageformatter" package.'); } try { diff --git a/vendor/symfony/translation/Formatter/MessageFormatter.php b/vendor/symfony/translation/Formatter/MessageFormatter.php index 013ed852..04079648 100644 --- a/vendor/symfony/translation/Formatter/MessageFormatter.php +++ b/vendor/symfony/translation/Formatter/MessageFormatter.php @@ -22,8 +22,8 @@ class_exists(IntlFormatter::class); */ class MessageFormatter implements MessageFormatterInterface, IntlFormatterInterface { - private TranslatorInterface $translator; - private IntlFormatterInterface $intlFormatter; + private $translator; + private $intlFormatter; /** * @param TranslatorInterface|null $translator An identity translator to use as selector for pluralization @@ -37,7 +37,7 @@ class MessageFormatter implements MessageFormatterInterface, IntlFormatterInterf /** * {@inheritdoc} */ - public function format(string $message, string $locale, array $parameters = []): string + public function format(string $message, string $locale, array $parameters = []) { if ($this->translator instanceof TranslatorInterface) { return $this->translator->trans($message, $parameters, null, $locale); diff --git a/vendor/symfony/translation/Formatter/MessageFormatterInterface.php b/vendor/symfony/translation/Formatter/MessageFormatterInterface.php index d5c41c19..b85dbfd1 100644 --- a/vendor/symfony/translation/Formatter/MessageFormatterInterface.php +++ b/vendor/symfony/translation/Formatter/MessageFormatterInterface.php @@ -23,6 +23,8 @@ interface MessageFormatterInterface * @param string $message The message (may also be an object that can be cast to string) * @param string $locale The message locale * @param array $parameters An array of parameters for the message + * + * @return string */ - public function format(string $message, string $locale, array $parameters = []): string; + public function format(string $message, string $locale, array $parameters = []); } diff --git a/vendor/symfony/translation/Loader/ArrayLoader.php b/vendor/symfony/translation/Loader/ArrayLoader.php index 35de9ef5..0758da8b 100644 --- a/vendor/symfony/translation/Loader/ArrayLoader.php +++ b/vendor/symfony/translation/Loader/ArrayLoader.php @@ -23,7 +23,7 @@ class ArrayLoader implements LoaderInterface /** * {@inheritdoc} */ - public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue + public function load($resource, string $locale, string $domain = 'messages') { $resource = $this->flatten($resource); $catalogue = new MessageCatalogue($locale); diff --git a/vendor/symfony/translation/Loader/CsvFileLoader.php b/vendor/symfony/translation/Loader/CsvFileLoader.php index 6f14fd39..8d5d4db9 100644 --- a/vendor/symfony/translation/Loader/CsvFileLoader.php +++ b/vendor/symfony/translation/Loader/CsvFileLoader.php @@ -20,14 +20,14 @@ use Symfony\Component\Translation\Exception\NotFoundResourceException; */ class CsvFileLoader extends FileLoader { - private string $delimiter = ';'; - private string $enclosure = '"'; - private string $escape = '\\'; + private $delimiter = ';'; + private $enclosure = '"'; + private $escape = '\\'; /** * {@inheritdoc} */ - protected function loadResource(string $resource): array + protected function loadResource(string $resource) { $messages = []; @@ -45,7 +45,7 @@ class CsvFileLoader extends FileLoader continue; } - if (!str_starts_with($data[0], '#') && isset($data[1]) && 2 === \count($data)) { + if ('#' !== substr($data[0], 0, 1) && isset($data[1]) && 2 === \count($data)) { $messages[$data[0]] = $data[1]; } } diff --git a/vendor/symfony/translation/Loader/FileLoader.php b/vendor/symfony/translation/Loader/FileLoader.php index e170d761..4725ea6d 100644 --- a/vendor/symfony/translation/Loader/FileLoader.php +++ b/vendor/symfony/translation/Loader/FileLoader.php @@ -14,7 +14,6 @@ namespace Symfony\Component\Translation\Loader; use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\Translation\Exception\InvalidResourceException; use Symfony\Component\Translation\Exception\NotFoundResourceException; -use Symfony\Component\Translation\MessageCatalogue; /** * @author Abdellatif Ait boudad @@ -24,7 +23,7 @@ abstract class FileLoader extends ArrayLoader /** * {@inheritdoc} */ - public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue + public function load($resource, string $locale, string $domain = 'messages') { if (!stream_is_local($resource)) { throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource)); @@ -56,7 +55,9 @@ abstract class FileLoader extends ArrayLoader } /** + * @return array + * * @throws InvalidResourceException if stream content has an invalid format */ - abstract protected function loadResource(string $resource): array; + abstract protected function loadResource(string $resource); } diff --git a/vendor/symfony/translation/Loader/IcuDatFileLoader.php b/vendor/symfony/translation/Loader/IcuDatFileLoader.php index e589ab17..2a1aecc6 100644 --- a/vendor/symfony/translation/Loader/IcuDatFileLoader.php +++ b/vendor/symfony/translation/Loader/IcuDatFileLoader.php @@ -26,7 +26,7 @@ class IcuDatFileLoader extends IcuResFileLoader /** * {@inheritdoc} */ - public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue + public function load($resource, string $locale, string $domain = 'messages') { if (!stream_is_local($resource.'.dat')) { throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource)); @@ -38,7 +38,7 @@ class IcuDatFileLoader extends IcuResFileLoader try { $rb = new \ResourceBundle($locale, $resource); - } catch (\Exception) { + } catch (\Exception $e) { $rb = null; } diff --git a/vendor/symfony/translation/Loader/IcuResFileLoader.php b/vendor/symfony/translation/Loader/IcuResFileLoader.php index 555b2a39..7e3391ec 100644 --- a/vendor/symfony/translation/Loader/IcuResFileLoader.php +++ b/vendor/symfony/translation/Loader/IcuResFileLoader.php @@ -26,7 +26,7 @@ class IcuResFileLoader implements LoaderInterface /** * {@inheritdoc} */ - public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue + public function load($resource, string $locale, string $domain = 'messages') { if (!stream_is_local($resource)) { throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource)); @@ -38,7 +38,7 @@ class IcuResFileLoader implements LoaderInterface try { $rb = new \ResourceBundle($locale, $resource); - } catch (\Exception) { + } catch (\Exception $e) { $rb = null; } @@ -72,8 +72,10 @@ class IcuResFileLoader implements LoaderInterface * @param \ResourceBundle $rb The ResourceBundle that will be flattened * @param array $messages Used internally for recursive calls * @param string $path Current path being parsed, used internally for recursive calls + * + * @return array */ - protected function flatten(\ResourceBundle $rb, array &$messages = [], string $path = null): array + protected function flatten(\ResourceBundle $rb, array &$messages = [], string $path = null) { foreach ($rb as $key => $value) { $nodePath = $path ? $path.'.'.$key : $key; diff --git a/vendor/symfony/translation/Loader/IniFileLoader.php b/vendor/symfony/translation/Loader/IniFileLoader.php index 04e294d1..7398f777 100644 --- a/vendor/symfony/translation/Loader/IniFileLoader.php +++ b/vendor/symfony/translation/Loader/IniFileLoader.php @@ -21,7 +21,7 @@ class IniFileLoader extends FileLoader /** * {@inheritdoc} */ - protected function loadResource(string $resource): array + protected function loadResource(string $resource) { return parse_ini_file($resource, true); } diff --git a/vendor/symfony/translation/Loader/JsonFileLoader.php b/vendor/symfony/translation/Loader/JsonFileLoader.php index c70dfde0..5aefba07 100644 --- a/vendor/symfony/translation/Loader/JsonFileLoader.php +++ b/vendor/symfony/translation/Loader/JsonFileLoader.php @@ -23,7 +23,7 @@ class JsonFileLoader extends FileLoader /** * {@inheritdoc} */ - protected function loadResource(string $resource): array + protected function loadResource(string $resource) { $messages = []; if ($data = file_get_contents($resource)) { @@ -42,13 +42,19 @@ class JsonFileLoader extends FileLoader */ private function getJSONErrorMessage(int $errorCode): string { - return match ($errorCode) { - \JSON_ERROR_DEPTH => 'Maximum stack depth exceeded', - \JSON_ERROR_STATE_MISMATCH => 'Underflow or the modes mismatch', - \JSON_ERROR_CTRL_CHAR => 'Unexpected control character found', - \JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON', - \JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded', - default => 'Unknown error', - }; + switch ($errorCode) { + case \JSON_ERROR_DEPTH: + return 'Maximum stack depth exceeded'; + case \JSON_ERROR_STATE_MISMATCH: + return 'Underflow or the modes mismatch'; + case \JSON_ERROR_CTRL_CHAR: + return 'Unexpected control character found'; + case \JSON_ERROR_SYNTAX: + return 'Syntax error, malformed JSON'; + case \JSON_ERROR_UTF8: + return 'Malformed UTF-8 characters, possibly incorrectly encoded'; + default: + return 'Unknown error'; + } } } diff --git a/vendor/symfony/translation/Loader/LoaderInterface.php b/vendor/symfony/translation/Loader/LoaderInterface.php index 29d5560d..96b0c0d8 100644 --- a/vendor/symfony/translation/Loader/LoaderInterface.php +++ b/vendor/symfony/translation/Loader/LoaderInterface.php @@ -25,8 +25,14 @@ interface LoaderInterface /** * Loads a locale. * + * @param mixed $resource A resource + * @param string $locale A locale + * @param string $domain The domain + * + * @return MessageCatalogue + * * @throws NotFoundResourceException when the resource cannot be found * @throws InvalidResourceException when the resource cannot be loaded */ - public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue; + public function load($resource, string $locale, string $domain = 'messages'); } diff --git a/vendor/symfony/translation/Loader/MoFileLoader.php b/vendor/symfony/translation/Loader/MoFileLoader.php index b0c89138..7fa2f2dc 100644 --- a/vendor/symfony/translation/Loader/MoFileLoader.php +++ b/vendor/symfony/translation/Loader/MoFileLoader.php @@ -41,7 +41,7 @@ class MoFileLoader extends FileLoader * * {@inheritdoc} */ - protected function loadResource(string $resource): array + protected function loadResource(string $resource) { $stream = fopen($resource, 'r'); diff --git a/vendor/symfony/translation/Loader/PhpFileLoader.php b/vendor/symfony/translation/Loader/PhpFileLoader.php index ae299c2a..40f64db2 100644 --- a/vendor/symfony/translation/Loader/PhpFileLoader.php +++ b/vendor/symfony/translation/Loader/PhpFileLoader.php @@ -18,12 +18,12 @@ namespace Symfony\Component\Translation\Loader; */ class PhpFileLoader extends FileLoader { - private static ?array $cache = []; + private static $cache = []; /** * {@inheritdoc} */ - protected function loadResource(string $resource): array + protected function loadResource(string $resource) { if ([] === self::$cache && \function_exists('opcache_invalidate') && filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOLEAN) && (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) || filter_var(\ini_get('opcache.enable_cli'), \FILTER_VALIDATE_BOOLEAN))) { self::$cache = null; diff --git a/vendor/symfony/translation/Loader/PoFileLoader.php b/vendor/symfony/translation/Loader/PoFileLoader.php index 01fc8d4f..ee143e20 100644 --- a/vendor/symfony/translation/Loader/PoFileLoader.php +++ b/vendor/symfony/translation/Loader/PoFileLoader.php @@ -60,7 +60,7 @@ class PoFileLoader extends FileLoader * * {@inheritdoc} */ - protected function loadResource(string $resource): array + protected function loadResource(string $resource) { $stream = fopen($resource, 'r'); @@ -83,15 +83,15 @@ class PoFileLoader extends FileLoader } $item = $defaults; $flags = []; - } elseif (str_starts_with($line, '#,')) { + } elseif ('#,' === substr($line, 0, 2)) { $flags = array_map('trim', explode(',', substr($line, 2))); - } elseif (str_starts_with($line, 'msgid "')) { + } elseif ('msgid "' === substr($line, 0, 7)) { // We start a new msg so save previous // TODO: this fails when comments or contexts are added $this->addMessage($messages, $item); $item = $defaults; $item['ids']['singular'] = substr($line, 7, -1); - } elseif (str_starts_with($line, 'msgstr "')) { + } elseif ('msgstr "' === substr($line, 0, 8)) { $item['translated'] = substr($line, 8, -1); } elseif ('"' === $line[0]) { $continues = isset($item['translated']) ? 'translated' : 'ids'; @@ -102,9 +102,9 @@ class PoFileLoader extends FileLoader } else { $item[$continues] .= substr($line, 1, -1); } - } elseif (str_starts_with($line, 'msgid_plural "')) { + } elseif ('msgid_plural "' === substr($line, 0, 14)) { $item['ids']['plural'] = substr($line, 14, -1); - } elseif (str_starts_with($line, 'msgstr[')) { + } elseif ('msgstr[' === substr($line, 0, 7)) { $size = strpos($line, ']'); $item['translated'][(int) substr($line, 7, 1)] = substr($line, $size + 3, -1); } diff --git a/vendor/symfony/translation/Loader/QtFileLoader.php b/vendor/symfony/translation/Loader/QtFileLoader.php index 6d5582d6..9cf2fe97 100644 --- a/vendor/symfony/translation/Loader/QtFileLoader.php +++ b/vendor/symfony/translation/Loader/QtFileLoader.php @@ -28,7 +28,7 @@ class QtFileLoader implements LoaderInterface /** * {@inheritdoc} */ - public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue + public function load($resource, string $locale, string $domain = 'messages') { if (!class_exists(XmlUtils::class)) { throw new RuntimeException('Loading translations from the QT format requires the Symfony Config component.'); diff --git a/vendor/symfony/translation/Loader/XliffFileLoader.php b/vendor/symfony/translation/Loader/XliffFileLoader.php index 971bfd50..5c9794a5 100644 --- a/vendor/symfony/translation/Loader/XliffFileLoader.php +++ b/vendor/symfony/translation/Loader/XliffFileLoader.php @@ -31,7 +31,7 @@ class XliffFileLoader implements LoaderInterface /** * {@inheritdoc} */ - public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue + public function load($resource, string $locale, string $domain = 'messages') { if (!class_exists(XmlUtils::class)) { throw new RuntimeException('Loading translations from the Xliff format requires the Symfony Config component.'); @@ -104,10 +104,6 @@ class XliffFileLoader implements LoaderInterface $file->registerXPathNamespace('xliff', $namespace); - foreach ($file->xpath('.//xliff:prop') as $prop) { - $catalogue->setCatalogueMetadata($prop->attributes()['prop-type'], (string) $prop, $domain); - } - foreach ($file->xpath('.//xliff:trans-unit') as $translation) { $attributes = $translation->attributes(); @@ -231,6 +227,6 @@ class XliffFileLoader implements LoaderInterface private function isXmlString(string $resource): bool { - return str_starts_with($resource, 'yamlParser) { if (!class_exists(\Symfony\Component\Yaml\Parser::class)) { diff --git a/vendor/symfony/translation/LocaleSwitcher.php b/vendor/symfony/translation/LocaleSwitcher.php deleted file mode 100644 index 0fc56e33..00000000 --- a/vendor/symfony/translation/LocaleSwitcher.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation; - -use Symfony\Component\Routing\RequestContext; -use Symfony\Contracts\Translation\LocaleAwareInterface; - -/** - * @author Kevin Bond - */ -class LocaleSwitcher implements LocaleAwareInterface -{ - private string $defaultLocale; - - /** - * @param LocaleAwareInterface[] $localeAwareServices - */ - public function __construct( - private string $locale, - private iterable $localeAwareServices, - private ?RequestContext $requestContext = null, - ) { - $this->defaultLocale = $locale; - } - - public function setLocale(string $locale): void - { - \Locale::setDefault($this->locale = $locale); - $this->requestContext?->setParameter('_locale', $locale); - - foreach ($this->localeAwareServices as $service) { - $service->setLocale($locale); - } - } - - public function getLocale(): string - { - return $this->locale; - } - - /** - * Switch to a new locale, execute a callback, then switch back to the original. - * - * @template T - * - * @param callable():T $callback - * - * @return T - */ - public function runWithLocale(string $locale, callable $callback): mixed - { - $original = $this->getLocale(); - $this->setLocale($locale); - - try { - return $callback(); - } finally { - $this->setLocale($original); - } - } - - public function reset(): void - { - $this->setLocale($this->defaultLocale); - } -} diff --git a/vendor/symfony/translation/LoggingTranslator.php b/vendor/symfony/translation/LoggingTranslator.php index 8dd8ecf9..6ccd4828 100644 --- a/vendor/symfony/translation/LoggingTranslator.php +++ b/vendor/symfony/translation/LoggingTranslator.php @@ -21,8 +21,8 @@ use Symfony\Contracts\Translation\TranslatorInterface; */ class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface, LocaleAwareInterface { - private TranslatorInterface $translator; - private LoggerInterface $logger; + private $translator; + private $logger; /** * @param TranslatorInterface&TranslatorBagInterface&LocaleAwareInterface $translator The translator must implement TranslatorBagInterface @@ -40,7 +40,7 @@ class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface, /** * {@inheritdoc} */ - public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null): string + public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null) { $trans = $this->translator->trans($id = (string) $id, $parameters, $domain, $locale); $this->log($id, $domain, $locale); @@ -65,7 +65,7 @@ class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface, /** * {@inheritdoc} */ - public function getLocale(): string + public function getLocale() { return $this->translator->getLocale(); } @@ -73,7 +73,7 @@ class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface, /** * {@inheritdoc} */ - public function getCatalogue(string $locale = null): MessageCatalogueInterface + public function getCatalogue(string $locale = null) { return $this->translator->getCatalogue($locale); } @@ -88,8 +88,10 @@ class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface, /** * Gets the fallback locales. + * + * @return array */ - public function getFallbackLocales(): array + public function getFallbackLocales() { if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) { return $this->translator->getFallbackLocales(); diff --git a/vendor/symfony/translation/MessageCatalogue.php b/vendor/symfony/translation/MessageCatalogue.php index 4b8fc58d..9da3b7f0 100644 --- a/vendor/symfony/translation/MessageCatalogue.php +++ b/vendor/symfony/translation/MessageCatalogue.php @@ -17,15 +17,14 @@ use Symfony\Component\Translation\Exception\LogicException; /** * @author Fabien Potencier */ -class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterface, CatalogueMetadataAwareInterface +class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterface { - private array $messages = []; - private array $metadata = []; - private array $catalogueMetadata = []; - private array $resources = []; - private string $locale; - private ?MessageCatalogueInterface $fallbackCatalogue = null; - private ?self $parent = null; + private $messages = []; + private $metadata = []; + private $resources = []; + private $locale; + private $fallbackCatalogue; + private $parent; /** * @param array $messages An array of messages classified by domain @@ -39,7 +38,7 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf /** * {@inheritdoc} */ - public function getLocale(): string + public function getLocale() { return $this->locale; } @@ -47,7 +46,7 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf /** * {@inheritdoc} */ - public function getDomains(): array + public function getDomains() { $domains = []; @@ -64,7 +63,7 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf /** * {@inheritdoc} */ - public function all(string $domain = null): array + public function all(string $domain = null) { if (null !== $domain) { // skip messages merge if intl-icu requested explicitly @@ -100,7 +99,7 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf /** * {@inheritdoc} */ - public function has(string $id, string $domain = 'messages'): bool + public function has(string $id, string $domain = 'messages') { if (isset($this->messages[$domain][$id]) || isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id])) { return true; @@ -116,7 +115,7 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf /** * {@inheritdoc} */ - public function defines(string $id, string $domain = 'messages'): bool + public function defines(string $id, string $domain = 'messages') { return isset($this->messages[$domain][$id]) || isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id]); } @@ -124,7 +123,7 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf /** * {@inheritdoc} */ - public function get(string $id, string $domain = 'messages'): string + public function get(string $id, string $domain = 'messages') { if (isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id])) { return $this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id]; @@ -192,11 +191,6 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf $metadata = $catalogue->getMetadata('', ''); $this->addMetadata($metadata); } - - if ($catalogue instanceof CatalogueMetadataAwareInterface) { - $catalogueMetadata = $catalogue->getCatalogueMetadata('', ''); - $this->addCatalogueMetadata($catalogueMetadata); - } } /** @@ -234,7 +228,7 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf /** * {@inheritdoc} */ - public function getFallbackCatalogue(): ?MessageCatalogueInterface + public function getFallbackCatalogue() { return $this->fallbackCatalogue; } @@ -242,7 +236,7 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf /** * {@inheritdoc} */ - public function getResources(): array + public function getResources() { return array_values($this->resources); } @@ -258,7 +252,7 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf /** * {@inheritdoc} */ - public function getMetadata(string $key = '', string $domain = 'messages'): mixed + public function getMetadata(string $key = '', string $domain = 'messages') { if ('' == $domain) { return $this->metadata; @@ -280,7 +274,7 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf /** * {@inheritdoc} */ - public function setMetadata(string $key, mixed $value, string $domain = 'messages') + public function setMetadata(string $key, $value, string $domain = 'messages') { $this->metadata[$domain][$key] = $value; } @@ -299,50 +293,6 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf } } - /** - * {@inheritdoc} - */ - public function getCatalogueMetadata(string $key = '', string $domain = 'messages'): mixed - { - if (!$domain) { - return $this->catalogueMetadata; - } - - if (isset($this->catalogueMetadata[$domain])) { - if (!$key) { - return $this->catalogueMetadata[$domain]; - } - - if (isset($this->catalogueMetadata[$domain][$key])) { - return $this->catalogueMetadata[$domain][$key]; - } - } - - return null; - } - - /** - * {@inheritdoc} - */ - public function setCatalogueMetadata(string $key, mixed $value, string $domain = 'messages') - { - $this->catalogueMetadata[$domain][$key] = $value; - } - - /** - * {@inheritdoc} - */ - public function deleteCatalogueMetadata(string $key = '', string $domain = 'messages') - { - if (!$domain) { - $this->catalogueMetadata = []; - } elseif (!$key) { - unset($this->catalogueMetadata[$domain]); - } else { - unset($this->catalogueMetadata[$domain][$key]); - } - } - /** * Adds current values with the new values. * @@ -356,13 +306,4 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf } } } - - private function addCatalogueMetadata(array $values) - { - foreach ($values as $domain => $keys) { - foreach ($keys as $key => $value) { - $this->setCatalogueMetadata($key, $value, $domain); - } - } - } } diff --git a/vendor/symfony/translation/MessageCatalogueInterface.php b/vendor/symfony/translation/MessageCatalogueInterface.php index 75e3a2fa..cf7746c2 100644 --- a/vendor/symfony/translation/MessageCatalogueInterface.php +++ b/vendor/symfony/translation/MessageCatalogueInterface.php @@ -24,13 +24,17 @@ interface MessageCatalogueInterface /** * Gets the catalogue locale. + * + * @return string */ - public function getLocale(): string; + public function getLocale(); /** * Gets the domains. + * + * @return array */ - public function getDomains(): array; + public function getDomains(); /** * Gets the messages within a given domain. @@ -38,8 +42,10 @@ interface MessageCatalogueInterface * If $domain is null, it returns all messages. * * @param string $domain The domain name + * + * @return array */ - public function all(string $domain = null): array; + public function all(string $domain = null); /** * Sets a message translation. @@ -55,24 +61,30 @@ interface MessageCatalogueInterface * * @param string $id The message id * @param string $domain The domain name + * + * @return bool */ - public function has(string $id, string $domain = 'messages'): bool; + public function has(string $id, string $domain = 'messages'); /** * Checks if a message has a translation (it does not take into account the fallback mechanism). * * @param string $id The message id * @param string $domain The domain name + * + * @return bool */ - public function defines(string $id, string $domain = 'messages'): bool; + public function defines(string $id, string $domain = 'messages'); /** * Gets a message translation. * * @param string $id The message id * @param string $domain The domain name + * + * @return string */ - public function get(string $id, string $domain = 'messages'): string; + public function get(string $id, string $domain = 'messages'); /** * Sets translations for a given domain. @@ -107,15 +119,17 @@ interface MessageCatalogueInterface /** * Gets the fallback catalogue. + * + * @return self|null */ - public function getFallbackCatalogue(): ?self; + public function getFallbackCatalogue(); /** * Returns an array of resources loaded to build this collection. * * @return ResourceInterface[] */ - public function getResources(): array; + public function getResources(); /** * Adds a resource for this collection. diff --git a/vendor/symfony/translation/MetadataAwareInterface.php b/vendor/symfony/translation/MetadataAwareInterface.php index 5753b817..2216eed9 100644 --- a/vendor/symfony/translation/MetadataAwareInterface.php +++ b/vendor/symfony/translation/MetadataAwareInterface.php @@ -12,7 +12,7 @@ namespace Symfony\Component\Translation; /** - * This interface is used to get, set, and delete metadata about the translation messages. + * MetadataAwareInterface. * * @author Fabien Potencier */ @@ -27,12 +27,14 @@ interface MetadataAwareInterface * * @return mixed The value that was set or an array with the domains/keys or null */ - public function getMetadata(string $key = '', string $domain = 'messages'): mixed; + public function getMetadata(string $key = '', string $domain = 'messages'); /** * Adds metadata to a message domain. + * + * @param mixed $value */ - public function setMetadata(string $key, mixed $value, string $domain = 'messages'); + public function setMetadata(string $key, $value, string $domain = 'messages'); /** * Deletes metadata for the given key and domain. diff --git a/vendor/symfony/translation/Provider/Dsn.php b/vendor/symfony/translation/Provider/Dsn.php index 0f74d17f..820cabfb 100644 --- a/vendor/symfony/translation/Provider/Dsn.php +++ b/vendor/symfony/translation/Provider/Dsn.php @@ -20,14 +20,14 @@ use Symfony\Component\Translation\Exception\MissingRequiredOptionException; */ final class Dsn { - private ?string $scheme; - private ?string $host; - private ?string $user; - private ?string $password; - private ?int $port; - private ?string $path; - private array $options = []; - private string $originalDsn; + private $scheme; + private $host; + private $user; + private $password; + private $port; + private $path; + private $options; + private $originalDsn; public function __construct(string $dsn) { @@ -79,7 +79,7 @@ final class Dsn return $this->port ?? $default; } - public function getOption(string $key, mixed $default = null) + public function getOption(string $key, $default = null) { return $this->options[$key] ?? $default; } diff --git a/vendor/symfony/translation/Provider/FilteringProvider.php b/vendor/symfony/translation/Provider/FilteringProvider.php index db02b6ad..5f970a2e 100644 --- a/vendor/symfony/translation/Provider/FilteringProvider.php +++ b/vendor/symfony/translation/Provider/FilteringProvider.php @@ -21,9 +21,9 @@ use Symfony\Component\Translation\TranslatorBagInterface; */ class FilteringProvider implements ProviderInterface { - private ProviderInterface $provider; - private array $locales; - private array $domains; + private $provider; + private $locales; + private $domains; public function __construct(ProviderInterface $provider, array $locales, array $domains = []) { diff --git a/vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php b/vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php index 6300c875..81db3a5f 100644 --- a/vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php +++ b/vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php @@ -18,8 +18,8 @@ use Symfony\Component\Translation\Exception\UnsupportedSchemeException; */ class TranslationProviderCollectionFactory { - private iterable $factories; - private array $enabledLocales; + private $factories; + private $enabledLocales; /** * @param iterable $factories diff --git a/vendor/symfony/translation/PseudoLocalizationTranslator.php b/vendor/symfony/translation/PseudoLocalizationTranslator.php index dfcfe43a..c769bdad 100644 --- a/vendor/symfony/translation/PseudoLocalizationTranslator.php +++ b/vendor/symfony/translation/PseudoLocalizationTranslator.php @@ -20,16 +20,16 @@ final class PseudoLocalizationTranslator implements TranslatorInterface { private const EXPANSION_CHARACTER = '~'; - private TranslatorInterface $translator; - private bool $accents; - private float $expansionFactor; - private bool $brackets; - private bool $parseHTML; + private $translator; + private $accents; + private $expansionFactor; + private $brackets; + private $parseHTML; /** * @var string[] */ - private array $localizableHTMLAttributes; + private $localizableHTMLAttributes; /** * Available options: diff --git a/vendor/symfony/translation/README.md b/vendor/symfony/translation/README.md index 4fedd6a2..adda9a5b 100644 --- a/vendor/symfony/translation/README.md +++ b/vendor/symfony/translation/README.md @@ -26,11 +26,12 @@ echo $translator->trans('Hello World!'); // outputs « Bonjour ! » Sponsor ------- -The Translation component for Symfony 6.1 is [backed][1] by: +The Translation component for Symfony 5.4/6.0 is [backed][1] by: * [Crowdin][2], a cloud-based localization management software helping teams to go global and stay agile. + * [Lokalise][3], a continuous localization and translation management platform that integrates into your development workflow so you can ship localized products, faster. -Help Symfony by [sponsoring][3] its development! +Help Symfony by [sponsoring][4] its development! Resources --------- @@ -43,4 +44,5 @@ Resources [1]: https://symfony.com/backers [2]: https://crowdin.com -[3]: https://symfony.com/sponsor +[3]: https://lokalise.com +[4]: https://symfony.com/sponsor diff --git a/vendor/symfony/translation/Reader/TranslationReader.php b/vendor/symfony/translation/Reader/TranslationReader.php index bbc687e1..e8e8638a 100644 --- a/vendor/symfony/translation/Reader/TranslationReader.php +++ b/vendor/symfony/translation/Reader/TranslationReader.php @@ -27,7 +27,7 @@ class TranslationReader implements TranslationReaderInterface * * @var array */ - private array $loaders = []; + private $loaders = []; /** * Adds a loader to the translation extractor. diff --git a/vendor/symfony/translation/Resources/bin/translation-status.php b/vendor/symfony/translation/Resources/bin/translation-status.php index 4fe814cf..53e642c0 100644 --- a/vendor/symfony/translation/Resources/bin/translation-status.php +++ b/vendor/symfony/translation/Resources/bin/translation-status.php @@ -66,7 +66,7 @@ foreach (array_slice($argv, 1) as $argumentOrOption) { continue; } - if (str_starts_with($argumentOrOption, '-')) { + if (0 === strpos($argumentOrOption, '-')) { $config['verbose_output'] = true; } else { $config['locale_to_analyze'] = $argumentOrOption; diff --git a/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd b/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd similarity index 96% rename from vendor/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd rename to vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd index 1f38de72..dface628 100644 --- a/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd +++ b/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd @@ -1,4 +1,5 @@ + - + - + @@ -1672,16 +1672,14 @@ Jan-10-2006 - - - + @@ -1741,11 +1739,10 @@ Jan-10-2006 - - + @@ -1794,7 +1791,6 @@ Jan-10-2006 - @@ -1842,34 +1838,16 @@ Jan-10-2006 - - - - - - - - - - - - - - - - - - - + - + @@ -1887,9 +1865,8 @@ Jan-10-2006 - - + @@ -1900,7 +1877,6 @@ Jan-10-2006 - @@ -1925,7 +1901,7 @@ Jan-10-2006 - + @@ -1937,11 +1913,10 @@ Jan-10-2006 - - + @@ -1949,7 +1924,6 @@ Jan-10-2006 - @@ -1973,7 +1947,7 @@ Jan-10-2006 - + @@ -1988,8 +1962,7 @@ Jan-10-2006 - - + @@ -2012,8 +1985,7 @@ Jan-10-2006 - - + @@ -2039,8 +2011,6 @@ Jan-10-2006 - - @@ -2048,7 +2018,7 @@ Jan-10-2006 - + @@ -2072,21 +2042,18 @@ Jan-10-2006 - + - - + - - @@ -2103,7 +2070,7 @@ Jan-10-2006 - + @@ -2122,22 +2089,20 @@ Jan-10-2006 - - + - - + @@ -2146,8 +2111,7 @@ Jan-10-2006 - - + @@ -2157,13 +2121,12 @@ Jan-10-2006 - - + @@ -2254,8 +2217,7 @@ Jan-10-2006 - - + diff --git a/vendor/symfony/translation/Test/ProviderFactoryTestCase.php b/vendor/symfony/translation/Test/ProviderFactoryTestCase.php index d1259c7e..6d5f4b7b 100644 --- a/vendor/symfony/translation/Test/ProviderFactoryTestCase.php +++ b/vendor/symfony/translation/Test/ProviderFactoryTestCase.php @@ -11,7 +11,6 @@ namespace Symfony\Component\Translation\Test; -use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Symfony\Component\HttpClient\MockHttpClient; @@ -21,7 +20,6 @@ use Symfony\Component\Translation\Exception\UnsupportedSchemeException; use Symfony\Component\Translation\Loader\LoaderInterface; use Symfony\Component\Translation\Provider\Dsn; use Symfony\Component\Translation\Provider\ProviderFactoryInterface; -use Symfony\Component\Translation\TranslatorBagInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; /** @@ -33,12 +31,11 @@ use Symfony\Contracts\HttpClient\HttpClientInterface; */ abstract class ProviderFactoryTestCase extends TestCase { - protected HttpClientInterface $client; - protected LoggerInterface|MockObject $logger; - protected string $defaultLocale; - protected LoaderInterface|MockObject $loader; - protected XliffFileDumper|MockObject $xliffFileDumper; - protected TranslatorBagInterface|MockObject $translatorBag; + protected $client; + protected $logger; + protected $defaultLocale; + protected $loader; + protected $xliffFileDumper; abstract public function createFactory(): ProviderFactoryInterface; @@ -125,31 +122,26 @@ abstract class ProviderFactoryTestCase extends TestCase protected function getClient(): HttpClientInterface { - return $this->client ??= new MockHttpClient(); + return $this->client ?? $this->client = new MockHttpClient(); } protected function getLogger(): LoggerInterface { - return $this->logger ??= $this->createMock(LoggerInterface::class); + return $this->logger ?? $this->logger = $this->createMock(LoggerInterface::class); } protected function getDefaultLocale(): string { - return $this->defaultLocale ??= 'en'; + return $this->defaultLocale ?? $this->defaultLocale = 'en'; } protected function getLoader(): LoaderInterface { - return $this->loader ??= $this->createMock(LoaderInterface::class); + return $this->loader ?? $this->loader = $this->createMock(LoaderInterface::class); } protected function getXliffFileDumper(): XliffFileDumper { - return $this->xliffFileDumper ??= $this->createMock(XliffFileDumper::class); - } - - protected function getTranslatorBag(): TranslatorBagInterface - { - return $this->translatorBag ??= $this->createMock(TranslatorBagInterface::class); + return $this->xliffFileDumper ?? $this->xliffFileDumper = $this->createMock(XliffFileDumper::class); } } diff --git a/vendor/symfony/translation/Test/ProviderTestCase.php b/vendor/symfony/translation/Test/ProviderTestCase.php index 6de24ac3..4eb08604 100644 --- a/vendor/symfony/translation/Test/ProviderTestCase.php +++ b/vendor/symfony/translation/Test/ProviderTestCase.php @@ -11,14 +11,12 @@ namespace Symfony\Component\Translation\Test; -use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\Translation\Dumper\XliffFileDumper; use Symfony\Component\Translation\Loader\LoaderInterface; use Symfony\Component\Translation\Provider\ProviderInterface; -use Symfony\Component\Translation\TranslatorBagInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; /** @@ -30,12 +28,11 @@ use Symfony\Contracts\HttpClient\HttpClientInterface; */ abstract class ProviderTestCase extends TestCase { - protected HttpClientInterface $client; - protected LoggerInterface|MockObject $logger; - protected string $defaultLocale; - protected LoaderInterface|MockObject $loader; - protected XliffFileDumper|MockObject $xliffFileDumper; - protected TranslatorBagInterface|MockObject $translatorBag; + protected $client; + protected $logger; + protected $defaultLocale; + protected $loader; + protected $xliffFileDumper; abstract public function createProvider(HttpClientInterface $client, LoaderInterface $loader, LoggerInterface $logger, string $defaultLocale, string $endpoint): ProviderInterface; @@ -54,31 +51,26 @@ abstract class ProviderTestCase extends TestCase protected function getClient(): MockHttpClient { - return $this->client ??= new MockHttpClient(); + return $this->client ?? $this->client = new MockHttpClient(); } protected function getLoader(): LoaderInterface { - return $this->loader ??= $this->createMock(LoaderInterface::class); + return $this->loader ?? $this->loader = $this->createMock(LoaderInterface::class); } protected function getLogger(): LoggerInterface { - return $this->logger ??= $this->createMock(LoggerInterface::class); + return $this->logger ?? $this->logger = $this->createMock(LoggerInterface::class); } protected function getDefaultLocale(): string { - return $this->defaultLocale ??= 'en'; + return $this->defaultLocale ?? $this->defaultLocale = 'en'; } protected function getXliffFileDumper(): XliffFileDumper { - return $this->xliffFileDumper ??= $this->createMock(XliffFileDumper::class); - } - - protected function getTranslatorBag(): TranslatorBagInterface - { - return $this->translatorBag ??= $this->createMock(TranslatorBagInterface::class); + return $this->xliffFileDumper ?? $this->xliffFileDumper = $this->createMock(XliffFileDumper::class); } } diff --git a/vendor/symfony/translation/TranslatableMessage.php b/vendor/symfony/translation/TranslatableMessage.php index b1a3b6b1..282d289c 100644 --- a/vendor/symfony/translation/TranslatableMessage.php +++ b/vendor/symfony/translation/TranslatableMessage.php @@ -19,9 +19,9 @@ use Symfony\Contracts\Translation\TranslatorInterface; */ class TranslatableMessage implements TranslatableInterface { - private string $message; - private array $parameters; - private ?string $domain; + private $message; + private $parameters; + private $domain; public function __construct(string $message, array $parameters = [], string $domain = null) { diff --git a/vendor/symfony/translation/Translator.php b/vendor/symfony/translation/Translator.php index d2e5c73f..dc062609 100644 --- a/vendor/symfony/translation/Translator.php +++ b/vendor/symfony/translation/Translator.php @@ -22,7 +22,6 @@ use Symfony\Component\Translation\Formatter\MessageFormatter; use Symfony\Component\Translation\Formatter\MessageFormatterInterface; use Symfony\Component\Translation\Loader\LoaderInterface; use Symfony\Contracts\Translation\LocaleAwareInterface; -use Symfony\Contracts\Translation\TranslatableInterface; use Symfony\Contracts\Translation\TranslatorInterface; // Help opcache.preload discover always-needed symbols @@ -38,33 +37,54 @@ class Translator implements TranslatorInterface, TranslatorBagInterface, LocaleA */ protected $catalogues = []; - private string $locale; + /** + * @var string + */ + private $locale; /** * @var string[] */ - private array $fallbackLocales = []; + private $fallbackLocales = []; /** * @var LoaderInterface[] */ - private array $loaders = []; + private $loaders = []; - private array $resources = []; + /** + * @var array + */ + private $resources = []; - private MessageFormatterInterface $formatter; + /** + * @var MessageFormatterInterface + */ + private $formatter; - private ?string $cacheDir; + /** + * @var string + */ + private $cacheDir; - private bool $debug; + /** + * @var bool + */ + private $debug; - private array $cacheVary; + private $cacheVary; - private ?ConfigCacheFactoryInterface $configCacheFactory; + /** + * @var ConfigCacheFactoryInterface|null + */ + private $configCacheFactory; - private array $parentLocales; + /** + * @var array|null + */ + private $parentLocales; - private bool $hasIntlFormatter; + private $hasIntlFormatter; /** * @throws InvalidArgumentException If a locale contains invalid characters @@ -107,7 +127,7 @@ class Translator implements TranslatorInterface, TranslatorBagInterface, LocaleA * * @throws InvalidArgumentException If the locale contains invalid characters */ - public function addResource(string $format, mixed $resource, string $locale, string $domain = null) + public function addResource(string $format, $resource, string $locale, string $domain = null) { if (null === $domain) { $domain = 'messages'; @@ -137,7 +157,7 @@ class Translator implements TranslatorInterface, TranslatorBagInterface, LocaleA /** * {@inheritdoc} */ - public function getLocale(): string + public function getLocale() { return $this->locale ?: (class_exists(\Locale::class) ? \Locale::getDefault() : 'en'); } @@ -174,7 +194,7 @@ class Translator implements TranslatorInterface, TranslatorBagInterface, LocaleA /** * {@inheritdoc} */ - public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null): string + public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null) { if (null === $id || '' === $id) { return ''; @@ -195,10 +215,6 @@ class Translator implements TranslatorInterface, TranslatorBagInterface, LocaleA } } - $parameters = array_map(function ($parameter) use ($locale) { - return $parameter instanceof TranslatableInterface ? $parameter->trans($this, $locale) : $parameter; - }, $parameters); - $len = \strlen(MessageCatalogue::INTL_DOMAIN_SUFFIX); if ($this->hasIntlFormatter && ($catalogue->defines($id, $domain.MessageCatalogue::INTL_DOMAIN_SUFFIX) @@ -213,7 +229,7 @@ class Translator implements TranslatorInterface, TranslatorBagInterface, LocaleA /** * {@inheritdoc} */ - public function getCatalogue(string $locale = null): MessageCatalogueInterface + public function getCatalogue(string $locale = null) { if (!$locale) { $locale = $this->getLocale(); @@ -241,7 +257,7 @@ class Translator implements TranslatorInterface, TranslatorBagInterface, LocaleA * * @return LoaderInterface[] */ - protected function getLoaders(): array + protected function getLoaders() { return $this->loaders; } @@ -393,7 +409,9 @@ EOF protected function computeFallbackLocales(string $locale) { - $this->parentLocales ??= json_decode(file_get_contents(__DIR__.'/Resources/data/parents.json'), true); + if (null === $this->parentLocales) { + $this->parentLocales = json_decode(file_get_contents(__DIR__.'/Resources/data/parents.json'), true); + } $originLocale = $locale; $locales = []; @@ -450,7 +468,9 @@ EOF */ private function getConfigCacheFactory(): ConfigCacheFactoryInterface { - $this->configCacheFactory ??= new ConfigCacheFactory($this->debug); + if (!$this->configCacheFactory) { + $this->configCacheFactory = new ConfigCacheFactory($this->debug); + } return $this->configCacheFactory; } diff --git a/vendor/symfony/translation/TranslatorBag.php b/vendor/symfony/translation/TranslatorBag.php index 9be3458c..555a9e81 100644 --- a/vendor/symfony/translation/TranslatorBag.php +++ b/vendor/symfony/translation/TranslatorBag.php @@ -17,7 +17,7 @@ use Symfony\Component\Translation\Catalogue\TargetOperation; final class TranslatorBag implements TranslatorBagInterface { /** @var MessageCatalogue[] */ - private array $catalogues = []; + private $catalogues = []; public function addCatalogue(MessageCatalogue $catalogue): void { diff --git a/vendor/symfony/translation/TranslatorBagInterface.php b/vendor/symfony/translation/TranslatorBagInterface.php index a787acf1..42289773 100644 --- a/vendor/symfony/translation/TranslatorBagInterface.php +++ b/vendor/symfony/translation/TranslatorBagInterface.php @@ -14,6 +14,10 @@ namespace Symfony\Component\Translation; use Symfony\Component\Translation\Exception\InvalidArgumentException; /** + * TranslatorBagInterface. + * + * @method MessageCatalogueInterface[] getCatalogues() Returns all catalogues of the instance + * * @author Abdellatif Ait boudad */ interface TranslatorBagInterface @@ -23,14 +27,9 @@ interface TranslatorBagInterface * * @param string|null $locale The locale or null to use the default * + * @return MessageCatalogueInterface + * * @throws InvalidArgumentException If the locale contains invalid characters */ - public function getCatalogue(string $locale = null): MessageCatalogueInterface; - - /** - * Returns all catalogues of the instance. - * - * @return MessageCatalogueInterface[] - */ - public function getCatalogues(): array; + public function getCatalogue(string $locale = null); } diff --git a/vendor/symfony/translation/Util/ArrayConverter.php b/vendor/symfony/translation/Util/ArrayConverter.php index 60b8be6e..f69c2e3c 100644 --- a/vendor/symfony/translation/Util/ArrayConverter.php +++ b/vendor/symfony/translation/Util/ArrayConverter.php @@ -30,8 +30,10 @@ class ArrayConverter * For example this array('foo.bar' => 'value') will be converted to ['foo' => ['bar' => 'value']]. * * @param array $messages Linear messages array + * + * @return array */ - public static function expandToTree(array $messages): array + public static function expandToTree(array $messages) { $tree = []; diff --git a/vendor/symfony/translation/Util/XliffUtils.php b/vendor/symfony/translation/Util/XliffUtils.php index 335c34be..e4373a7d 100644 --- a/vendor/symfony/translation/Util/XliffUtils.php +++ b/vendor/symfony/translation/Util/XliffUtils.php @@ -85,6 +85,11 @@ class XliffUtils private static function shouldEnableEntityLoader(): bool { + // Version prior to 8.0 can be enabled without deprecation + if (\PHP_VERSION_ID < 80000) { + return true; + } + static $dom, $schema; if (null === $dom) { $dom = new \DOMDocument(); @@ -129,7 +134,7 @@ class XliffUtils private static function getSchema(string $xliffVersion): string { if ('1.2' === $xliffVersion) { - $schemaSource = file_get_contents(__DIR__.'/../Resources/schemas/xliff-core-1.2-transitional.xsd'); + $schemaSource = file_get_contents(__DIR__.'/../Resources/schemas/xliff-core-1.2-strict.xsd'); $xmlUri = 'http://www.w3.org/2001/xml.xsd'; } elseif ('2.0' === $xliffVersion) { $schemaSource = file_get_contents(__DIR__.'/../Resources/schemas/xliff-core-2.0.xsd'); diff --git a/vendor/symfony/translation/Writer/TranslationWriter.php b/vendor/symfony/translation/Writer/TranslationWriter.php index 5dd3a5c4..96d608f0 100644 --- a/vendor/symfony/translation/Writer/TranslationWriter.php +++ b/vendor/symfony/translation/Writer/TranslationWriter.php @@ -26,7 +26,7 @@ class TranslationWriter implements TranslationWriterInterface /** * @var array */ - private array $dumpers = []; + private $dumpers = []; /** * Adds a dumper to the writer. @@ -38,8 +38,10 @@ class TranslationWriter implements TranslationWriterInterface /** * Obtains the list of supported formats. + * + * @return array */ - public function getFormats(): array + public function getFormats() { return array_keys($this->dumpers); } diff --git a/vendor/symfony/translation/composer.json b/vendor/symfony/translation/composer.json index e25f09ef..5c9266b7 100644 --- a/vendor/symfony/translation/composer.json +++ b/vendor/symfony/translation/composer.json @@ -16,34 +16,35 @@ } ], "require": { - "php": ">=8.1", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.3|^3.0" + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^2.3" }, "require-dev": { - "symfony/config": "^5.4|^6.0", + "symfony/config": "^4.4|^5.0|^6.0", "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", + "symfony/dependency-injection": "^5.0|^6.0", "symfony/http-client-contracts": "^1.1|^2.0|^3.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/intl": "^5.4|^6.0", + "symfony/http-kernel": "^5.0|^6.0", + "symfony/intl": "^4.4|^5.0|^6.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^5.4|^6.0", "symfony/service-contracts": "^1.1.2|^2|^3", - "symfony/yaml": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", "psr/log": "^1|^2|^3" }, "conflict": { - "symfony/config": "<5.4", - "symfony/dependency-injection": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/twig-bundle": "<5.4", - "symfony/yaml": "<5.4", - "symfony/console": "<5.4" + "symfony/config": "<4.4", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4", + "symfony/console": "<5.3" }, "provide": { - "symfony/translation-implementation": "2.3|3.0" + "symfony/translation-implementation": "2.3" }, "suggest": { "symfony/config": "", diff --git a/vendor/symfony/var-exporter/Instantiator.php b/vendor/symfony/var-exporter/Instantiator.php index 38fce27b..368c769a 100644 --- a/vendor/symfony/var-exporter/Instantiator.php +++ b/vendor/symfony/var-exporter/Instantiator.php @@ -65,7 +65,7 @@ final class Instantiator $wrappedInstance = [$reflector->newInstanceWithoutConstructor()]; } elseif (null === Registry::$prototypes[$class]) { throw new NotInstantiableTypeException($class); - } elseif ($reflector->implementsInterface('Serializable') && !method_exists($class, '__unserialize')) { + } elseif ($reflector->implementsInterface('Serializable') && (\PHP_VERSION_ID < 70400 || !method_exists($class, '__unserialize'))) { $wrappedInstance = [unserialize('C:'.\strlen($class).':"'.$class.'":0:{}')]; } else { $wrappedInstance = [unserialize('O:'.\strlen($class).':"'.$class.'":0:{}')]; diff --git a/vendor/symfony/var-exporter/Internal/Exporter.php b/vendor/symfony/var-exporter/Internal/Exporter.php index f7ef22df..a034dddb 100644 --- a/vendor/symfony/var-exporter/Internal/Exporter.php +++ b/vendor/symfony/var-exporter/Internal/Exporter.php @@ -31,11 +31,9 @@ class Exporter * @param int &$objectsCount * @param bool &$valuesAreStatic * - * @return array - * * @throws NotInstantiableTypeException When a value cannot be serialized */ - public static function prepare($values, $objectsPool, &$refsPool, &$objectsCount, &$valuesAreStatic) + public static function prepare($values, $objectsPool, &$refsPool, &$objectsCount, &$valuesAreStatic): array { $refs = $values; foreach ($values as $k => $value) { @@ -187,7 +185,7 @@ class Exporter return $values; } - public static function export($value, $indent = '') + public static function export($value, string $indent = '') { switch (true) { case \is_int($value) || \is_float($value): return var_export($value, true); @@ -226,7 +224,7 @@ class Exporter return substr($m[1], 0, -2); } - if (str_ends_with($m[1], 'n".\'')) { + if ('n".\'' === substr($m[1], -4)) { return substr_replace($m[1], "\n".$subIndent.".'".$m[2], -2); } diff --git a/vendor/symfony/var-exporter/Internal/Hydrator.php b/vendor/symfony/var-exporter/Internal/Hydrator.php index 9e73f2b1..5ed6bdc9 100644 --- a/vendor/symfony/var-exporter/Internal/Hydrator.php +++ b/vendor/symfony/var-exporter/Internal/Hydrator.php @@ -99,7 +99,7 @@ class Hydrator switch ($class) { case 'ArrayIterator': case 'ArrayObject': - $constructor = $classReflector->getConstructor()->invokeArgs(...); + $constructor = \Closure::fromCallable([$classReflector->getConstructor(), 'invokeArgs']); return self::$hydrators[$class] = static function ($properties, $objects) use ($constructor) { foreach ($properties as $name => $values) { @@ -126,7 +126,8 @@ class Hydrator $propertySetters = []; foreach ($classReflector->getProperties() as $propertyReflector) { if (!$propertyReflector->isStatic()) { - $propertySetters[$propertyReflector->name] = $propertyReflector->setValue(...); + $propertyReflector->setAccessible(true); + $propertySetters[$propertyReflector->name] = \Closure::fromCallable([$propertyReflector, 'setValue']); } } diff --git a/vendor/symfony/var-exporter/Internal/Registry.php b/vendor/symfony/var-exporter/Internal/Registry.php index 119145ee..24b77b9e 100644 --- a/vendor/symfony/var-exporter/Internal/Registry.php +++ b/vendor/symfony/var-exporter/Internal/Registry.php @@ -60,7 +60,7 @@ class Registry { $reflector = self::$reflectors[$class] ?? self::getClassReflector($class, true, false); - return self::$factories[$class] = [$reflector, 'newInstanceWithoutConstructor'](...); + return self::$factories[$class] = \Closure::fromCallable([$reflector, 'newInstanceWithoutConstructor']); } public static function getClassReflector($class, $instantiableWithoutConstructor = false, $cloneable = null) @@ -85,7 +85,7 @@ class Registry try { $proto = $reflector->newInstanceWithoutConstructor(); $instantiableWithoutConstructor = true; - } catch (\ReflectionException) { + } catch (\ReflectionException $e) { $proto = $reflector->implementsInterface('Serializable') && !method_exists($class, '__unserialize') ? 'C:' : 'O:'; if ('C:' === $proto && !$reflector->getMethod('unserialize')->isInternal()) { $proto = null; @@ -103,7 +103,7 @@ class Registry } } } - if (null !== $proto && !$proto instanceof \Throwable && !$proto instanceof \Serializable && !method_exists($class, '__sleep') && !method_exists($class, '__serialize')) { + if (null !== $proto && !$proto instanceof \Throwable && !$proto instanceof \Serializable && !method_exists($class, '__sleep') && (\PHP_VERSION_ID < 70400 || !method_exists($class, '__serialize'))) { try { serialize($proto); } catch (\Exception $e) { @@ -113,7 +113,7 @@ class Registry } if (null === $cloneable) { - if (($proto instanceof \Reflector || $proto instanceof \ReflectionGenerator || $proto instanceof \ReflectionType || $proto instanceof \IteratorIterator || $proto instanceof \RecursiveIteratorIterator) && (!$proto instanceof \Serializable && !method_exists($proto, '__wakeup') && !method_exists($class, '__unserialize'))) { + if (($proto instanceof \Reflector || $proto instanceof \ReflectionGenerator || $proto instanceof \ReflectionType || $proto instanceof \IteratorIterator || $proto instanceof \RecursiveIteratorIterator) && (!$proto instanceof \Serializable && !method_exists($proto, '__wakeup') && (\PHP_VERSION_ID < 70400 || !method_exists($class, '__unserialize')))) { throw new NotInstantiableTypeException($class); } @@ -132,8 +132,10 @@ class Registry new \ReflectionProperty(\Error::class, 'trace'), new \ReflectionProperty(\Exception::class, 'trace'), ]; - $setTrace[0] = $setTrace[0]->setValue(...); - $setTrace[1] = $setTrace[1]->setValue(...); + $setTrace[0]->setAccessible(true); + $setTrace[1]->setAccessible(true); + $setTrace[0] = \Closure::fromCallable([$setTrace[0], 'setValue']); + $setTrace[1] = \Closure::fromCallable([$setTrace[1], 'setValue']); } $setTrace[$proto instanceof \Exception]($proto, []); diff --git a/vendor/symfony/var-exporter/VarExporter.php b/vendor/symfony/var-exporter/VarExporter.php index 3e2a4cc0..003388e7 100644 --- a/vendor/symfony/var-exporter/VarExporter.php +++ b/vendor/symfony/var-exporter/VarExporter.php @@ -32,12 +32,13 @@ final class VarExporter /** * Exports a serializable PHP value to PHP code. * - * @param bool &$isStaticValue Set to true after execution if the provided value is static, false otherwise - * @param bool &$classes Classes found in the value are added to this list as both keys and values + * @param mixed $value The value to export + * @param bool &$isStaticValue Set to true after execution if the provided value is static, false otherwise + * @param bool &$classes Classes found in the value are added to this list as both keys and values * * @throws ExceptionInterface When the provided value cannot be serialized */ - public static function export(mixed $value, bool &$isStaticValue = null, array &$foundClasses = []): string + public static function export($value, bool &$isStaticValue = null, array &$foundClasses = []): string { $isStaticValue = true; diff --git a/vendor/symfony/var-exporter/composer.json b/vendor/symfony/var-exporter/composer.json index 3aac3aff..29d4901d 100644 --- a/vendor/symfony/var-exporter/composer.json +++ b/vendor/symfony/var-exporter/composer.json @@ -16,10 +16,11 @@ } ], "require": { - "php": ">=8.1" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "symfony/var-dumper": "^5.4|^6.0" + "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0" }, "autoload": { "psr-4": { "Symfony\\Component\\VarExporter\\": "" },