From 5d99f9f1d650868e037e03baca895f27bc207caf Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Fri, 11 Jan 2013 15:14:07 -0600 Subject: [PATCH 01/71] moving laravel 4 into develop branch. --- .gitignore | 41 +- .travis.yml | 6 - CONTRIBUTING.md | 10 +- .../.gitignore => app/commands/.gitkeep | 0 app/config/app.php | 170 + app/config/auth.php | 46 + app/config/cache.php | 89 + app/config/database.php | 122 + app/config/mail.php | 83 + .../config/packages/.gitkeep | 0 app/config/session.php | 86 + app/config/testing/cache.php | 20 + app/config/testing/session.php | 21 + app/config/view.php | 31 + .../.gitignore => app/controllers/.gitkeep | 0 app/controllers/BaseController.php | 18 + app/controllers/HomeController.php | 23 + .../database/migrations/.gitkeep | 0 .../database/production.sqlite | 0 .../.gitignore => app/database/seeds/.gitkeep | 0 app/filters.php | 64 + .../language => app/lang}/en/pagination.php | 4 +- app/lang/en/validation.php | 89 + app/models/User.php | 41 + app/routes.php | 17 + app/start/artisan.php | 13 + app/start/global.php | 45 + app/start/local.php | 3 + app/storage/.gitignore | 1 + {storage => app/storage}/cache/.gitignore | 0 {storage => app/storage}/logs/.gitignore | 0 .../sessions => app/storage/meta}/.gitignore | 0 .../views => app/storage/sessions}/.gitignore | 0 .../work => app/storage/views}/.gitignore | 0 app/tests/ExampleTest.php | 19 + app/tests/TestCase.php | 19 + app/views/hello.php | 1 + application/bundles.php | 40 - application/config/.gitignore | 1 - application/config/application.php | 198 -- application/config/auth.php | 73 - application/config/cache.php | 71 - application/config/database.php | 125 - application/config/error.php | 69 - application/config/mimes.php | 97 - application/config/session.php | 117 - application/config/strings.php | 190 -- application/controllers/base.php | 17 - application/controllers/home.php | 38 - application/language/ar/pagination.php | 19 - application/language/ar/validation.php | 104 - application/language/bg/pagination.php | 19 - application/language/bg/validation.php | 104 - application/language/da/pagination.php | 19 - application/language/da/validation.php | 104 - application/language/de/pagination.php | 19 - application/language/de/validation.php | 104 - application/language/el/pagination.php | 19 - application/language/el/validation.php | 104 - application/language/en/pagination.php | 19 - application/language/en/validation.php | 106 - application/language/fi/pagination.php | 19 - application/language/fi/validation.php | 104 - application/language/fr/pagination.php | 19 - application/language/fr/validation.php | 104 - application/language/he/pagination.php | 19 - application/language/he/validation.php | 107 - application/language/hu/pagination.php | 19 - application/language/hu/validation.php | 104 - application/language/id/pagination.php | 19 - application/language/id/validation.php | 104 - application/language/it/pagination.php | 19 - application/language/it/validation.php | 104 - application/language/ja/pagination.php | 31 - application/language/ja/validation.php | 147 - application/language/nl/pagination.php | 19 - application/language/nl/validation.php | 95 - application/language/pl/pagination.php | 19 - application/language/pl/validation.php | 104 - application/language/pt/pagination.php | 19 - application/language/pt/validation.php | 99 - application/language/ru/pagination.php | 19 - application/language/ru/validation.php | 104 - application/language/sq/pagination.php | 19 - application/language/sq/validation.php | 104 - application/language/sr/pagination.php | 19 - application/language/sr/validation.php | 104 - application/language/sv/pagination.php | 19 - application/language/sv/validation.php | 104 - application/language/tr/pagination.php | 28 - application/language/tr/validation.php | 108 - application/routes.php | 111 - application/start.php | 173 - application/tests/example.test.php | 15 - application/views/error/404.php | 125 - application/views/error/500.php | 125 - application/views/home/index.blade.php | 57 - artisan | 89 +- bundles/docs/libraries/markdown.php | 2934 ----------------- bundles/docs/routes.php | 85 - bundles/docs/views/page.blade.php | 5 - bundles/docs/views/template.blade.php | 34 - composer.json | 15 + laravel/asset.php | 356 -- laravel/auth.php | 93 - laravel/auth/drivers/driver.php | 231 -- laravel/auth/drivers/eloquent.php | 73 - laravel/auth/drivers/fluent.php | 72 - laravel/autoloader.php | 229 -- laravel/blade.php | 454 --- laravel/bundle.php | 476 --- laravel/cache.php | 118 - laravel/cache/drivers/apc.php | 89 - laravel/cache/drivers/database.php | 125 - laravel/cache/drivers/driver.php | 113 - laravel/cache/drivers/file.php | 100 - laravel/cache/drivers/memcached.php | 186 -- laravel/cache/drivers/memory.php | 151 - laravel/cache/drivers/redis.php | 91 - laravel/cache/drivers/sectionable.php | 142 - laravel/cache/drivers/wincache.php | 89 - laravel/cli/artisan.php | 49 - laravel/cli/command.php | 198 -- laravel/cli/dependencies.php | 140 - laravel/cli/tasks/bundle/bundler.php | 255 -- laravel/cli/tasks/bundle/providers/github.php | 19 - .../cli/tasks/bundle/providers/provider.php | 82 - laravel/cli/tasks/bundle/publisher.php | 85 - laravel/cli/tasks/bundle/repository.php | 29 - laravel/cli/tasks/help.json | 86 - laravel/cli/tasks/help.php | 34 - laravel/cli/tasks/key.php | 57 - laravel/cli/tasks/migrate/database.php | 84 - laravel/cli/tasks/migrate/migrator.php | 278 -- laravel/cli/tasks/migrate/resolver.php | 175 - laravel/cli/tasks/migrate/stub.php | 25 - laravel/cli/tasks/route.php | 56 - laravel/cli/tasks/session/manager.php | 93 - laravel/cli/tasks/session/migration.php | 40 - laravel/cli/tasks/task.php | 3 - laravel/cli/tasks/test/phpunit.php | 21 - laravel/cli/tasks/test/runner.php | 146 - laravel/cli/tasks/test/stub.xml | 9 - laravel/config.php | 235 -- laravel/cookie.php | 172 - laravel/core.php | 243 -- laravel/crypter.php | 178 - laravel/database.php | 195 -- laravel/database/connection.php | 336 -- laravel/database/connectors/connector.php | 41 - laravel/database/connectors/mysql.php | 46 - laravel/database/connectors/postgres.php | 59 - laravel/database/connectors/sqlite.php | 28 - laravel/database/connectors/sqlserver.php | 45 - laravel/database/eloquent/model.php | 798 ----- laravel/database/eloquent/pivot.php | 61 - laravel/database/eloquent/query.php | 296 -- .../eloquent/relationships/belongs_to.php | 129 - .../eloquent/relationships/has_many.php | 110 - .../relationships/has_many_and_belongs_to.php | 437 --- .../eloquent/relationships/has_one.php | 57 - .../relationships/has_one_or_many.php | 68 - .../eloquent/relationships/relationship.php | 135 - laravel/database/exception.php | 54 - laravel/database/expression.php | 43 - laravel/database/grammar.php | 174 - laravel/database/query.php | 950 ------ laravel/database/query/grammars/grammar.php | 491 --- laravel/database/query/grammars/mysql.php | 12 - laravel/database/query/grammars/postgres.php | 20 - laravel/database/query/grammars/sqlite.php | 70 - laravel/database/query/grammars/sqlserver.php | 140 - laravel/database/query/join.php | 68 - laravel/database/schema.php | 194 -- laravel/database/schema/grammars/grammar.php | 126 - laravel/database/schema/grammars/mysql.php | 421 --- laravel/database/schema/grammars/postgres.php | 407 --- laravel/database/schema/grammars/sqlite.php | 351 -- .../database/schema/grammars/sqlserver.php | 425 --- laravel/database/schema/table.php | 425 --- laravel/documentation/artisan/commands.md | 110 - laravel/documentation/artisan/tasks.md | 108 - laravel/documentation/auth/config.md | 38 - laravel/documentation/auth/usage.md | 86 - laravel/documentation/bundles.md | 214 -- laravel/documentation/cache/config.md | 79 - laravel/documentation/cache/usage.md | 59 - laravel/documentation/changes.md | 453 --- laravel/documentation/config.md | 34 - laravel/documentation/contents.md | 119 - laravel/documentation/contrib/command-line.md | 128 - laravel/documentation/contrib/github.md | 46 - laravel/documentation/contrib/tortoisegit.md | 114 - laravel/documentation/controllers.md | 206 -- laravel/documentation/database/config.md | 70 - laravel/documentation/database/eloquent.md | 565 ---- laravel/documentation/database/fluent.md | 304 -- laravel/documentation/database/migrations.md | 76 - laravel/documentation/database/raw.md | 56 - laravel/documentation/database/redis.md | 58 - laravel/documentation/database/schema.md | 154 - laravel/documentation/encryption.md | 30 - laravel/documentation/events.md | 100 - laravel/documentation/files.md | 92 - laravel/documentation/home.md | 59 - laravel/documentation/input.md | 160 - laravel/documentation/install.md | 124 - laravel/documentation/ioc.md | 49 - laravel/documentation/loading.md | 58 - laravel/documentation/localization.md | 70 - laravel/documentation/logging.md | 40 - laravel/documentation/models.md | 116 - laravel/documentation/profiler.md | 50 - laravel/documentation/requests.md | 77 - laravel/documentation/routing.md | 339 -- laravel/documentation/session/config.md | 108 - laravel/documentation/session/usage.md | 79 - laravel/documentation/strings.md | 81 - laravel/documentation/testing.md | 68 - laravel/documentation/urls.md | 109 - laravel/documentation/validation.md | 485 --- laravel/documentation/views/assets.md | 73 - laravel/documentation/views/forms.md | 161 - laravel/documentation/views/home.md | 264 -- laravel/documentation/views/html.md | 152 - laravel/documentation/views/pagination.md | 110 - laravel/documentation/views/templating.md | 210 -- laravel/error.php | 129 - laravel/event.php | 220 -- laravel/file.php | 355 -- laravel/fluent.php | 96 - laravel/form.php | 618 ---- laravel/hash.php | 53 - laravel/helpers.php | 598 ---- laravel/html.php | 481 --- laravel/input.php | 300 -- laravel/ioc.php | 208 -- laravel/lang.php | 252 -- laravel/laravel.php | 237 -- laravel/log.php | 99 - laravel/memcached.php | 74 - laravel/messages.php | 194 -- laravel/paginator.php | 423 --- laravel/pluralizer.php | 131 - laravel/profiling/profiler.css | 231 -- laravel/profiling/profiler.js | 197 -- laravel/profiling/profiler.php | 186 -- laravel/profiling/template.blade.php | 124 - laravel/redirect.php | 187 -- laravel/redis.php | 294 -- laravel/request.php | 290 -- laravel/response.php | 369 --- laravel/routing/controller.php | 442 --- laravel/routing/filter.php | 329 -- laravel/routing/route.php | 418 --- laravel/routing/router.php | 597 ---- laravel/section.php | 136 - laravel/session.php | 153 - laravel/session/drivers/apc.php | 60 - laravel/session/drivers/cookie.php | 56 - laravel/session/drivers/database.php | 107 - laravel/session/drivers/driver.php | 78 - laravel/session/drivers/file.php | 87 - laravel/session/drivers/memcached.php | 60 - laravel/session/drivers/memory.php | 49 - laravel/session/drivers/redis.php | 60 - laravel/session/drivers/sweeper.php | 13 - laravel/session/payload.php | 354 -- laravel/str.php | 380 --- laravel/tests/application/bundles.php | 36 - .../tests/application/config/application.php | 158 - laravel/tests/application/config/auth.php | 73 - laravel/tests/application/config/cache.php | 71 - laravel/tests/application/config/database.php | 108 - laravel/tests/application/config/error.php | 69 - .../application/config/local/database.php | 7 - laravel/tests/application/config/mimes.php | 97 - laravel/tests/application/config/session.php | 117 - laravel/tests/application/config/strings.php | 190 -- .../application/controllers/admin/panel.php | 10 - .../tests/application/controllers/auth.php | 20 - .../tests/application/controllers/filter.php | 65 - .../tests/application/controllers/home.php | 42 - .../tests/application/controllers/restful.php | 17 - .../controllers/template/basic.php | 12 - .../controllers/template/named.php | 12 - .../controllers/template/override.php | 26 - .../application/dashboard/repository.php | 7 - .../application/language/en/validation.php | 97 - .../application/language/sp/validation.php | 7 - laravel/tests/application/models/.gitignore | 0 .../tests/application/models/autoloader.php | 3 - laravel/tests/application/models/model.php | 15 - .../application/models/repositories/user.php | 3 - laravel/tests/application/models/user.php | 3 - laravel/tests/application/routes.php | 93 - laravel/tests/application/start.php | 157 - laravel/tests/application/tasks/.gitignore | 0 laravel/tests/application/views/error/404.php | 103 - laravel/tests/application/views/error/500.php | 103 - .../tests/application/views/home/index.php | 122 - .../tests/application/views/tests/basic.php | 1 - .../tests/application/views/tests/nested.php | 1 - laravel/tests/bundles/.gitignore | 0 .../tests/bundles/dashboard/config/meta.php | 7 - .../bundles/dashboard/controllers/panel.php | 10 - .../bundles/dashboard/models/repository.php | 7 - laravel/tests/bundles/dashboard/routes.php | 8 - laravel/tests/bundles/dummy/routes.php | 6 - laravel/tests/bundles/dummy/start.php | 3 - laravel/tests/cases/asset.test.php | 258 -- laravel/tests/cases/auth.test.php | 393 --- laravel/tests/cases/autoloader.test.php | 102 - laravel/tests/cases/blade.test.php | 124 - laravel/tests/cases/bundle.test.php | 251 -- laravel/tests/cases/config.test.php | 79 - laravel/tests/cases/controller.test.php | 267 -- laravel/tests/cases/cookie.test.php | 134 - laravel/tests/cases/database.test.php | 74 - laravel/tests/cases/eloquent.test.php | 291 -- laravel/tests/cases/event.test.php | 43 - laravel/tests/cases/fluent.test.php | 50 - laravel/tests/cases/form.test.php | 451 --- laravel/tests/cases/hash.test.php | 37 - laravel/tests/cases/html.test.php | 242 -- laravel/tests/cases/input.test.php | 174 - laravel/tests/cases/ioc.test.php | 74 - laravel/tests/cases/lang.test.php | 68 - laravel/tests/cases/messages.test.php | 115 - laravel/tests/cases/query.test.php | 48 - laravel/tests/cases/redirect.test.php | 143 - laravel/tests/cases/request.test.php | 177 - laravel/tests/cases/response.test.php | 89 - laravel/tests/cases/route.test.php | 179 - laravel/tests/cases/routing.test.php | 160 - laravel/tests/cases/session.test.php | 443 --- laravel/tests/cases/str.test.php | 135 - laravel/tests/cases/uri.test.php | 75 - laravel/tests/cases/url.test.php | 151 - laravel/tests/cases/validator.test.php | 711 ---- laravel/tests/cases/view.test.php | 255 -- laravel/tests/phpunit.php | 32 - laravel/tests/storage/cache/.gitignore | 0 .../tests/storage/database/application.sqlite | Bin 196608 -> 0 bytes laravel/tests/storage/files/desert.jpg | Bin 845941 -> 0 bytes laravel/tests/storage/logs/.gitignore | 0 laravel/tests/storage/sessions/.gitignore | 0 laravel/tests/storage/views/.gitignore | 0 laravel/uri.php | 105 - laravel/url.php | 361 -- laravel/validator.php | 1239 ------- .../Symfony/Component/Console/Application.php | 1007 ------ .../Component/Console/Command/Command.php | 612 ---- .../Component/Console/Command/HelpCommand.php | 84 - .../Component/Console/Command/ListCommand.php | 87 - .../Console/Formatter/OutputFormatter.php | 192 -- .../Formatter/OutputFormatterInterface.php | 83 - .../Formatter/OutputFormatterStyle.php | 218 -- .../OutputFormatterStyleInterface.php | 72 - .../Component/Console/Helper/DialogHelper.php | 139 - .../Console/Helper/FormatterHelper.php | 97 - .../Component/Console/Helper/Helper.php | 42 - .../Console/Helper/HelperInterface.php | 49 - .../Component/Console/Helper/HelperSet.php | 104 - .../Component/Console/Input/ArgvInput.php | 311 -- .../Component/Console/Input/ArrayInput.php | 190 -- .../Symfony/Component/Console/Input/Input.php | 211 -- .../Component/Console/Input/InputArgument.php | 132 - .../Console/Input/InputDefinition.php | 533 --- .../Console/Input/InputInterface.php | 152 - .../Component/Console/Input/InputOption.php | 201 -- .../Component/Console/Input/StringInput.php | 79 - .../vendor/Symfony/Component/Console/LICENSE | 19 - .../Console/Output/ConsoleOutput.php | 83 - .../Console/Output/ConsoleOutputInterface.php | 30 - .../Component/Console/Output/NullOutput.php | 34 - .../Component/Console/Output/Output.php | 180 - .../Console/Output/OutputInterface.php | 109 - .../Component/Console/Output/StreamOutput.php | 113 - .../Symfony/Component/Console/README.md | 48 - .../Symfony/Component/Console/Shell.php | 206 -- .../Console/Tester/ApplicationTester.php | 102 - .../Console/Tester/CommandTester.php | 100 - .../Symfony/Component/Console/composer.json | 30 - .../HttpFoundation/ApacheRequest.php | 51 - .../Component/HttpFoundation/CHANGELOG.md | 75 - .../Component/HttpFoundation/Cookie.php | 208 -- .../File/Exception/AccessDeniedException.php | 30 - .../File/Exception/FileException.php | 21 - .../File/Exception/FileNotFoundException.php | 30 - .../Exception/UnexpectedTypeException.php | 20 - .../File/Exception/UploadException.php | 21 - .../Component/HttpFoundation/File/File.php | 152 - .../File/MimeType/ExtensionGuesser.php | 102 - .../MimeType/ExtensionGuesserInterface.php | 26 - .../MimeType/FileBinaryMimeTypeGuesser.php | 87 - .../File/MimeType/FileinfoMimeTypeGuesser.php | 57 - .../MimeType/MimeTypeExtensionGuesser.php | 740 ----- .../File/MimeType/MimeTypeGuesser.php | 124 - .../MimeType/MimeTypeGuesserInterface.php | 35 - .../HttpFoundation/File/UploadedFile.php | 236 -- .../Component/HttpFoundation/FileBag.php | 155 - .../Component/HttpFoundation/HeaderBag.php | 325 -- .../Component/HttpFoundation/JsonResponse.php | 113 - .../Symfony/Component/HttpFoundation/LICENSE | 19 - .../HttpFoundation/LaravelRequest.php | 38 - .../HttpFoundation/LaravelResponse.php | 40 - .../Component/HttpFoundation/ParameterBag.php | 303 -- .../Component/HttpFoundation/README.md | 46 - .../HttpFoundation/RedirectResponse.php | 102 - .../Component/HttpFoundation/Request.php | 1634 --------- .../HttpFoundation/RequestMatcher.php | 237 -- .../RequestMatcherInterface.php | 33 - .../stubs/SessionHandlerInterface.php | 100 - .../Component/HttpFoundation/Response.php | 1159 ------- .../HttpFoundation/ResponseHeaderBag.php | 293 -- .../Component/HttpFoundation/ServerBag.php | 82 - .../Session/Attribute/AttributeBag.php | 157 - .../Attribute/AttributeBagInterface.php | 72 - .../Attribute/NamespacedAttributeBag.php | 154 - .../Session/Flash/AutoExpireFlashBag.php | 176 - .../HttpFoundation/Session/Flash/FlashBag.php | 186 -- .../Session/Flash/FlashBagInterface.php | 93 - .../HttpFoundation/Session/Session.php | 347 -- .../Session/SessionBagInterface.php | 48 - .../Session/SessionInterface.php | 208 -- .../Handler/MemcacheSessionHandler.php | 109 - .../Handler/MemcachedSessionHandler.php | 115 - .../Storage/Handler/MongoDbSessionHandler.php | 150 - .../Handler/NativeFileSessionHandler.php | 58 - .../Storage/Handler/NativeSessionHandler.php | 24 - .../Storage/Handler/NullSessionHandler.php | 72 - .../Storage/Handler/PdoSessionHandler.php | 241 -- .../Session/Storage/MetadataBag.php | 160 - .../Storage/MockArraySessionStorage.php | 268 -- .../Storage/MockFileSessionStorage.php | 143 - .../Session/Storage/NativeSessionStorage.php | 400 --- .../Session/Storage/Proxy/AbstractProxy.php | 135 - .../Session/Storage/Proxy/NativeProxy.php | 41 - .../Storage/Proxy/SessionHandlerProxy.php | 95 - .../Storage/SessionStorageInterface.php | 146 - .../HttpFoundation/StreamedResponse.php | 125 - .../Component/HttpFoundation/composer.json | 29 - laravel/view.php | 609 ---- license.txt | 46 - paths.php | 148 - phpunit.xml | 18 + public/.htaccess | 25 +- public/bundles/.gitignore | 0 public/css/.gitignore | 0 public/img/.gitignore | 0 public/index.php | 75 +- public/js/.gitignore | 0 public/laravel/css/style.css | 378 --- public/laravel/img/logoback.png | Bin 10295 -> 0 bytes public/laravel/js/modernizr-2.5.3.min.js | 4 - public/laravel/js/prettify.js | 1477 --------- public/laravel/js/scroll.js | 236 -- .../.gitignore => public/packages/.gitkeep | 0 readme.md | 68 +- server.php | 15 + start.php | 72 + storage/database/.gitignore | 1 - 463 files changed, 1283 insertions(+), 65186 deletions(-) delete mode 100644 .travis.yml rename application/libraries/.gitignore => app/commands/.gitkeep (100%) create mode 100644 app/config/app.php create mode 100644 app/config/auth.php create mode 100644 app/config/cache.php create mode 100644 app/config/database.php create mode 100644 app/config/mail.php rename application/migrations/.gitignore => app/config/packages/.gitkeep (100%) create mode 100644 app/config/session.php create mode 100644 app/config/testing/cache.php create mode 100644 app/config/testing/session.php create mode 100644 app/config/view.php rename application/models/.gitignore => app/controllers/.gitkeep (100%) create mode 100644 app/controllers/BaseController.php create mode 100644 app/controllers/HomeController.php rename application/tasks/.gitignore => app/database/migrations/.gitkeep (100%) rename bundles/.gitignore => app/database/production.sqlite (100%) rename laravel/tests/application/libraries/.gitignore => app/database/seeds/.gitkeep (100%) create mode 100644 app/filters.php rename {laravel/tests/application/language => app/lang}/en/pagination.php (71%) create mode 100644 app/lang/en/validation.php create mode 100644 app/models/User.php create mode 100644 app/routes.php create mode 100644 app/start/artisan.php create mode 100644 app/start/global.php create mode 100644 app/start/local.php create mode 100644 app/storage/.gitignore rename {storage => app/storage}/cache/.gitignore (100%) rename {storage => app/storage}/logs/.gitignore (100%) rename {storage/sessions => app/storage/meta}/.gitignore (100%) rename {storage/views => app/storage/sessions}/.gitignore (100%) rename {storage/work => app/storage/views}/.gitignore (100%) create mode 100644 app/tests/ExampleTest.php create mode 100644 app/tests/TestCase.php create mode 100644 app/views/hello.php delete mode 100644 application/bundles.php delete mode 100644 application/config/.gitignore delete mode 100755 application/config/application.php delete mode 100644 application/config/auth.php delete mode 100644 application/config/cache.php delete mode 100644 application/config/database.php delete mode 100644 application/config/error.php delete mode 100644 application/config/mimes.php delete mode 100644 application/config/session.php delete mode 100644 application/config/strings.php delete mode 100644 application/controllers/base.php delete mode 100644 application/controllers/home.php delete mode 100644 application/language/ar/pagination.php delete mode 100644 application/language/ar/validation.php delete mode 100644 application/language/bg/pagination.php delete mode 100644 application/language/bg/validation.php delete mode 100644 application/language/da/pagination.php delete mode 100644 application/language/da/validation.php delete mode 100644 application/language/de/pagination.php delete mode 100644 application/language/de/validation.php delete mode 100644 application/language/el/pagination.php delete mode 100644 application/language/el/validation.php delete mode 100644 application/language/en/pagination.php delete mode 100644 application/language/en/validation.php delete mode 100644 application/language/fi/pagination.php delete mode 100644 application/language/fi/validation.php delete mode 100644 application/language/fr/pagination.php delete mode 100644 application/language/fr/validation.php delete mode 100644 application/language/he/pagination.php delete mode 100644 application/language/he/validation.php delete mode 100644 application/language/hu/pagination.php delete mode 100644 application/language/hu/validation.php delete mode 100644 application/language/id/pagination.php delete mode 100644 application/language/id/validation.php delete mode 100755 application/language/it/pagination.php delete mode 100755 application/language/it/validation.php delete mode 100644 application/language/ja/pagination.php delete mode 100644 application/language/ja/validation.php delete mode 100644 application/language/nl/pagination.php delete mode 100644 application/language/nl/validation.php delete mode 100644 application/language/pl/pagination.php delete mode 100644 application/language/pl/validation.php delete mode 100644 application/language/pt/pagination.php delete mode 100644 application/language/pt/validation.php delete mode 100644 application/language/ru/pagination.php delete mode 100644 application/language/ru/validation.php delete mode 100644 application/language/sq/pagination.php delete mode 100644 application/language/sq/validation.php delete mode 100644 application/language/sr/pagination.php delete mode 100644 application/language/sr/validation.php delete mode 100644 application/language/sv/pagination.php delete mode 100644 application/language/sv/validation.php delete mode 100644 application/language/tr/pagination.php delete mode 100644 application/language/tr/validation.php delete mode 100644 application/routes.php delete mode 100755 application/start.php delete mode 100644 application/tests/example.test.php delete mode 100644 application/views/error/404.php delete mode 100644 application/views/error/500.php delete mode 100644 application/views/home/index.blade.php delete mode 100755 bundles/docs/libraries/markdown.php delete mode 100644 bundles/docs/routes.php delete mode 100644 bundles/docs/views/page.blade.php delete mode 100755 bundles/docs/views/template.blade.php create mode 100644 composer.json delete mode 100644 laravel/asset.php delete mode 100644 laravel/auth.php delete mode 100644 laravel/auth/drivers/driver.php delete mode 100644 laravel/auth/drivers/eloquent.php delete mode 100644 laravel/auth/drivers/fluent.php delete mode 100644 laravel/autoloader.php delete mode 100644 laravel/blade.php delete mode 100644 laravel/bundle.php delete mode 100644 laravel/cache.php delete mode 100644 laravel/cache/drivers/apc.php delete mode 100644 laravel/cache/drivers/database.php delete mode 100644 laravel/cache/drivers/driver.php delete mode 100644 laravel/cache/drivers/file.php delete mode 100644 laravel/cache/drivers/memcached.php delete mode 100644 laravel/cache/drivers/memory.php delete mode 100644 laravel/cache/drivers/redis.php delete mode 100644 laravel/cache/drivers/sectionable.php delete mode 100644 laravel/cache/drivers/wincache.php delete mode 100644 laravel/cli/artisan.php delete mode 100644 laravel/cli/command.php delete mode 100644 laravel/cli/dependencies.php delete mode 100644 laravel/cli/tasks/bundle/bundler.php delete mode 100644 laravel/cli/tasks/bundle/providers/github.php delete mode 100644 laravel/cli/tasks/bundle/providers/provider.php delete mode 100644 laravel/cli/tasks/bundle/publisher.php delete mode 100644 laravel/cli/tasks/bundle/repository.php delete mode 100644 laravel/cli/tasks/help.json delete mode 100644 laravel/cli/tasks/help.php delete mode 100644 laravel/cli/tasks/key.php delete mode 100644 laravel/cli/tasks/migrate/database.php delete mode 100644 laravel/cli/tasks/migrate/migrator.php delete mode 100644 laravel/cli/tasks/migrate/resolver.php delete mode 100644 laravel/cli/tasks/migrate/stub.php delete mode 100644 laravel/cli/tasks/route.php delete mode 100644 laravel/cli/tasks/session/manager.php delete mode 100644 laravel/cli/tasks/session/migration.php delete mode 100644 laravel/cli/tasks/task.php delete mode 100644 laravel/cli/tasks/test/phpunit.php delete mode 100644 laravel/cli/tasks/test/runner.php delete mode 100644 laravel/cli/tasks/test/stub.xml delete mode 100644 laravel/config.php delete mode 100644 laravel/cookie.php delete mode 100644 laravel/core.php delete mode 100644 laravel/crypter.php delete mode 100644 laravel/database.php delete mode 100644 laravel/database/connection.php delete mode 100644 laravel/database/connectors/connector.php delete mode 100644 laravel/database/connectors/mysql.php delete mode 100644 laravel/database/connectors/postgres.php delete mode 100644 laravel/database/connectors/sqlite.php delete mode 100644 laravel/database/connectors/sqlserver.php delete mode 100644 laravel/database/eloquent/model.php delete mode 100644 laravel/database/eloquent/pivot.php delete mode 100644 laravel/database/eloquent/query.php delete mode 100644 laravel/database/eloquent/relationships/belongs_to.php delete mode 100644 laravel/database/eloquent/relationships/has_many.php delete mode 100644 laravel/database/eloquent/relationships/has_many_and_belongs_to.php delete mode 100644 laravel/database/eloquent/relationships/has_one.php delete mode 100644 laravel/database/eloquent/relationships/has_one_or_many.php delete mode 100644 laravel/database/eloquent/relationships/relationship.php delete mode 100644 laravel/database/exception.php delete mode 100644 laravel/database/expression.php delete mode 100644 laravel/database/grammar.php delete mode 100755 laravel/database/query.php delete mode 100755 laravel/database/query/grammars/grammar.php delete mode 100644 laravel/database/query/grammars/mysql.php delete mode 100644 laravel/database/query/grammars/postgres.php delete mode 100644 laravel/database/query/grammars/sqlite.php delete mode 100644 laravel/database/query/grammars/sqlserver.php delete mode 100644 laravel/database/query/join.php delete mode 100644 laravel/database/schema.php delete mode 100644 laravel/database/schema/grammars/grammar.php delete mode 100644 laravel/database/schema/grammars/mysql.php delete mode 100644 laravel/database/schema/grammars/postgres.php delete mode 100644 laravel/database/schema/grammars/sqlite.php delete mode 100644 laravel/database/schema/grammars/sqlserver.php delete mode 100644 laravel/database/schema/table.php delete mode 100644 laravel/documentation/artisan/commands.md delete mode 100644 laravel/documentation/artisan/tasks.md delete mode 100644 laravel/documentation/auth/config.md delete mode 100644 laravel/documentation/auth/usage.md delete mode 100644 laravel/documentation/bundles.md delete mode 100644 laravel/documentation/cache/config.md delete mode 100644 laravel/documentation/cache/usage.md delete mode 100644 laravel/documentation/changes.md delete mode 100644 laravel/documentation/config.md delete mode 100644 laravel/documentation/contents.md delete mode 100644 laravel/documentation/contrib/command-line.md delete mode 100644 laravel/documentation/contrib/github.md delete mode 100644 laravel/documentation/contrib/tortoisegit.md delete mode 100644 laravel/documentation/controllers.md delete mode 100644 laravel/documentation/database/config.md delete mode 100644 laravel/documentation/database/eloquent.md delete mode 100644 laravel/documentation/database/fluent.md delete mode 100644 laravel/documentation/database/migrations.md delete mode 100644 laravel/documentation/database/raw.md delete mode 100644 laravel/documentation/database/redis.md delete mode 100644 laravel/documentation/database/schema.md delete mode 100644 laravel/documentation/encryption.md delete mode 100644 laravel/documentation/events.md delete mode 100644 laravel/documentation/files.md delete mode 100644 laravel/documentation/home.md delete mode 100644 laravel/documentation/input.md delete mode 100644 laravel/documentation/install.md delete mode 100644 laravel/documentation/ioc.md delete mode 100644 laravel/documentation/loading.md delete mode 100644 laravel/documentation/localization.md delete mode 100644 laravel/documentation/logging.md delete mode 100644 laravel/documentation/models.md delete mode 100644 laravel/documentation/profiler.md delete mode 100644 laravel/documentation/requests.md delete mode 100644 laravel/documentation/routing.md delete mode 100644 laravel/documentation/session/config.md delete mode 100644 laravel/documentation/session/usage.md delete mode 100644 laravel/documentation/strings.md delete mode 100644 laravel/documentation/testing.md delete mode 100644 laravel/documentation/urls.md delete mode 100644 laravel/documentation/validation.md delete mode 100644 laravel/documentation/views/assets.md delete mode 100644 laravel/documentation/views/forms.md delete mode 100644 laravel/documentation/views/home.md delete mode 100644 laravel/documentation/views/html.md delete mode 100644 laravel/documentation/views/pagination.md delete mode 100644 laravel/documentation/views/templating.md delete mode 100644 laravel/error.php delete mode 100644 laravel/event.php delete mode 100644 laravel/file.php delete mode 100644 laravel/fluent.php delete mode 100644 laravel/form.php delete mode 100644 laravel/hash.php delete mode 100644 laravel/helpers.php delete mode 100644 laravel/html.php delete mode 100644 laravel/input.php delete mode 100644 laravel/ioc.php delete mode 100644 laravel/lang.php delete mode 100644 laravel/laravel.php delete mode 100644 laravel/log.php delete mode 100644 laravel/memcached.php delete mode 100644 laravel/messages.php delete mode 100644 laravel/paginator.php delete mode 100644 laravel/pluralizer.php delete mode 100755 laravel/profiling/profiler.css delete mode 100755 laravel/profiling/profiler.js delete mode 100644 laravel/profiling/profiler.php delete mode 100755 laravel/profiling/template.blade.php delete mode 100644 laravel/redirect.php delete mode 100644 laravel/redis.php delete mode 100644 laravel/request.php delete mode 100644 laravel/response.php delete mode 100644 laravel/routing/controller.php delete mode 100644 laravel/routing/filter.php delete mode 100644 laravel/routing/route.php delete mode 100644 laravel/routing/router.php delete mode 100644 laravel/section.php delete mode 100644 laravel/session.php delete mode 100644 laravel/session/drivers/apc.php delete mode 100644 laravel/session/drivers/cookie.php delete mode 100644 laravel/session/drivers/database.php delete mode 100644 laravel/session/drivers/driver.php delete mode 100644 laravel/session/drivers/file.php delete mode 100644 laravel/session/drivers/memcached.php delete mode 100644 laravel/session/drivers/memory.php delete mode 100644 laravel/session/drivers/redis.php delete mode 100644 laravel/session/drivers/sweeper.php delete mode 100644 laravel/session/payload.php delete mode 100644 laravel/str.php delete mode 100644 laravel/tests/application/bundles.php delete mode 100644 laravel/tests/application/config/application.php delete mode 100644 laravel/tests/application/config/auth.php delete mode 100644 laravel/tests/application/config/cache.php delete mode 100644 laravel/tests/application/config/database.php delete mode 100644 laravel/tests/application/config/error.php delete mode 100644 laravel/tests/application/config/local/database.php delete mode 100644 laravel/tests/application/config/mimes.php delete mode 100644 laravel/tests/application/config/session.php delete mode 100644 laravel/tests/application/config/strings.php delete mode 100644 laravel/tests/application/controllers/admin/panel.php delete mode 100644 laravel/tests/application/controllers/auth.php delete mode 100644 laravel/tests/application/controllers/filter.php delete mode 100644 laravel/tests/application/controllers/home.php delete mode 100644 laravel/tests/application/controllers/restful.php delete mode 100644 laravel/tests/application/controllers/template/basic.php delete mode 100644 laravel/tests/application/controllers/template/named.php delete mode 100644 laravel/tests/application/controllers/template/override.php delete mode 100644 laravel/tests/application/dashboard/repository.php delete mode 100644 laravel/tests/application/language/en/validation.php delete mode 100644 laravel/tests/application/language/sp/validation.php delete mode 100644 laravel/tests/application/models/.gitignore delete mode 100644 laravel/tests/application/models/autoloader.php delete mode 100644 laravel/tests/application/models/model.php delete mode 100644 laravel/tests/application/models/repositories/user.php delete mode 100644 laravel/tests/application/models/user.php delete mode 100644 laravel/tests/application/routes.php delete mode 100644 laravel/tests/application/start.php delete mode 100644 laravel/tests/application/tasks/.gitignore delete mode 100644 laravel/tests/application/views/error/404.php delete mode 100644 laravel/tests/application/views/error/500.php delete mode 100644 laravel/tests/application/views/home/index.php delete mode 100644 laravel/tests/application/views/tests/basic.php delete mode 100644 laravel/tests/application/views/tests/nested.php delete mode 100644 laravel/tests/bundles/.gitignore delete mode 100644 laravel/tests/bundles/dashboard/config/meta.php delete mode 100644 laravel/tests/bundles/dashboard/controllers/panel.php delete mode 100644 laravel/tests/bundles/dashboard/models/repository.php delete mode 100644 laravel/tests/bundles/dashboard/routes.php delete mode 100644 laravel/tests/bundles/dummy/routes.php delete mode 100644 laravel/tests/bundles/dummy/start.php delete mode 100644 laravel/tests/cases/asset.test.php delete mode 100644 laravel/tests/cases/auth.test.php delete mode 100644 laravel/tests/cases/autoloader.test.php delete mode 100644 laravel/tests/cases/blade.test.php delete mode 100644 laravel/tests/cases/bundle.test.php delete mode 100644 laravel/tests/cases/config.test.php delete mode 100644 laravel/tests/cases/controller.test.php delete mode 100644 laravel/tests/cases/cookie.test.php delete mode 100644 laravel/tests/cases/database.test.php delete mode 100644 laravel/tests/cases/eloquent.test.php delete mode 100644 laravel/tests/cases/event.test.php delete mode 100644 laravel/tests/cases/fluent.test.php delete mode 100644 laravel/tests/cases/form.test.php delete mode 100644 laravel/tests/cases/hash.test.php delete mode 100644 laravel/tests/cases/html.test.php delete mode 100644 laravel/tests/cases/input.test.php delete mode 100644 laravel/tests/cases/ioc.test.php delete mode 100644 laravel/tests/cases/lang.test.php delete mode 100644 laravel/tests/cases/messages.test.php delete mode 100644 laravel/tests/cases/query.test.php delete mode 100644 laravel/tests/cases/redirect.test.php delete mode 100644 laravel/tests/cases/request.test.php delete mode 100644 laravel/tests/cases/response.test.php delete mode 100644 laravel/tests/cases/route.test.php delete mode 100644 laravel/tests/cases/routing.test.php delete mode 100644 laravel/tests/cases/session.test.php delete mode 100644 laravel/tests/cases/str.test.php delete mode 100644 laravel/tests/cases/uri.test.php delete mode 100644 laravel/tests/cases/url.test.php delete mode 100644 laravel/tests/cases/validator.test.php delete mode 100644 laravel/tests/cases/view.test.php delete mode 100644 laravel/tests/phpunit.php delete mode 100644 laravel/tests/storage/cache/.gitignore delete mode 100644 laravel/tests/storage/database/application.sqlite delete mode 100644 laravel/tests/storage/files/desert.jpg delete mode 100644 laravel/tests/storage/logs/.gitignore delete mode 100644 laravel/tests/storage/sessions/.gitignore delete mode 100644 laravel/tests/storage/views/.gitignore delete mode 100644 laravel/uri.php delete mode 100644 laravel/url.php delete mode 100644 laravel/validator.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Application.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Command/Command.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Command/HelpCommand.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Command/ListCommand.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Formatter/OutputFormatter.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Formatter/OutputFormatterInterface.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Formatter/OutputFormatterStyle.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Helper/DialogHelper.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Helper/FormatterHelper.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Helper/Helper.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Helper/HelperInterface.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Helper/HelperSet.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Input/ArgvInput.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Input/ArrayInput.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Input/Input.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Input/InputArgument.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Input/InputDefinition.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Input/InputInterface.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Input/InputOption.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Input/StringInput.php delete mode 100644 laravel/vendor/Symfony/Component/Console/LICENSE delete mode 100644 laravel/vendor/Symfony/Component/Console/Output/ConsoleOutput.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Output/ConsoleOutputInterface.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Output/NullOutput.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Output/Output.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Output/OutputInterface.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Output/StreamOutput.php delete mode 100644 laravel/vendor/Symfony/Component/Console/README.md delete mode 100644 laravel/vendor/Symfony/Component/Console/Shell.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Tester/ApplicationTester.php delete mode 100644 laravel/vendor/Symfony/Component/Console/Tester/CommandTester.php delete mode 100644 laravel/vendor/Symfony/Component/Console/composer.json delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/ApacheRequest.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/CHANGELOG.md delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Cookie.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/AccessDeniedException.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/FileException.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/FileNotFoundException.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/UnexpectedTypeException.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/UploadException.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/File/File.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesser.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesserInterface.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeExtensionGuesser.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesserInterface.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/File/UploadedFile.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/FileBag.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/HeaderBag.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/JsonResponse.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/LICENSE delete mode 100644 laravel/vendor/Symfony/Component/HttpFoundation/LaravelRequest.php delete mode 100644 laravel/vendor/Symfony/Component/HttpFoundation/LaravelResponse.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/ParameterBag.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/README.md delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/RedirectResponse.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Request.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/RequestMatcher.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/RequestMatcherInterface.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Response.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/ResponseHeaderBag.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/ServerBag.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Session.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/SessionBagInterface.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/SessionInterface.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeFileSessionHandler.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/StreamedResponse.php delete mode 100755 laravel/vendor/Symfony/Component/HttpFoundation/composer.json delete mode 100644 laravel/view.php delete mode 100644 license.txt delete mode 100644 paths.php create mode 100644 phpunit.xml delete mode 100644 public/bundles/.gitignore delete mode 100644 public/css/.gitignore delete mode 100644 public/img/.gitignore delete mode 100644 public/js/.gitignore delete mode 100755 public/laravel/css/style.css delete mode 100755 public/laravel/img/logoback.png delete mode 100755 public/laravel/js/modernizr-2.5.3.min.js delete mode 100755 public/laravel/js/prettify.js delete mode 100644 public/laravel/js/scroll.js rename laravel/tests/application/migrations/.gitignore => public/packages/.gitkeep (100%) create mode 100644 server.php create mode 100644 start.php delete mode 100644 storage/database/.gitignore diff --git a/.gitignore b/.gitignore index 49d6cd59..2c1fc0c1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,37 +1,4 @@ -# Numerous always-ignore extensions -*.diff -*.err -*.orig -*.log -*.rej -*.swo -*.swp -*.vi -*~ -*.sass-cache - -# OS or Editor folders -.DS_Store -Thumbs.db -.cache -.project -.settings -.tmproj -*.esproj -nbproject - -# Dreamweaver added files -_notes -dwsync.xml - -# Komodo -*.komodoproject -.komodotools - -# Folders to ignore -.hg -.svn -.CVS -intermediate -publish -.idea \ No newline at end of file +/vendor +composer.phar +composer.lock +.DS_Store \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 1d589555..00000000 --- a/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: php - -php: - - 5.3 - -script: "php artisan test:core" \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 94e2b12a..015febc4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,9 +1,3 @@ -# Pull request guidelines +# Contribution Guidelines -[GitHub pull requests](https://help.github.com/articles/using-pull-requests) are a great way for everyone in the community to contribute to the Laravel codebase. Found a bug? Just fix it in your fork and submit a pull request. This will then be reviewed, and, if found as good, merged into the main repository. - -In order to keep the codebase clean, stable and at high quality, even with so many people contributing, some guidelines are necessary for high-quality pull requests: - -- **Branch:** Unless they are immediate documentation fixes relevant for old versions, pull requests should be sent to the `develop` branch only. Make sure to select that branch as target when creating the pull request (GitHub will not automatically select it.) -- **Documentation:** If you are adding a new feature or changing the API in any relevant way, this should be documented. The documentation files can be found directly in the core repository. -- **Unit tests:** To keep old bugs from re-appearing and generally hold quality at a high level, the Laravel core is thoroughly unit-tested. Thus, when you create a pull request, it is expected that you unit test any new code you add. For any bug you fix, you should also add regression tests to make sure the bug will never appear again. If you are unsure about how to write tests, the core team or other contributors will gladly help. \ No newline at end of file +Please submit all issues and pull requests to the [laravel/framework](http://github.com/laravel/framework) repository! \ No newline at end of file diff --git a/application/libraries/.gitignore b/app/commands/.gitkeep similarity index 100% rename from application/libraries/.gitignore rename to app/commands/.gitkeep diff --git a/app/config/app.php b/app/config/app.php new file mode 100644 index 00000000..3925e64c --- /dev/null +++ b/app/config/app.php @@ -0,0 +1,170 @@ + true, + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + */ + + 'timezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + */ + + 'locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Application Fallback Locale + |-------------------------------------------------------------------------- + | + | The fallback locale determines the locale to use when the current one + | is not available. You may change the value to correspond to any of + | the language folders that are provided through your application. + | + */ + + 'fallback_locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, long string, otherwise these encrypted values will not + | be safe. Make sure to change it before deploying any application! + | + */ + + 'key' => 'YourSecretKey!!!', + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => array( + + 'Illuminate\Foundation\Providers\ArtisanServiceProvider', + 'Illuminate\Auth\AuthServiceProvider', + 'Illuminate\Cache\CacheServiceProvider', + 'Illuminate\Foundation\Providers\CommandCreatorServiceProvider', + 'Illuminate\Foundation\Providers\ComposerServiceProvider', + 'Illuminate\Routing\ControllerServiceProvider', + 'Illuminate\Cookie\CookieServiceProvider', + 'Illuminate\Database\DatabaseServiceProvider', + 'Illuminate\Encryption\EncryptionServiceProvider', + 'Illuminate\Filesystem\FilesystemServiceProvider', + 'Illuminate\Hashing\HashServiceProvider', + 'Illuminate\Foundation\Providers\KeyGeneratorServiceProvider', + 'Illuminate\Log\LogServiceProvider', + 'Illuminate\Mail\MailServiceProvider', + 'Illuminate\Database\MigrationServiceProvider', + 'Illuminate\Pagination\PaginationServiceProvider', + 'Illuminate\Foundation\Providers\PublisherServiceProvider', + 'Illuminate\Redis\RedisServiceProvider', + 'Illuminate\Database\SeedServiceProvider', + 'Illuminate\Foundation\Providers\ServerServiceProvider', + 'Illuminate\Session\SessionServiceProvider', + 'Illuminate\Foundation\Providers\TinkerServiceProvider', + 'Illuminate\Translation\TranslationServiceProvider', + 'Illuminate\Validation\ValidationServiceProvider', + 'Illuminate\View\ViewServiceProvider', + 'Illuminate\Workbench\WorkbenchServiceProvider', + + ), + + /* + |-------------------------------------------------------------------------- + | Service Provider Manifest + |-------------------------------------------------------------------------- + | + | The service provider manifest is used by Laravel to lazy load service + | providers which are not needed for each request, as well to keep a + | list of all of the services. Here, you may set its storage spot. + | + */ + + 'manifest' => __DIR__.'/../storage/meta', + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => array( + + 'App' => 'Illuminate\Support\Facades\App', + 'Artisan' => 'Illuminate\Support\Facades\Artisan', + 'Auth' => 'Illuminate\Support\Facades\Auth', + 'Blade' => 'Illuminate\Support\Facades\Blade', + 'Cache' => 'Illuminate\Support\Facades\Cache', + 'Config' => 'Illuminate\Support\Facades\Config', + 'Controller' => 'Illuminate\Routing\Controllers\Controller', + 'Cookie' => 'Illuminate\Support\Facades\Cookie', + 'Crypt' => 'Illuminate\Support\Facades\Crypt', + 'DB' => 'Illuminate\Support\Facades\DB', + 'Eloquent' => 'Illuminate\Database\Eloquent\Model', + 'Event' => 'Illuminate\Support\Facades\Event', + 'File' => 'Illuminate\Support\Facades\File', + 'Hash' => 'Illuminate\Support\Facades\Hash', + 'Input' => 'Illuminate\Support\Facades\Input', + 'Lang' => 'Illuminate\Support\Facades\Lang', + 'Log' => 'Illuminate\Support\Facades\Log', + 'Mail' => 'Illuminate\Support\Facades\Mail', + 'Paginator' => 'Illuminate\Support\Facades\Paginator', + 'Redirect' => 'Illuminate\Support\Facades\Redirect', + 'Redis' => 'Illuminate\Support\Facades\Redis', + 'Request' => 'Illuminate\Support\Facades\Request', + 'Response' => 'Illuminate\Support\Facades\Response', + 'Route' => 'Illuminate\Support\Facades\Route', + 'Schema' => 'Illuminate\Support\Facades\Schema', + 'Session' => 'Illuminate\Support\Facades\Session', + 'URL' => 'Illuminate\Support\Facades\URL', + 'Validator' => 'Illuminate\Support\Facades\Validator', + 'View' => 'Illuminate\Support\Facades\View', + + ), + +); diff --git a/app/config/auth.php b/app/config/auth.php new file mode 100644 index 00000000..3eceea3c --- /dev/null +++ b/app/config/auth.php @@ -0,0 +1,46 @@ + 'eloquent', + + /* + |-------------------------------------------------------------------------- + | Authentication Model + |-------------------------------------------------------------------------- + | + | When using the "Eloquent" authentication driver, we need to know which + | Eloquent model should be used to retrieve your users. Of course, it + | is often just the "User" model but you may use whatever you like. + | + */ + + 'model' => 'User', + + /* + |-------------------------------------------------------------------------- + | Authentication Table + |-------------------------------------------------------------------------- + | + | When using the "Database" authentication driver, we need to know which + | table should be used to retrieve your users. We have chosen a basic + | default value but you may easily change it to any table you like. + | + */ + + 'table' => 'users', + +); diff --git a/app/config/cache.php b/app/config/cache.php new file mode 100644 index 00000000..f55ca145 --- /dev/null +++ b/app/config/cache.php @@ -0,0 +1,89 @@ + 'file', + + /* + |-------------------------------------------------------------------------- + | File Cache Location + |-------------------------------------------------------------------------- + | + | When using the "file" cache driver, we need a location where the cache + | files may be stored. A sensible default has been specified, but you + | are free to change it to any other place on disk that you desire. + | + */ + + 'path' => __DIR__.'/../storage/cache', + + /* + |-------------------------------------------------------------------------- + | Database Cache Connection + |-------------------------------------------------------------------------- + | + | When using the "database" cache driver you may specify the connection + | that should be used to store the cached items. When this option is + | null the default database connection will be utilized for cache. + | + */ + + 'connection' => null, + + /* + |-------------------------------------------------------------------------- + | Database Cache Table + |-------------------------------------------------------------------------- + | + | When using the "database" cache driver we need to know the table that + | should be used to store the cached items. A default table name has + | been provided but you're free to change it however you deem fit. + | + */ + + 'table' => 'cache', + + /* + |-------------------------------------------------------------------------- + | Memcached Servers + |-------------------------------------------------------------------------- + | + | Now you may specify an array of your Memcached servers that should be + | used when utilizing the Memcached cache driver. All of the servers + | should contain a value for "host", "port", and "weight" options. + | + */ + + 'memcached' => array( + + array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100), + + ), + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing a RAM based store such as APC or Memcached, there might + | be other applications utilizing the same cache. So, we'll specify a + | value to get prefixed to all our keys so we can avoid collisions. + | + */ + + 'prefix' => 'laravel', + +); diff --git a/app/config/database.php b/app/config/database.php new file mode 100644 index 00000000..d811e9aa --- /dev/null +++ b/app/config/database.php @@ -0,0 +1,122 @@ + PDO::FETCH_CLASS, + + /* + |-------------------------------------------------------------------------- + | Default Database Connection Name + |-------------------------------------------------------------------------- + | + | Here you may specify which of the database connections below you wish + | to use as your default connection for all database work. Of course + | you may use many connections at once using the Database library. + | + */ + + 'default' => 'mysql', + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => array( + + 'sqlite' => array( + 'driver' => 'sqlite', + 'database' => __DIR__.'/../database/production.sqlite', + 'prefix' => '', + ), + + 'mysql' => array( + 'driver' => 'mysql', + 'host' => 'localhost', + 'database' => 'database', + 'username' => 'root', + 'password' => '', + 'charset' => 'utf8', + 'collation' => 'utf8_unicode_ci', + 'prefix' => '', + ), + + 'pgsql' => array( + 'driver' => 'pgsql', + 'host' => 'localhost', + 'database' => 'database', + 'username' => 'root', + 'password' => '', + 'charset' => 'utf8', + 'prefix' => '', + 'schema' => 'public', + ), + + 'sqlsrv' => array( + 'driver' => 'sqlsrv', + 'host' => 'localhost', + 'database' => 'database', + 'username' => 'root', + 'password' => '', + 'prefix' => '', + ), + + ), + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk have not actually be run in the databases. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer set of commands than a typical key-value systems + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => array( + + 'default' => array( + 'host' => '127.0.0.1', + 'port' => 6379, + 'database' => 0, + ), + + ), + +); \ No newline at end of file diff --git a/app/config/mail.php b/app/config/mail.php new file mode 100644 index 00000000..e793d886 --- /dev/null +++ b/app/config/mail.php @@ -0,0 +1,83 @@ + 'smtp.postmarkapp.com', + + /* + |-------------------------------------------------------------------------- + | SMTP Host Port + |-------------------------------------------------------------------------- + | + | This is the SMTP port used by your application to delivery e-mails to + | users of your application. Like the host we have set this value to + | stay compatible with the Postmark e-mail application by default. + | + */ + + 'port' => 2525, + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => array('address' => null, 'name' => null), + + /* + |-------------------------------------------------------------------------- + | E-Mail Encryption Protocol + |-------------------------------------------------------------------------- + | + | Here you may specify the encryption protocol that should be used when + | the application send e-mail messages. A sensible default using the + | transport layer security protocol should provide great security. + | + */ + + 'encryption' => 'tls', + + /* + |-------------------------------------------------------------------------- + | SMTP Server Username + |-------------------------------------------------------------------------- + | + | If your SMTP server requires a username for authentication, you should + | set it here. This will get used to authenticate with your server on + | connection. You may also set the "password" value below this one. + | + */ + + 'username' => null, + + /* + |-------------------------------------------------------------------------- + | SMTP Server Password + |-------------------------------------------------------------------------- + | + | Here you may set the password required by your SMTP server to send out + | messages from your application. This will be given to the server on + | connection so that the application will be able to send messages. + | + */ + + 'password' => null, + +); diff --git a/application/migrations/.gitignore b/app/config/packages/.gitkeep similarity index 100% rename from application/migrations/.gitignore rename to app/config/packages/.gitkeep diff --git a/app/config/session.php b/app/config/session.php new file mode 100644 index 00000000..188c8c7c --- /dev/null +++ b/app/config/session.php @@ -0,0 +1,86 @@ + 'cookie', + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle for it is expired. If you want them + | to immediately expire when the browser closes, set it to zero. + | + */ + + 'lifetime' => 120, + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When using the "file" session driver, we need a location where session + | files may be stored. A default has been set for you but a different + | location may be specified. This is only needed for file sessions. + | + */ + + 'path' => __DIR__.'/../storage/sessions', + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the database + | connection that should be used to manage your sessions. This should + | correspond to a connection in your "database" configuration file. + | + */ + + 'connection' => null, + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table we + | should use to manage the sessions. Of course, a sensible default is + | provided for you; however, you are free to change this as needed. + | + */ + + 'table' => 'sessions', + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => array(2, 100), + +); diff --git a/app/config/testing/cache.php b/app/config/testing/cache.php new file mode 100644 index 00000000..16d3ae2f --- /dev/null +++ b/app/config/testing/cache.php @@ -0,0 +1,20 @@ + 'array', + +); \ No newline at end of file diff --git a/app/config/testing/session.php b/app/config/testing/session.php new file mode 100644 index 00000000..338aebaf --- /dev/null +++ b/app/config/testing/session.php @@ -0,0 +1,21 @@ + 'array', + +); \ No newline at end of file diff --git a/app/config/view.php b/app/config/view.php new file mode 100644 index 00000000..eba10a4c --- /dev/null +++ b/app/config/view.php @@ -0,0 +1,31 @@ + array(__DIR__.'/../views'), + + /* + |-------------------------------------------------------------------------- + | Pagination View + |-------------------------------------------------------------------------- + | + | This view will be used to render the pagination link output, and can + | be easily customized here to show any view you like. A clean view + | compatible with Twitter's Bootstrap is given to you by default. + | + */ + + 'pagination' => 'pagination::slider', + +); diff --git a/application/models/.gitignore b/app/controllers/.gitkeep similarity index 100% rename from application/models/.gitignore rename to app/controllers/.gitkeep diff --git a/app/controllers/BaseController.php b/app/controllers/BaseController.php new file mode 100644 index 00000000..097e161a --- /dev/null +++ b/app/controllers/BaseController.php @@ -0,0 +1,18 @@ +layout)) + { + $this->layout = View::make($this->layout); + } + } + +} \ No newline at end of file diff --git a/app/controllers/HomeController.php b/app/controllers/HomeController.php new file mode 100644 index 00000000..796a085e --- /dev/null +++ b/app/controllers/HomeController.php @@ -0,0 +1,23 @@ + "The :attribute must be accepted.", + "active_url" => "The :attribute is not a valid URL.", + "after" => "The :attribute must be a date after :date.", + "alpha" => "The :attribute may only contain letters.", + "alpha_dash" => "The :attribute may only contain letters, numbers, and dashes.", + "alpha_num" => "The :attribute may only contain letters and numbers.", + "before" => "The :attribute must be a date before :date.", + "between" => array( + "numeric" => "The :attribute must be between :min - :max.", + "file" => "The :attribute must be between :min - :max kilobytes.", + "string" => "The :attribute must be between :min - :max characters.", + ), + "confirmed" => "The :attribute confirmation does not match.", + "different" => "The :attribute and :other must be different.", + "digits" => "The :attribute must be :digits digits.", + "digits_between" => "The :attribute must be between :min and :max digits.", + "email" => "The :attribute format is invalid.", + "exists" => "The selected :attribute is invalid.", + "image" => "The :attribute must be an image.", + "in" => "The selected :attribute is invalid.", + "integer" => "The :attribute must be an integer.", + "ip" => "The :attribute must be a valid IP address.", + "match" => "The :attribute format is invalid.", + "max" => array( + "numeric" => "The :attribute must be less than :max.", + "file" => "The :attribute must be less than :max kilobytes.", + "string" => "The :attribute must be less than :max characters.", + ), + "mimes" => "The :attribute must be a file of type: :values.", + "min" => array( + "numeric" => "The :attribute must be at least :min.", + "file" => "The :attribute must be at least :min kilobytes.", + "string" => "The :attribute must be at least :min characters.", + ), + "notin" => "The selected :attribute is invalid.", + "numeric" => "The :attribute must be a number.", + "required" => "The :attribute field is required.", + "required_with" => "The :attribute field is required when :values is present.", + "same" => "The :attribute and :other must match.", + "size" => array( + "numeric" => "The :attribute must be :size.", + "file" => "The :attribute must be :size kilobytes.", + "string" => "The :attribute must be :size characters.", + ), + "unique" => "The :attribute has already been taken.", + "url" => "The :attribute format is invalid.", + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => array(), + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => array(), + +); \ No newline at end of file diff --git a/app/models/User.php b/app/models/User.php new file mode 100644 index 00000000..e2bcec57 --- /dev/null +++ b/app/models/User.php @@ -0,0 +1,41 @@ +getKey(); + } + + /** + * Get the password for the user. + * + * @return string + */ + public function getAuthPassword() + { + return $this->password; + } + +} \ No newline at end of file diff --git a/app/routes.php b/app/routes.php new file mode 100644 index 00000000..e2a75e25 --- /dev/null +++ b/app/routes.php @@ -0,0 +1,17 @@ +client->request('GET', '/'); + + $this->assertTrue($this->client->getResponse()->isOk()); + + $this->assertCount(1, $crawler->filter('h1:contains("Hello World!")')); + } + +} \ No newline at end of file diff --git a/app/tests/TestCase.php b/app/tests/TestCase.php new file mode 100644 index 00000000..1af7071e --- /dev/null +++ b/app/tests/TestCase.php @@ -0,0 +1,19 @@ +Hello World! \ No newline at end of file diff --git a/application/bundles.php b/application/bundles.php deleted file mode 100644 index e8b8f266..00000000 --- a/application/bundles.php +++ /dev/null @@ -1,40 +0,0 @@ - array( -| 'location' => 'admin', -| 'handles' => 'admin', -| ), -| -| Note that the "location" is relative to the "bundles" directory. -| Now the bundle will be recognized by Laravel and will be able -| to respond to requests beginning with "admin"! -| -| Have a bundle that lives in the root of the bundle directory -| and doesn't respond to any requests? Just add the bundle -| name to the array and we'll take care of the rest. -| -*/ - -return array( - - 'docs' => array('handles' => 'docs'), - -); \ No newline at end of file diff --git a/application/config/.gitignore b/application/config/.gitignore deleted file mode 100644 index aa5195c6..00000000 --- a/application/config/.gitignore +++ /dev/null @@ -1 +0,0 @@ -local/* \ No newline at end of file diff --git a/application/config/application.php b/application/config/application.php deleted file mode 100755 index 60735a60..00000000 --- a/application/config/application.php +++ /dev/null @@ -1,198 +0,0 @@ - '', - - /* - |-------------------------------------------------------------------------- - | Asset URL - |-------------------------------------------------------------------------- - | - | The base URL used for your application's asset files. This is useful if - | you are serving your assets through a different server or a CDN. If it - | is not set, we'll default to the application URL above. - | - */ - - 'asset_url' => '', - - /* - |-------------------------------------------------------------------------- - | Application Index - |-------------------------------------------------------------------------- - | - | If you are including the "index.php" in your URLs, you can ignore this. - | However, if you are using mod_rewrite to get cleaner URLs, just set - | this option to an empty string and we'll take care of the rest. - | - */ - - 'index' => 'index.php', - - /* - |-------------------------------------------------------------------------- - | Application Key - |-------------------------------------------------------------------------- - | - | This key is used by the encryption and cookie classes to generate secure - | encrypted strings and hashes. It is extremely important that this key - | remains secret and it should not be shared with anyone. Make it about 32 - | characters of random gibberish. - | - */ - - 'key' => 'YourSecretKeyGoesHere!', - - /* - |-------------------------------------------------------------------------- - | Profiler Toolbar - |-------------------------------------------------------------------------- - | - | Laravel includes a beautiful profiler toolbar that gives you a heads - | up display of the queries and logs performed by your application. - | This is wonderful for development, but, of course, you should - | disable the toolbar for production applications. - | - */ - - 'profiler' => false, - - /* - |-------------------------------------------------------------------------- - | Application Character Encoding - |-------------------------------------------------------------------------- - | - | The default character encoding used by your application. This encoding - | will be used by the Str, Text, Form, and any other classes that need - | to know what type of encoding to use for your awesome application. - | - */ - - 'encoding' => 'UTF-8', - - /* - |-------------------------------------------------------------------------- - | Default Application Language - |-------------------------------------------------------------------------- - | - | The default language of your application. This language will be used by - | Lang library as the default language when doing string localization. - | - */ - - 'language' => 'en', - - /* - |-------------------------------------------------------------------------- - | Supported Languages - |-------------------------------------------------------------------------- - | - | These languages may also be supported by your application. If a request - | enters your application with a URI beginning with one of these values - | the default language will automatically be set to that language. - | - */ - - 'languages' => array(), - - /* - |-------------------------------------------------------------------------- - | SSL Link Generation - |-------------------------------------------------------------------------- - | - | Many sites use SSL to protect their users' data. However, you may not be - | able to use SSL on your development machine, meaning all HTTPS will be - | broken during development. - | - | For this reason, you may wish to disable the generation of HTTPS links - | throughout your application. This option does just that. All attempts - | to generate HTTPS links will generate regular HTTP links instead. - | - */ - - 'ssl' => true, - - /* - |-------------------------------------------------------------------------- - | Application Timezone - |-------------------------------------------------------------------------- - | - | The default timezone of your application. The timezone will be used when - | Laravel needs a date, such as when writing to a log file or travelling - | to a distant star at warp speed. - | - */ - - 'timezone' => 'UTC', - - /* - |-------------------------------------------------------------------------- - | Class Aliases - |-------------------------------------------------------------------------- - | - | Here, you can specify any class aliases that you would like registered - | when Laravel loads. Aliases are lazy-loaded, so feel free to add! - | - | Aliases make it more convenient to use namespaced classes. Instead of - | referring to the class using its full namespace, you may simply use - | the alias defined here. - | - */ - - 'aliases' => array( - 'Auth' => 'Laravel\\Auth', - 'Authenticator' => 'Laravel\\Auth\\Drivers\\Driver', - 'Asset' => 'Laravel\\Asset', - 'Autoloader' => 'Laravel\\Autoloader', - 'Blade' => 'Laravel\\Blade', - 'Bundle' => 'Laravel\\Bundle', - 'Cache' => 'Laravel\\Cache', - 'Config' => 'Laravel\\Config', - 'Controller' => 'Laravel\\Routing\\Controller', - 'Cookie' => 'Laravel\\Cookie', - 'Crypter' => 'Laravel\\Crypter', - 'DB' => 'Laravel\\Database', - 'Eloquent' => 'Laravel\\Database\\Eloquent\\Model', - 'Event' => 'Laravel\\Event', - 'File' => 'Laravel\\File', - 'Filter' => 'Laravel\\Routing\\Filter', - 'Form' => 'Laravel\\Form', - 'Hash' => 'Laravel\\Hash', - 'HTML' => 'Laravel\\HTML', - 'Input' => 'Laravel\\Input', - 'IoC' => 'Laravel\\IoC', - 'Lang' => 'Laravel\\Lang', - 'Log' => 'Laravel\\Log', - 'Memcached' => 'Laravel\\Memcached', - 'Paginator' => 'Laravel\\Paginator', - 'Profiler' => 'Laravel\\Profiling\\Profiler', - 'URL' => 'Laravel\\URL', - 'Redirect' => 'Laravel\\Redirect', - 'Redis' => 'Laravel\\Redis', - 'Request' => 'Laravel\\Request', - 'Response' => 'Laravel\\Response', - 'Route' => 'Laravel\\Routing\\Route', - 'Router' => 'Laravel\\Routing\\Router', - 'Schema' => 'Laravel\\Database\\Schema', - 'Section' => 'Laravel\\Section', - 'Session' => 'Laravel\\Session', - 'Str' => 'Laravel\\Str', - 'Task' => 'Laravel\\CLI\\Tasks\\Task', - 'URI' => 'Laravel\\URI', - 'Validator' => 'Laravel\\Validator', - 'View' => 'Laravel\\View', - ), - -); diff --git a/application/config/auth.php b/application/config/auth.php deleted file mode 100644 index d4a0dcbc..00000000 --- a/application/config/auth.php +++ /dev/null @@ -1,73 +0,0 @@ - 'eloquent', - - /* - |-------------------------------------------------------------------------- - | Authentication Username - |-------------------------------------------------------------------------- - | - | Here you may specify the database column that should be considered the - | "username" for your users. Typically, this will either be "username" - | or "email". Of course, you're free to change the value to anything. - | - */ - - 'username' => 'email', - - /* - |-------------------------------------------------------------------------- - | Authentication Password - |-------------------------------------------------------------------------- - | - | Here you may specify the database column that should be considered the - | "password" for your users. Typically, this will be "password" but, - | again, you're free to change the value to anything you see fit. - | - */ - - 'password' => 'password', - - /* - |-------------------------------------------------------------------------- - | Authentication Model - |-------------------------------------------------------------------------- - | - | When using the "eloquent" authentication driver, you may specify the - | model that should be considered the "User" model. This model will - | be used to authenticate and load the users of your application. - | - */ - - 'model' => 'User', - - /* - |-------------------------------------------------------------------------- - | Authentication Table - |-------------------------------------------------------------------------- - | - | When using the "fluent" authentication driver, the database table used - | to load users may be specified here. This table will be used in by - | the fluent query builder to authenticate and load your users. - | - */ - - 'table' => 'users', - -); \ No newline at end of file diff --git a/application/config/cache.php b/application/config/cache.php deleted file mode 100644 index 5dc267e6..00000000 --- a/application/config/cache.php +++ /dev/null @@ -1,71 +0,0 @@ - 'file', - - /* - |-------------------------------------------------------------------------- - | Cache Key - |-------------------------------------------------------------------------- - | - | This key will be prepended to item keys stored using Memcached and APC - | to prevent collisions with other applications on the server. Since the - | memory based stores could be shared by other applications, we need to - | be polite and use a prefix to uniquely identify our items. - | - */ - - 'key' => 'laravel', - - /* - |-------------------------------------------------------------------------- - | Cache Database - |-------------------------------------------------------------------------- - | - | When using the database cache driver, this database table will be used - | to store the cached item. You may also add a "connection" option to - | the array to specify which database connection should be used. - | - */ - - 'database' => array('table' => 'laravel_cache'), - - /* - |-------------------------------------------------------------------------- - | Memcached Servers - |-------------------------------------------------------------------------- - | - | The Memcached servers used by your application. Memcached is a free and - | open source, high-performance, distributed memory caching system. It is - | generic in nature but intended for use in speeding up web applications - | by alleviating database load. - | - | For more information, check out: http://memcached.org - | - */ - - 'memcached' => array( - - array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100), - - ), - -); \ No newline at end of file diff --git a/application/config/database.php b/application/config/database.php deleted file mode 100644 index a2d58036..00000000 --- a/application/config/database.php +++ /dev/null @@ -1,125 +0,0 @@ - false, - - /* - |-------------------------------------------------------------------------- - | PDO Fetch Style - |-------------------------------------------------------------------------- - | - | By default, database results will be returned as instances of the PHP - | stdClass object; however, you may wish to retrieve records as arrays - | instead of objects. Here you can control the PDO fetch style of the - | database queries run by your application. - | - */ - - 'fetch' => PDO::FETCH_CLASS, - - /* - |-------------------------------------------------------------------------- - | Default Database Connection - |-------------------------------------------------------------------------- - | - | The name of your default database connection. This connection will be used - | as the default for all database operations unless a different name is - | given when performing said operation. This connection name should be - | listed in the array of connections below. - | - */ - - 'default' => 'mysql', - - /* - |-------------------------------------------------------------------------- - | Database Connections - |-------------------------------------------------------------------------- - | - | All of the database connections used by your application. Many of your - | applications will no doubt only use one connection; however, you have - | the freedom to specify as many connections as you can handle. - | - | All database work in Laravel is done through the PHP's PDO facilities, - | so make sure you have the PDO drivers for your particular database of - | choice installed on your machine. - | - */ - - 'connections' => array( - - 'sqlite' => array( - 'driver' => 'sqlite', - 'database' => 'application', - 'prefix' => '', - ), - - 'mysql' => array( - 'driver' => 'mysql', - 'host' => '127.0.0.1', - 'database' => 'database', - 'username' => 'root', - 'password' => '', - 'charset' => 'utf8', - 'prefix' => '', - ), - - 'pgsql' => array( - 'driver' => 'pgsql', - 'host' => '127.0.0.1', - 'database' => 'database', - 'username' => 'root', - 'password' => '', - 'charset' => 'utf8', - 'prefix' => '', - 'schema' => 'public', - ), - - 'sqlsrv' => array( - 'driver' => 'sqlsrv', - 'host' => '127.0.0.1', - 'database' => 'database', - 'username' => 'root', - 'password' => '', - 'prefix' => '', - ), - - ), - - /* - |-------------------------------------------------------------------------- - | Redis Databases - |-------------------------------------------------------------------------- - | - | Redis is an open source, fast, and advanced key-value store. However, it - | provides a richer set of commands than a typical key-value store such as - | APC or memcached. All the cool kids are using it. - | - | To get the scoop on Redis, check out: http://redis.io - | - */ - - 'redis' => array( - - 'default' => array( - 'host' => '127.0.0.1', - 'port' => 6379, - 'database' => 0 - ), - - ), - -); \ No newline at end of file diff --git a/application/config/error.php b/application/config/error.php deleted file mode 100644 index c4d27fe4..00000000 --- a/application/config/error.php +++ /dev/null @@ -1,69 +0,0 @@ - array(), - - /* - |-------------------------------------------------------------------------- - | Error Detail - |-------------------------------------------------------------------------- - | - | Detailed error messages contain information about the file in which an - | error occurs, as well as a PHP stack trace containing the call stack. - | You'll want them when you're trying to debug your application. - | - | If your application is in production, you'll want to turn off the error - | details for enhanced security and user experience since the exception - | stack trace could contain sensitive information. - | - */ - - 'detail' => true, - - /* - |-------------------------------------------------------------------------- - | Error Logging - |-------------------------------------------------------------------------- - | - | When error logging is enabled, the "logger" Closure defined below will - | be called for every error in your application. You are free to log the - | errors however you want. Enjoy the flexibility. - | - */ - - 'log' => false, - - /* - |-------------------------------------------------------------------------- - | Error Logger - |-------------------------------------------------------------------------- - | - | Because of the various ways of managing error logging, you get complete - | flexibility to manage error logging as you see fit. This function will - | be called anytime an error occurs within your application and error - | logging is enabled. - | - | You may log the error message however you like; however, a simple log - | solution has been set up for you which will log all error messages to - | text files within the application storage directory. - | - */ - - 'logger' => function($exception) - { - Log::exception($exception); - }, - -); \ No newline at end of file diff --git a/application/config/mimes.php b/application/config/mimes.php deleted file mode 100644 index e2bd4fbb..00000000 --- a/application/config/mimes.php +++ /dev/null @@ -1,97 +0,0 @@ - 'application/mac-binhex40', - 'cpt' => 'application/mac-compactpro', - 'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream'), - 'bin' => 'application/macbinary', - 'dms' => 'application/octet-stream', - 'lha' => 'application/octet-stream', - 'lzh' => 'application/octet-stream', - 'exe' => array('application/octet-stream', 'application/x-msdownload'), - 'class' => 'application/octet-stream', - 'psd' => 'application/x-photoshop', - 'so' => 'application/octet-stream', - 'sea' => 'application/octet-stream', - 'dll' => 'application/octet-stream', - 'oda' => 'application/oda', - 'pdf' => array('application/pdf', 'application/x-download'), - 'ai' => 'application/postscript', - 'eps' => 'application/postscript', - 'ps' => 'application/postscript', - 'smi' => 'application/smil', - 'smil' => 'application/smil', - 'mif' => 'application/vnd.mif', - 'xls' => array('application/excel', 'application/vnd.ms-excel', 'application/msexcel'), - 'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint'), - 'wbxml' => 'application/wbxml', - 'wmlc' => 'application/wmlc', - 'dcr' => 'application/x-director', - 'dir' => 'application/x-director', - 'dxr' => 'application/x-director', - 'dvi' => 'application/x-dvi', - 'gtar' => 'application/x-gtar', - 'gz' => 'application/x-gzip', - 'php' => array('application/x-httpd-php', 'text/x-php'), - 'php4' => 'application/x-httpd-php', - 'php3' => 'application/x-httpd-php', - 'phtml' => 'application/x-httpd-php', - 'phps' => 'application/x-httpd-php-source', - 'js' => 'application/x-javascript', - 'swf' => 'application/x-shockwave-flash', - 'sit' => 'application/x-stuffit', - 'tar' => 'application/x-tar', - 'tgz' => array('application/x-tar', 'application/x-gzip-compressed'), - 'xhtml' => 'application/xhtml+xml', - 'xht' => 'application/xhtml+xml', - 'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed'), - 'mid' => 'audio/midi', - 'midi' => 'audio/midi', - 'mpga' => 'audio/mpeg', - 'mp2' => 'audio/mpeg', - 'mp3' => array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'), - 'aif' => 'audio/x-aiff', - 'aiff' => 'audio/x-aiff', - 'aifc' => 'audio/x-aiff', - 'ram' => 'audio/x-pn-realaudio', - 'rm' => 'audio/x-pn-realaudio', - 'rpm' => 'audio/x-pn-realaudio-plugin', - 'ra' => 'audio/x-realaudio', - 'rv' => 'video/vnd.rn-realvideo', - 'wav' => 'audio/x-wav', - 'bmp' => 'image/bmp', - 'gif' => 'image/gif', - 'jpeg' => array('image/jpeg', 'image/pjpeg'), - 'jpg' => array('image/jpeg', 'image/pjpeg'), - 'jpe' => array('image/jpeg', 'image/pjpeg'), - 'png' => 'image/png', - 'tiff' => 'image/tiff', - 'tif' => 'image/tiff', - 'css' => 'text/css', - 'html' => 'text/html', - 'htm' => 'text/html', - 'shtml' => 'text/html', - 'txt' => 'text/plain', - 'text' => 'text/plain', - 'log' => array('text/plain', 'text/x-log'), - 'rtx' => 'text/richtext', - 'rtf' => 'text/rtf', - 'xml' => 'text/xml', - 'xsl' => 'text/xml', - 'mpeg' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mpe' => 'video/mpeg', - 'qt' => 'video/quicktime', - 'mov' => 'video/quicktime', - 'avi' => 'video/x-msvideo', - 'movie' => 'video/x-sgi-movie', - 'doc' => 'application/msword', - 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'word' => array('application/msword', 'application/octet-stream'), - 'xl' => 'application/excel', - 'eml' => 'message/rfc822', - 'json' => array('application/json', 'text/json'), - -); \ No newline at end of file diff --git a/application/config/session.php b/application/config/session.php deleted file mode 100644 index dbfe8b27..00000000 --- a/application/config/session.php +++ /dev/null @@ -1,117 +0,0 @@ - 'cookie', - - /* - |-------------------------------------------------------------------------- - | Session Database - |-------------------------------------------------------------------------- - | - | The database table in which the session should be stored. It probably - | goes without saying that this option only matters if you are using - | the super slick database session driver. - | - */ - - 'table' => 'sessions', - - /* - |-------------------------------------------------------------------------- - | Session Garbage Collection Probability - |-------------------------------------------------------------------------- - | - | Some session drivers require the manual clean-up of expired sessions. - | This option specifies the probability of session garbage collection - | occuring for any given request to the application. - | - | For example, the default value states that garbage collection has a - | 2% chance of occuring for any given request to the application. - | Feel free to tune this to your requirements. - | - */ - - 'sweepage' => array(2, 100), - - /* - |-------------------------------------------------------------------------- - | Session Lifetime - |-------------------------------------------------------------------------- - | - | The number of minutes a session can be idle before expiring. - | - */ - - 'lifetime' => 60, - - /* - |-------------------------------------------------------------------------- - | Session Expiration On Close - |-------------------------------------------------------------------------- - | - | Determines if the session should expire when the user's web browser closes. - | - */ - - 'expire_on_close' => false, - - /* - |-------------------------------------------------------------------------- - | Session Cookie Name - |-------------------------------------------------------------------------- - | - | The name that should be given to the session cookie. - | - */ - - 'cookie' => 'laravel_session', - - /* - |-------------------------------------------------------------------------- - | Session Cookie Path - |-------------------------------------------------------------------------- - | - | The path for which the session cookie is available. - | - */ - - 'path' => '/', - - /* - |-------------------------------------------------------------------------- - | Session Cookie Domain - |-------------------------------------------------------------------------- - | - | The domain for which the session cookie is available. - | - */ - - 'domain' => null, - - /* - |-------------------------------------------------------------------------- - | HTTPS Only Session Cookie - |-------------------------------------------------------------------------- - | - | Determines if the cookie should only be sent over HTTPS. - | - */ - - 'secure' => false, - -); \ No newline at end of file diff --git a/application/config/strings.php b/application/config/strings.php deleted file mode 100644 index bbbe230c..00000000 --- a/application/config/strings.php +++ /dev/null @@ -1,190 +0,0 @@ - array( - '/(quiz)$/i' => "$1zes", - '/^(ox)$/i' => "$1en", - '/([m|l])ouse$/i' => "$1ice", - '/(matr|vert|ind)ix|ex$/i' => "$1ices", - '/(x|ch|ss|sh)$/i' => "$1es", - '/([^aeiouy]|qu)y$/i' => "$1ies", - '/(hive)$/i' => "$1s", - '/(?:([^f])fe|([lr])f)$/i' => "$1$2ves", - '/(shea|lea|loa|thie)f$/i' => "$1ves", - '/sis$/i' => "ses", - '/([ti])um$/i' => "$1a", - '/(tomat|potat|ech|her|vet)o$/i' => "$1oes", - '/(bu)s$/i' => "$1ses", - '/(alias)$/i' => "$1es", - '/(octop)us$/i' => "$1i", - '/(ax|test)is$/i' => "$1es", - '/(us)$/i' => "$1es", - '/s$/i' => "s", - '/$/' => "s" - ), - - 'singular' => array( - '/(quiz)zes$/i' => "$1", - '/(matr)ices$/i' => "$1ix", - '/(vert|ind)ices$/i' => "$1ex", - '/^(ox)en$/i' => "$1", - '/(alias)es$/i' => "$1", - '/(octop|vir)i$/i' => "$1us", - '/(cris|ax|test)es$/i' => "$1is", - '/(shoe)s$/i' => "$1", - '/(o)es$/i' => "$1", - '/(bus)es$/i' => "$1", - '/([m|l])ice$/i' => "$1ouse", - '/(x|ch|ss|sh)es$/i' => "$1", - '/(m)ovies$/i' => "$1ovie", - '/(s)eries$/i' => "$1eries", - '/([^aeiouy]|qu)ies$/i' => "$1y", - '/([lr])ves$/i' => "$1f", - '/(tive)s$/i' => "$1", - '/(hive)s$/i' => "$1", - '/(li|wi|kni)ves$/i' => "$1fe", - '/(shea|loa|lea|thie)ves$/i' => "$1f", - '/(^analy)ses$/i' => "$1sis", - '/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i' => "$1$2sis", - '/([ti])a$/i' => "$1um", - '/(n)ews$/i' => "$1ews", - '/(h|bl)ouses$/i' => "$1ouse", - '/(corpse)s$/i' => "$1", - '/(us)es$/i' => "$1", - '/(us|ss)$/i' => "$1", - '/s$/i' => "", - ), - - 'irregular' => array( - 'child' => 'children', - 'foot' => 'feet', - 'goose' => 'geese', - 'man' => 'men', - 'move' => 'moves', - 'person' => 'people', - 'sex' => 'sexes', - 'tooth' => 'teeth', - ), - - 'uncountable' => array( - 'audio', - 'equipment', - 'deer', - 'fish', - 'gold', - 'information', - 'money', - 'rice', - 'police', - 'series', - 'sheep', - 'species', - 'moose', - 'chassis', - 'traffic', - ), - - /* - |-------------------------------------------------------------------------- - | ASCII Characters - |-------------------------------------------------------------------------- - | - | This array contains foreign characters and their 7-bit ASCII equivalents. - | The array is used by the "ascii" method on the Str class to get strings - | ready for inclusion in a URL slug. - | - | Of course, the "ascii" method may also be used by you for whatever your - | application requires. Feel free to add any characters we missed, and be - | sure to let us know about them! - | - */ - - 'ascii' => array( - - '/æ|ǽ/' => 'ae', - '/œ/' => 'oe', - '/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|А/' => 'A', - '/à|á|â|ã|ä|å|ǻ|ā|ă|ą|ǎ|ª|а/' => 'a', - '/Б/' => 'B', - '/б/' => 'b', - '/Ç|Ć|Ĉ|Ċ|Č|Ц/' => 'C', - '/ç|ć|ĉ|ċ|č|ц/' => 'c', - '/Ð|Ď|Đ|Д/' => 'Dj', - '/ð|ď|đ|д/' => 'dj', - '/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Е|Ё|Э/' => 'E', - '/è|é|ê|ë|ē|ĕ|ė|ę|ě|е|ё|э/' => 'e', - '/Ф/' => 'F', - '/ƒ|ф/' => 'f', - '/Ĝ|Ğ|Ġ|Ģ|Г/' => 'G', - '/ĝ|ğ|ġ|ģ|г/' => 'g', - '/Ĥ|Ħ|Х/' => 'H', - '/ĥ|ħ|х/' => 'h', - '/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|И/' => 'I', - '/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|и/' => 'i', - '/Ĵ|Й/' => 'J', - '/ĵ|й/' => 'j', - '/Ķ|К/' => 'K', - '/ķ|к/' => 'k', - '/Ĺ|Ļ|Ľ|Ŀ|Ł|Л/' => 'L', - '/ĺ|ļ|ľ|ŀ|ł|л/' => 'l', - '/М/' => 'M', - '/м/' => 'm', - '/Ñ|Ń|Ņ|Ň|Н/' => 'N', - '/ñ|ń|ņ|ň|ʼn|н/' => 'n', - '/Ö|Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|О/' => 'O', - '/ö|ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|о/' => 'o', - '/П/' => 'P', - '/п/' => 'p', - '/Ŕ|Ŗ|Ř|Р/' => 'R', - '/ŕ|ŗ|ř|р/' => 'r', - '/Ś|Ŝ|Ş|Ș|Š|С/' => 'S', - '/ś|ŝ|ş|ș|š|ſ|с/' => 's', - '/Ţ|Ț|Ť|Ŧ|Т/' => 'T', - '/ţ|ț|ť|ŧ|т/' => 't', - '/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ü|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|У/' => 'U', - '/ù|ú|û|ũ|ū|ŭ|ů|ü|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|у/' => 'u', - '/В/' => 'V', - '/в/' => 'v', - '/Ý|Ÿ|Ŷ|Ы/' => 'Y', - '/ý|ÿ|ŷ|ы/' => 'y', - '/Ŵ/' => 'W', - '/ŵ/' => 'w', - '/Ź|Ż|Ž|З/' => 'Z', - '/ź|ż|ž|з/' => 'z', - '/Æ|Ǽ/' => 'AE', - '/ß/'=> 'ss', - '/IJ/' => 'IJ', - '/ij/' => 'ij', - '/Œ/' => 'OE', - '/Ч/' => 'Ch', - '/ч/' => 'ch', - '/Ю/' => 'Ju', - '/ю/' => 'ju', - '/Я/' => 'Ja', - '/я/' => 'ja', - '/Ш/' => 'Sh', - '/ш/' => 'sh', - '/Щ/' => 'Shch', - '/щ/' => 'shch', - '/Ж/' => 'Zh', - '/ж/' => 'zh', - - ), - -); diff --git a/application/controllers/base.php b/application/controllers/base.php deleted file mode 100644 index 177d887a..00000000 --- a/application/controllers/base.php +++ /dev/null @@ -1,17 +0,0 @@ - '→ السابق', - 'next' => 'التالي ←', - -); \ No newline at end of file diff --git a/application/language/ar/validation.php b/application/language/ar/validation.php deleted file mode 100644 index fb88f6d8..00000000 --- a/application/language/ar/validation.php +++ /dev/null @@ -1,104 +0,0 @@ - "القيمة :attribute يجب أن تكون مقبولة.", - "active_url" => "القيمة :attribute تمثل عنوان موقع إنترنت غير صحيح.", - "after" => "القيمة :attribute يجب أن تكون بعد تاريخ :date.", - "alpha" => "القيمة :attribute يمكنها أن تحتوي على أحرف فقط.", - "alpha_dash" => "القيمة :attribute يمكنها أن تحتوي على أحرف و أرقام و إشارة الناقص فقط.", - "alpha_num" => "القيمة :attribute يمكنها أن تحتوي على أحرف و أرقام فقط.", - "array" => "The :attribute must have selected elements.", - "before" => "القيمة :attribute يجب أن تكون قبل تاريخ :date.", - "between" => array( - "numeric" => "القيمة :attribute يجب أن تكون بين :min و :max.", - "file" => "الملف :attribute يجب أن يكون بحجم من :min إلى :max كيلوبايت.", - "string" => "النص :attribute يجب أن يكون بطول من :min إلى :max حرف.", - ), - "confirmed" => "القيمة :attribute التأكيدية غير مطابقة.", - "count" => "The :attribute must have exactly :count selected elements.", - "countbetween" => "The :attribute must have between :min and :max selected elements.", - "countmax" => "The :attribute must have less than :max selected elements.", - "countmin" => "The :attribute must have at least :min selected elements.", - "different" => "القيمتان :attribute و :other يجب أن تختلفان.", - "email" => "القيمة :attribute تمثل بريد إلكتروني غير صحيح.", - "exists" => "القيمة المختارة :attribute غير موجودة.", - "image" => "القيمة :attribute يجب أن تكون صورة.", - "in" => "القيمة المختارة :attribute غير موجودة.", - "integer" => "القيمة :attribute يجب أن تكون رقماً.", - "ip" => "القيمة :attribute يجب أن تمثل عنوان بروتوكول إنترنت صحيح.", - "match" => "القيمة :attribute هي بتنسيق غير صحيح.", - "max" => array( - "numeric" => "القيمة :attribute يجب أن تكون أقل من :max.", - "file" => "الملف :attribute يجب أن يكون بحجم أقل من :max كيلوبايت.", - "string" => "النص :attribute يجب أن يكون بطول أقل من :max حرف.", - ), - "mimes" => "القيمة :attribute يجب أن تكون ملف من نوع: :values.", - "min" => array( - "numeric" => "القيمة :attribute يجب أن تساوي :min على الأقل.", - "file" => "الملف :attribute يجب أن يكون بحجم :min كيلوبايت على الأقل.", - "string" => "النص :attribute يجب أن يكون بطول :min حرف على الأقل.", - ), - "not_in" => "القيمة :attribute المختارة غير صحيحة.", - "numeric" => "القيمة :attribute يجب أن تكون رقماً.", - "required" => "القيمة :attribute مطلوبة.", - "same" => "القيمتان :attribute و :other يجب أن تتطابقان.", - "size" => array( - "numeric" => "القيمة :attribute يجب أن تكون بحجم :size.", - "file" => "الملف :attribute يجب أن يكون بحجم :size كيلوبايت.", - "string" => "النص :attribute يجب أن يكون بطول :size حرف.", - ), - "unique" => "القيمة :attribute تم استخدامها من قبل.", - "url" => "التنسيق :attribute غير صحيح.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/language/bg/pagination.php b/application/language/bg/pagination.php deleted file mode 100644 index 2f4b150c..00000000 --- a/application/language/bg/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Назад', - 'next' => 'Напред »', - -); \ No newline at end of file diff --git a/application/language/bg/validation.php b/application/language/bg/validation.php deleted file mode 100644 index c95b1ed3..00000000 --- a/application/language/bg/validation.php +++ /dev/null @@ -1,104 +0,0 @@ - "Трябва да приемете :attribute.", - "active_url" => "Полето :attribute не е валиден URL адрес.", - "after" => "Полето :attribute трябва да бъде дата след :date.", - "alpha" => "Полето :attribute трябва да съдържа само букви.", - "alpha_dash" => "Полето :attribute трябва да съдържа само букви, цифри, долна черта и тире.", - "alpha_num" => "Полето :attribute трябва да съдържа само букви и цифри.", - "array" => "Полето :attribute трябва да има избрани елементи.", - "before" => "Полето :attribute трябва да бъде дата преди :date.", - "between" => array( - "numeric" => "Полето :attribute трябва да бъде между :min и :max.", - "file" => "Полето :attribute трябва да бъде между :min и :max килобайта.", - "string" => "Полето :attribute трябва да бъде между :min и :max знака.", - ), - "confirmed" => "Полето :attribute не е потвърдено.", - "count" => "Полето :attribute трябва да има точно :count избрани елементи.", - "countbetween" => "Полето :attribute трябва да има от :min до :max избрани елементи.", - "countmax" => "Полето :attribute трябва да има по-малко от :max избрани елементи.", - "countmin" => "Полето :attribute трябва да има минимум :min избрани елементи.", - "different" => "Полетата :attribute и :other трябва да са различни.", - "email" => "Полето :attribute е с невалиден формат.", - "exists" => "Избраната стойност на :attribute вече съществува.", - "image" => "Полето :attribute трябва да бъде изображение.", - "in" => "Стойността на :attribute е невалидна.", - "integer" => "Полето :attribute трябва да бъде цяло число.", - "ip" => "Полето :attribute трябва да бъде IP адрес.", - "match" => "Полето :attribute е с невалиден формат.", - "max" => array( - "numeric" => "Полето :attribute трябва да бъде по-малко от :max.", - "file" => "Полето :attribute трябва да бъде по-малко от :max килобайта.", - "string" => "Полето :attribute трябва да бъде по-малко от :max знака.", - ), - "mimes" => "Полето :attribute трябва да бъде файл от тип: :values.", - "min" => array( - "numeric" => "Полето :attribute трябва да бъде минимум :min.", - "file" => "Полето :attribute трябва да бъде минимум :min килобайта.", - "string" => "Полето :attribute трябва да бъде минимум :min знака.", - ), - "not_in" => "Стойността на :attribute е невалидна.", - "numeric" => "Полето :attribute трябва да бъде число.", - "required" => "Полето :attribute е задължително.", - "same" => "Стойностите на :attribute и :other трябва да съвпадат.", - "size" => array( - "numeric" => "Полето :attribute трябва да бъде :size.", - "file" => "Полето :attribute трябва да бъде :size килобайта.", - "string" => "Полето :attribute трябва да бъде :size знака.", - ), - "unique" => "Стойността на :attribute вече съществува.", - "url" => "Полето :attribute е с невалиден формат.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/language/da/pagination.php b/application/language/da/pagination.php deleted file mode 100644 index 089ec7e0..00000000 --- a/application/language/da/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Forrige', - 'next' => 'Næste »', - -); \ No newline at end of file diff --git a/application/language/da/validation.php b/application/language/da/validation.php deleted file mode 100644 index b49b75ec..00000000 --- a/application/language/da/validation.php +++ /dev/null @@ -1,104 +0,0 @@ - ":attribute skal accepteres.", - "active_url" => ":attribute er ikke en gyldig URL.", - "after" => ":attribute skal være en dato efter :date.", - "alpha" => ":attribute må kun indeholde bogstaver.", - "alpha_dash" => ":attribute må kun indeholde bogstaver, numre, og skråstreg.", - "alpha_num" => ":attribute må kun indeholde bogstaver og numre.", - "array" => ":attribute skal have valgte elementer.", - "before" => ":attribute skal have en dato før :date.", - "between" => array( - "numeric" => ":attribute skal være mellem :min - :max.", - "file" => ":attribute skal være mellem :min - :max kilobytes.", - "string" => ":attribute skal være mellem :min - :max karakterer.", - ), - "confirmed" => ":attribute bekræftelse stemmer ikke overens.", - "count" => ":attribute skal være præcis :count valgte elementer.", - "countbetween" => ":attribute skal være mellem :min and :max valgte elementer.", - "countmax" => ":attribute skal have mindre end :max valgte elementer.", - "countmin" => ":attribute skal have minimum :min valgte elementer.", - "different" => ":attribute og :other skal være forskellige.", - "email" => "Formatet for :attribute er ugyldigt.", - "exists" => "Den valgte :attribute er ugyldig.", - "image" => ":attribute skal være et billede.", - "in" => "Den valgte :attribute er ugyldig.", - "integer" => ":attribute må kun indeholde tal.", - "ip" => ":attribute skal være en gyldig IP adresse.", - "match" => "Formatet for :attribute er ugyldigt.", - "max" => array( - "numeric" => ":attribute skal være mindre end :max.", - "file" => ":attribute skal være mindre end :max kilobytes.", - "string" => ":attribute skal være mindre end :max karakterer.", - ), - "mimes" => ":attribute skal have filtypen type: :values.", - "min" => array( - "numeric" => ":attribute ska minimum være :min.", - "file" => ":attribute skal være mindst :min kilobytes.", - "string" => ":attribute skal være mindst :min karakterer.", - ), - "not_in" => "Den valgte :attribute er ugyldig.", - "numeric" => ":attribute skal være et nummer.", - "required" => ":attribute er krævet.", - "same" => ":attribute og :other stemmer ikke overens.", - "size" => array( - "numeric" => ":attribute skal være :size.", - "file" => ":attribute skal være :size kilobyte.", - "string" => ":attribute skal være :size karakterer.", - ), - "unique" => ":attribute er allerede optaget.", - "url" => ":attribute formatet er ugyldigt.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/language/de/pagination.php b/application/language/de/pagination.php deleted file mode 100644 index 9fd96322..00000000 --- a/application/language/de/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Zurück', - 'next' => 'Weiter »', - -); \ No newline at end of file diff --git a/application/language/de/validation.php b/application/language/de/validation.php deleted file mode 100644 index cb41d00c..00000000 --- a/application/language/de/validation.php +++ /dev/null @@ -1,104 +0,0 @@ - ":attribute muss akzeptiert werden.", - "active_url" => ":attribute ist keine gültige URL.", - "after" => ":attribute muss ein Datum nach dem :date sein.", - "alpha" => ":attribute darf nur Buchstaben beinhalten.", - "alpha_dash" => ":attribute darf nur aus Buchstaben, Nummern und Bindestrichen bestehen.", - "alpha_num" => ":attribute darf nur aus Buchstaben und Nummern bestehen.", - "array" => ":attribute muss ausgewählte Elemente haben.", - "before" => ":attribute muss ein Datum vor dem :date sein.", - "between" => array( - "numeric" => ":attribute muss zwischen :min und :max liegen.", - "file" => ":attribute muss zwischen :min und :max Kilobytes groß sein.", - "string" => ":attribute muss zwischen :min und :max Zeichen lang sein.", - ), - "confirmed" => ":attribute stimmt nicht mit der Bestätigung überein.", - "count" => ":attribute muss genau :count ausgewählte Elemente haben.", - "countbetween" => ":attribute muss zwischen :min und :max ausgewählte Elemente haben.", - "countmax" => ":attribute muss weniger als :max ausgewählte Elemente haben.", - "countmin" => ":attribute muss mindestens :min ausgewählte Elemente haben.", - "different" => ":attribute und :other müssen verschieden sein.", - "email" => ":attribute ist keine gültige Email-Adresse.", - "exists" => "Der gewählte Wert für :attribute ist ungültig.", - "image" => ":attribute muss ein Bild sein.", - "in" => "Der gewählte Wert für :attribute ist ungültig.", - "integer" => ":attribute muss eine ganze Zahl sein.", - "ip" => ":attribute muss eine gültige IP-Adresse sein.", - "match" => ":attribute hat ein ungültiges Format.", - "max" => array( - "numeric" => ":attribute muss kleiner als :max sein.", - "file" => ":attribute muss kleiner als :max Kilobytes groß sein.", - "string" => ":attribute muss kürzer als :max Zeichen sein.", - ), - "mimes" => ":attribute muss den Dateityp :values haben.", - "min" => array( - "numeric" => ":attribute muss größer als :min sein.", - "file" => ":attribute muss größer als :min Kilobytes groß sein.", - "string" => ":attribute muss länger als :min Zeichen sein.", - ), - "not_in" => "Der gewählte Wert für :attribute ist ungültig.", - "numeric" => ":attribute muss eine Zahl sein.", - "required" => ":attribute muss ausgefüllt sein.", - "same" => ":attribute und :other müssen übereinstimmen.", - "size" => array( - "numeric" => ":attribute muss gleich :size sein.", - "file" => ":attribute muss :size Kilobyte groß sein.", - "string" => ":attribute muss :size Zeichen lang sein.", - ), - "unique" => ":attribute ist schon vergeben.", - "url" => "Das Format von :attribute ist ungültig.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/language/el/pagination.php b/application/language/el/pagination.php deleted file mode 100644 index 1b0a53ae..00000000 --- a/application/language/el/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Προηγούμενο', - 'next' => 'Επόμενο »', - -); \ No newline at end of file diff --git a/application/language/el/validation.php b/application/language/el/validation.php deleted file mode 100644 index f461ac0e..00000000 --- a/application/language/el/validation.php +++ /dev/null @@ -1,104 +0,0 @@ - "Το πεδίο :attribute πρέπει να εγκριθεί.", - "active_url" => "Το πεδίο :attribute δεν ειναι σωστό URL.", - "after" => "Το πεδίο :attribute πρέπει η ημερομηνία να ειναι μετά :date.", - "alpha" => "Το πεδίο :attribute μπορεί να περιλαμβάνει μόνο γράμματα.", - "alpha_dash" => "Το πεδίο :attribute μπορεί να περιλαμβάνει μόνο γράμματα, αριθμούς και παύλες.", - "alpha_num" => "Το πεδίο :attribute μπορεί να περιλαμβάνει μόνο γράμματα και αριθμούς.", - "array" => "Το πεδίο :attribute πρέπει να περιλαμβάνει επιλεγμένα αντικείμενα.", - "before" => "Το πεδίο :attribute πρέπει η ημερομηνία να ειναι πριν από :date.", - "between" => array( - "numeric" => "Το πεδίο :attribute πρέπει να έχει τιμές μεταξύ :min - :max.", - "file" => "Το πεδίο :attribute πρέπει να ειναι ανάμεσα σε :min - :max kb.", - "string" => "Το πεδίο :attribute πρέπει να περιλαμβάνει :min - :max χαρακτήρες.", - ), - "confirmed" => "Το πεδίο :attribute δεν πέρασε τον έλεγχο.", - "count" => "Το πεδίο :attribute πρέπει να έχει ακριβώς :count επιλεγμένα αντικείμενα.", - "countbetween" => "Το πεδίο :attribute πρέπει να είναι ανάμεσα σε :min και :max επιλεγμένα αντικείμενα.", - "countmax" => "Το πεδίο :attribute πρέπει να έχει λιγότερα από :max επιλεγμένα αντικείμενα.", - "countmin" => "Το πεδίο :attribute πρέπει να έχει τουλάχιστον :min επιλεγμένα αντικείμενα.", - "different" => "Τα πεδία :attribute και :other πρέπει να ειναι διαφορετικά.", - "email" => "Στο πεδίο :attribute η μορφοποίηση ειναι άκυρη.", - "exists" => "Το επιλεγμένο πεδίο :attribute είναι άκυρο.", - "image" => "Το πεδίο :attribute πρέπει να είναι εικόνα.", - "in" => "Το επιλεγμένο πεδίο :attribute είναι άκυρο.", - "integer" => "Το πεδίο :attribute πρέπει να ειναι αριθμός.", - "ip" => "Το πεδίο :attribute πρέπει να ειναι μια έγκυρη διεύθυνση IP.", - "match" => "Το φορμάτ του πεδίου :attribute είναι άκυρο.", - "max" => array( - "numeric" => "Το πεδίο :attribute πρέπει να είναι μικρότερο από :max.", - "file" => "Το πεδίο :attribute πρέπει να είναι μικρότερο από :max kb.", - "string" => "Το πεδίο :attribute πρέπει να έχει λιγότερους από :max χαρακτήρες.", - ), - "mimes" => "Το πεδίο :attribute πρέπει να ειναι αρχείο με τύπο: :values.", - "min" => array( - "numeric" => "Το πεδίο :attribute πρέπει να είναι τουλάχιστον :min.", - "file" => "Το πεδίο :attribute πρέπει να είναι μικρότερο από :max kb.", - "string" => "Το πεδίο :attribute πρέπει να έχει λιγότερους από :max χαρακτήρες.", - ), - "not_in" => "Το επιλεγμένο πεδίο :attribute είναι άκυρο.", - "numeric" => "Το πεδίο :attribute πρέπει να είναι αριθμός.", - "required" => "Το πεδίο :attribute είναι απαραίτητο.", - "same" => "Τα πεδία :attribute και :other πρέπει να είναι ίδια.", - "size" => array( - "numeric" => "Το πεδίο :attribute πρέπει να ειναι :size.", - "file" => "Το πεδίο :attribute πρέπει να έχει μέγεθος :size kb.", - "string" => "Το πεδίο :attribute πρέπει να είναι :size χαρακτήρες.", - ), - "unique" => "Το πεδίο :attribute έχει ήδη ανατεθεί.", - "url" => "Το πεδίο :attribute είναι άκυρο.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/language/en/pagination.php b/application/language/en/pagination.php deleted file mode 100644 index f58ada06..00000000 --- a/application/language/en/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Previous', - 'next' => 'Next »', - -); \ No newline at end of file diff --git a/application/language/en/validation.php b/application/language/en/validation.php deleted file mode 100644 index c07e4a0d..00000000 --- a/application/language/en/validation.php +++ /dev/null @@ -1,106 +0,0 @@ - "The :attribute must be accepted.", - "active_url" => "The :attribute is not a valid URL.", - "after" => "The :attribute must be a date after :date.", - "alpha" => "The :attribute may only contain letters.", - "alpha_dash" => "The :attribute may only contain letters, numbers, and dashes.", - "alpha_num" => "The :attribute may only contain letters and numbers.", - "array" => "The :attribute must have selected elements.", - "before" => "The :attribute must be a date before :date.", - "between" => array( - "numeric" => "The :attribute must be between :min - :max.", - "file" => "The :attribute must be between :min - :max kilobytes.", - "string" => "The :attribute must be between :min - :max characters.", - ), - "confirmed" => "The :attribute confirmation does not match.", - "count" => "The :attribute must have exactly :count selected elements.", - "countbetween" => "The :attribute must have between :min and :max selected elements.", - "countmax" => "The :attribute must have less than :max selected elements.", - "countmin" => "The :attribute must have at least :min selected elements.", - "date_format" => "The :attribute must have a valid date format.", - "different" => "The :attribute and :other must be different.", - "email" => "The :attribute format is invalid.", - "exists" => "The selected :attribute is invalid.", - "image" => "The :attribute must be an image.", - "in" => "The selected :attribute is invalid.", - "integer" => "The :attribute must be an integer.", - "ip" => "The :attribute must be a valid IP address.", - "match" => "The :attribute format is invalid.", - "max" => array( - "numeric" => "The :attribute must be less than :max.", - "file" => "The :attribute must be less than :max kilobytes.", - "string" => "The :attribute must be less than :max characters.", - ), - "mimes" => "The :attribute must be a file of type: :values.", - "min" => array( - "numeric" => "The :attribute must be at least :min.", - "file" => "The :attribute must be at least :min kilobytes.", - "string" => "The :attribute must be at least :min characters.", - ), - "not_in" => "The selected :attribute is invalid.", - "numeric" => "The :attribute must be a number.", - "required" => "The :attribute field is required.", - "required_with" => "The :attribute field is required with :field", - "same" => "The :attribute and :other must match.", - "size" => array( - "numeric" => "The :attribute must be :size.", - "file" => "The :attribute must be :size kilobyte.", - "string" => "The :attribute must be :size characters.", - ), - "unique" => "The :attribute has already been taken.", - "url" => "The :attribute format is invalid.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); diff --git a/application/language/fi/pagination.php b/application/language/fi/pagination.php deleted file mode 100644 index 8ce29f2f..00000000 --- a/application/language/fi/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Edellinen', - 'next' => 'Seuraava »', - -); \ No newline at end of file diff --git a/application/language/fi/validation.php b/application/language/fi/validation.php deleted file mode 100644 index fa1a4d21..00000000 --- a/application/language/fi/validation.php +++ /dev/null @@ -1,104 +0,0 @@ - ":attribute pitää hyväksyä.", - "active_url" => ":attribute pitää olla validi URL-osoite.", - "after" => ":attribute pitää olla päiväys :date päiväyksen jälkeen.", - "alpha" => ":attribute voi vain sisältää kirjaimia.", - "alpha_dash" => ":attribute voi vain sisältää kirjaimia, numeroita ja viivoja.", - "alpha_num" => ":attribute voi vain sisältää kirjaimia ja numeroita.", - "array" => ":attribute pitää sisältää elementin.", - "before" => ":attribute pitää olla päiväys ennen :date.", - "between" => array( - "numeric" => ":attribute numeron pitää olla välillä :min - :max.", - "file" => ":attribute tiedoston pitää olla välillä :min - :max kilobittiä.", - "string" => ":attribute elementin pitää olla välillä :min - :max kirjainta.", - ), - "confirmed" => ":attribute vahvistus ei täsmää.", - "count" => ":attribute pitää olla tarkalleen :count määrä elementtejä.", - "countbetween" => ":attribute pitää olla välillä :min ja :max määrä elementtejä.", - "countmax" => ":attribute pitää olla vähemmän kun :max määrä elementtejä.", - "countmin" => ":attribute pitää olla vähintään :min määrä elementtejä.", - "different" => ":attribute ja :other tulee olla eri arvoisia.", - "email" => ":attribute muoto on virheellinen.", - "exists" => "valittu :attribute on virheellinen.", - "image" => ":attribute pitää olla kuva.", - "in" => "valittu :attribute on virheellinen.", - "integer" => ":attribute pitää olla numero.", - "ip" => ":attribute pitää olla validi IP-osoite.", - "match" => ":attribute muoto on virheellinen.", - "max" => array( - "numeric" => ":attribute pitää olla pienempi kuin :max.", - "file" => ":attribute pitää olla pienempi :max kilobittiä.", - "string" => ":attribute pitää olla pienempi :max kirjainta.", - ), - "mimes" => ":attribute pitää olla tiedostotyyppi: :values.", - "min" => array( - "numeric" => ":attribute pitää olla vähintään :min.", - "file" => ":attribute pitää olla vähintään :min kilobittiä.", - "string" => ":attribute pitää olla vähintään :min kirjainta.", - ), - "not_in" => "valittu :attribute on virheellinen.", - "numeric" => ":attribute pitää olla numero.", - "required" => ":attribute kenttä on pakollinen.", - "same" => ":attribute ja :other on oltava samat.", - "size" => array( - "numeric" => ":attribute pitää olla kokoa: :size.", - "file" => ":attribute pitää olla kokoa: :size kilobittiä.", - "string" => ":attribute pitää olla kokoa: :size kirjainta.", - ), - "unique" => ":attribute on jo valittu.", - "url" => ":attribute URL-osoite on virheellinen.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/language/fr/pagination.php b/application/language/fr/pagination.php deleted file mode 100644 index 30b85534..00000000 --- a/application/language/fr/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Précédent', - 'next' => 'Suivant »', - -); diff --git a/application/language/fr/validation.php b/application/language/fr/validation.php deleted file mode 100644 index 2e2f2105..00000000 --- a/application/language/fr/validation.php +++ /dev/null @@ -1,104 +0,0 @@ - "Le champ :attribute doit être accepté.", - "active_url" => "Le champ :attribute n'est pas une URL valide.", - "after" => "Le champ :attribute doit être une date après :date.", - "alpha" => "Le champ :attribute ne doit contenir que des lettres.", - "alpha_dash" => "Le champ :attribute ne doit contenir que des lettres, nombres et des tirets.", - "alpha_num" => "Le champ :attribute ne doit contenir que des lettres et nombres.", - "array" => "Le champ :attribute doit avoir des éléments selectionnés.", - "before" => "Le champ :attribute doit être une date avant :date.", - "between" => array( - "numeric" => "Le champ :attribute doit être entre :min - :max.", - "file" => "Le champ :attribute doit être entre :min - :max kilo-octets.", - "string" => "Le champ :attribute doit être entre :min - :max caractères.", - ), - "confirmed" => "Le champ :attribute confirmation est différent.", - "count" => "Le champ :attribute doit avoir exactement :count éléments sélectionnés.", - "countbetween" => "Le champ :attribute doit avoir entre :min et :max éléments sélectionnés.", - "countmax" => "Le champ :attribute doit avoir moins de :max éléments sélectionnés.", - "countmin" => "Le champ :attribute doit avoir au moins :min éléments sélectionnés.", - "different" => "Les champs :attribute et :other doivent être différents.", - "email" => "Le format du champ :attribute est invalide.", - "exists" => "Le champ sélectionné :attribute est invalide.", - "image" => "Le champ :attribute doit être une image.", - "in" => "Le champ sélectionné :attribute est invalide.", - "integer" => "Le champ :attribute doit être un entier.", - "ip" => "Le champ :attribute doit être une adresse IP valide.", - "match" => "Le format du champ :attribute est invalide.", - "max" => array( - "numeric" => "Le champ :attribute doit être plus petit que :max.", - "file" => "Le champ :attribute doit être plus petit que :max kilo-octets.", - "string" => "Le champ :attribute doit être plus petit que :max caractères.", - ), - "mimes" => "Le champ :attribute doit être un fichier de type: :values.", - "min" => array( - "numeric" => "Le champ :attribute doit être au moins :min.", - "file" => "Le champ :attribute doit être au moins de :min kilo-octets.", - "string" => "Le champ :attribute doit avoir au moins :min caractères.", - ), - "not_in" => "Le champ sélectionné :attribute est invalide.", - "numeric" => "Le champ :attribute doit être un nombre.", - "required" => "Le champ :attribute est requis", - "same" => "Les champs :attribute et :other doivent être identique.", - "size" => array( - "numeric" => "Le champ :attribute doit être :size.", - "file" => "Le champ :attribute doit être de :size kilo-octets.", - "string" => "Le champ :attribute doit être de :size caractères.", - ), - "unique" => "Le champ :attribute est déjà utilisé.", - "url" => "Le champ :attribute a un format invalide.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); diff --git a/application/language/he/pagination.php b/application/language/he/pagination.php deleted file mode 100644 index 6d2684cd..00000000 --- a/application/language/he/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '→ אחורה', - 'next' => 'קדימה ←', - -); \ No newline at end of file diff --git a/application/language/he/validation.php b/application/language/he/validation.php deleted file mode 100644 index f714dd8d..00000000 --- a/application/language/he/validation.php +++ /dev/null @@ -1,107 +0,0 @@ - "חובה להסכים ל-:attribute.", - "active_url" => "הערך :attribute חייב להכיל כתובת אינטרנט פעילה.", - "after" => "הערך :attribute חייב להכיל תאריך אחרי :date.", - "alpha" => "הערך :attribute יכול להכיל רק אותיות.", - "alpha_dash" => "הערך :attribute יכול להכיל רק אותיות, מספרים ומקפים.", - "alpha_num" => "הערך :attribute יכול להכיל רק אותיות ומספרים.", - "array" => "The :attribute must have selected elements.", - "before" => "הערך :attribute חייב להכיל תאריך לפני :date.", - "between" => array( - "numeric" => "הערך :attribute חייב להיות בין :min ל-:max.", - "file" => "הערך :attribute חייב לשקול בין :min ל-:max ק"ב.", - "string" => "הערך :attribute חייב להכיל בין :min ל-:max תווים.", - ), - "confirmed" => "הערכים של :attribute חייבים להיות זהים.", - "count" => "The :attribute must have exactly :count selected elements.", - "countbetween" => "The :attribute must have between :min and :max selected elements.", - "countmax" => "The :attribute must have less than :max selected elements.", - "countmin" => "The :attribute must have at least :min selected elements.", - "different" => "הערכים של :attribute ו-:other חייבים להיות שונים.", - "email" => "הערך :attribute חייב להכיל כתובת אימייל תקינה.", - "exists" => "הערך :attribute לא קיים.", - "image" => "הערך :attribute חייב להיות תמונה.", - "in" => "הערך :attribute חייב להיות ברשימה המאשרת.", - "integer" => "הערך :attribute חייב להיות מספר שלם.", - "ip" => "הערך :attribute חייב להיות כתובת IP תקינה.", - "match" => "התבנית של הערך :attribute אינה תקינה.", - "max" => array( - "numeric" => "הערך :attribute חייב להיות פחות מ-:max.", - "file" => "הערך :attribute חייב לשקול פחות מ-:max ק"ב.", - "string" => "הערך :attribute חייב להכיל פחות מ-:max תווים.", - ), - "mimes" => "הערך :attribute חייב להיות קובץ מסוג: :values.", - "min" => array( - "numeric" => "הערך :attribute חייב להיות לפחות :min.", - "file" => "הערך :attribute חייב לשקול לפחות :min ק"ב.", - "string" => "הערך :attribute חייב להכיל לפחות :min תווים.", - ), - "not_in" => "הערך :attribute נמצא ברשימה השחורה.", - "numeric" => "הערך :attribute חייב להיות מספר.", - "required" => "חובה למלא את הערך :attribute.", - "same" => "הערכים :attribute ו-:other חייבים להיות זהים.", - "size" => array( - "numeric" => "הערך :attribute חייב להיות :size.", - "file" => "הערך :attribute חייב לשקול :size ק"ב.", - "string" => "הערך :attribute חייב להכיל :size תווים.", - ), - "unique" => "הערך :attribute כבר קיים.", - "url" => "הערך :attribute חייב להכיל כתובת אינטרנט תקינה.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/language/hu/pagination.php b/application/language/hu/pagination.php deleted file mode 100644 index 00104344..00000000 --- a/application/language/hu/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Előző', - 'next' => 'Következő »', - -); \ No newline at end of file diff --git a/application/language/hu/validation.php b/application/language/hu/validation.php deleted file mode 100644 index ee0e7145..00000000 --- a/application/language/hu/validation.php +++ /dev/null @@ -1,104 +0,0 @@ - "A(z) :attribute el kell legyen fogadva.", - "active_url" => "A :attribute nem valós URL.", - "after" => "A :attribute :date utáni dátum kell legyen.", - "alpha" => "A(z) :attribute csak betűket tartalmazhat.", - "alpha_dash" => "A(z) :attribute betűket, számokat és kötőjeleket tartalmazhat.", - "alpha_num" => "A(z) :attribute csak betűket és számokat tartalmazhat.", - "array" => "The :attribute must have selected elements.", - "before" => "A :attribute :date előtti dátum kell legyen.", - "between" => array( - "numeric" => "A(z) :attribute :min - :max közötti érték kell legyen.", - "file" => "A(z) :attribute :min - :max kilobyte között kell legyen.", - "string" => "A(z) :attribute :min - :max karakterhossz között kell legyen", - ), - "confirmed" => "A(z) :attribute megerősítése nem egyezett meg.", - "count" => "The :attribute must have exactly :count selected elements.", - "countbetween" => "The :attribute must have between :min and :max selected elements.", - "countmax" => "The :attribute must have less than :max selected elements.", - "countmin" => "The :attribute must have at least :min selected elements.", - "different" => "A(z) :attribute és :other különböző kell legyen.", - "email" => "A(z) :attribute formátuma nem megfelelő.", - "exists" => "A(z) választott :attribute nem megfelelő.", - "image" => "A(z) :attribute kép kell legyen.", - "in" => "A(z) választott :attribute nem megfelelő.", - "integer" => "A :attribute szám kell legyen.", - "ip" => "A :attribute valós IP cím kell legyen.", - "match" => "A(z) :attribute formátuma nem megfelelő.", - "max" => array( - "numeric" => "A :attribute kevesebb kell legyen, mint :max.", - "file" => "A :attribute kevesebb kell legyen :max kilobytenál.", - "string" => "A :attribute kevesebb karakterből kell álljon, mint :max.", - ), - "mimes" => "A :attribute az alábbi tipusokból való kell legyen :values.", - "min" => array( - "numeric" => "A :attribute legalább :min kell legyen.", - "file" => "A :attribute legalább :min kilobyte kell legyen.", - "string" => "A :attribute legalább :min karakter hosszú kell legyen.", - ), - "not_in" => "A választott :attribute nem megfelelő.", - "numeric" => "A :attribute szám kell legyen.", - "required" => "A(z) :attribute megadása kötelező.", - "same" => "A :attribute és a :other muszáj hogy megegyezzen.", - "size" => array( - "numeric" => "A(z) :attribute :size kell legyen.", - "file" => "A(z) :attribute :size kilobyteos kell legyen.", - "string" => "A(z) :attribute :size karakteres kell legyen.", - ), - "unique" => "A(z) :attribute már foglalt.", - "url" => "A(z) :attribute formátuma nem megfelelő.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/language/id/pagination.php b/application/language/id/pagination.php deleted file mode 100644 index 7679f1fa..00000000 --- a/application/language/id/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Sebelumnya', - 'next' => 'Berikutnya »', - -); diff --git a/application/language/id/validation.php b/application/language/id/validation.php deleted file mode 100644 index e2728c0a..00000000 --- a/application/language/id/validation.php +++ /dev/null @@ -1,104 +0,0 @@ - "Isian :attribute harus diterima.", - "active_url" => "Isian :attribute bukan URL yang valid.", - "after" => "Isian :attribute harus tanggal setelah :date.", - "alpha" => "Isian :attribute hanya boleh berisi huruf.", - "alpha_dash" => "Isian :attribute hanya boleh berisi huruf, angka, dan strip.", - "alpha_num" => "Isian :attribute hanya boleh berisi huruf dan angka.", - "array" => "Isian :attribute harus memiliki elemen yang dipilih.", - "before" => "Isian :attribute harus tanggal sebelum :date.", - "between" => array( - "numeric" => "Isian :attribute harus antara :min - :max.", - "file" => "Isian :attribute harus antara :min - :max kilobytes.", - "string" => "Isian :attribute harus antara :min - :max karakter.", - ), - "confirmed" => "Konfirmasi :attribute tidak cocok.", - "count" => "Isian :attribute harus memiliki tepat :count elemen.", - "countbetween" => "Isian :attribute harus diantara :min dan :max elemen.", - "countmax" => "Isian :attribute harus lebih kurang dari :max elemen.", - "countmin" => "Isian :attribute harus paling sedikit :min elemen.", - "different" => "Isian :attribute dan :other harus berbeda.", - "email" => "Format isian :attribute tidak valid.", - "exists" => "Isian :attribute yang dipilih tidak valid.", - "image" => ":attribute harus berupa gambar.", - "in" => "Isian :attribute yang dipilih tidak valid.", - "integer" => "Isian :attribute harus merupakan bilangan.", - "ip" => "Isian :attribute harus alamat IP yang valid.", - "match" => "Format isian :attribute tidak valid.", - "max" => array( - "numeric" => "Isian :attribute harus kurang dari :max.", - "file" => "Isian :attribute harus kurang dari :max kilobytes.", - "string" => "Isian :attribute harus kurang dari :max karakter.", - ), - "mimes" => "Isian :attribute harus dokumen berjenis : :values.", - "min" => array( - "numeric" => "Isian :attribute harus minimal :min.", - "file" => "Isian :attribute harus minimal :min kilobytes.", - "string" => "Isian :attribute harus minimal :min karakter.", - ), - "not_in" => "Isian :attribute yang dipilih tidak valid.", - "numeric" => "Isian :attribute harus berupa angka.", - "required" => "Isian :attribute wajib diisi.", - "same" => "Isian :attribute dan :other harus sama.", - "size" => array( - "numeric" => "Isian :attribute harus berukuran :size.", - "file" => "Isian :attribute harus berukuran :size kilobyte.", - "string" => "Isian :attribute harus berukuran :size karakter.", - ), - "unique" => "Isian :attribute sudah ada sebelumnya.", - "url" => "Format isian :attribute tidak valid.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/language/it/pagination.php b/application/language/it/pagination.php deleted file mode 100755 index 6d4c949c..00000000 --- a/application/language/it/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Precedente', - 'next' => 'Successivo »', - -); \ No newline at end of file diff --git a/application/language/it/validation.php b/application/language/it/validation.php deleted file mode 100755 index f2b161cf..00000000 --- a/application/language/it/validation.php +++ /dev/null @@ -1,104 +0,0 @@ - ":attribute deve essere accettato.", - "active_url" => ":attribute non è un URL valido.", - "after" => ":attribute deve essere una data successiva al :date.", - "alpha" => ":attribute può contenere solo lettere.", - "alpha_dash" => ":attribute può contenere solo numeri lettere e dashes.", - "alpha_num" => ":attribute può contenere solo lettere e numeri.", - "array" => ":attribute deve avere almeno un elemento selezionato.", - "before" => ":attribute deve essere una data che precede :date.", - "between" => array( - "numeric" => ":attribute deve trovarsi tra :min - :max.", - "file" => ":attribute deve trovarsi tra :min - :max kilobytes.", - "string" => ":attribute deve trovarsi tra :min - :max caratteri.", - ), - "confirmed" => "Il campo di conferma per :attribute non coincide.", - "count" => ":attribute deve avere esattamente :count elementi selezionati.", - "countbetween" => ":attribute deve avere esattamente almeno :min o al più :max elementi selezionati.", - "countmax" => ":attribute deve avere meno di :max elementi selezionati.", - "countmin" => ":attribute deve avere almeno :min elementi selezionati.", - "different" => ":attribute e :other devono essere differenti.", - "email" => ":attribute non è valido.", - "exists" => ":attribute selezionato/a non è valido.", - "image" => ":attribute deve essere un'immagine.", - "in" => ":attribute selezionato non è valido.", - "integer" => ":attribute deve essere intero.", - "ip" => ":attribute deve essere un indirizzo IP valido.", - "match" => ":attribute non è valido.", - "max" => array( - "numeric" => ":attribute deve essere minore di :max.", - "file" => ":attribute non deve essere più grande di :max kilobytes.", - "string" => ":attribute non può contenere più di :max caratteri.", - ), - "mimes" => ":attribute deve essere del tipo: :values.", - "min" => array( - "numeric" => ":attribute deve valere almeno :min.", - "file" => ":attribute deve essere più grande di :min kilobytes.", - "string" => ":attribute deve contenere almeno :min caratteri.", - ), - "not_in" => "Il valore selezionato per :attribute non è valido.", - "numeric" => ":attribute deve essere un numero.", - "required" => ":attribute non può essere omesso.", - "same" => ":attribute e :other devono coincidere.", - "size" => array( - "numeric" => ":attribute deve valere :size.", - "file" => ":attribute deve essere grande :size kilobyte.", - "string" => ":attribute deve contenere :size caratteri.", - ), - "unique" => ":attribute è stato già usato.", - "url" => ":attribute deve essere un URL.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/language/ja/pagination.php b/application/language/ja/pagination.php deleted file mode 100644 index 47e9d3f2..00000000 --- a/application/language/ja/pagination.php +++ /dev/null @@ -1,31 +0,0 @@ - '« 前', - 'next' => '次 »', - -); diff --git a/application/language/ja/validation.php b/application/language/ja/validation.php deleted file mode 100644 index 620bb539..00000000 --- a/application/language/ja/validation.php +++ /dev/null @@ -1,147 +0,0 @@ - ":attributeを承認してください。", - "active_url" => ":attributeが有効なURLではありません。", - "after" => ":attributeには、:date以降の日付を指定してください。", - "alpha" => ":attributeはアルファベッドのみがご利用できます。", - "alpha_dash" => ":attributeは英数字とダッシュ(-)及び下線(_)がご利用できます。", - "alpha_num" => ":attributeは英数字がご利用できます。", - "array" => "The :attribute must have selected elements.", - "before" => ":attributeには、:date以前の日付をご利用ください。", - "between" => array( - "numeric" => ":attributeは、:minから、:maxまでの数字をご指定ください。", - "file" => ":attributeには、:min kBから:max kBまでのサイズのファイルをご指定ください。", - "string" => ":attributeは、:min文字から:max文字の間でご指定ください。", - ), - "confirmed" => ":attributeと、確認フィールドとが、一致していません。", - "count" => ":attributeは、:count個選択してください。", - "countbetween" => ":attributeは、:min個から:max個の間で選択してください。", - "countmax" => ":attributeは、:max個以下で選択してください。", - "countmin" => ":attributeは、最低:min個選択してください。", - "different" => ":attributeと:otherには、異なった内容を指定してください。", - "email" => ":attributeには正しいメールアドレスの形式をご指定ください。", - "exists" => "選択された:attributeは正しくありません。", - "image" => ":attributeには画像ファイルを指定してください。", - "in" => "選択された:attributeは正しくありません。", - "integer" => ":attributeは整数でご指定ください。", - "ip" => ":attributeには、有効なIPアドレスをご指定ください。", - "match" => ":attributeの入力フォーマットが間違っています。", - "max" => array( - "numeric" => ":attributeには、:max以下の数字をご指定ください。", - "file" => ":attributeには、:max kB以下のファイルをご指定ください。", - "string" => ":attributeは、:max文字以下でご指定ください。", - ), - "mimes" => ":attributeには:valuesタイプのファイルを指定してください。", - "min" => array( - "numeric" => ":attributeには、:min以上の数字をご指定ください。", - "file" => ":attributeには、:min kB以上のファイルをご指定ください。", - "string" => ":attributeは、:min文字以上でご指定ください。", - ), - "not_in" => "選択された:attributeは正しくありません。", - "numeric" => ":attributeには、数字を指定してください。", - "required" => ":attributeは必ず指定してください。", - "same" => ":attributeと:otherには同じ値を指定してください。", - "size" => array( - "numeric" => ":attributeには:sizeを指定してください。", - "file" => ":attributeのファイルは、:sizeキロバイトでなくてはなりません。", - "string" => ":attributeは:size文字で指定してください。", - ), - "unique" => ":attributeに指定された値は既に存在しています。", - "url" => ":attributeのフォーマットが正しくありません。", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - /* - |-------------------------------------------------------------------------- - | カスタムバリデーション言語設定 - |-------------------------------------------------------------------------- - | - | ここでは、"属性_ルール"の記法を使用し、属性に対するカスタムバリデーションメッセージを - | 指定してください。これにより、カスタムバリデーションをきれいに美しく保てます。 - | - | 例えば、"email"属性のuniqueバリデーションで、カスタムバリデーションメッセージを - | 使いたいならば、"email_unique"をカスタムメッセージとともに、配列に追加してください。 - | Validatorクラスが残りの面倒を見ます! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - /* - |-------------------------------------------------------------------------- - | バリデーション属性 - |-------------------------------------------------------------------------- - | - | 以下の言語設定は属性のプレースホルダーを例えば"email"属性を"E-Mailアドレス"という風に - | 読み手に親切になるよう置き換えるために使用されます。 - | あなたのユーザーは、あなたに感謝するでしょう。 - | - | Validatorクラスは、自動的にメッセージに含まれる:attributeプレースホルダーを - | この配列の値に置き換えようと試みます。絶妙ですね。あなたも気に入ってくれるでしょう。 - */ - - 'attributes' => array(), - -); diff --git a/application/language/nl/pagination.php b/application/language/nl/pagination.php deleted file mode 100644 index 0240af61..00000000 --- a/application/language/nl/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Vorige', - 'next' => 'Volgende »', - -); diff --git a/application/language/nl/validation.php b/application/language/nl/validation.php deleted file mode 100644 index 3017d8fa..00000000 --- a/application/language/nl/validation.php +++ /dev/null @@ -1,95 +0,0 @@ - ":attribute moet geaccepteerd zijn.", - "active_url" => ":attribute is geen geldige URL.", - "after" => ":attribute moet een datum na :date zijn.", - "alpha" => ":attribute mag alleen letters bevatten.", - "alpha_dash" => ":attribute mag alleen letters, nummers, onderstreep(_) en strepen(-) bevatten.", - "alpha_num" => ":attribute mag alleen letters en nummers bevatten.", - "array" => ":attribute moet geselecteerde elementen bevatten.", - "before" => ":attribute moet een datum voor :date zijn.", - "between" => array( - "numeric" => ":attribute moet tussen :min en :max zijn.", - "file" => ":attribute moet tussen :min en :max kilobytes zijn.", - "string" => ":attribute moet tussen :min en :max karakters zijn.", - ), - "confirmed" => ":attribute bevestiging komt niet overeen.", - "count" => ":attribute moet precies :count geselecteerde elementen bevatten.", - "countbetween" => ":attribute moet tussen :min en :max geselecteerde elementen bevatten.", - "countmax" => ":attribute moet minder dan :max geselecteerde elementen bevatten.", - "countmin" => ":attribute moet minimaal :min geselecteerde elementen bevatten.", - "different" => ":attribute en :other moeten verschillend zijn.", - "email" => ":attribute is geen geldig e-mailadres.", - "exists" => ":attribute bestaat niet.", - "image" => ":attribute moet een afbeelding zijn.", - "in" => ":attribute is ongeldig.", - "integer" => ":attribute moet een getal zijn.", - "ip" => ":attribute moet een geldig IP-adres zijn.", - "match" => "Het formaat van :attribute is ongeldig.", - "max" => array( - "numeric" => ":attribute moet minder dan :max zijn.", - "file" => ":attribute moet minder dan :max kilobytes zijn.", - "string" => ":attribute moet minder dan :max karakters zijn.", - ), - "mimes" => ":attribute moet een bestand zijn van het bestandstype :values.", - "min" => array( - "numeric" => ":attribute moet minimaal :min zijn.", - "file" => ":attribute moet minimaal :min kilobytes zijn.", - "string" => ":attribute moet minimaal :min karakters zijn.", - ), - "not_in" => "Het formaat van :attribute is ongeldig.", - "numeric" => ":attribute moet een nummer zijn.", - "required" => ":attribute is verplicht.", - "same" => ":attribute en :other moeten overeenkomen.", - "size" => array( - "numeric" => ":attribute moet :size zijn.", - "file" => ":attribute moet :size kilobyte zijn.", - "string" => ":attribute moet :size characters zijn.", - ), - "unique" => ":attribute is al in gebruik.", - "url" => ":attribute is geen geldige URL.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); diff --git a/application/language/pl/pagination.php b/application/language/pl/pagination.php deleted file mode 100644 index 90536b95..00000000 --- a/application/language/pl/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Poprzednia', - 'next' => 'Następna »', - -); \ No newline at end of file diff --git a/application/language/pl/validation.php b/application/language/pl/validation.php deleted file mode 100644 index 0ec36d57..00000000 --- a/application/language/pl/validation.php +++ /dev/null @@ -1,104 +0,0 @@ - ":attribute musi zostać zaakceptowane.", - "active_url" => ":attribute nie jest prawidłowym adresem URL.", - "after" => ":attribute musi zawierać datę, która jest po :date.", - "alpha" => ":attribute może zawierać jedynie litery.", - "alpha_dash" => ":attribute może zawierać jedynie litery, cyfry i myślniki.", - "alpha_num" => ":attribute może zawierać jedynie litery i cyfry.", - "array" => "The :attribute must have selected elements.", - "before" => ":attribute musi zawierać datę, która jest przed :date.", - "between" => array( - "numeric" => ":attribute musi mieścić się w granicach :min - :max.", - "file" => ":attribute musi mieć :min - :max kilobajtów.", - "string" => ":attribute musi mieć :min - :max znaków.", - ), - "confirmed" => "Potwierdzenie :attribute się nie zgadza.", - "count" => "The :attribute must have exactly :count selected elements.", - "countbetween" => "The :attribute must have between :min and :max selected elements.", - "countmax" => "The :attribute must have less than :max selected elements.", - "countmin" => "The :attribute must have at least :min selected elements.", - "different" => ":attribute i :other muszą się od siebie różnić.", - "email" => "The :attribute format is invalid.", - "exists" => "Zaznaczona opcja :attribute jest nieprawidłowa.", - "image" => ":attribute musi być obrazkiem.", - "in" => "Zaznaczona opcja :attribute jest nieprawidłowa.", - "integer" => ":attribute musi być liczbą całkowitą.", - "ip" => ":attribute musi być prawidłowym adresem IP.", - "match" => "Format :attribute jest nieprawidłowy.", - "max" => array( - "numeric" => ":attribute musi być poniżej :max.", - "file" => ":attribute musi mieć poniżej :max kilobajtów.", - "string" => ":attribute musi mieć poniżej :max znaków.", - ), - "mimes" => ":attribute musi być plikiem rodzaju :values.", - "min" => array( - "numeric" => ":attribute musi być co najmniej :min.", - "file" => "Plik :attribute musi mieć co najmniej :min kilobajtów.", - "string" => ":attribute musi mieć co najmniej :min znaków.", - ), - "not_in" => "Zaznaczona opcja :attribute jest nieprawidłowa.", - "numeric" => ":attribute musi być numeryczne.", - "required" => "Pole :attribute jest wymagane.", - "same" => ":attribute i :other muszą być takie same.", - "size" => array( - "numeric" => ":attribute musi mieć rozmiary :size.", - "file" => ":attribute musi mieć :size kilobajtów.", - "string" => ":attribute musi mieć :size znaków.", - ), - "unique" => ":attribute zostało już użyte.", - "url" => "Format pola :attribute jest nieprawidłowy.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/language/pt/pagination.php b/application/language/pt/pagination.php deleted file mode 100644 index e6303530..00000000 --- a/application/language/pt/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Anterior', - 'next' => 'Próxima »', - -); \ No newline at end of file diff --git a/application/language/pt/validation.php b/application/language/pt/validation.php deleted file mode 100644 index ee57c218..00000000 --- a/application/language/pt/validation.php +++ /dev/null @@ -1,99 +0,0 @@ - "O :attribute deve ser aceite.", - "active_url" => "O :attribute não é uma URL válida.", - "after" => "O :attribute deve ser uma data após :date.", - "alpha" => "O :attribute só pode conter letras.", - "alpha_dash" => "O :attribute só pode conter letras, números e traços.", - "alpha_num" => "O :attribute só pode conter letras e números.", - "before" => "O :attribute deve ser uma data anterior à :date.", - "between" => array( - "numeric" => "O :attribute deve estar entre :min - :max.", - "file" => "O :attribute deve estar entre :min - :max kilobytes.", - "string" => "O :attribute deve estar entre :min - :max caracteres.", - ), - "confirmed" => "O :attribute confirmação não coincide.", - "different" => "O :attribute e :other devem ser diferentes.", - "email" => "O :attribute não é um e-mail válido.", - "exists" => "O :attribute selecionado é inválido.", - "image" => "O :attribute deve ser uma imagem.", - "in" => "O :attribute selecionado é inválido.", - "integer" => "O :attribute deve ser um inteiro.", - "ip" => "O :attribute deve ser um endereço IP válido.", - "match" => "O formato :attribute é inválido.", - "max" => array( - "numeric" => "O :attribute deve ser inferior a :max.", - "file" => "O :attribute deve ser inferior a :max kilobytes.", - "string" => "O :attribute deve ser inferior a :max caracteres.", - ), - "mimes" => "O :attribute deve ser um arquivo do tipo: :values.", - "min" => array( - "numeric" => "O :attribute deve conter pelo menos :min.", - "file" => "O :attribute deve conter pelo menos :min kilobytes.", - "string" => "O :attribute deve conter pelo menos :min caracteres.", - ), - "not_in" => "O :attribute selecionado é inválido.", - "numeric" => "O :attribute deve ser um número.", - "required" => "O campo :attribute deve ser preenchido.", - "same" => "O :attribute e :other devem ser iguais.", - "size" => array( - "numeric" => "O :attribute deve ser :size.", - "file" => "O :attribute deve ter :size kilobyte.", - "string" => "O :attribute deve ter :size caracteres.", - ), - "unique" => "Este :attribute já existe.", - "url" => "O formato :attribute é inválido.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/language/ru/pagination.php b/application/language/ru/pagination.php deleted file mode 100644 index 0ac9e0a3..00000000 --- a/application/language/ru/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '← Назад', - 'next' => 'Вперёд →', - -); \ No newline at end of file diff --git a/application/language/ru/validation.php b/application/language/ru/validation.php deleted file mode 100644 index 8fd15f5c..00000000 --- a/application/language/ru/validation.php +++ /dev/null @@ -1,104 +0,0 @@ - "Вы должны принять :attribute.", - "active_url" => "Поле :attribute должно быть полным URL.", - "after" => "Поле :attribute должно быть датой после :date.", - "alpha" => "Поле :attribute может содержать только буквы.", - "alpha_dash" => "Поле :attribute может содержать только буквы, цифры и тире.", - "alpha_num" => "Поле :attribute может содержать только буквы и цифры.", - "array" => "The :attribute must have selected elements.", - "before" => "Поле :attribute должно быть датой перед :date.", - "between" => array( - "numeric" => "Поле :attribute должно быть между :min и :max.", - "file" => "Поле :attribute должно быть от :min до :max Килобайт.", - "string" => "Поле :attribute должно быть от :min до :max символов.", - ), - "confirmed" => "Поле :attribute не совпадает с подтверждением.", - "count" => "The :attribute must have exactly :count selected elements.", - "countbetween" => "The :attribute must have between :min and :max selected elements.", - "countmax" => "The :attribute must have less than :max selected elements.", - "countmin" => "The :attribute must have at least :min selected elements.", - "different" => "Поля :attribute и :other должны различаться.", - "email" => "Поле :attribute имеет неверный формат.", - "exists" => "Выбранное значение для :attribute уже существует.", - "image" => "Поле :attribute должно быть картинкой.", - "in" => "Выбранное значение для :attribute не верно.", - "integer" => "Поле :attribute должно быть целым числом.", - "ip" => "Поле :attribute должно быть полным IP-адресом.", - "match" => "Поле :attribute имеет неверный формат.", - "max" => array( - "numeric" => "Поле :attribute должно быть меньше :max.", - "file" => "Поле :attribute должно быть меньше :max Килобайт.", - "string" => "Поле :attribute должно быть короче :max символов.", - ), - "mimes" => "Поле :attribute должно быть файлом одного из типов: :values.", - "min" => array( - "numeric" => "Поле :attribute должно быть не менее :min.", - "file" => "Поле :attribute должно быть не менее :min Килобайт.", - "string" => "Поле :attribute должно быть не короче :min символов.", - ), - "not_in" => "Выбранное значение для :attribute не верно.", - "numeric" => "Поле :attribute должно быть числом.", - "required" => "Поле :attribute обязательно для заполнения.", - "same" => "Значение :attribute должно совпадать с :other.", - "size" => array( - "numeric" => "Поле :attribute должно быть :size.", - "file" => "Поле :attribute должно быть :size Килобайт.", - "string" => "Поле :attribute должно быть длиной :size символов.", - ), - "unique" => "Такое значение поля :attribute уже существует.", - "url" => "Поле :attribute имеет неверный формат.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/language/sq/pagination.php b/application/language/sq/pagination.php deleted file mode 100644 index 3f5b57be..00000000 --- a/application/language/sq/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Prapa', - 'next' => 'Para »', - -); \ No newline at end of file diff --git a/application/language/sq/validation.php b/application/language/sq/validation.php deleted file mode 100644 index f3b69b02..00000000 --- a/application/language/sq/validation.php +++ /dev/null @@ -1,104 +0,0 @@ - ":attribute duhet të pranohet.", - "active_url" => ":attribute nuk është URL valide.", - "after" => ":attribute duhet të jetë datë pas :date.", - "alpha" => ":attribute mund të përmbajë vetëm shkronja.", - "alpha_dash" => ":attribute mund të përmbajë vetëm shkronja, numra dhe viza.", - "alpha_num" => ":attribute mund të përmbajë vetëm shkronja dhe numra.", - "array" => ":attribute duhet të ketë elemente të përzgjedhura.", - "before" => ":attribute duhet të jetë datë para :date.", - "between" => array( - "numeric" => ":attribute duhet të jetë në mes :min - :max.", - "file" => ":attribute duhet të jetë në mes :min - :max kilobajtëve.", - "string" => ":attribute duhet të jetë në mes :min - :max karaktereve.", - ), - "confirmed" => ":attribute konfirmimi nuk përputhet.", - "count" => ":attributeduhet të ketë saktësisht :count elemente te përzgjedhura.", - "countbetween" => ":attribute duhet të jetë në mes :min and :max elemente te përzgjedhura.", - "countmax" => ":attribute duhet të ketë me pak se :max elemente te përzgjedhura.", - "countmin" => ":attribute duhet të ketë së paku :min elemente te përzgjedhura.", - "different" => ":attribute dhe :other duhet të jenë të ndryshme.", - "email" => ":attribute formati është jo valid.", - "exists" => ":attribute e përzgjedhur është jo valid.", - "image" => ":attribute duhet të jetë imazh.", - "in" => ":attribute e përzgjedhur është jo valid.", - "integer" => ":attribute duhet të jete numër i plotë.", - "ip" => ":attribute duhet të jetë një IP adresë e vlefshme.", - "match" => ":attribute formati është i pavlefshëm.", - "max" => array( - "numeric" => ":attribute duhet të jetë më e vogël se :max.", - "file" => ":attribute duhet të jetë më e vogël se :max kilobytes.", - "string" => ":attribute duhet të jetë më e vogël se :max characters.", - ), - "mimes" => ":attribute duhet të jetë një fajll i tipit: :values.", - "min" => array( - "numeric" => ":attribute duhet të jetë së paku :min.", - "file" => ":attribute duhet të jetë së paku :min kilobajt.", - "string" => ":attribute duhet të jetë së paku :min karaktere.", - ), - "not_in" => ":attribute e përzgjedhur është jo valid.", - "numeric" => ":attribute duhet të jetë numër.", - "required" => ":attribute fusha është e nevojshme.", - "same" => ":attribute dhe :other duhet të përputhen.", - "size" => array( - "numeric" => ":attribute duhet të jetë :size.", - "file" => ":attribute duhet të jetë :size kilobajt.", - "string" => ":attribute duhet të jetë :size karaktere.", - ), - "unique" => ":attribute tashmë është marrë.", - "url" => ":attribute formati është i pavlefshëm.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/language/sr/pagination.php b/application/language/sr/pagination.php deleted file mode 100644 index 7a787ac6..00000000 --- a/application/language/sr/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Nazad', - 'next' => 'Napred »', - -); \ No newline at end of file diff --git a/application/language/sr/validation.php b/application/language/sr/validation.php deleted file mode 100644 index 8bf945df..00000000 --- a/application/language/sr/validation.php +++ /dev/null @@ -1,104 +0,0 @@ - "Polje :attribute mora biti prihvaćeno.", - "active_url" => "Polje :attribute nije validan URL.", - "after" => "Polje :attribute mora biti datum posle :date.", - "alpha" => "Polje :attribute može sadržati samo slova.", - "alpha_dash" => "Polje :attribute može sadržati samo slova, brojeve i povlake.", - "alpha_num" => "Polje :attribute može sadržati samo slova i brojeve.", - "array" => "Polje :attribute mora imati odabrane elemente.", - "before" => "Polje :attribute mora biti datum pre :date.", - "between" => array( - "numeric" => "Polje :attribute mora biti izmedju :min - :max.", - "file" => "Fajl :attribute mora biti izmedju :min - :max kilobajta.", - "string" => "Polje :attribute mora biti izmedju :min - :max karaktera.", - ), - "confirmed" => "Potvrda polja :attribute se ne poklapa.", - "count" => "Polje :attribute mora imati tačno :count odabranih elemenata.", - "countbetween" => "Polje :attribute mora imati izmedju :min i :max odabranih elemenata.", - "countmax" => "Polje :attribute mora imati manje od :max odabranih elemenata.", - "countmin" => "Polje :attribute mora imati najmanje :min odabranih elemenata.", - "different" => "Polja :attribute i :other moraju biti različita.", - "email" => "Format polja :attribute nije validan.", - "exists" => "Odabrano polje :attribute nije validno.", - "image" => "Polje :attribute mora biti slika.", - "in" => "Odabrano polje :attribute nije validno.", - "integer" => "Polje :attribute mora biti broj.", - "ip" => "Polje :attribute mora biti validna IP adresa.", - "match" => "Format polja :attribute nije validan.", - "max" => array( - "numeric" => "Polje :attribute mora biti manje od :max.", - "file" => "Polje :attribute mora biti manje od :max kilobajta.", - "string" => "Polje :attribute mora sadržati manje od :max karaktera.", - ), - "mimes" => "Polje :attribute mora biti fajl tipa: :values.", - "min" => array( - "numeric" => "Polje :attribute mora biti najmanje :min.", - "file" => "Fajl :attribute mora biti najmanje :min kilobajta.", - "string" => "Polje :attribute mora sadržati najmanje :min karaktera.", - ), - "not_in" => "Odabrani element polja :attribute nije validan.", - "numeric" => "Polje :attribute mora biti broj.", - "required" => "Polje :attribute je obavezno.", - "same" => "Polja :attribute i :other se moraju poklapati.", - "size" => array( - "numeric" => "Polje :attribute mora biti :size.", - "file" => "Fajl :attribute mora biti :size kilobajta.", - "string" => "Polje :attribute mora biti :size karaktera.", - ), - "unique" => "Polje :attribute već postoji.", - "url" => "Format polja :attribute nije validan.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/language/sv/pagination.php b/application/language/sv/pagination.php deleted file mode 100644 index bdad977e..00000000 --- a/application/language/sv/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Föregående', - 'next' => 'Nästa »', - -); \ No newline at end of file diff --git a/application/language/sv/validation.php b/application/language/sv/validation.php deleted file mode 100644 index 1f1019a8..00000000 --- a/application/language/sv/validation.php +++ /dev/null @@ -1,104 +0,0 @@ - ":attribute måste accepteras.", - "active_url" => ":attribute är inte en giltig webbadress.", - "after" => ":attribute måste vara ett datum efter den :date.", - "alpha" => ":attribute får endast innehålla bokstäver.", - "alpha_dash" => ":attribute får endast innehålla bokstäver, nummer och bindestreck.", - "alpha_num" => ":attribute får endast innehålla bokstäver och nummer.", - "array" => ":attribute måste ha valda element.", - "before" => ":attribute måste vara ett datum innan den :date.", - "between" => array( - "numeric" => ":attribute måste vara ett nummer mellan :min och :max.", - "file" => ":attribute måste vara mellan :min till :max kilobytes stor.", - "string" => ":attribute måste innehålla :min till :max tecken.", - ), - "confirmed" => ":attribute bekräftelsen matchar inte.", - "count" => ":attribute måste exakt ha :count valda element.", - "countbetween" => ":attribute får endast ha :min till :max valda element.", - "countmax" => ":attribute får max ha :max valda element.", - "countmin" => ":attribute måste minst ha :min valda element.", - "different" => ":attribute och :other får ej vara lika.", - "email" => ":attribute formatet är ogiltig.", - "exists" => "Det valda :attribute är ogiltigt.", - "image" => ":attribute måste vara en bild.", - "in" => "Det valda :attribute är ogiltigt.", - "integer" => ":attribute måste vara en siffra.", - "ip" => ":attribute måste vara en giltig IP-adress.", - "match" => ":attribute formatet är ogiltig.", - "max" => array( - "numeric" => ":attribute får inte vara större än :max.", - "file" => ":attribute får max vara :max kilobytes stor.", - "string" => ":attribute får max innehålla :max tecken.", - ), - "mimes" => ":attribute måste vara en fil av typen: :values.", - "min" => array( - "numeric" => ":attribute måste vara större än :min.", - "file" => ":attribute måste minst vara :min kilobytes stor.", - "string" => ":attribute måste minst innehålla :min tecken.", - ), - "not_in" => "Det valda :attribute är ogiltigt.", - "numeric" => ":attribute måste vara ett nummer.", - "required" => ":attribute fältet är obligatoriskt.", - "same" => ":attribute och :other måste vara likadana.", - "size" => array( - "numeric" => ":attribute måste vara :size.", - "file" => ":attribute får endast vara :size kilobyte stor.", - "string" => ":attribute måste innehålla :size tecken.", - ), - "unique" => ":attribute används redan.", - "url" => ":attribute formatet är ogiltig", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/language/tr/pagination.php b/application/language/tr/pagination.php deleted file mode 100644 index fce594d6..00000000 --- a/application/language/tr/pagination.php +++ /dev/null @@ -1,28 +0,0 @@ - - * @link http://sinaneldem.com.tr - */ - -return array( - - /* - |-------------------------------------------------------------------------- - | Pagination Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are used by the paginator library to build - | the pagination links. You're free to change them to anything you want. - | If you come up with something more exciting, let us know. - | - */ - - 'previous' => '« Önceki', - 'next' => 'Sonraki »', - -); \ No newline at end of file diff --git a/application/language/tr/validation.php b/application/language/tr/validation.php deleted file mode 100644 index 18cb0458..00000000 --- a/application/language/tr/validation.php +++ /dev/null @@ -1,108 +0,0 @@ - - * @link http://sinaneldem.com.tr - */ - -return array( - - /* - |-------------------------------------------------------------------------- - | Validation Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines contain the default error messages used - | by the validator class. Some of the rules contain multiple versions, - | such as the size (max, min, between) rules. These versions are used - | for different input types such as strings and files. - | - | These language lines may be easily changed to provide custom error - | messages in your application. Error messages for custom validation - | rules may also be added to this file. - | - */ - - "accepted" => ":attribute kabul edilmelidir.", - "active_url" => ":attribute geçerli bir URL olmalıdır.", - "after" => ":attribute şundan daha eski bir tarih olmalıdır :date.", - "alpha" => ":attribute sadece harflerden oluşmalıdır.", - "alpha_dash" => ":attribute sadece harfler, rakamlar ve tirelerden oluşmalıdır.", - "alpha_num" => ":attribute sadece harfler ve rakamlar içermelidir.", - "before" => ":attribute şundan daha önceki bir tarih olmalıdır :date.", - "between" => array( - "numeric" => ":attribute :min - :max arasında olmalıdır.", - "file" => ":attribute :min - :max arasındaki kilobyte değeri olmalıdır.", - "string" => ":attribute :min - :max arasında karakterden oluşmalıdır.", - ), - "confirmed" => ":attribute onayı eşleşmiyor.", - "different" => ":attribute ile :other birbirinden farklı olmalıdır.", - "email" => ":attribute biçimi geçersiz.", - "exists" => "Seçili :attribute geçersiz.", - "image" => ":attribute resim dosyası olmalıdır.", - "in" => "selected :attribute geçersiz.", - "integer" => ":attribute rakam olmalıdır.", - "ip" => ":attribute geçerli bir IP adresi olmalıdır.", - "match" => ":attribute biçimi geçersiz.", - "max" => array( - "numeric" => ":attribute şundan küçük olmalıdır :max.", - "file" => ":attribute şundan küçük olmalıdır :max kilobyte.", - "string" => ":attribute şundan küçük olmalıdır :max karakter.", - ), - "mimes" => ":attribute dosya biçimi :values olmalıdır.", - "min" => array( - "numeric" => ":attribute en az :min olmalıdır.", - "file" => ":attribute en az :min kilobyte olmalıdır.", - "string" => ":attribute en az :min karakter olmalıdır.", - ), - "not_in" => "Seçili :attribute geçersiz.", - "numeric" => ":attribute rakam olmalıdır.", - "required" => ":attribute alanı gereklidir.", - "same" => ":attribute ile :other eşleşmelidir.", - "size" => array( - "numeric" => ":attribute :size olmalıdır.", - "file" => ":attribute :size kilobyte olmalıdır.", - "string" => ":attribute :size karakter olmalıdır.", - ), - "unique" => ":attribute daha önceden kayıt edilmiş.", - "url" => ":attribute biçimi geçersiz.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array(), - -); \ No newline at end of file diff --git a/application/routes.php b/application/routes.php deleted file mode 100644 index 2892da90..00000000 --- a/application/routes.php +++ /dev/null @@ -1,111 +0,0 @@ - 'filter', function() -| { -| return 'Hello World!'; -| })); -| -*/ - -Route::filter('before', function() -{ - // Do stuff before every request to your application... -}); - -Route::filter('after', function($response) -{ - // Do stuff after every request to your application... -}); - -Route::filter('csrf', function() -{ - if (Request::forged()) return Response::error('500'); -}); - -Route::filter('auth', function() -{ - if (Auth::guest()) return Redirect::to('login'); -}); \ No newline at end of file diff --git a/application/start.php b/application/start.php deleted file mode 100755 index 6bb648b3..00000000 --- a/application/start.php +++ /dev/null @@ -1,173 +0,0 @@ - path('app').'controllers/base.php', -)); - -/* -|-------------------------------------------------------------------------- -| Auto-Loader Directories -|-------------------------------------------------------------------------- -| -| The Laravel auto-loader can search directories for files using the PSR-0 -| naming convention. This convention basically organizes classes by using -| the class namespace to indicate the directory structure. -| -*/ - -Autoloader::directories(array( - path('app').'models', - path('app').'libraries', -)); - -/* -|-------------------------------------------------------------------------- -| Laravel View Loader -|-------------------------------------------------------------------------- -| -| The Laravel view loader is responsible for returning the full file path -| for the given bundle and view. Of course, a default implementation is -| provided to load views according to typical Laravel conventions but -| you may change this to customize how your views are organized. -| -*/ - -Event::listen(View::loader, function($bundle, $view) -{ - return View::file($bundle, $view, Bundle::path($bundle).'views'); -}); - -/* -|-------------------------------------------------------------------------- -| Laravel Language Loader -|-------------------------------------------------------------------------- -| -| The Laravel language loader is responsible for returning the array of -| language lines for a given bundle, language, and "file". A default -| implementation has been provided which uses the default language -| directories included with Laravel. -| -*/ - -Event::listen(Lang::loader, function($bundle, $language, $file) -{ - return Lang::file($bundle, $language, $file); -}); - -/* -|-------------------------------------------------------------------------- -| Attach The Laravel Profiler -|-------------------------------------------------------------------------- -| -| If the profiler is enabled, we will attach it to the Laravel events -| for both queries and logs. This allows the profiler to intercept -| any of the queries or logs performed by the application. -| -*/ - -if (Config::get('application.profiler')) -{ - Profiler::attach(); -} - -/* -|-------------------------------------------------------------------------- -| Enable The Blade View Engine -|-------------------------------------------------------------------------- -| -| The Blade view engine provides a clean, beautiful templating language -| for your application, including syntax for echoing data and all of -| the typical PHP control structures. We'll simply enable it here. -| -*/ - -Blade::sharpen(); - -/* -|-------------------------------------------------------------------------- -| Set The Default Timezone -|-------------------------------------------------------------------------- -| -| We need to set the default timezone for the application. This controls -| the timezone that will be used by any of the date methods and classes -| utilized by Laravel or your application. The timezone may be set in -| your application configuration file. -| -*/ - -date_default_timezone_set(Config::get('application.timezone')); - -/* -|-------------------------------------------------------------------------- -| Start / Load The User Session -|-------------------------------------------------------------------------- -| -| Sessions allow the web, which is stateless, to simulate state. In other -| words, sessions allow you to store information about the current user -| and state of your application. Here we'll just fire up the session -| if a session driver has been configured. -| -*/ - -if ( ! Request::cli() and Config::get('session.driver') !== '') -{ - Session::load(); -} \ No newline at end of file diff --git a/application/tests/example.test.php b/application/tests/example.test.php deleted file mode 100644 index d9b330c0..00000000 --- a/application/tests/example.test.php +++ /dev/null @@ -1,15 +0,0 @@ -assertTrue(true); - } - -} \ No newline at end of file diff --git a/application/views/error/404.php b/application/views/error/404.php deleted file mode 100644 index ade2026d..00000000 --- a/application/views/error/404.php +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - Error 404 - Not Found - - - - -
-
-
- - -

- -

Server Error: 404 (Not Found)

- -
- -

What does this mean?

- -

- We couldn't find the page you requested on our servers. We're really sorry - about that. It's our fault, not yours. We'll work hard to get this page - back online as soon as possible. -

- -

- Perhaps you would like to go to our ? -

-
-
- - \ No newline at end of file diff --git a/application/views/error/500.php b/application/views/error/500.php deleted file mode 100644 index 4ce7c066..00000000 --- a/application/views/error/500.php +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - Error 500 - Internal Server Error - - - - -
-
-
- - -

- -

Server Error: 500 (Internal Server Error)

- -
- -

What does this mean?

- -

- Something went wrong on our servers while we were processing your request. - We're really sorry about this, and will work hard to get this resolved as - soon as possible. -

- -

- Perhaps you would like to go to our ? -

-
-
- - \ No newline at end of file diff --git a/application/views/home/index.blade.php b/application/views/home/index.blade.php deleted file mode 100644 index d3c9bf17..00000000 --- a/application/views/home/index.blade.php +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Laravel: A Framework For Web Artisans - - {{ HTML::style('laravel/css/style.css') }} - - -
-
-

Laravel

-

A Framework For Web Artisans

- -

-

-
-
-
-

Learn the terrain.

- -

- You've landed yourself on our default home page. The route that - is generating this page lives at: -

- -
{{ path('app') }}routes.php
- -

And the view sitting before you can be found at:

- -
{{ path('app') }}views/home/index.blade.php
- -

Grow in knowledge.

- -

- Learning to use Laravel is amazingly simple thanks to - its {{ HTML::link('docs', 'wonderful documentation') }}. -

- -

Create something beautiful.

- -

- Now that you're up and running, it's time to start creating! - Here are some links to help you get started: -

- - -
-
-
- - diff --git a/artisan b/artisan index 02beb785..14ccfd6f 100644 --- a/artisan +++ b/artisan @@ -1,24 +1,73 @@ +#!/usr/bin/env php - * @link http://laravel.com - */ -// -------------------------------------------------------------- -// Set the core Laravel path constants. -// -------------------------------------------------------------- -require 'paths.php'; +/* +|-------------------------------------------------------------------------- +| Register The Composer Auto Loader +|-------------------------------------------------------------------------- +| +| Composer provides a convenient, automatically generated class loader +| for our application. We just need to utilize it! We'll require it +| into the script here so that we do not have to worry about the +| loading of any our classes "manually". Feels great to relax. +| +*/ -// -------------------------------------------------------------- -// Bootstrap the Laravel core. -// -------------------------------------------------------------- -require path('sys').'core.php'; +require __DIR__.'/vendor/autoload.php'; -// -------------------------------------------------------------- -// Launch the Laravel "Artisan" CLI. -// -------------------------------------------------------------- -require path('sys').'cli/artisan'.EXT; \ No newline at end of file +/* +|-------------------------------------------------------------------------- +| Register The Workbench Loaders +|-------------------------------------------------------------------------- +| +| The Laravel workbench provides a convenient place to develop packages +| when working locally. However we will need to load in the Composer +| auto-load files for the packages so that these can be used here. +| +*/ + +if (is_dir($workbench = __DIR__.'/workbench')) +{ + Illuminate\Workbench\Starter::start($workbench); +} + +/* +|-------------------------------------------------------------------------- +| Turn On The Lights +|-------------------------------------------------------------------------- +| +| We need to illuminate PHP development, so let's turn on the lights. +| This bootstrap the framework and gets it ready for use, then it +| will load up this application so that we can run it and send +| the responses back to the browser and delight these users. +| +*/ + +$app = require_once __DIR__.'/start.php'; + +/* +|-------------------------------------------------------------------------- +| Load The Artisan Console Application +|-------------------------------------------------------------------------- +| +| We'll need to run the script to load and return the Artisan console +| application. We keep this in its own script so that we will load +| the console application independent of running commands which +| will allow us to fire commands from Routes when we want to. +| +*/ + +$artisan = Illuminate\Console\Application::start($app); + +/* +|-------------------------------------------------------------------------- +| Run The Artisan Application +|-------------------------------------------------------------------------- +| +| When we run the console application, the current CLI command will be +| executed in this console and the response sent back to a terminal +| or another output device for the developers. Here goes nothing! +| +*/ + +$artisan->run(); \ No newline at end of file diff --git a/bundles/docs/libraries/markdown.php b/bundles/docs/libraries/markdown.php deleted file mode 100755 index b0a31a3f..00000000 --- a/bundles/docs/libraries/markdown.php +++ /dev/null @@ -1,2934 +0,0 @@ - -# -# Original Markdown -# Copyright (c) 2004-2006 John Gruber -# -# - - -define( 'MARKDOWN_VERSION', "1.0.1o" ); # Sun 8 Jan 2012 -define( 'MARKDOWNEXTRA_VERSION', "1.2.5" ); # Sun 8 Jan 2012 - - -# -# Global default settings: -# - -# Change to ">" for HTML output -@define( 'MARKDOWN_EMPTY_ELEMENT_SUFFIX', " />"); - -# Define the width of a tab for code blocks. -@define( 'MARKDOWN_TAB_WIDTH', 4 ); - -# Optional title attribute for footnote links and backlinks. -@define( 'MARKDOWN_FN_LINK_TITLE', "" ); -@define( 'MARKDOWN_FN_BACKLINK_TITLE', "" ); - -# Optional class attribute for footnote links and backlinks. -@define( 'MARKDOWN_FN_LINK_CLASS', "" ); -@define( 'MARKDOWN_FN_BACKLINK_CLASS', "" ); - - -# -# WordPress settings: -# - -# Change to false to remove Markdown from posts and/or comments. -@define( 'MARKDOWN_WP_POSTS', true ); -@define( 'MARKDOWN_WP_COMMENTS', true ); - - - -### Standard Function Interface ### - -@define( 'MARKDOWN_PARSER_CLASS', 'MarkdownExtra_Parser' ); - -function Markdown($text) { -# -# Initialize the parser and return the result of its transform method. -# - # Setup static parser variable. - static $parser; - if (!isset($parser)) { - $parser_class = MARKDOWN_PARSER_CLASS; - $parser = new $parser_class; - } - - # Transform text using parser. - return $parser->transform($text); -} - - -### WordPress Plugin Interface ### - -/* -Plugin Name: Markdown Extra -Plugin URI: http://michelf.com/projects/php-markdown/ -Description: Markdown syntax allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by John Gruber. More... -Version: 1.2.5 -Author: Michel Fortin -Author URI: http://michelf.com/ -*/ - -if (isset($wp_version)) { - # More details about how it works here: - # - - # Post content and excerpts - # - Remove WordPress paragraph generator. - # - Run Markdown on excerpt, then remove all tags. - # - Add paragraph tag around the excerpt, but remove it for the excerpt rss. - if (MARKDOWN_WP_POSTS) { - remove_filter('the_content', 'wpautop'); - remove_filter('the_content_rss', 'wpautop'); - remove_filter('the_excerpt', 'wpautop'); - add_filter('the_content', 'mdwp_MarkdownPost', 6); - add_filter('the_content_rss', 'mdwp_MarkdownPost', 6); - add_filter('get_the_excerpt', 'mdwp_MarkdownPost', 6); - add_filter('get_the_excerpt', 'trim', 7); - add_filter('the_excerpt', 'mdwp_add_p'); - add_filter('the_excerpt_rss', 'mdwp_strip_p'); - - remove_filter('content_save_pre', 'balanceTags', 50); - remove_filter('excerpt_save_pre', 'balanceTags', 50); - add_filter('the_content', 'balanceTags', 50); - add_filter('get_the_excerpt', 'balanceTags', 9); - } - - # Add a footnote id prefix to posts when inside a loop. - function mdwp_MarkdownPost($text) { - static $parser; - if (!$parser) { - $parser_class = MARKDOWN_PARSER_CLASS; - $parser = new $parser_class; - } - if (is_single() || is_page() || is_feed()) { - $parser->fn_id_prefix = ""; - } else { - $parser->fn_id_prefix = get_the_ID() . "."; - } - return $parser->transform($text); - } - - # Comments - # - Remove WordPress paragraph generator. - # - Remove WordPress auto-link generator. - # - Scramble important tags before passing them to the kses filter. - # - Run Markdown on excerpt then remove paragraph tags. - if (MARKDOWN_WP_COMMENTS) { - remove_filter('comment_text', 'wpautop', 30); - remove_filter('comment_text', 'make_clickable'); - add_filter('pre_comment_content', 'Markdown', 6); - add_filter('pre_comment_content', 'mdwp_hide_tags', 8); - add_filter('pre_comment_content', 'mdwp_show_tags', 12); - add_filter('get_comment_text', 'Markdown', 6); - add_filter('get_comment_excerpt', 'Markdown', 6); - add_filter('get_comment_excerpt', 'mdwp_strip_p', 7); - - global $mdwp_hidden_tags, $mdwp_placeholders; - $mdwp_hidden_tags = explode(' ', - '

 
  • '); - $mdwp_placeholders = explode(' ', str_rot13( - 'pEj07ZbbBZ U1kqgh4w4p pre2zmeN6K QTi31t9pre ol0MP1jzJR '. - 'ML5IjmbRol ulANi1NsGY J7zRLJqPul liA8ctl16T K9nhooUHli')); - } - - function mdwp_add_p($text) { - if (!preg_match('{^$|^<(p|ul|ol|dl|pre|blockquote)>}i', $text)) { - $text = '

    '.$text.'

    '; - $text = preg_replace('{\n{2,}}', "

    \n\n

    ", $text); - } - return $text; - } - - function mdwp_strip_p($t) { return preg_replace('{}i', '', $t); } - - function mdwp_hide_tags($text) { - global $mdwp_hidden_tags, $mdwp_placeholders; - return str_replace($mdwp_hidden_tags, $mdwp_placeholders, $text); - } - function mdwp_show_tags($text) { - global $mdwp_hidden_tags, $mdwp_placeholders; - return str_replace($mdwp_placeholders, $mdwp_hidden_tags, $text); - } -} - - -### bBlog Plugin Info ### - -function identify_modifier_markdown() { - return array( - 'name' => 'markdown', - 'type' => 'modifier', - 'nicename' => 'PHP Markdown Extra', - 'description' => 'A text-to-HTML conversion tool for web writers', - 'authors' => 'Michel Fortin and John Gruber', - 'licence' => 'GPL', - 'version' => MARKDOWNEXTRA_VERSION, - 'help' => 'Markdown syntax allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by John Gruber. More...', - ); -} - - -### Smarty Modifier Interface ### - -function smarty_modifier_markdown($text) { - return Markdown($text); -} - - -### Textile Compatibility Mode ### - -# Rename this file to "classTextile.php" and it can replace Textile everywhere. - -if (strcasecmp(substr(__FILE__, -16), "classTextile.php") == 0) { - # Try to include PHP SmartyPants. Should be in the same directory. - @include_once 'smartypants.php'; - # Fake Textile class. It calls Markdown instead. - class Textile { - function TextileThis($text, $lite='', $encode='') { - if ($lite == '' && $encode == '') $text = Markdown($text); - if (function_exists('SmartyPants')) $text = SmartyPants($text); - return $text; - } - # Fake restricted version: restrictions are not supported for now. - function TextileRestricted($text, $lite='', $noimage='') { - return $this->TextileThis($text, $lite); - } - # Workaround to ensure compatibility with TextPattern 4.0.3. - function blockLite($text) { return $text; } - } -} - - - -# -# Markdown Parser Class -# - -class Markdown_Parser { - - # Regex to match balanced [brackets]. - # Needed to insert a maximum bracked depth while converting to PHP. - var $nested_brackets_depth = 6; - var $nested_brackets_re; - - var $nested_url_parenthesis_depth = 4; - var $nested_url_parenthesis_re; - - # Table of hash values for escaped characters: - var $escape_chars = '\`*_{}[]()>#+-.!'; - var $escape_chars_re; - - # Change to ">" for HTML output. - var $empty_element_suffix = MARKDOWN_EMPTY_ELEMENT_SUFFIX; - var $tab_width = MARKDOWN_TAB_WIDTH; - - # Change to `true` to disallow markup or entities. - var $no_markup = false; - var $no_entities = false; - - # Predefined urls and titles for reference links and images. - var $predef_urls = array(); - var $predef_titles = array(); - - - function Markdown_Parser() { - # - # Constructor function. Initialize appropriate member variables. - # - $this->_initDetab(); - $this->prepareItalicsAndBold(); - - $this->nested_brackets_re = - str_repeat('(?>[^\[\]]+|\[', $this->nested_brackets_depth). - str_repeat('\])*', $this->nested_brackets_depth); - - $this->nested_url_parenthesis_re = - str_repeat('(?>[^()\s]+|\(', $this->nested_url_parenthesis_depth). - str_repeat('(?>\)))*', $this->nested_url_parenthesis_depth); - - $this->escape_chars_re = '['.preg_quote($this->escape_chars).']'; - - # Sort document, block, and span gamut in ascendent priority order. - asort($this->document_gamut); - asort($this->block_gamut); - asort($this->span_gamut); - } - - - # Internal hashes used during transformation. - var $urls = array(); - var $titles = array(); - var $html_hashes = array(); - - # Status flag to avoid invalid nesting. - var $in_anchor = false; - - - function setup() { - # - # Called before the transformation process starts to setup parser - # states. - # - # Clear global hashes. - $this->urls = $this->predef_urls; - $this->titles = $this->predef_titles; - $this->html_hashes = array(); - - $in_anchor = false; - } - - function teardown() { - # - # Called after the transformation process to clear any variable - # which may be taking up memory unnecessarly. - # - $this->urls = array(); - $this->titles = array(); - $this->html_hashes = array(); - } - - - function transform($text) { - # - # Main function. Performs some preprocessing on the input text - # and pass it through the document gamut. - # - $this->setup(); - - # Remove UTF-8 BOM and marker character in input, if present. - $text = preg_replace('{^\xEF\xBB\xBF|\x1A}', '', $text); - - # Standardize line endings: - # DOS to Unix and Mac to Unix - $text = preg_replace('{\r\n?}', "\n", $text); - - # Make sure $text ends with a couple of newlines: - $text .= "\n\n"; - - # Convert all tabs to spaces. - $text = $this->detab($text); - - # Turn block-level HTML blocks into hash entries - $text = $this->hashHTMLBlocks($text); - - # Strip any lines consisting only of spaces and tabs. - # This makes subsequent regexen easier to write, because we can - # match consecutive blank lines with /\n+/ instead of something - # contorted like /[ ]*\n+/ . - $text = preg_replace('/^[ ]+$/m', '', $text); - - # Run document gamut methods. - foreach ($this->document_gamut as $method => $priority) { - $text = $this->$method($text); - } - - $this->teardown(); - - return $text . "\n"; - } - - var $document_gamut = array( - # Strip link definitions, store in hashes. - "stripLinkDefinitions" => 20, - - "runBasicBlockGamut" => 30, - ); - - - function stripLinkDefinitions($text) { - # - # Strips link definitions from text, stores the URLs and titles in - # hash references. - # - $less_than_tab = $this->tab_width - 1; - - # Link defs are in the form: ^[id]: url "optional title" - $text = preg_replace_callback('{ - ^[ ]{0,'.$less_than_tab.'}\[(.+)\][ ]?: # id = $1 - [ ]* - \n? # maybe *one* newline - [ ]* - (?: - <(.+?)> # url = $2 - | - (\S+?) # url = $3 - ) - [ ]* - \n? # maybe one newline - [ ]* - (?: - (?<=\s) # lookbehind for whitespace - ["(] - (.*?) # title = $4 - [")] - [ ]* - )? # title is optional - (?:\n+|\Z) - }xm', - array(&$this, '_stripLinkDefinitions_callback'), - $text); - return $text; - } - function _stripLinkDefinitions_callback($matches) { - $link_id = strtolower($matches[1]); - $url = $matches[2] == '' ? $matches[3] : $matches[2]; - $this->urls[$link_id] = $url; - $this->titles[$link_id] =& $matches[4]; - return ''; # String that will replace the block - } - - - function hashHTMLBlocks($text) { - if ($this->no_markup) return $text; - - $less_than_tab = $this->tab_width - 1; - - # Hashify HTML blocks: - # We only want to do this for block-level HTML tags, such as headers, - # lists, and tables. That's because we still want to wrap

    s around - # "paragraphs" that are wrapped in non-block-level tags, such as anchors, - # phrase emphasis, and spans. The list of tags we're looking for is - # hard-coded: - # - # * List "a" is made of tags which can be both inline or block-level. - # These will be treated block-level when the start tag is alone on - # its line, otherwise they're not matched here and will be taken as - # inline later. - # * List "b" is made of tags which are always block-level; - # - $block_tags_a_re = 'ins|del'; - $block_tags_b_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|'. - 'script|noscript|form|fieldset|iframe|math'; - - # Regular expression for the content of a block tag. - $nested_tags_level = 4; - $attr = ' - (?> # optional tag attributes - \s # starts with whitespace - (?> - [^>"/]+ # text outside quotes - | - /+(?!>) # slash not followed by ">" - | - "[^"]*" # text inside double quotes (tolerate ">") - | - \'[^\']*\' # text inside single quotes (tolerate ">") - )* - )? - '; - $content = - str_repeat(' - (?> - [^<]+ # content without tag - | - <\2 # nested opening tag - '.$attr.' # attributes - (?> - /> - | - >', $nested_tags_level). # end of opening tag - '.*?'. # last level nested tag content - str_repeat(' - # closing nested tag - ) - | - <(?!/\2\s*> # other tags with a different name - ) - )*', - $nested_tags_level); - $content2 = str_replace('\2', '\3', $content); - - # First, look for nested blocks, e.g.: - #

    - #
    - # tags for inner block must be indented. - #
    - #
    - # - # The outermost tags must start at the left margin for this to match, and - # the inner nested divs must be indented. - # We need to do this before the next, more liberal match, because the next - # match will start at the first `
    ` and stop at the first `
    `. - $text = preg_replace_callback('{(?> - (?> - (?<=\n\n) # Starting after a blank line - | # or - \A\n? # the beginning of the doc - ) - ( # save in $1 - - # Match from `\n` to `\n`, handling nested tags - # in between. - - [ ]{0,'.$less_than_tab.'} - <('.$block_tags_b_re.')# start tag = $2 - '.$attr.'> # attributes followed by > and \n - '.$content.' # content, support nesting - # the matching end tag - [ ]* # trailing spaces/tabs - (?=\n+|\Z) # followed by a newline or end of document - - | # Special version for tags of group a. - - [ ]{0,'.$less_than_tab.'} - <('.$block_tags_a_re.')# start tag = $3 - '.$attr.'>[ ]*\n # attributes followed by > - '.$content2.' # content, support nesting - # the matching end tag - [ ]* # trailing spaces/tabs - (?=\n+|\Z) # followed by a newline or end of document - - | # Special case just for
    . It was easier to make a special - # case than to make the other regex more complicated. - - [ ]{0,'.$less_than_tab.'} - <(hr) # start tag = $2 - '.$attr.' # attributes - /?> # the matching end tag - [ ]* - (?=\n{2,}|\Z) # followed by a blank line or end of document - - | # Special case for standalone HTML comments: - - [ ]{0,'.$less_than_tab.'} - (?s: - - ) - [ ]* - (?=\n{2,}|\Z) # followed by a blank line or end of document - - | # PHP and ASP-style processor instructions ( - ) - [ ]* - (?=\n{2,}|\Z) # followed by a blank line or end of document - - ) - )}Sxmi', - array(&$this, '_hashHTMLBlocks_callback'), - $text); - - return $text; - } - function _hashHTMLBlocks_callback($matches) { - $text = $matches[1]; - $key = $this->hashBlock($text); - return "\n\n$key\n\n"; - } - - - function hashPart($text, $boundary = 'X') { - # - # Called whenever a tag must be hashed when a function insert an atomic - # element in the text stream. Passing $text to through this function gives - # a unique text-token which will be reverted back when calling unhash. - # - # The $boundary argument specify what character should be used to surround - # the token. By convension, "B" is used for block elements that needs not - # to be wrapped into paragraph tags at the end, ":" is used for elements - # that are word separators and "X" is used in the general case. - # - # Swap back any tag hash found in $text so we do not have to `unhash` - # multiple times at the end. - $text = $this->unhash($text); - - # Then hash the block. - static $i = 0; - $key = "$boundary\x1A" . ++$i . $boundary; - $this->html_hashes[$key] = $text; - return $key; # String that will replace the tag. - } - - - function hashBlock($text) { - # - # Shortcut function for hashPart with block-level boundaries. - # - return $this->hashPart($text, 'B'); - } - - - var $block_gamut = array( - # - # These are all the transformations that form block-level - # tags like paragraphs, headers, and list items. - # - "doHeaders" => 10, - "doHorizontalRules" => 20, - - "doLists" => 40, - "doCodeBlocks" => 50, - "doBlockQuotes" => 60, - ); - - function runBlockGamut($text) { - # - # Run block gamut tranformations. - # - # We need to escape raw HTML in Markdown source before doing anything - # else. This need to be done for each block, and not only at the - # begining in the Markdown function since hashed blocks can be part of - # list items and could have been indented. Indented blocks would have - # been seen as a code block in a previous pass of hashHTMLBlocks. - $text = $this->hashHTMLBlocks($text); - - return $this->runBasicBlockGamut($text); - } - - function runBasicBlockGamut($text) { - # - # Run block gamut tranformations, without hashing HTML blocks. This is - # useful when HTML blocks are known to be already hashed, like in the first - # whole-document pass. - # - foreach ($this->block_gamut as $method => $priority) { - $text = $this->$method($text); - } - - # Finally form paragraph and restore hashed blocks. - $text = $this->formParagraphs($text); - - return $text; - } - - - function doHorizontalRules($text) { - # Do Horizontal Rules: - return preg_replace( - '{ - ^[ ]{0,3} # Leading space - ([-*_]) # $1: First marker - (?> # Repeated marker group - [ ]{0,2} # Zero, one, or two spaces. - \1 # Marker character - ){2,} # Group repeated at least twice - [ ]* # Tailing spaces - $ # End of line. - }mx', - "\n".$this->hashBlock("empty_element_suffix")."\n", - $text); - } - - - var $span_gamut = array( - # - # These are all the transformations that occur *within* block-level - # tags like paragraphs, headers, and list items. - # - # Process character escapes, code spans, and inline HTML - # in one shot. - "parseSpan" => -30, - - # Process anchor and image tags. Images must come first, - # because ![foo][f] looks like an anchor. - "doImages" => 10, - "doAnchors" => 20, - - # Make links out of things like `` - # Must come after doAnchors, because you can use < and > - # delimiters in inline links like [this](). - "doAutoLinks" => 30, - "encodeAmpsAndAngles" => 40, - - "doItalicsAndBold" => 50, - "doHardBreaks" => 60, - ); - - function runSpanGamut($text) { - # - # Run span gamut tranformations. - # - foreach ($this->span_gamut as $method => $priority) { - $text = $this->$method($text); - } - - return $text; - } - - - function doHardBreaks($text) { - # Do hard breaks: - return preg_replace_callback('/ {2,}\n/', - array(&$this, '_doHardBreaks_callback'), $text); - } - function _doHardBreaks_callback($matches) { - return $this->hashPart("empty_element_suffix\n"); - } - - - function doAnchors($text) { - # - # Turn Markdown link shortcuts into XHTML tags. - # - if ($this->in_anchor) return $text; - $this->in_anchor = true; - - # - # First, handle reference-style links: [link text] [id] - # - $text = preg_replace_callback('{ - ( # wrap whole match in $1 - \[ - ('.$this->nested_brackets_re.') # link text = $2 - \] - - [ ]? # one optional space - (?:\n[ ]*)? # one optional newline followed by spaces - - \[ - (.*?) # id = $3 - \] - ) - }xs', - array(&$this, '_doAnchors_reference_callback'), $text); - - # - # Next, inline-style links: [link text](url "optional title") - # - $text = preg_replace_callback('{ - ( # wrap whole match in $1 - \[ - ('.$this->nested_brackets_re.') # link text = $2 - \] - \( # literal paren - [ \n]* - (?: - <(.+?)> # href = $3 - | - ('.$this->nested_url_parenthesis_re.') # href = $4 - ) - [ \n]* - ( # $5 - ([\'"]) # quote char = $6 - (.*?) # Title = $7 - \6 # matching quote - [ \n]* # ignore any spaces/tabs between closing quote and ) - )? # title is optional - \) - ) - }xs', - array(&$this, '_doAnchors_inline_callback'), $text); - - # - # Last, handle reference-style shortcuts: [link text] - # These must come last in case you've also got [link text][1] - # or [link text](/foo) - # - $text = preg_replace_callback('{ - ( # wrap whole match in $1 - \[ - ([^\[\]]+) # link text = $2; can\'t contain [ or ] - \] - ) - }xs', - array(&$this, '_doAnchors_reference_callback'), $text); - - $this->in_anchor = false; - return $text; - } - function _doAnchors_reference_callback($matches) { - $whole_match = $matches[1]; - $link_text = $matches[2]; - $link_id =& $matches[3]; - - if ($link_id == "") { - # for shortcut links like [this][] or [this]. - $link_id = $link_text; - } - - # lower-case and turn embedded newlines into spaces - $link_id = strtolower($link_id); - $link_id = preg_replace('{[ ]?\n}', ' ', $link_id); - - if (isset($this->urls[$link_id])) { - $url = $this->urls[$link_id]; - $url = URL::to($url); - $url = $this->encodeAttribute($url); - - $result = "titles[$link_id] ) ) { - $title = $this->titles[$link_id]; - $title = $this->encodeAttribute($title); - $result .= " title=\"$title\""; - } - - $link_text = $this->runSpanGamut($link_text); - $result .= ">$link_text"; - $result = $this->hashPart($result); - } - else { - $result = $whole_match; - } - return $result; - } - function _doAnchors_inline_callback($matches) { - $whole_match = $matches[1]; - $link_text = $this->runSpanGamut($matches[2]); - $url = $matches[3] == '' ? $matches[4] : $matches[3]; - $title =& $matches[7]; - - $url = URL::to($url); - $url = $this->encodeAttribute($url); - - $result = "encodeAttribute($title); - $result .= " title=\"$title\""; - } - - $link_text = $this->runSpanGamut($link_text); - $result .= ">$link_text"; - - return $this->hashPart($result); - } - - - function doImages($text) { - # - # Turn Markdown image shortcuts into tags. - # - # - # First, handle reference-style labeled images: ![alt text][id] - # - $text = preg_replace_callback('{ - ( # wrap whole match in $1 - !\[ - ('.$this->nested_brackets_re.') # alt text = $2 - \] - - [ ]? # one optional space - (?:\n[ ]*)? # one optional newline followed by spaces - - \[ - (.*?) # id = $3 - \] - - ) - }xs', - array(&$this, '_doImages_reference_callback'), $text); - - # - # Next, handle inline images: ![alt text](url "optional title") - # Don't forget: encode * and _ - # - $text = preg_replace_callback('{ - ( # wrap whole match in $1 - !\[ - ('.$this->nested_brackets_re.') # alt text = $2 - \] - \s? # One optional whitespace character - \( # literal paren - [ \n]* - (?: - <(\S*)> # src url = $3 - | - ('.$this->nested_url_parenthesis_re.') # src url = $4 - ) - [ \n]* - ( # $5 - ([\'"]) # quote char = $6 - (.*?) # title = $7 - \6 # matching quote - [ \n]* - )? # title is optional - \) - ) - }xs', - array(&$this, '_doImages_inline_callback'), $text); - - return $text; - } - function _doImages_reference_callback($matches) { - $whole_match = $matches[1]; - $alt_text = $matches[2]; - $link_id = strtolower($matches[3]); - - if ($link_id == "") { - $link_id = strtolower($alt_text); # for shortcut links like ![this][]. - } - - $alt_text = $this->encodeAttribute($alt_text); - if (isset($this->urls[$link_id])) { - $url = $this->encodeAttribute($this->urls[$link_id]); - $result = "\"$alt_text\"";titles[$link_id])) { - $title = $this->titles[$link_id]; - $title = $this->encodeAttribute($title); - $result .= " title=\"$title\""; - } - $result .= $this->empty_element_suffix; - $result = $this->hashPart($result); - } - else { - # If there's no such link ID, leave intact: - $result = $whole_match; - } - - return $result; - } - function _doImages_inline_callback($matches) { - $whole_match = $matches[1]; - $alt_text = $matches[2]; - $url = $matches[3] == '' ? $matches[4] : $matches[3]; - $title =& $matches[7]; - - $alt_text = $this->encodeAttribute($alt_text); - $url = $this->encodeAttribute($url); - $result = "\"$alt_text\"";encodeAttribute($title); - $result .= " title=\"$title\""; # $title already quoted - } - $result .= $this->empty_element_suffix; - - return $this->hashPart($result); - } - - - function doHeaders($text) { - # Setext-style headers: - # Header 1 - # ======== - # - # Header 2 - # -------- - # - $text = preg_replace_callback('{ ^(.+?)[ ]*\n(=+|-+)[ ]*\n+ }mx', - array(&$this, '_doHeaders_callback_setext'), $text); - - # atx-style headers: - # # Header 1 - # ## Header 2 - # ## Header 2 with closing hashes ## - # ... - # ###### Header 6 - # - $text = preg_replace_callback('{ - ^(\#{1,6}) # $1 = string of #\'s - [ ]* - (.+?) # $2 = Header text - [ ]* - \#* # optional closing #\'s (not counted) - \n+ - }xm', - array(&$this, '_doHeaders_callback_atx'), $text); - - return $text; - } - function _doHeaders_callback_setext($matches) { - # Terrible hack to check we haven't found an empty list item. - if ($matches[2] == '-' && preg_match('{^-(?: |$)}', $matches[1])) - return $matches[0]; - - $level = $matches[2]{0} == '=' ? 1 : 2; - $block = "".$this->runSpanGamut($matches[1]).""; - return "\n" . $this->hashBlock($block) . "\n\n"; - } - function _doHeaders_callback_atx($matches) { - $level = strlen($matches[1]); - $block = "".$this->runSpanGamut($matches[2]).""; - return "\n" . $this->hashBlock($block) . "\n\n"; - } - - - function doLists($text) { - # - # Form HTML ordered (numbered) and unordered (bulleted) lists. - # - $less_than_tab = $this->tab_width - 1; - - # Re-usable patterns to match list item bullets and number markers: - $marker_ul_re = '[*+-]'; - $marker_ol_re = '\d+[\.]'; - $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)"; - - $markers_relist = array( - $marker_ul_re => $marker_ol_re, - $marker_ol_re => $marker_ul_re, - ); - - foreach ($markers_relist as $marker_re => $other_marker_re) { - # Re-usable pattern to match any entirel ul or ol list: - $whole_list_re = ' - ( # $1 = whole list - ( # $2 - ([ ]{0,'.$less_than_tab.'}) # $3 = number of spaces - ('.$marker_re.') # $4 = first list item marker - [ ]+ - ) - (?s:.+?) - ( # $5 - \z - | - \n{2,} - (?=\S) - (?! # Negative lookahead for another list item marker - [ ]* - '.$marker_re.'[ ]+ - ) - | - (?= # Lookahead for another kind of list - \n - \3 # Must have the same indentation - '.$other_marker_re.'[ ]+ - ) - ) - ) - '; // mx - - # We use a different prefix before nested lists than top-level lists. - # See extended comment in _ProcessListItems(). - - if ($this->list_level) { - $text = preg_replace_callback('{ - ^ - '.$whole_list_re.' - }mx', - array(&$this, '_doLists_callback'), $text); - } - else { - $text = preg_replace_callback('{ - (?:(?<=\n)\n|\A\n?) # Must eat the newline - '.$whole_list_re.' - }mx', - array(&$this, '_doLists_callback'), $text); - } - } - - return $text; - } - function _doLists_callback($matches) { - # Re-usable patterns to match list item bullets and number markers: - $marker_ul_re = '[*+-]'; - $marker_ol_re = '\d+[\.]'; - $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)"; - - $list = $matches[1]; - $list_type = preg_match("/$marker_ul_re/", $matches[4]) ? "ul" : "ol"; - - $marker_any_re = ( $list_type == "ul" ? $marker_ul_re : $marker_ol_re ); - - $list .= "\n"; - $result = $this->processListItems($list, $marker_any_re); - - $result = $this->hashBlock("<$list_type>\n" . $result . ""); - return "\n". $result ."\n\n"; - } - - var $list_level = 0; - - function processListItems($list_str, $marker_any_re) { - # - # Process the contents of a single ordered or unordered list, splitting it - # into individual list items. - # - # The $this->list_level global keeps track of when we're inside a list. - # Each time we enter a list, we increment it; when we leave a list, - # we decrement. If it's zero, we're not in a list anymore. - # - # We do this because when we're not inside a list, we want to treat - # something like this: - # - # I recommend upgrading to version - # 8. Oops, now this line is treated - # as a sub-list. - # - # As a single paragraph, despite the fact that the second line starts - # with a digit-period-space sequence. - # - # Whereas when we're inside a list (or sub-list), that line will be - # treated as the start of a sub-list. What a kludge, huh? This is - # an aspect of Markdown's syntax that's hard to parse perfectly - # without resorting to mind-reading. Perhaps the solution is to - # change the syntax rules such that sub-lists must start with a - # starting cardinal number; e.g. "1." or "a.". - - $this->list_level++; - - # trim trailing blank lines: - $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str); - - $list_str = preg_replace_callback('{ - (\n)? # leading line = $1 - (^[ ]*) # leading whitespace = $2 - ('.$marker_any_re.' # list marker and space = $3 - (?:[ ]+|(?=\n)) # space only required if item is not empty - ) - ((?s:.*?)) # list item text = $4 - (?:(\n+(?=\n))|\n) # tailing blank line = $5 - (?= \n* (\z | \2 ('.$marker_any_re.') (?:[ ]+|(?=\n)))) - }xm', - array(&$this, '_processListItems_callback'), $list_str); - - $this->list_level--; - return $list_str; - } - function _processListItems_callback($matches) { - $item = $matches[4]; - $leading_line =& $matches[1]; - $leading_space =& $matches[2]; - $marker_space = $matches[3]; - $tailing_blank_line =& $matches[5]; - - if ($leading_line || $tailing_blank_line || - preg_match('/\n{2,}/', $item)) - { - # Replace marker with the appropriate whitespace indentation - $item = $leading_space . str_repeat(' ', strlen($marker_space)) . $item; - $item = $this->runBlockGamut($this->outdent($item)."\n"); - } - else { - # Recursion for sub-lists: - $item = $this->doLists($this->outdent($item)); - $item = preg_replace('/\n+$/', '', $item); - $item = $this->runSpanGamut($item); - } - - return "
  • " . $item . "
  • \n"; - } - - - function doCodeBlocks($text) { - # - # Process Markdown `
    ` blocks.
    -	#
    -		$text = preg_replace_callback('{
    -				(?:\n\n|\A\n?)
    -				(	            # $1 = the code block -- one or more lines, starting with a space/tab
    -				  (?>
    -					[ ]{'.$this->tab_width.'}  # Lines must start with a tab or a tab-width of spaces
    -					.*\n+
    -				  )+
    -				)
    -				((?=^[ ]{0,'.$this->tab_width.'}\S)|\Z)	# Lookahead for non-space at line-start, or end of doc
    -			}xm',
    -			array(&$this, '_doCodeBlocks_callback'), $text);
    -
    -		return $text;
    -	}
    -	function _doCodeBlocks_callback($matches) {
    -		$codeblock = $matches[1];
    -
    -		$codeblock = $this->outdent($codeblock);
    -		$codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);
    -
    -		# trim leading newlines and trailing newlines
    -		$codeblock = preg_replace('/\A\n+|\n+\z/', '', $codeblock);
    -
    -		$codeblock = "
    $codeblock\n
    "; - return "\n\n".$this->hashBlock($codeblock)."\n\n"; - } - - - function makeCodeSpan($code) { - # - # Create a code span markup for $code. Called from handleSpanToken. - # - $code = htmlspecialchars(trim($code), ENT_NOQUOTES); - return $this->hashPart("$code"); - } - - - var $em_relist = array( - '' => '(?:(? '(?<=\S|^)(? '(?<=\S|^)(? '(?:(? '(?<=\S|^)(? '(?<=\S|^)(? '(?:(? '(?<=\S|^)(? '(?<=\S|^)(?em_relist as $em => $em_re) { - foreach ($this->strong_relist as $strong => $strong_re) { - # Construct list of allowed token expressions. - $token_relist = array(); - if (isset($this->em_strong_relist["$em$strong"])) { - $token_relist[] = $this->em_strong_relist["$em$strong"]; - } - $token_relist[] = $em_re; - $token_relist[] = $strong_re; - - # Construct master expression from list. - $token_re = '{('. implode('|', $token_relist) .')}'; - $this->em_strong_prepared_relist["$em$strong"] = $token_re; - } - } - } - - function doItalicsAndBold($text) { - $token_stack = array(''); - $text_stack = array(''); - $em = ''; - $strong = ''; - $tree_char_em = false; - - while (1) { - # - # Get prepared regular expression for seraching emphasis tokens - # in current context. - # - $token_re = $this->em_strong_prepared_relist["$em$strong"]; - - # - # Each loop iteration search for the next emphasis token. - # Each token is then passed to handleSpanToken. - # - $parts = preg_split($token_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE); - $text_stack[0] .= $parts[0]; - $token =& $parts[1]; - $text =& $parts[2]; - - if (empty($token)) { - # Reached end of text span: empty stack without emitting. - # any more emphasis. - while ($token_stack[0]) { - $text_stack[1] .= array_shift($token_stack); - $text_stack[0] .= array_shift($text_stack); - } - break; - } - - $token_len = strlen($token); - if ($tree_char_em) { - # Reached closing marker while inside a three-char emphasis. - if ($token_len == 3) { - # Three-char closing marker, close em and strong. - array_shift($token_stack); - $span = array_shift($text_stack); - $span = $this->runSpanGamut($span); - $span = "$span"; - $text_stack[0] .= $this->hashPart($span); - $em = ''; - $strong = ''; - } else { - # Other closing marker: close one em or strong and - # change current token state to match the other - $token_stack[0] = str_repeat($token{0}, 3-$token_len); - $tag = $token_len == 2 ? "strong" : "em"; - $span = $text_stack[0]; - $span = $this->runSpanGamut($span); - $span = "<$tag>$span"; - $text_stack[0] = $this->hashPart($span); - $$tag = ''; # $$tag stands for $em or $strong - } - $tree_char_em = false; - } else if ($token_len == 3) { - if ($em) { - # Reached closing marker for both em and strong. - # Closing strong marker: - for ($i = 0; $i < 2; ++$i) { - $shifted_token = array_shift($token_stack); - $tag = strlen($shifted_token) == 2 ? "strong" : "em"; - $span = array_shift($text_stack); - $span = $this->runSpanGamut($span); - $span = "<$tag>$span"; - $text_stack[0] .= $this->hashPart($span); - $$tag = ''; # $$tag stands for $em or $strong - } - } else { - # Reached opening three-char emphasis marker. Push on token - # stack; will be handled by the special condition above. - $em = $token{0}; - $strong = "$em$em"; - array_unshift($token_stack, $token); - array_unshift($text_stack, ''); - $tree_char_em = true; - } - } else if ($token_len == 2) { - if ($strong) { - # Unwind any dangling emphasis marker: - if (strlen($token_stack[0]) == 1) { - $text_stack[1] .= array_shift($token_stack); - $text_stack[0] .= array_shift($text_stack); - } - # Closing strong marker: - array_shift($token_stack); - $span = array_shift($text_stack); - $span = $this->runSpanGamut($span); - $span = "$span"; - $text_stack[0] .= $this->hashPart($span); - $strong = ''; - } else { - array_unshift($token_stack, $token); - array_unshift($text_stack, ''); - $strong = $token; - } - } else { - # Here $token_len == 1 - if ($em) { - if (strlen($token_stack[0]) == 1) { - # Closing emphasis marker: - array_shift($token_stack); - $span = array_shift($text_stack); - $span = $this->runSpanGamut($span); - $span = "$span"; - $text_stack[0] .= $this->hashPart($span); - $em = ''; - } else { - $text_stack[0] .= $token; - } - } else { - array_unshift($token_stack, $token); - array_unshift($text_stack, ''); - $em = $token; - } - } - } - return $text_stack[0]; - } - - - function doBlockQuotes($text) { - $text = preg_replace_callback('/ - ( # Wrap whole match in $1 - (?> - ^[ ]*>[ ]? # ">" at the start of a line - .+\n # rest of the first line - (.+\n)* # subsequent consecutive lines - \n* # blanks - )+ - ) - /xm', - array(&$this, '_doBlockQuotes_callback'), $text); - - return $text; - } - function _doBlockQuotes_callback($matches) { - $bq = $matches[1]; - # trim one level of quoting - trim whitespace-only lines - $bq = preg_replace('/^[ ]*>[ ]?|^[ ]+$/m', '', $bq); - $bq = $this->runBlockGamut($bq); # recurse - - $bq = preg_replace('/^/m', " ", $bq); - # These leading spaces cause problem with
     content, 
    -		# so we need to fix that:
    -		$bq = preg_replace_callback('{(\s*
    .+?
    )}sx', - array(&$this, '_doBlockQuotes_callback2'), $bq); - - return "\n". $this->hashBlock("
    \n$bq\n
    ")."\n\n"; - } - function _doBlockQuotes_callback2($matches) { - $pre = $matches[1]; - $pre = preg_replace('/^ /m', '', $pre); - return $pre; - } - - - function formParagraphs($text) { - # - # Params: - # $text - string to process with html

    tags - # - # Strip leading and trailing lines: - $text = preg_replace('/\A\n+|\n+\z/', '', $text); - - $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY); - - # - # Wrap

    tags and unhashify HTML blocks - # - foreach ($grafs as $key => $value) { - if (!preg_match('/^B\x1A[0-9]+B$/', $value)) { - # Is a paragraph. - $value = $this->runSpanGamut($value); - $value = preg_replace('/^([ ]*)/', "

    ", $value); - $value .= "

    "; - $grafs[$key] = $this->unhash($value); - } - else { - # Is a block. - # Modify elements of @grafs in-place... - $graf = $value; - $block = $this->html_hashes[$graf]; - $graf = $block; -// if (preg_match('{ -// \A -// ( # $1 =
    tag -//
    ]* -// \b -// markdown\s*=\s* ([\'"]) # $2 = attr quote char -// 1 -// \2 -// [^>]* -// > -// ) -// ( # $3 = contents -// .* -// ) -// (
    ) # $4 = closing tag -// \z -// }xs', $block, $matches)) -// { -// list(, $div_open, , $div_content, $div_close) = $matches; -// -// # We can't call Markdown(), because that resets the hash; -// # that initialization code should be pulled into its own sub, though. -// $div_content = $this->hashHTMLBlocks($div_content); -// -// # Run document gamut methods on the content. -// foreach ($this->document_gamut as $method => $priority) { -// $div_content = $this->$method($div_content); -// } -// -// $div_open = preg_replace( -// '{\smarkdown\s*=\s*([\'"]).+?\1}', '', $div_open); -// -// $graf = $div_open . "\n" . $div_content . "\n" . $div_close; -// } - $grafs[$key] = $graf; - } - } - - return implode("\n\n", $grafs); - } - - - function encodeAttribute($text) { - # - # Encode text for a double-quoted HTML attribute. This function - # is *not* suitable for attributes enclosed in single quotes. - # - $text = $this->encodeAmpsAndAngles($text); - $text = str_replace('"', '"', $text); - return $text; - } - - - function encodeAmpsAndAngles($text) { - # - # Smart processing for ampersands and angle brackets that need to - # be encoded. Valid character entities are left alone unless the - # no-entities mode is set. - # - if ($this->no_entities) { - $text = str_replace('&', '&', $text); - } else { - # Ampersand-encoding based entirely on Nat Irons's Amputator - # MT plugin: - $text = preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/', - '&', $text);; - } - # Encode remaining <'s - $text = str_replace('<', '<', $text); - - return $text; - } - - - function doAutoLinks($text) { - $text = preg_replace_callback('{<((https?|ftp|dict):[^\'">\s]+)>}i', - array(&$this, '_doAutoLinks_url_callback'), $text); - - # Email addresses: - $text = preg_replace_callback('{ - < - (?:mailto:)? - ( - (?: - [-!#$%&\'*+/=?^_`.{|}~\w\x80-\xFF]+ - | - ".*?" - ) - \@ - (?: - [-a-z0-9\x80-\xFF]+(\.[-a-z0-9\x80-\xFF]+)*\.[a-z]+ - | - \[[\d.a-fA-F:]+\] # IPv4 & IPv6 - ) - ) - > - }xi', - array(&$this, '_doAutoLinks_email_callback'), $text); - - return $text; - } - function _doAutoLinks_url_callback($matches) { - $url = $this->encodeAttribute($matches[1]); - $link = "$url"; - return $this->hashPart($link); - } - function _doAutoLinks_email_callback($matches) { - $address = $matches[1]; - $link = $this->encodeEmailAddress($address); - return $this->hashPart($link); - } - - - function encodeEmailAddress($addr) { - # - # Input: an email address, e.g. "foo@example.com" - # - # Output: the email address as a mailto link, with each character - # of the address encoded as either a decimal or hex entity, in - # the hopes of foiling most address harvesting spam bots. E.g.: - # - #

    foo@exampl - # e.com

    - # - # Based by a filter by Matthew Wickline, posted to BBEdit-Talk. - # With some optimizations by Milian Wolff. - # - $addr = "mailto:" . $addr; - $chars = preg_split('/(? $char) { - $ord = ord($char); - # Ignore non-ascii chars. - if ($ord < 128) { - $r = ($seed * (1 + $key)) % 100; # Pseudo-random function. - # roughly 10% raw, 45% hex, 45% dec - # '@' *must* be encoded. I insist. - if ($r > 90 && $char != '@') /* do nothing */; - else if ($r < 45) $chars[$key] = '&#x'.dechex($ord).';'; - else $chars[$key] = '&#'.$ord.';'; - } - } - - $addr = implode('', $chars); - $text = implode('', array_slice($chars, 7)); # text without `mailto:` - $addr = "$text"; - - return $addr; - } - - - function parseSpan($str) { - # - # Take the string $str and parse it into tokens, hashing embeded HTML, - # escaped characters and handling code spans. - # - $output = ''; - - $span_re = '{ - ( - \\\\'.$this->escape_chars_re.' - | - (?no_markup ? '' : ' - | - # comment - | - <\?.*?\?> | <%.*?%> # processing instruction - | - <[/!$]?[-a-zA-Z0-9:_]+ # regular tags - (?> - \s - (?>[^"\'>]+|"[^"]*"|\'[^\']*\')* - )? - > - ').' - ) - }xs'; - - while (1) { - # - # Each loop iteration seach for either the next tag, the next - # openning code span marker, or the next escaped character. - # Each token is then passed to handleSpanToken. - # - $parts = preg_split($span_re, $str, 2, PREG_SPLIT_DELIM_CAPTURE); - - # Create token from text preceding tag. - if ($parts[0] != "") { - $output .= $parts[0]; - } - - # Check if we reach the end. - if (isset($parts[1])) { - $output .= $this->handleSpanToken($parts[1], $parts[2]); - $str = $parts[2]; - } - else { - break; - } - } - - return $output; - } - - - function handleSpanToken($token, &$str) { - # - # Handle $token provided by parseSpan by determining its nature and - # returning the corresponding value that should replace it. - # - switch ($token{0}) { - case "\\": - return $this->hashPart("&#". ord($token{1}). ";"); - case "`": - # Search for end marker in remaining text. - if (preg_match('/^(.*?[^`])'.preg_quote($token).'(?!`)(.*)$/sm', - $str, $matches)) - { - $str = $matches[2]; - $codespan = $this->makeCodeSpan($matches[1]); - return $this->hashPart($codespan); - } - return $token; // return as text since no ending marker found. - default: - return $this->hashPart($token); - } - } - - - function outdent($text) { - # - # Remove one level of line-leading tabs or spaces - # - return preg_replace('/^(\t|[ ]{1,'.$this->tab_width.'})/m', '', $text); - } - - - # String length function for detab. `_initDetab` will create a function to - # hanlde UTF-8 if the default function does not exist. - var $utf8_strlen = 'mb_strlen'; - - function detab($text) { - # - # Replace tabs with the appropriate amount of space. - # - # For each line we separate the line in blocks delemited by - # tab characters. Then we reconstruct every line by adding the - # appropriate number of space between each blocks. - - $text = preg_replace_callback('/^.*\t.*$/m', - array(&$this, '_detab_callback'), $text); - - return $text; - } - function _detab_callback($matches) { - $line = $matches[0]; - $strlen = $this->utf8_strlen; # strlen function for UTF-8. - - # Split in blocks. - $blocks = explode("\t", $line); - # Add each blocks to the line. - $line = $blocks[0]; - unset($blocks[0]); # Do not add first block twice. - foreach ($blocks as $block) { - # Calculate amount of space, insert spaces, insert block. - $amount = $this->tab_width - - $strlen($line, 'UTF-8') % $this->tab_width; - $line .= str_repeat(" ", $amount) . $block; - } - return $line; - } - function _initDetab() { - # - # Check for the availability of the function in the `utf8_strlen` property - # (initially `mb_strlen`). If the function is not available, create a - # function that will loosely count the number of UTF-8 characters with a - # regular expression. - # - if (function_exists($this->utf8_strlen)) return; - $this->utf8_strlen = create_function('$text', 'return preg_match_all( - "/[\\\\x00-\\\\xBF]|[\\\\xC0-\\\\xFF][\\\\x80-\\\\xBF]*/", - $text, $m);'); - } - - - function unhash($text) { - # - # Swap back in all the tags hashed by _HashHTMLBlocks. - # - return preg_replace_callback('/(.)\x1A[0-9]+\1/', - array(&$this, '_unhash_callback'), $text); - } - function _unhash_callback($matches) { - return $this->html_hashes[$matches[0]]; - } - -} - - -# -# Markdown Extra Parser Class -# - -class MarkdownExtra_Parser extends Markdown_Parser { - - # Prefix for footnote ids. - var $fn_id_prefix = ""; - - # Optional title attribute for footnote links and backlinks. - var $fn_link_title = MARKDOWN_FN_LINK_TITLE; - var $fn_backlink_title = MARKDOWN_FN_BACKLINK_TITLE; - - # Optional class attribute for footnote links and backlinks. - var $fn_link_class = MARKDOWN_FN_LINK_CLASS; - var $fn_backlink_class = MARKDOWN_FN_BACKLINK_CLASS; - - # Predefined abbreviations. - var $predef_abbr = array(); - - - function MarkdownExtra_Parser() { - # - # Constructor function. Initialize the parser object. - # - # Add extra escapable characters before parent constructor - # initialize the table. - $this->escape_chars .= ':|'; - - # Insert extra document, block, and span transformations. - # Parent constructor will do the sorting. - $this->document_gamut += array( - "doFencedCodeBlocks" => 5, - "stripFootnotes" => 15, - "stripAbbreviations" => 25, - "appendFootnotes" => 50, - ); - $this->block_gamut += array( - "doFencedCodeBlocks" => 5, - "doTables" => 15, - "doDefLists" => 45, - ); - $this->span_gamut += array( - "doFootnotes" => 5, - "doAbbreviations" => 70, - ); - - parent::Markdown_Parser(); - } - - - # Extra variables used during extra transformations. - var $footnotes = array(); - var $footnotes_ordered = array(); - var $abbr_desciptions = array(); - var $abbr_word_re = ''; - - # Give the current footnote number. - var $footnote_counter = 1; - - - function setup() { - # - # Setting up Extra-specific variables. - # - parent::setup(); - - $this->footnotes = array(); - $this->footnotes_ordered = array(); - $this->abbr_desciptions = array(); - $this->abbr_word_re = ''; - $this->footnote_counter = 1; - - foreach ($this->predef_abbr as $abbr_word => $abbr_desc) { - if ($this->abbr_word_re) - $this->abbr_word_re .= '|'; - $this->abbr_word_re .= preg_quote($abbr_word); - $this->abbr_desciptions[$abbr_word] = trim($abbr_desc); - } - } - - function teardown() { - # - # Clearing Extra-specific variables. - # - $this->footnotes = array(); - $this->footnotes_ordered = array(); - $this->abbr_desciptions = array(); - $this->abbr_word_re = ''; - - parent::teardown(); - } - - - ### HTML Block Parser ### - - # Tags that are always treated as block tags: - var $block_tags_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend'; - - # Tags treated as block tags only if the opening tag is alone on it's line: - var $context_block_tags_re = 'script|noscript|math|ins|del'; - - # Tags where markdown="1" default to span mode: - var $contain_span_tags_re = 'p|h[1-6]|li|dd|dt|td|th|legend|address'; - - # Tags which must not have their contents modified, no matter where - # they appear: - var $clean_tags_re = 'script|math'; - - # Tags that do not need to be closed. - var $auto_close_tags_re = 'hr|img'; - - - function hashHTMLBlocks($text) { - # - # Hashify HTML Blocks and "clean tags". - # - # We only want to do this for block-level HTML tags, such as headers, - # lists, and tables. That's because we still want to wrap

    s around - # "paragraphs" that are wrapped in non-block-level tags, such as anchors, - # phrase emphasis, and spans. The list of tags we're looking for is - # hard-coded. - # - # This works by calling _HashHTMLBlocks_InMarkdown, which then calls - # _HashHTMLBlocks_InHTML when it encounter block tags. When the markdown="1" - # attribute is found whitin a tag, _HashHTMLBlocks_InHTML calls back - # _HashHTMLBlocks_InMarkdown to handle the Markdown syntax within the tag. - # These two functions are calling each other. It's recursive! - # - # - # Call the HTML-in-Markdown hasher. - # - list($text, ) = $this->_hashHTMLBlocks_inMarkdown($text); - - return $text; - } - function _hashHTMLBlocks_inMarkdown($text, $indent = 0, - $enclosing_tag_re = '', $span = false) - { - # - # Parse markdown text, calling _HashHTMLBlocks_InHTML for block tags. - # - # * $indent is the number of space to be ignored when checking for code - # blocks. This is important because if we don't take the indent into - # account, something like this (which looks right) won't work as expected: - # - #

    - #
    - # Hello World. <-- Is this a Markdown code block or text? - #
    <-- Is this a Markdown code block or a real tag? - #
    - # - # If you don't like this, just don't indent the tag on which - # you apply the markdown="1" attribute. - # - # * If $enclosing_tag_re is not empty, stops at the first unmatched closing - # tag with that name. Nested tags supported. - # - # * If $span is true, text inside must treated as span. So any double - # newline will be replaced by a single newline so that it does not create - # paragraphs. - # - # Returns an array of that form: ( processed text , remaining text ) - # - if ($text === '') return array('', ''); - - # Regex to check for the presense of newlines around a block tag. - $newline_before_re = '/(?:^\n?|\n\n)*$/'; - $newline_after_re = - '{ - ^ # Start of text following the tag. - (?>[ ]*)? # Optional comment. - [ ]*\n # Must be followed by newline. - }xs'; - - # Regex to match any tag. - $block_tag_re = - '{ - ( # $2: Capture hole tag. - # Tag name. - '.$this->block_tags_re.' | - '.$this->context_block_tags_re.' | - '.$this->clean_tags_re.' | - (?!\s)'.$enclosing_tag_re.' - ) - (?: - (?=[\s"\'/a-zA-Z0-9]) # Allowed characters after tag name. - (?> - ".*?" | # Double quotes (can contain `>`) - \'.*?\' | # Single quotes (can contain `>`) - .+? # Anything but quotes and `>`. - )*? - )? - > # End of tag. - | - # HTML Comment - | - <\?.*?\?> | <%.*?%> # Processing instruction - | - # CData Block - | - # Code span marker - `+ - '. ( !$span ? ' # If not in span. - | - # Indented code block - (?: ^[ ]*\n | ^ | \n[ ]*\n ) - [ ]{'.($indent+4).'}[^\n]* \n - (?> - (?: [ ]{'.($indent+4).'}[^\n]* | [ ]* ) \n - )* - | - # Fenced code block marker - (?> ^ | \n ) - [ ]{0,'.($indent).'}~~~+[ ]*\n - ' : '' ). ' # End (if not is span). - ) - }xs'; - - - $depth = 0; # Current depth inside the tag tree. - $parsed = ""; # Parsed text that will be returned. - - # - # Loop through every tag until we find the closing tag of the parent - # or loop until reaching the end of text if no parent tag specified. - # - do { - # - # Split the text using the first $tag_match pattern found. - # Text before pattern will be first in the array, text after - # pattern will be at the end, and between will be any catches made - # by the pattern. - # - $parts = preg_split($block_tag_re, $text, 2, - PREG_SPLIT_DELIM_CAPTURE); - - # If in Markdown span mode, add a empty-string span-level hash - # after each newline to prevent triggering any block element. - if ($span) { - $void = $this->hashPart("", ':'); - $newline = "$void\n"; - $parts[0] = $void . str_replace("\n", $newline, $parts[0]) . $void; - } - - $parsed .= $parts[0]; # Text before current tag. - - # If end of $text has been reached. Stop loop. - if (count($parts) < 3) { - $text = ""; - break; - } - - $tag = $parts[1]; # Tag to handle. - $text = $parts[2]; # Remaining text after current tag. - $tag_re = preg_quote($tag); # For use in a regular expression. - - # - # Check for: Code span marker - # - if ($tag{0} == "`") { - # Find corresponding end marker. - $tag_re = preg_quote($tag); - if (preg_match('{^(?>.+?|\n(?!\n))*?(?.*\n)+?[ ]{0,'.($indent).'}'.$tag_re.'[ ]*\n}', $text, - $matches)) - { - # End marker found: pass text unchanged until marker. - $parsed .= $tag . $matches[0]; - $text = substr($text, strlen($matches[0])); - } - else { - # No end marker: just skip it. - $parsed .= $tag; - } - } - # - # Check for: Indented code block. - # - else if ($tag{0} == "\n" || $tag{0} == " ") { - # Indented code block: pass it unchanged, will be handled - # later. - $parsed .= $tag; - } - # - # Check for: Opening Block level tag or - # Opening Context Block tag (like ins and del) - # used as a block tag (tag is alone on it's line). - # - else if (preg_match('{^<(?:'.$this->block_tags_re.')\b}', $tag) || - ( preg_match('{^<(?:'.$this->context_block_tags_re.')\b}', $tag) && - preg_match($newline_before_re, $parsed) && - preg_match($newline_after_re, $text) ) - ) - { - # Need to parse tag and following text using the HTML parser. - list($block_text, $text) = - $this->_hashHTMLBlocks_inHTML($tag . $text, "hashBlock", true); - - # Make sure it stays outside of any paragraph by adding newlines. - $parsed .= "\n\n$block_text\n\n"; - } - # - # Check for: Clean tag (like script, math) - # HTML Comments, processing instructions. - # - else if (preg_match('{^<(?:'.$this->clean_tags_re.')\b}', $tag) || - $tag{1} == '!' || $tag{1} == '?') - { - # Need to parse tag and following text using the HTML parser. - # (don't check for markdown attribute) - list($block_text, $text) = - $this->_hashHTMLBlocks_inHTML($tag . $text, "hashClean", false); - - $parsed .= $block_text; - } - # - # Check for: Tag with same name as enclosing tag. - # - else if ($enclosing_tag_re !== '' && - # Same name as enclosing tag. - preg_match('{^= 0); - - return array($parsed, $text); - } - function _hashHTMLBlocks_inHTML($text, $hash_method, $md_attr) { - # - # Parse HTML, calling _HashHTMLBlocks_InMarkdown for block tags. - # - # * Calls $hash_method to convert any blocks. - # * Stops when the first opening tag closes. - # * $md_attr indicate if the use of the `markdown="1"` attribute is allowed. - # (it is not inside clean tags) - # - # Returns an array of that form: ( processed text , remaining text ) - # - if ($text === '') return array('', ''); - - # Regex to match `markdown` attribute inside of a tag. - $markdown_attr_re = ' - { - \s* # Eat whitespace before the `markdown` attribute - markdown - \s*=\s* - (?> - (["\']) # $1: quote delimiter - (.*?) # $2: attribute value - \1 # matching delimiter - | - ([^\s>]*) # $3: unquoted attribute value - ) - () # $4: make $3 always defined (avoid warnings) - }xs'; - - # Regex to match any tag. - $tag_re = '{ - ( # $2: Capture hole tag. - - ".*?" | # Double quotes (can contain `>`) - \'.*?\' | # Single quotes (can contain `>`) - .+? # Anything but quotes and `>`. - )*? - )? - > # End of tag. - | - # HTML Comment - | - <\?.*?\?> | <%.*?%> # Processing instruction - | - # CData Block - ) - }xs'; - - $original_text = $text; # Save original text in case of faliure. - - $depth = 0; # Current depth inside the tag tree. - $block_text = ""; # Temporary text holder for current text. - $parsed = ""; # Parsed text that will be returned. - - # - # Get the name of the starting tag. - # (This pattern makes $base_tag_name_re safe without quoting.) - # - if (preg_match('/^<([\w:$]*)\b/', $text, $matches)) - $base_tag_name_re = $matches[1]; - - # - # Loop through every tag until we find the corresponding closing tag. - # - do { - # - # Split the text using the first $tag_match pattern found. - # Text before pattern will be first in the array, text after - # pattern will be at the end, and between will be any catches made - # by the pattern. - # - $parts = preg_split($tag_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE); - - if (count($parts) < 3) { - # - # End of $text reached with unbalenced tag(s). - # In that case, we return original text unchanged and pass the - # first character as filtered to prevent an infinite loop in the - # parent function. - # - return array($original_text{0}, substr($original_text, 1)); - } - - $block_text .= $parts[0]; # Text before current tag. - $tag = $parts[1]; # Tag to handle. - $text = $parts[2]; # Remaining text after current tag. - - # - # Check for: Auto-close tag (like
    ) - # Comments and Processing Instructions. - # - if (preg_match('{^auto_close_tags_re.')\b}', $tag) || - $tag{1} == '!' || $tag{1} == '?') - { - # Just add the tag to the block as if it was text. - $block_text .= $tag; - } - else { - # - # Increase/decrease nested tag count. Only do so if - # the tag's name match base tag's. - # - if (preg_match('{^mode = $attr_m[2] . $attr_m[3]; - $span_mode = $this->mode == 'span' || $this->mode != 'block' && - preg_match('{^<(?:'.$this->contain_span_tags_re.')\b}', $tag); - - # Calculate indent before tag. - if (preg_match('/(?:^|\n)( *?)(?! ).*?$/', $block_text, $matches)) { - $strlen = $this->utf8_strlen; - $indent = $strlen($matches[1], 'UTF-8'); - } else { - $indent = 0; - } - - # End preceding block with this tag. - $block_text .= $tag; - $parsed .= $this->$hash_method($block_text); - - # Get enclosing tag name for the ParseMarkdown function. - # (This pattern makes $tag_name_re safe without quoting.) - preg_match('/^<([\w:$]*)\b/', $tag, $matches); - $tag_name_re = $matches[1]; - - # Parse the content using the HTML-in-Markdown parser. - list ($block_text, $text) - = $this->_hashHTMLBlocks_inMarkdown($text, $indent, - $tag_name_re, $span_mode); - - # Outdent markdown text. - if ($indent > 0) { - $block_text = preg_replace("/^[ ]{1,$indent}/m", "", - $block_text); - } - - # Append tag content to parsed text. - if (!$span_mode) $parsed .= "\n\n$block_text\n\n"; - else $parsed .= "$block_text"; - - # Start over a new block. - $block_text = ""; - } - else $block_text .= $tag; - } - - } while ($depth > 0); - - # - # Hash last block text that wasn't processed inside the loop. - # - $parsed .= $this->$hash_method($block_text); - - return array($parsed, $text); - } - - - function hashClean($text) { - # - # Called whenever a tag must be hashed when a function insert a "clean" tag - # in $text, it pass through this function and is automaticaly escaped, - # blocking invalid nested overlap. - # - return $this->hashPart($text, 'C'); - } - - - function doHeaders($text) { - # - # Redefined to add id attribute support. - # - # Setext-style headers: - # Header 1 {#header1} - # ======== - # - # Header 2 {#header2} - # -------- - # - $text = preg_replace_callback( - '{ - (^.+?) # $1: Header text - (?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})? # $2: Id attribute - [ ]*\n(=+|-+)[ ]*\n+ # $3: Header footer - }mx', - array(&$this, '_doHeaders_callback_setext'), $text); - - # atx-style headers: - # # Header 1 {#header1} - # ## Header 2 {#header2} - # ## Header 2 with closing hashes ## {#header3} - # ... - # ###### Header 6 {#header2} - # - $text = preg_replace_callback('{ - ^(\#{1,6}) # $1 = string of #\'s - [ ]* - (.+?) # $2 = Header text - [ ]* - \#* # optional closing #\'s (not counted) - (?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})? # id attribute - [ ]* - \n+ - }xm', - array(&$this, '_doHeaders_callback_atx'), $text); - - return $text; - } - function _doHeaders_attr($attr) { - if (empty($attr)) return ""; - return " id=\"$attr\""; - } - function _doHeaders_callback_setext($matches) { - if ($matches[3] == '-' && preg_match('{^- }', $matches[1])) - return $matches[0]; - $level = $matches[3]{0} == '=' ? 1 : 2; - $attr = $this->_doHeaders_attr($id =& $matches[2]); - $block = "".$this->runSpanGamut($matches[1]).""; - return "\n" . $this->hashBlock($block) . "\n\n"; - } - function _doHeaders_callback_atx($matches) { - $level = strlen($matches[1]); - $attr = $this->_doHeaders_attr($id =& $matches[3]); - $block = "".$this->runSpanGamut($matches[2]).""; - return "\n" . $this->hashBlock($block) . "\n\n"; - } - - - function doTables($text) { - # - # Form HTML tables. - # - $less_than_tab = $this->tab_width - 1; - # - # Find tables with leading pipe. - # - # | Header 1 | Header 2 - # | -------- | -------- - # | Cell 1 | Cell 2 - # | Cell 3 | Cell 4 - # - $text = preg_replace_callback(' - { - ^ # Start of a line - [ ]{0,'.$less_than_tab.'} # Allowed whitespace. - [|] # Optional leading pipe (present) - (.+) \n # $1: Header row (at least one pipe) - - [ ]{0,'.$less_than_tab.'} # Allowed whitespace. - [|] ([ ]*[-:]+[-| :]*) \n # $2: Header underline - - ( # $3: Cells - (?> - [ ]* # Allowed whitespace. - [|] .* \n # Row content. - )* - ) - (?=\n|\Z) # Stop at final double newline. - }xm', - array(&$this, '_doTable_leadingPipe_callback'), $text); - - # - # Find tables without leading pipe. - # - # Header 1 | Header 2 - # -------- | -------- - # Cell 1 | Cell 2 - # Cell 3 | Cell 4 - # - $text = preg_replace_callback(' - { - ^ # Start of a line - [ ]{0,'.$less_than_tab.'} # Allowed whitespace. - (\S.*[|].*) \n # $1: Header row (at least one pipe) - - [ ]{0,'.$less_than_tab.'} # Allowed whitespace. - ([-:]+[ ]*[|][-| :]*) \n # $2: Header underline - - ( # $3: Cells - (?> - .* [|] .* \n # Row content - )* - ) - (?=\n|\Z) # Stop at final double newline. - }xm', - array(&$this, '_DoTable_callback'), $text); - - return $text; - } - function _doTable_leadingPipe_callback($matches) { - $head = $matches[1]; - $underline = $matches[2]; - $content = $matches[3]; - - # Remove leading pipe for each row. - $content = preg_replace('/^ *[|]/m', '', $content); - - return $this->_doTable_callback(array($matches[0], $head, $underline, $content)); - } - function _doTable_callback($matches) { - $head = $matches[1]; - $underline = $matches[2]; - $content = $matches[3]; - - # Remove any tailing pipes for each line. - $head = preg_replace('/[|] *$/m', '', $head); - $underline = preg_replace('/[|] *$/m', '', $underline); - $content = preg_replace('/[|] *$/m', '', $content); - - # Reading alignement from header underline. - $separators = preg_split('/ *[|] */', $underline); - foreach ($separators as $n => $s) { - if (preg_match('/^ *-+: *$/', $s)) $attr[$n] = ' align="right"'; - else if (preg_match('/^ *:-+: *$/', $s))$attr[$n] = ' align="center"'; - else if (preg_match('/^ *:-+ *$/', $s)) $attr[$n] = ' align="left"'; - else $attr[$n] = ''; - } - - # Parsing span elements, including code spans, character escapes, - # and inline HTML tags, so that pipes inside those gets ignored. - $head = $this->parseSpan($head); - $headers = preg_split('/ *[|] */', $head); - $col_count = count($headers); - - # Write column headers. - $text = "\n"; - $text .= "\n"; - $text .= "\n"; - foreach ($headers as $n => $header) - $text .= " ".$this->runSpanGamut(trim($header))."\n"; - $text .= "\n"; - $text .= "\n"; - - # Split content by row. - $rows = explode("\n", trim($content, "\n")); - - $text .= "\n"; - foreach ($rows as $row) { - # Parsing span elements, including code spans, character escapes, - # and inline HTML tags, so that pipes inside those gets ignored. - $row = $this->parseSpan($row); - - # Split row by cell. - $row_cells = preg_split('/ *[|] */', $row, $col_count); - $row_cells = array_pad($row_cells, $col_count, ''); - - $text .= "\n"; - foreach ($row_cells as $n => $cell) - $text .= " ".$this->runSpanGamut(trim($cell))."\n"; - $text .= "\n"; - } - $text .= "\n"; - $text .= "
    "; - - return $this->hashBlock($text) . "\n"; - } - - - function doDefLists($text) { - # - # Form HTML definition lists. - # - $less_than_tab = $this->tab_width - 1; - - # Re-usable pattern to match any entire dl list: - $whole_list_re = '(?> - ( # $1 = whole list - ( # $2 - [ ]{0,'.$less_than_tab.'} - ((?>.*\S.*\n)+) # $3 = defined term - \n? - [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition - ) - (?s:.+?) - ( # $4 - \z - | - \n{2,} - (?=\S) - (?! # Negative lookahead for another term - [ ]{0,'.$less_than_tab.'} - (?: \S.*\n )+? # defined term - \n? - [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition - ) - (?! # Negative lookahead for another definition - [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition - ) - ) - ) - )'; // mx - - $text = preg_replace_callback('{ - (?>\A\n?|(?<=\n\n)) - '.$whole_list_re.' - }mx', - array(&$this, '_doDefLists_callback'), $text); - - return $text; - } - function _doDefLists_callback($matches) { - # Re-usable patterns to match list item bullets and number markers: - $list = $matches[1]; - - # Turn double returns into triple returns, so that we can make a - # paragraph for the last item in a list, if necessary: - $result = trim($this->processDefListItems($list)); - $result = "
    \n" . $result . "\n
    "; - return $this->hashBlock($result) . "\n\n"; - } - - - function processDefListItems($list_str) { - # - # Process the contents of a single definition list, splitting it - # into individual term and definition list items. - # - $less_than_tab = $this->tab_width - 1; - - # trim trailing blank lines: - $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str); - - # Process definition terms. - $list_str = preg_replace_callback('{ - (?>\A\n?|\n\n+) # leading line - ( # definition terms = $1 - [ ]{0,'.$less_than_tab.'} # leading whitespace - (?![:][ ]|[ ]) # negative lookahead for a definition - # mark (colon) or more whitespace. - (?> \S.* \n)+? # actual term (not whitespace). - ) - (?=\n?[ ]{0,3}:[ ]) # lookahead for following line feed - # with a definition mark. - }xm', - array(&$this, '_processDefListItems_callback_dt'), $list_str); - - # Process actual definitions. - $list_str = preg_replace_callback('{ - \n(\n+)? # leading line = $1 - ( # marker space = $2 - [ ]{0,'.$less_than_tab.'} # whitespace before colon - [:][ ]+ # definition mark (colon) - ) - ((?s:.+?)) # definition text = $3 - (?= \n+ # stop at next definition mark, - (?: # next term or end of text - [ ]{0,'.$less_than_tab.'} [:][ ] | -
    | \z - ) - ) - }xm', - array(&$this, '_processDefListItems_callback_dd'), $list_str); - - return $list_str; - } - function _processDefListItems_callback_dt($matches) { - $terms = explode("\n", trim($matches[1])); - $text = ''; - foreach ($terms as $term) { - $term = $this->runSpanGamut(trim($term)); - $text .= "\n
    " . $term . "
    "; - } - return $text . "\n"; - } - function _processDefListItems_callback_dd($matches) { - $leading_line = $matches[1]; - $marker_space = $matches[2]; - $def = $matches[3]; - - if ($leading_line || preg_match('/\n{2,}/', $def)) { - # Replace marker with the appropriate whitespace indentation - $def = str_repeat(' ', strlen($marker_space)) . $def; - $def = $this->runBlockGamut($this->outdent($def . "\n\n")); - $def = "\n". $def ."\n"; - } - else { - $def = rtrim($def); - $def = $this->runSpanGamut($this->outdent($def)); - } - - return "\n
    " . $def . "
    \n"; - } - - - function doFencedCodeBlocks($text) { - # - # Adding the fenced code block syntax to regular Markdown: - # - # ~~~ - # Code block - # ~~~ - # - $less_than_tab = $this->tab_width; - - $text = preg_replace_callback('{ - (?:\n|\A) - # 1: Opening marker - ( - ~{3,} # Marker: three tilde or more. - ) - [ ]* \n # Whitespace and newline following marker. - - # 2: Content - ( - (?> - (?!\1 [ ]* \n) # Not a closing marker. - .*\n+ - )+ - ) - - # Closing marker. - \1 [ ]* \n - }xm', - array(&$this, '_doFencedCodeBlocks_callback'), $text); - - return $text; - } - function _doFencedCodeBlocks_callback($matches) { - $codeblock = $matches[2]; - $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES); - $codeblock = preg_replace_callback('/^\n+/', - array(&$this, '_doFencedCodeBlocks_newlines'), $codeblock); - $codeblock = "
    $codeblock
    "; - return "\n\n".$this->hashBlock($codeblock)."\n\n"; - } - function _doFencedCodeBlocks_newlines($matches) { - return str_repeat("empty_element_suffix", - strlen($matches[0])); - } - - - # - # Redefining emphasis markers so that emphasis by underscore does not - # work in the middle of a word. - # - var $em_relist = array( - '' => '(?:(? '(?<=\S|^)(? '(?<=\S|^)(? '(?:(? '(?<=\S|^)(? '(?<=\S|^)(? '(?:(? '(?<=\S|^)(? '(?<=\S|^)(? tags - # - # Strip leading and trailing lines: - $text = preg_replace('/\A\n+|\n+\z/', '', $text); - - $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY); - - # - # Wrap

    tags and unhashify HTML blocks - # - foreach ($grafs as $key => $value) { - $value = trim($this->runSpanGamut($value)); - - # Check if this should be enclosed in a paragraph. - # Clean tag hashes & block tag hashes are left alone. - $is_p = !preg_match('/^B\x1A[0-9]+B|^C\x1A[0-9]+C$/', $value); - - if ($is_p) { - $value = "

    $value

    "; - } - $grafs[$key] = $value; - } - - # Join grafs in one text, then unhash HTML tags. - $text = implode("\n\n", $grafs); - - # Finish by removing any tag hashes still present in $text. - $text = $this->unhash($text); - - return $text; - } - - - ### Footnotes - - function stripFootnotes($text) { - # - # Strips link definitions from text, stores the URLs and titles in - # hash references. - # - $less_than_tab = $this->tab_width - 1; - - # Link defs are in the form: [^id]: url "optional title" - $text = preg_replace_callback('{ - ^[ ]{0,'.$less_than_tab.'}\[\^(.+?)\][ ]?: # note_id = $1 - [ ]* - \n? # maybe *one* newline - ( # text = $2 (no blank lines allowed) - (?: - .+ # actual text - | - \n # newlines but - (?!\[\^.+?\]:\s)# negative lookahead for footnote marker. - (?!\n+[ ]{0,3}\S)# ensure line is not blank and followed - # by non-indented content - )* - ) - }xm', - array(&$this, '_stripFootnotes_callback'), - $text); - return $text; - } - function _stripFootnotes_callback($matches) { - $note_id = $this->fn_id_prefix . $matches[1]; - $this->footnotes[$note_id] = $this->outdent($matches[2]); - return ''; # String that will replace the block - } - - - function doFootnotes($text) { - # - # Replace footnote references in $text [^id] with a special text-token - # which will be replaced by the actual footnote marker in appendFootnotes. - # - if (!$this->in_anchor) { - $text = preg_replace('{\[\^(.+?)\]}', "F\x1Afn:\\1\x1A:", $text); - } - return $text; - } - - - function appendFootnotes($text) { - # - # Append footnote list to text. - # - $text = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}', - array(&$this, '_appendFootnotes_callback'), $text); - - if (!empty($this->footnotes_ordered)) { - $text .= "\n\n"; - $text .= "
    \n"; - $text .= "empty_element_suffix ."\n"; - $text .= "
      \n\n"; - - $attr = " rev=\"footnote\""; - if ($this->fn_backlink_class != "") { - $class = $this->fn_backlink_class; - $class = $this->encodeAttribute($class); - $attr .= " class=\"$class\""; - } - if ($this->fn_backlink_title != "") { - $title = $this->fn_backlink_title; - $title = $this->encodeAttribute($title); - $attr .= " title=\"$title\""; - } - $num = 0; - - while (!empty($this->footnotes_ordered)) { - $footnote = reset($this->footnotes_ordered); - $note_id = key($this->footnotes_ordered); - unset($this->footnotes_ordered[$note_id]); - - $footnote .= "\n"; # Need to append newline before parsing. - $footnote = $this->runBlockGamut("$footnote\n"); - $footnote = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}', - array(&$this, '_appendFootnotes_callback'), $footnote); - - $attr = str_replace("%%", ++$num, $attr); - $note_id = $this->encodeAttribute($note_id); - - # Add backlink to last paragraph; create new paragraph if needed. - $backlink = ""; - if (preg_match('{

      $}', $footnote)) { - $footnote = substr($footnote, 0, -4) . " $backlink

      "; - } else { - $footnote .= "\n\n

      $backlink

      "; - } - - $text .= "
    1. \n"; - $text .= $footnote . "\n"; - $text .= "
    2. \n\n"; - } - - $text .= "
    \n"; - $text .= "
    "; - } - return $text; - } - function _appendFootnotes_callback($matches) { - $node_id = $this->fn_id_prefix . $matches[1]; - - # Create footnote marker only if it has a corresponding footnote *and* - # the footnote hasn't been used by another marker. - if (isset($this->footnotes[$node_id])) { - # Transfert footnote content to the ordered list. - $this->footnotes_ordered[$node_id] = $this->footnotes[$node_id]; - unset($this->footnotes[$node_id]); - - $num = $this->footnote_counter++; - $attr = " rel=\"footnote\""; - if ($this->fn_link_class != "") { - $class = $this->fn_link_class; - $class = $this->encodeAttribute($class); - $attr .= " class=\"$class\""; - } - if ($this->fn_link_title != "") { - $title = $this->fn_link_title; - $title = $this->encodeAttribute($title); - $attr .= " title=\"$title\""; - } - - $attr = str_replace("%%", $num, $attr); - $node_id = $this->encodeAttribute($node_id); - - return - "". - "$num". - ""; - } - - return "[^".$matches[1]."]"; - } - - - ### Abbreviations ### - - function stripAbbreviations($text) { - # - # Strips abbreviations from text, stores titles in hash references. - # - $less_than_tab = $this->tab_width - 1; - - # Link defs are in the form: [id]*: url "optional title" - $text = preg_replace_callback('{ - ^[ ]{0,'.$less_than_tab.'}\*\[(.+?)\][ ]?: # abbr_id = $1 - (.*) # text = $2 (no blank lines allowed) - }xm', - array(&$this, '_stripAbbreviations_callback'), - $text); - return $text; - } - function _stripAbbreviations_callback($matches) { - $abbr_word = $matches[1]; - $abbr_desc = $matches[2]; - if ($this->abbr_word_re) - $this->abbr_word_re .= '|'; - $this->abbr_word_re .= preg_quote($abbr_word); - $this->abbr_desciptions[$abbr_word] = trim($abbr_desc); - return ''; # String that will replace the block - } - - - function doAbbreviations($text) { - # - # Find defined abbreviations in text and wrap them in elements. - # - if ($this->abbr_word_re) { - // cannot use the /x modifier because abbr_word_re may - // contain significant spaces: - $text = preg_replace_callback('{'. - '(?abbr_word_re.')'. - '(?![\w\x1A])'. - '}', - array(&$this, '_doAbbreviations_callback'), $text); - } - return $text; - } - function _doAbbreviations_callback($matches) { - $abbr = $matches[0]; - if (isset($this->abbr_desciptions[$abbr])) { - $desc = $this->abbr_desciptions[$abbr]; - if (empty($desc)) { - return $this->hashPart("$abbr"); - } else { - $desc = $this->encodeAttribute($desc); - return $this->hashPart("$abbr"); - } - } else { - return $matches[0]; - } - } - -} - - -/* - -PHP Markdown Extra -================== - -Description ------------ - -This is a PHP port of the original Markdown formatter written in Perl -by John Gruber. This special "Extra" version of PHP Markdown features -further enhancements to the syntax for making additional constructs -such as tables and definition list. - -Markdown is a text-to-HTML filter; it translates an easy-to-read / -easy-to-write structured text format into HTML. Markdown's text format -is most similar to that of plain text email, and supports features such -as headers, *emphasis*, code blocks, blockquotes, and links. - -Markdown's syntax is designed not as a generic markup language, but -specifically to serve as a front-end to (X)HTML. You can use span-level -HTML tags anywhere in a Markdown document, and you can use block level -HTML tags (like
    and as well). - -For more information about Markdown's syntax, see: - - - - -Bugs ----- - -To file bug reports please send email to: - - - -Please include with your report: (1) the example input; (2) the output you -expected; (3) the output Markdown actually produced. - - -Version History ---------------- - -See the readme file for detailed release notes for this version. - - -Copyright and License ---------------------- - -PHP Markdown & Extra -Copyright (c) 2004-2009 Michel Fortin - -All rights reserved. - -Based on Markdown -Copyright (c) 2003-2006 John Gruber - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* Neither the name "Markdown" nor the names of its contributors may - be used to endorse or promote products derived from this software - without specific prior written permission. - -This software is provided by the copyright holders and contributors "as -is" and any express or implied warranties, including, but not limited -to, the implied warranties of merchantability and fitness for a -particular purpose are disclaimed. In no event shall the copyright owner -or contributors be liable for any direct, indirect, incidental, special, -exemplary, or consequential damages (including, but not limited to, -procurement of substitute goods or services; loss of use, data, or -profits; or business interruption) however caused and on any theory of -liability, whether in contract, strict liability, or tort (including -negligence or otherwise) arising in any way out of the use of this -software, even if advised of the possibility of such damage. - -*/ -?> \ No newline at end of file diff --git a/bundles/docs/routes.php b/bundles/docs/routes.php deleted file mode 100644 index 2a8561ff..00000000 --- a/bundles/docs/routes.php +++ /dev/null @@ -1,85 +0,0 @@ -with('sidebar', document('contents')); -}); - -/** - * Handle the documentation homepage. - * - * This page contains the "introduction" to Laravel. - */ -Route::get('(:bundle)', function() -{ - return View::make('docs::page')->with('content', document('home')); -}); - -/** - * Handle documentation routes for sections and pages. - * - * @param string $section - * @param string $page - * @return mixed - */ -Route::get('(:bundle)/(:any)/(:any?)', function($section, $page = null) -{ - $file = rtrim(implode('/', func_get_args()), '/'); - - // If no page was specified, but a "home" page exists for the section, - // we'll set the file to the home page so that the proper page is - // displayed back out to the client for the requested doc page. - if (is_null($page) and document_exists($file.'/home')) - { - $file .= '/home'; - } - - if (document_exists($file)) - { - return View::make('docs::page')->with('content', document($file)); - } - else - { - return Response::error('404'); - } -}); \ No newline at end of file diff --git a/bundles/docs/views/page.blade.php b/bundles/docs/views/page.blade.php deleted file mode 100644 index 1309e905..00000000 --- a/bundles/docs/views/page.blade.php +++ /dev/null @@ -1,5 +0,0 @@ -@layout('docs::template') - -@section('content') - {{ $content }} -@endsection \ No newline at end of file diff --git a/bundles/docs/views/template.blade.php b/bundles/docs/views/template.blade.php deleted file mode 100755 index 658895e4..00000000 --- a/bundles/docs/views/template.blade.php +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - Laravel: A Framework For Web Artisans - - - {{ HTML::style(URL::$base.'/laravel/css/style.css') }} - {{ HTML::script(URL::$base.'/laravel/js/modernizr-2.5.3.min.js') }} - - -
    -
    -

    Laravel

    -

    A Framework For Web Artisans

    - -

    -

    -
    -
    - -
    - @yield('content') -
    -
    -
    - {{ HTML::script('http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js') }} - {{ HTML::script(URL::$base.'/laravel/js/prettify.js') }} - {{ HTML::script(URL::$base.'/laravel/js/scroll.js') }} - - diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..d4a91bf9 --- /dev/null +++ b/composer.json @@ -0,0 +1,15 @@ +{ + "require": { + "laravel/framework": "4.0.*" + }, + "autoload": { + "classmap": [ + "app/commands", + "app/controllers", + "app/models", + "app/database/migrations", + "app/tests/TestCase.php" + ] + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/laravel/asset.php b/laravel/asset.php deleted file mode 100644 index 57b45465..00000000 --- a/laravel/asset.php +++ /dev/null @@ -1,356 +0,0 @@ - - * // Get the default asset container - * $container = Asset::container(); - * - * // Get a named asset container - * $container = Asset::container('footer'); - * - * - * @param string $container - * @return Asset_Container - */ - public static function container($container = 'default') - { - if ( ! isset(static::$containers[$container])) - { - static::$containers[$container] = new Asset_Container($container); - } - - return static::$containers[$container]; - } - - /** - * Magic Method for calling methods on the default container. - * - * - * // Call the "styles" method on the default container - * echo Asset::styles(); - * - * // Call the "add" method on the default container - * Asset::add('jquery', 'js/jquery.js'); - * - */ - public static function __callStatic($method, $parameters) - { - return call_user_func_array(array(static::container(), $method), $parameters); - } - -} - -class Asset_Container { - - /** - * The asset container name. - * - * @var string - */ - public $name; - - /** - * The bundle that the assets belong to. - * - * @var string - */ - public $bundle = DEFAULT_BUNDLE; - - /** - * All of the registered assets. - * - * @var array - */ - public $assets = array(); - - /** - * Create a new asset container instance. - * - * @param string $name - * @return void - */ - public function __construct($name) - { - $this->name = $name; - } - - /** - * Add an asset to the container. - * - * The extension of the asset source will be used to determine the type of - * asset being registered (CSS or JavaScript). When using a non-standard - * extension, the style/script methods may be used to register assets. - * - * - * // Add an asset to the container - * Asset::container()->add('jquery', 'js/jquery.js'); - * - * // Add an asset that has dependencies on other assets - * Asset::add('jquery', 'js/jquery.js', 'jquery-ui'); - * - * // Add an asset that should have attributes applied to its tags - * Asset::add('jquery', 'js/jquery.js', null, array('defer')); - * - * - * @param string $name - * @param string $source - * @param array $dependencies - * @param array $attributes - * @return Asset_Container - */ - public function add($name, $source, $dependencies = array(), $attributes = array()) - { - $type = (pathinfo($source, PATHINFO_EXTENSION) == 'css') ? 'style' : 'script'; - - return $this->$type($name, $source, $dependencies, $attributes); - } - - /** - * Add a CSS file to the registered assets. - * - * @param string $name - * @param string $source - * @param array $dependencies - * @param array $attributes - * @return Asset_Container - */ - public function style($name, $source, $dependencies = array(), $attributes = array()) - { - if ( ! array_key_exists('media', $attributes)) - { - $attributes['media'] = 'all'; - } - - $this->register('style', $name, $source, $dependencies, $attributes); - - return $this; - } - - /** - * Add a JavaScript file to the registered assets. - * - * @param string $name - * @param string $source - * @param array $dependencies - * @param array $attributes - * @return Asset_Container - */ - public function script($name, $source, $dependencies = array(), $attributes = array()) - { - $this->register('script', $name, $source, $dependencies, $attributes); - - return $this; - } - - /** - * Returns the full-path for an asset. - * - * @param string $source - * @return string - */ - public function path($source) - { - return Bundle::assets($this->bundle).$source; - } - - /** - * Set the bundle that the container's assets belong to. - * - * @param string $bundle - * @return Asset_Container - */ - public function bundle($bundle) - { - $this->bundle = $bundle; - return $this; - } - - /** - * Add an asset to the array of registered assets. - * - * @param string $type - * @param string $name - * @param string $source - * @param array $dependencies - * @param array $attributes - * @return void - */ - protected function register($type, $name, $source, $dependencies, $attributes) - { - $dependencies = (array) $dependencies; - - $attributes = (array) $attributes; - - $this->assets[$type][$name] = compact('source', 'dependencies', 'attributes'); - } - - /** - * Get the links to all of the registered CSS assets. - * - * @return string - */ - public function styles() - { - return $this->group('style'); - } - - /** - * Get the links to all of the registered JavaScript assets. - * - * @return string - */ - public function scripts() - { - return $this->group('script'); - } - - /** - * Get all of the registered assets for a given type / group. - * - * @param string $group - * @return string - */ - protected function group($group) - { - if ( ! isset($this->assets[$group]) or count($this->assets[$group]) == 0) return ''; - - $assets = ''; - - foreach ($this->arrange($this->assets[$group]) as $name => $data) - { - $assets .= $this->asset($group, $name); - } - - return $assets; - } - - /** - * Get the HTML link to a registered asset. - * - * @param string $group - * @param string $name - * @return string - */ - protected function asset($group, $name) - { - if ( ! isset($this->assets[$group][$name])) return ''; - - $asset = $this->assets[$group][$name]; - - // If the bundle source is not a complete URL, we will go ahead and prepend - // the bundle's asset path to the source provided with the asset. This will - // ensure that we attach the correct path to the asset. - if (filter_var($asset['source'], FILTER_VALIDATE_URL) === false) - { - $asset['source'] = $this->path($asset['source']); - } - - return HTML::$group($asset['source'], $asset['attributes']); - } - - /** - * Sort and retrieve assets based on their dependencies - * - * @param array $assets - * @return array - */ - protected function arrange($assets) - { - list($original, $sorted) = array($assets, array()); - - while (count($assets) > 0) - { - foreach ($assets as $asset => $value) - { - $this->evaluate_asset($asset, $value, $original, $sorted, $assets); - } - } - - return $sorted; - } - - /** - * Evaluate an asset and its dependencies. - * - * @param string $asset - * @param string $value - * @param array $original - * @param array $sorted - * @param array $assets - * @return void - */ - protected function evaluate_asset($asset, $value, $original, &$sorted, &$assets) - { - // If the asset has no more dependencies, we can add it to the sorted list - // and remove it from the array of assets. Otherwise, we will not verify - // the asset's dependencies and determine if they've been sorted. - if (count($assets[$asset]['dependencies']) == 0) - { - $sorted[$asset] = $value; - - unset($assets[$asset]); - } - else - { - foreach ($assets[$asset]['dependencies'] as $key => $dependency) - { - if ( ! $this->dependency_is_valid($asset, $dependency, $original, $assets)) - { - unset($assets[$asset]['dependencies'][$key]); - - continue; - } - - // If the dependency has not yet been added to the sorted list, we can not - // remove it from this asset's array of dependencies. We'll try again on - // the next trip through the loop. - if ( ! isset($sorted[$dependency])) continue; - - unset($assets[$asset]['dependencies'][$key]); - } - } - } - - /** - * Verify that an asset's dependency is valid. - * - * A dependency is considered valid if it exists, is not a circular reference, and is - * not a reference to the owning asset itself. If the dependency doesn't exist, no - * error or warning will be given. For the other cases, an exception is thrown. - * - * @param string $asset - * @param string $dependency - * @param array $original - * @param array $assets - * @return bool - */ - protected function dependency_is_valid($asset, $dependency, $original, $assets) - { - if ( ! isset($original[$dependency])) - { - return false; - } - elseif ($dependency === $asset) - { - throw new \Exception("Asset [$asset] is dependent on itself."); - } - elseif (isset($assets[$dependency]) and in_array($asset, $assets[$dependency]['dependencies'])) - { - throw new \Exception("Assets [$asset] and [$dependency] have a circular dependency."); - } - - return true; - } - -} diff --git a/laravel/auth.php b/laravel/auth.php deleted file mode 100644 index ad4869c1..00000000 --- a/laravel/auth.php +++ /dev/null @@ -1,93 +0,0 @@ - - * // Call the "user" method on the default auth driver - * $user = Auth::user(); - * - * // Call the "check" method on the default auth driver - * Auth::check(); - * - */ - public static function __callStatic($method, $parameters) - { - return call_user_func_array(array(static::driver(), $method), $parameters); - } - -} \ No newline at end of file diff --git a/laravel/auth/drivers/driver.php b/laravel/auth/drivers/driver.php deleted file mode 100644 index b60d84e0..00000000 --- a/laravel/auth/drivers/driver.php +++ /dev/null @@ -1,231 +0,0 @@ -token = Session::get($this->token()); - } - - // If a token did not exist in the session for the user, we will attempt - // to load the value of a "remember me" cookie for the driver, which - // serves as a long-lived client side authenticator for the user. - if (is_null($this->token)) - { - $this->token = $this->recall(); - } - } - - /** - * Determine if the user of the application is not logged in. - * - * This method is the inverse of the "check" method. - * - * @return bool - */ - public function guest() - { - return ! $this->check(); - } - - /** - * Determine if the user is logged in. - * - * @return bool - */ - public function check() - { - return ! is_null($this->user()); - } - - /** - * Get the current user of the application. - * - * If the user is a guest, null should be returned. - * - * @return mixed|null - */ - public function user() - { - if ( ! is_null($this->user)) return $this->user; - - return $this->user = $this->retrieve($this->token); - } - - /** - * Get the given application user by ID. - * - * @param int $id - * @return mixed - */ - abstract public function retrieve($id); - - /** - * Attempt to log a user into the application. - * - * @param array $arguments - * @return void - */ - abstract public function attempt($arguments = array()); - - /** - * Login the user assigned to the given token. - * - * The token is typically a numeric ID for the user. - * - * @param string $token - * @param bool $remember - * @return bool - */ - public function login($token, $remember = false) - { - $this->token = $token; - - $this->store($token); - - if ($remember) $this->remember($token); - - Event::fire('laravel.auth: login'); - - return true; - } - - /** - * Log the user out of the driver's auth context. - * - * @return void - */ - public function logout() - { - $this->user = null; - - $this->cookie($this->recaller(), null, -2000); - - Session::forget($this->token()); - - Event::fire('laravel.auth: logout'); - - $this->token = null; - } - - /** - * Store a user's token in the session. - * - * @param string $token - * @return void - */ - protected function store($token) - { - Session::put($this->token(), $token); - } - - /** - * Store a user's token in a long-lived cookie. - * - * @param string $token - * @return void - */ - protected function remember($token) - { - $token = Crypter::encrypt($token.'|'.Str::random(40)); - - $this->cookie($this->recaller(), $token, Cookie::forever); - } - - /** - * Attempt to find a "remember me" cookie for the user. - * - * @return string|null - */ - protected function recall() - { - $cookie = Cookie::get($this->recaller()); - - // By default, "remember me" cookies are encrypted and contain the user - // token as well as a random string. If it exists, we'll decrypt it - // and return the first segment, which is the user's ID token. - if ( ! is_null($cookie)) - { - return head(explode('|', Crypter::decrypt($cookie))); - } - } - - /** - * Store an authentication cookie. - * - * @param string $name - * @param string $value - * @param int $minutes - * @return void - */ - protected function cookie($name, $value, $minutes) - { - // When setting the default implementation of an authentication - // cookie we'll use the same settings as the session cookie. - // This typically makes sense as they both are sensitive. - $config = Config::get('session'); - - extract($config); - - Cookie::put($name, $value, $minutes, $path, $domain, $secure); - } - - /** - * Get the session key name used to store the token. - * - * @return string - */ - protected function token() - { - return $this->name().'_login'; - } - - /** - * Get the name used for the "remember me" cookie. - * - * @return string - */ - protected function recaller() - { - return $this->name().'_remember'; - } - - /** - * Get the name of the driver in a storage friendly format. - * - * @return string - */ - protected function name() - { - return strtolower(str_replace('\\', '_', get_class($this))); - } - -} \ No newline at end of file diff --git a/laravel/auth/drivers/eloquent.php b/laravel/auth/drivers/eloquent.php deleted file mode 100644 index 3bb8a5ef..00000000 --- a/laravel/auth/drivers/eloquent.php +++ /dev/null @@ -1,73 +0,0 @@ -model()->find($token); - } - else if (is_object($token) and get_class($token) == Config::get('auth.model')) - { - return $token; - } - } - - /** - * Attempt to log a user into the application. - * - * @param array $arguments - * @return void - */ - public function attempt($arguments = array()) - { - $user = $this->model()->where(function($query) use($arguments) - { - $username = Config::get('auth.username'); - - $query->where($username, '=', $arguments['username']); - - foreach(array_except($arguments, array('username', 'password', 'remember')) as $column => $val) - { - $query->where($column, '=', $val); - } - })->first(); - - // If the credentials match what is in the database we will just - // log the user into the application and remember them if asked. - $password = $arguments['password']; - - $password_field = Config::get('auth.password', 'password'); - - if ( ! is_null($user) and Hash::check($password, $user->{$password_field})) - { - return $this->login($user->get_key(), array_get($arguments, 'remember')); - } - - return false; - } - - /** - * Get a fresh model instance. - * - * @return Eloquent - */ - protected function model() - { - $model = Config::get('auth.model'); - - return new $model; - } - -} diff --git a/laravel/auth/drivers/fluent.php b/laravel/auth/drivers/fluent.php deleted file mode 100644 index b91b93ea..00000000 --- a/laravel/auth/drivers/fluent.php +++ /dev/null @@ -1,72 +0,0 @@ -find($id); - } - } - - /** - * Attempt to log a user into the application. - * - * @param array $arguments - * @return void - */ - public function attempt($arguments = array()) - { - $user = $this->get_user($arguments); - - // If the credentials match what is in the database we will just - // log the user into the application and remember them if asked. - $password = $arguments['password']; - - $password_field = Config::get('auth.password', 'password'); - - if ( ! is_null($user) and Hash::check($password, $user->{$password_field})) - { - return $this->login($user->id, array_get($arguments, 'remember')); - } - - return false; - } - - /** - * Get the user from the database table. - * - * @param array $arguments - * @return mixed - */ - protected function get_user($arguments) - { - $table = Config::get('auth.table'); - - return DB::table($table)->where(function($query) use($arguments) - { - $username = Config::get('auth.username'); - - $query->where($username, '=', $arguments['username']); - - foreach(array_except($arguments, array('username', 'password', 'remember')) as $column => $val) - { - $query->where($column, '=', $val); - } - })->first(); - } - -} diff --git a/laravel/autoloader.php b/laravel/autoloader.php deleted file mode 100644 index 4168e305..00000000 --- a/laravel/autoloader.php +++ /dev/null @@ -1,229 +0,0 @@ - $directory) - { - if (starts_with($class, $namespace)) - { - return static::load_namespaced($class, $namespace, $directory); - } - } - - static::load_psr($class); - } - - /** - * Load a namespaced class from a given directory. - * - * @param string $class - * @param string $namespace - * @param string $directory - * @return void - */ - protected static function load_namespaced($class, $namespace, $directory) - { - return static::load_psr(substr($class, strlen($namespace)), $directory); - } - - /** - * Attempt to resolve a class using the PSR-0 standard. - * - * @param string $class - * @param string $directory - * @return void - */ - protected static function load_psr($class, $directory = null) - { - // The PSR-0 standard indicates that class namespaces and underscores - // should be used to indicate the directory tree in which the class - // resides, so we'll convert them to slashes. - $file = str_replace(array('\\', '_'), '/', $class); - - $directories = $directory ?: static::$directories; - - $lower = strtolower($file); - - // Once we have formatted the class name, we'll simply spin through - // the registered PSR-0 directories and attempt to locate and load - // the class file into the script. - foreach ((array) $directories as $directory) - { - if (file_exists($path = $directory.$lower.EXT)) - { - return require $path; - } - elseif (file_exists($path = $directory.$file.EXT)) - { - return require $path; - } - } - } - - /** - * Register an array of class to path mappings. - * - * @param array $mappings - * @return void - */ - public static function map($mappings) - { - static::$mappings = array_merge(static::$mappings, $mappings); - } - - /** - * Register a class alias with the auto-loader. - * - * @param string $class - * @param string $alias - * @return void - */ - public static function alias($class, $alias) - { - static::$aliases[$alias] = $class; - } - - /** - * Register directories to be searched as a PSR-0 library. - * - * @param string|array $directory - * @return void - */ - public static function directories($directory) - { - $directories = static::format($directory); - - static::$directories = array_unique(array_merge(static::$directories, $directories)); - } - - /** - * Map namespaces to directories. - * - * @param array $mappings - * @param string $append - * @return void - */ - public static function namespaces($mappings, $append = '\\') - { - $mappings = static::format_mappings($mappings, $append); - - static::$namespaces = array_merge($mappings, static::$namespaces); - } - - /** - * Register underscored "namespaces" to directory mappings. - * - * @param array $mappings - * @return void - */ - public static function underscored($mappings) - { - static::namespaces($mappings, '_'); - } - - /** - * Format an array of namespace to directory mappings. - * - * @param array $mappings - * @param string $append - * @return array - */ - protected static function format_mappings($mappings, $append) - { - foreach ($mappings as $namespace => $directory) - { - // When adding new namespaces to the mappings, we will unset the previously - // mapped value if it existed. This allows previously registered spaces to - // be mapped to new directories on the fly. - $namespace = trim($namespace, $append).$append; - - unset(static::$namespaces[$namespace]); - - $namespaces[$namespace] = head(static::format($directory)); - } - - return $namespaces; - } - - /** - * Format an array of directories with the proper trailing slashes. - * - * @param array $directories - * @return array - */ - protected static function format($directories) - { - return array_map(function($directory) - { - return rtrim($directory, DS).DS; - - }, (array) $directories); - } - -} \ No newline at end of file diff --git a/laravel/blade.php b/laravel/blade.php deleted file mode 100644 index f609b374..00000000 --- a/laravel/blade.php +++ /dev/null @@ -1,454 +0,0 @@ -path, BLADE_EXT)) - { - return; - } - - $compiled = Blade::compiled($view->path); - - // If the view doesn't exist or has been modified since the last time it - // was compiled, we will recompile the view into pure PHP from it's - // Blade representation, writing it to cached storage. - if ( ! file_exists($compiled) or Blade::expired($view->view, $view->path)) - { - file_put_contents($compiled, Blade::compile($view)); - } - - $view->path = $compiled; - - // Once the view has been compiled, we can simply set the path to the - // compiled view on the view instance and call the typical "get" - // method on the view to evaluate the compiled PHP view. - return ltrim($view->get()); - }); - } - - /** - * Register a custom Blade compiler. - * - * - * Blade::extend(function($view) - * { - * return str_replace('foo', 'bar', $view); - * }); - * - * - * @param Closure $compiler - * @return void - */ - public static function extend(Closure $compiler) - { - static::$extensions[] = $compiler; - } - - /** - * Determine if a view is "expired" and needs to be re-compiled. - * - * @param string $view - * @param string $path - * @return bool - */ - public static function expired($view, $path) - { - return filemtime($path) > filemtime(static::compiled($path)); - } - - /** - * Compiles the specified file containing Blade pseudo-code into valid PHP. - * - * @param string $path - * @return string - */ - public static function compile($view) - { - return static::compile_string(file_get_contents($view->path), $view); - } - - /** - * Compiles the given string containing Blade pseudo-code into valid PHP. - * - * @param string $value - * @param View $view - * @return string - */ - public static function compile_string($value, $view = null) - { - foreach (static::$compilers as $compiler) - { - $method = "compile_{$compiler}"; - - $value = static::$method($value, $view); - } - - return $value; - } - - /** - * Rewrites Blade "@layout" expressions into valid PHP. - * - * @param string $value - * @return string - */ - protected static function compile_layouts($value) - { - // If the Blade template is not using "layouts", we'll just return it - // unchanged since there is nothing to do with layouts and we will - // just let the other Blade compilers handle the rest. - if ( ! starts_with($value, '@layout')) - { - return $value; - } - - // First we'll split out the lines of the template so we can get the - // layout from the top of the template. By convention it must be - // located on the first line of the template contents. - $lines = preg_split("/(\r?\n)/", $value); - - $pattern = static::matcher('layout'); - - $lines[] = preg_replace($pattern, '$1@include$2', $lines[0]); - - // We will add a "render" statement to the end of the templates and - // then slice off the "@layout" shortcut from the start so the - // sections register before the parent template renders. - return implode(CRLF, array_slice($lines, 1)); - } - - /** - * Extract a variable value out of a Blade expression. - * - * @param string $value - * @return string - */ - protected static function extract($value, $expression) - { - preg_match('/@layout(\s*\(.*\))(\s*)/', $value, $matches); - - return str_replace(array("('", "')"), '', $matches[1]); - } - - /** - * Rewrites Blade comments into PHP comments. - * - * @param string $value - * @return string - */ - protected static function compile_comments($value) - { - $value = preg_replace('/\{\{--(.+?)(--\}\})?\n/', "", $value); - - return preg_replace('/\{\{--((.|\s)*?)--\}\}/', "\n", $value); - } - - /** - * Rewrites Blade echo statements into PHP echo statements. - * - * @param string $value - * @return string - */ - protected static function compile_echos($value) - { - $value = preg_replace('/\{\{\{(.+?)\}\}\}/', '', $value); - - return preg_replace('/\{\{(.+?)\}\}/', '', $value); - } - - /** - * Rewrites Blade "for else" statements into valid PHP. - * - * @param string $value - * @return string - */ - protected static function compile_forelse($value) - { - preg_match_all('/(\s*)@forelse(\s*\(.*\))(\s*)/', $value, $matches); - - foreach ($matches[0] as $forelse) - { - preg_match('/\s*\(\s*(\S*)\s/', $forelse, $variable); - - // Once we have extracted the variable being looped against, we can add - // an if statement to the start of the loop that checks if the count - // of the variable being looped against is greater than zero. - $if = " 0): ?>"; - - $search = '/(\s*)@forelse(\s*\(.*\))/'; - - $replace = '$1'.$if.''; - - $blade = preg_replace($search, $replace, $forelse); - - // Finally, once we have the check prepended to the loop we'll replace - // all instances of this forelse syntax in the view content of the - // view being compiled to Blade syntax with real PHP syntax. - $value = str_replace($forelse, $blade, $value); - } - - return $value; - } - - /** - * Rewrites Blade "empty" statements into valid PHP. - * - * @param string $value - * @return string - */ - protected static function compile_empty($value) - { - return str_replace('@empty', '', $value); - } - - /** - * Rewrites Blade "forelse" endings into valid PHP. - * - * @param string $value - * @return string - */ - protected static function compile_endforelse($value) - { - return str_replace('@endforelse', '', $value); - } - - /** - * Rewrites Blade structure openings into PHP structure openings. - * - * @param string $value - * @return string - */ - protected static function compile_structure_openings($value) - { - $pattern = '/(\s*)@(if|elseif|foreach|for|while)(\s*\(.*\))/'; - - return preg_replace($pattern, '$1', $value); - } - - /** - * Rewrites Blade structure closings into PHP structure closings. - * - * @param string $value - * @return string - */ - protected static function compile_structure_closings($value) - { - $pattern = '/(\s*)@(endif|endforeach|endfor|endwhile)(\s*)/'; - - return preg_replace($pattern, '$1$3', $value); - } - - /** - * Rewrites Blade else statements into PHP else statements. - * - * @param string $value - * @return string - */ - protected static function compile_else($value) - { - return preg_replace('/(\s*)@(else)(\s*)/', '$1$3', $value); - } - - /** - * Rewrites Blade "unless" statements into valid PHP. - * - * @param string $value - * @return string - */ - protected static function compile_unless($value) - { - $pattern = '/(\s*)@unless(\s*\(.*\))/'; - - return preg_replace($pattern, '$1', $value); - } - - /** - * Rewrites Blade "unless" endings into valid PHP. - * - * @param string $value - * @return string - */ - protected static function compile_endunless($value) - { - return str_replace('@endunless', '', $value); - } - - /** - * Rewrites Blade @include statements into valid PHP. - * - * @param string $value - * @return string - */ - protected static function compile_includes($value) - { - $pattern = static::matcher('include'); - - return preg_replace($pattern, '$1with(get_defined_vars())->render(); ?>', $value); - } - - /** - * Rewrites Blade @render statements into valid PHP. - * - * @param string $value - * @return string - */ - protected static function compile_render($value) - { - $pattern = static::matcher('render'); - - return preg_replace($pattern, '$1', $value); - } - - /** - * Rewrites Blade @render_each statements into valid PHP. - * - * @param string $value - * @return string - */ - protected static function compile_render_each($value) - { - $pattern = static::matcher('render_each'); - - return preg_replace($pattern, '$1', $value); - } - - /** - * Rewrites Blade @yield statements into Section statements. - * - * The Blade @yield statement is a shortcut to the Section::yield method. - * - * @param string $value - * @return string - */ - protected static function compile_yields($value) - { - $pattern = static::matcher('yield'); - - return preg_replace($pattern, '$1', $value); - } - - /** - * Rewrites Blade yield section statements into valid PHP. - * - * @return string - */ - protected static function compile_yield_sections($value) - { - $replace = ''; - - return str_replace('@yield_section', $replace, $value); - } - - /** - * Rewrites Blade @section statements into Section statements. - * - * The Blade @section statement is a shortcut to the Section::start method. - * - * @param string $value - * @return string - */ - protected static function compile_section_start($value) - { - $pattern = static::matcher('section'); - - return preg_replace($pattern, '$1', $value); - } - - /** - * Rewrites Blade @endsection statements into Section statements. - * - * The Blade @endsection statement is a shortcut to the Section::stop method. - * - * @param string $value - * @return string - */ - protected static function compile_section_end($value) - { - return preg_replace('/@endsection/', '', $value); - } - - /** - * Execute user defined compilers. - * - * @param string $value - * @return string - */ - protected static function compile_extensions($value) - { - foreach (static::$extensions as $compiler) - { - $value = $compiler($value); - } - - return $value; - } - - /** - * Get the regular expression for a generic Blade function. - * - * @param string $function - * @return string - */ - public static function matcher($function) - { - return '/(\s*)@'.$function.'(\s*\(.*\))/'; - } - - /** - * Get the fully qualified path for a compiled view. - * - * @param string $view - * @return string - */ - public static function compiled($path) - { - return path('storage').'views/'.md5($path); - } - -} \ No newline at end of file diff --git a/laravel/bundle.php b/laravel/bundle.php deleted file mode 100644 index 382051ea..00000000 --- a/laravel/bundle.php +++ /dev/null @@ -1,476 +0,0 @@ - null, 'auto' => false); - - // If the given configuration is actually a string, we will assume it is a - // location and set the bundle name to match it. This is common for most - // bundles that simply live in the root bundle directory. - if (is_string($config)) - { - $bundle = $config; - - $config = array('location' => $bundle); - } - - // If no location is set, we will set the location to match the name of - // the bundle. This is for bundles that are installed on the root of - // the bundle directory so a location was not set. - if ( ! isset($config['location'])) - { - $config['location'] = $bundle; - } - - static::$bundles[$bundle] = array_merge($defaults, $config); - - // It is possible for the developer to specify auto-loader mappings - // directly on the bundle registration. This provides a convenient - // way to register mappings without a bootstrap. - if (isset($config['autoloads'])) - { - static::autoloads($bundle, $config); - } - } - - /** - * Load a bundle by running its start-up script. - * - * If the bundle has already been started, no action will be taken. - * - * @param string $bundle - * @return void - */ - public static function start($bundle) - { - if (static::started($bundle)) return; - - if ( ! static::exists($bundle)) - { - throw new \Exception("Bundle [$bundle] has not been installed."); - } - - // Each bundle may have a start script which is responsible for preparing - // the bundle for use by the application. The start script may register - // any classes the bundle uses with the auto-loader class, etc. - if ( ! is_null($starter = static::option($bundle, 'starter'))) - { - $starter(); - } - elseif (file_exists($path = static::path($bundle).'start'.EXT)) - { - require $path; - } - - // Each bundle may also have a "routes" file which is responsible for - // registering the bundle's routes. This is kept separate from the - // start script for reverse routing efficiency purposes. - static::routes($bundle); - - Event::fire("laravel.started: {$bundle}"); - - static::$started[] = strtolower($bundle); - } - - /** - * Load the "routes" file for a given bundle. - * - * @param string $bundle - * @return void - */ - public static function routes($bundle) - { - if (static::routed($bundle)) return; - - $path = static::path($bundle).'routes'.EXT; - - // By setting the bundle property on the router, the router knows what - // value to replace the (:bundle) place-holder with when the bundle - // routes are added, keeping the routes flexible. - Router::$bundle = static::option($bundle, 'handles'); - - if ( ! static::routed($bundle) and file_exists($path)) - { - static::$routed[] = $bundle; - - require $path; - } - } - - /** - * Register the auto-loading configuration for a bundle. - * - * @param string $bundle - * @param array $config - * @return void - */ - protected static function autoloads($bundle, $config) - { - $path = rtrim(Bundle::path($bundle), DS); - - foreach ($config['autoloads'] as $type => $mappings) - { - // When registering each type of mapping we'll replace the (:bundle) - // place-holder with the path to the bundle's root directory, so - // the developer may dryly register the mappings. - $mappings = array_map(function($mapping) use ($path) - { - return str_replace('(:bundle)', $path, $mapping); - - }, $mappings); - - // Once the mappings are formatted, we will call the Autoloader - // function matching the mapping type and pass in the array of - // mappings so they can be registered and used. - Autoloader::$type($mappings); - } - } - - /** - * Disable a bundle for the current request. - * - * @param string $bundle - * @return void - */ - public static function disable($bundle) - { - unset(static::$bundles[$bundle]); - } - - /** - * Determine which bundle handles the given URI. - * - * The default bundle is returned if no other bundle is assigned. - * - * @param string $uri - * @return string - */ - public static function handles($uri) - { - $uri = rtrim($uri, '/').'/'; - - foreach (static::$bundles as $key => $value) - { - if (isset($value['handles']) and starts_with($uri, $value['handles'].'/') or $value['handles'] == '/') - { - return $key; - } - } - - return DEFAULT_BUNDLE; - } - - /** - * Determine if a bundle exists within the bundles directory. - * - * @param string $bundle - * @return bool - */ - public static function exists($bundle) - { - return $bundle == DEFAULT_BUNDLE or in_array(strtolower($bundle), static::names()); - } - - /** - * Determine if a given bundle has been started for the request. - * - * @param string $bundle - * @return void - */ - public static function started($bundle) - { - return in_array(strtolower($bundle), static::$started); - } - - /** - * Determine if a given bundle has its routes file loaded. - * - * @param string $bundle - * @return void - */ - public static function routed($bundle) - { - return in_array(strtolower($bundle), static::$routed); - } - - /** - * Get the identifier prefix for the bundle. - * - * @param string $bundle - * @return string - */ - public static function prefix($bundle) - { - return ($bundle !== DEFAULT_BUNDLE) ? "{$bundle}::" : ''; - } - - /** - * Get the class prefix for a given bundle. - * - * @param string $bundle - * @return string - */ - public static function class_prefix($bundle) - { - return ($bundle !== DEFAULT_BUNDLE) ? Str::classify($bundle).'_' : ''; - } - - /** - * Return the root bundle path for a given bundle. - * - * - * // Returns the bundle path for the "admin" bundle - * $path = Bundle::path('admin'); - * - * // Returns the path('app') constant as the default bundle - * $path = Bundle::path('application'); - * - * - * @param string $bundle - * @return string - */ - public static function path($bundle) - { - if (is_null($bundle) or $bundle === DEFAULT_BUNDLE) - { - return path('app'); - } - elseif ($location = array_get(static::$bundles, $bundle.'.location')) - { - // If the bundle location starts with "path: ", we will assume that a raw - // path has been specified and will simply return it. Otherwise, we'll - // prepend the bundle directory path onto the location and return. - if (starts_with($location, 'path: ')) - { - return str_finish(substr($location, 6), DS); - } - else - { - return str_finish(path('bundle').$location, DS); - } - } - } - - /** - * Return the root asset path for the given bundle. - * - * @param string $bundle - * @return string - */ - public static function assets($bundle) - { - if (is_null($bundle)) return static::assets(DEFAULT_BUNDLE); - - return ($bundle != DEFAULT_BUNDLE) ? "/bundles/{$bundle}/" : '/'; - } - - /** - * Get the bundle name from a given identifier. - * - * - * // Returns "admin" as the bundle name for the identifier - * $bundle = Bundle::name('admin::home.index'); - * - * - * @param string $identifier - * @return string - */ - public static function name($identifier) - { - list($bundle, $element) = static::parse($identifier); - - return $bundle; - } - - /** - * Get the element name from a given identifier. - * - * - * // Returns "home.index" as the element name for the identifier - * $bundle = Bundle::bundle('admin::home.index'); - * - * - * @param string $identifier - * @return string - */ - public static function element($identifier) - { - list($bundle, $element) = static::parse($identifier); - - return $element; - } - - /** - * Reconstruct an identifier from a given bundle and element. - * - * - * // Returns "admin::home.index" - * $identifier = Bundle::identifier('admin', 'home.index'); - * - * // Returns "home.index" - * $identifier = Bundle::identifier('application', 'home.index'); - * - * - * @param string $bundle - * @param string $element - * @return string - */ - public static function identifier($bundle, $element) - { - return (is_null($bundle) or $bundle == DEFAULT_BUNDLE) ? $element : $bundle.'::'.$element; - } - - /** - * Return the bundle name if it exists, else return the default bundle. - * - * @param string $bundle - * @return string - */ - public static function resolve($bundle) - { - return (static::exists($bundle)) ? $bundle : DEFAULT_BUNDLE; - } - - /** - * Parse an element identifier and return the bundle name and element. - * - * - * // Returns array(null, 'admin.user') - * $element = Bundle::parse('admin.user'); - * - * // Parses "admin::user" and returns array('admin', 'user') - * $element = Bundle::parse('admin::user'); - * - * - * @param string $identifier - * @return array - */ - public static function parse($identifier) - { - // The parsed elements are cached so we don't have to reparse them on each - // subsequent request for the parsed element. So if we've already parsed - // the given element, we'll just return the cached copy as the value. - if (isset(static::$elements[$identifier])) - { - return static::$elements[$identifier]; - } - - if (strpos($identifier, '::') !== false) - { - $element = explode('::', strtolower($identifier)); - } - // If no bundle is in the identifier, we will insert the default bundle - // since classes like Config and Lang organize their items by bundle. - // The application folder essentially behaves as a default bundle. - else - { - $element = array(DEFAULT_BUNDLE, strtolower($identifier)); - } - - return static::$elements[$identifier] = $element; - } - - /** - * Get the information for a given bundle. - * - * @param string $bundle - * @return object - */ - public static function get($bundle) - { - return array_get(static::$bundles, $bundle); - } - - /** - * Get an option for a given bundle. - * - * @param string $bundle - * @param string $option - * @param mixed $default - * @return mixed - */ - public static function option($bundle, $option, $default = null) - { - $bundle = static::get($bundle); - - if (is_null($bundle)) - { - return value($default); - } - - return array_get($bundle, $option, $default); - } - - /** - * Get all of the installed bundles for the application. - * - * @return array - */ - public static function all() - { - return static::$bundles; - } - - /** - * Get all of the installed bundle names. - * - * @return array - */ - public static function names() - { - return array_keys(static::$bundles); - } - - /** - * Expand given bundle path of form "[bundle::]path/...". - * - * @param string $path - * @return string - */ - public static function expand($path) - { - list($bundle, $element) = static::parse($path); - return static::path($bundle).$element; - } - -} \ No newline at end of file diff --git a/laravel/cache.php b/laravel/cache.php deleted file mode 100644 index e633e83b..00000000 --- a/laravel/cache.php +++ /dev/null @@ -1,118 +0,0 @@ - - * // Get the default cache driver instance - * $driver = Cache::driver(); - * - * // Get a specific cache driver instance by name - * $driver = Cache::driver('memcached'); - * - * - * @param string $driver - * @return Cache\Drivers\Driver - */ - public static function driver($driver = null) - { - if (is_null($driver)) $driver = Config::get('cache.driver'); - - if ( ! isset(static::$drivers[$driver])) - { - static::$drivers[$driver] = static::factory($driver); - } - - return static::$drivers[$driver]; - } - - /** - * Create a new cache driver instance. - * - * @param string $driver - * @return Cache\Drivers\Driver - */ - protected static function factory($driver) - { - if (isset(static::$registrar[$driver])) - { - $resolver = static::$registrar[$driver]; - - return $resolver(); - } - - switch ($driver) - { - case 'apc': - return new Cache\Drivers\APC(Config::get('cache.key')); - - case 'file': - return new Cache\Drivers\File(path('storage').'cache'.DS); - - case 'memcached': - return new Cache\Drivers\Memcached(Memcached::connection(), Config::get('cache.key')); - - case 'memory': - return new Cache\Drivers\Memory; - - case 'redis': - return new Cache\Drivers\Redis(Redis::db()); - - case 'database': - return new Cache\Drivers\Database(Config::get('cache.key')); - - case 'wincache': - return new Cache\Drivers\WinCache(Config::get('cache.key')); - - default: - throw new \Exception("Cache driver {$driver} is not supported."); - } - } - - /** - * Register a third-party cache driver. - * - * @param string $driver - * @param Closure $resolver - * @return void - */ - public static function extend($driver, Closure $resolver) - { - static::$registrar[$driver] = $resolver; - } - - /** - * Magic Method for calling the methods on the default cache driver. - * - * - * // Call the "get" method on the default cache driver - * $name = Cache::get('name'); - * - * // Call the "put" method on the default cache driver - * Cache::put('name', 'Taylor', 15); - * - */ - public static function __callStatic($method, $parameters) - { - return call_user_func_array(array(static::driver(), $method), $parameters); - } - -} diff --git a/laravel/cache/drivers/apc.php b/laravel/cache/drivers/apc.php deleted file mode 100644 index 2fade423..00000000 --- a/laravel/cache/drivers/apc.php +++ /dev/null @@ -1,89 +0,0 @@ -key = $key; - } - - /** - * Determine if an item exists in the cache. - * - * @param string $key - * @return bool - */ - public function has($key) - { - return ( ! is_null($this->get($key))); - } - - /** - * Retrieve an item from the cache driver. - * - * @param string $key - * @return mixed - */ - protected function retrieve($key) - { - if (($cache = apc_fetch($this->key.$key)) !== false) - { - return $cache; - } - } - - /** - * Write an item to the cache for a given number of minutes. - * - * - * // Put an item in the cache for 15 minutes - * Cache::put('name', 'Taylor', 15); - * - * - * @param string $key - * @param mixed $value - * @param int $minutes - * @return void - */ - public function put($key, $value, $minutes) - { - apc_store($this->key.$key, $value, $minutes * 60); - } - - /** - * Write an item to the cache that lasts forever. - * - * @param string $key - * @param mixed $value - * @return void - */ - public function forever($key, $value) - { - return $this->put($key, $value, 0); - } - - /** - * Delete an item from the cache. - * - * @param string $key - * @return void - */ - public function forget($key) - { - apc_delete($this->key.$key); - } - -} \ No newline at end of file diff --git a/laravel/cache/drivers/database.php b/laravel/cache/drivers/database.php deleted file mode 100644 index 44bf4785..00000000 --- a/laravel/cache/drivers/database.php +++ /dev/null @@ -1,125 +0,0 @@ -key = $key; - } - - /** - * Determine if an item exists in the cache. - * - * @param string $key - * @return bool - */ - public function has($key) - { - return ( ! is_null($this->get($key))); - } - - /** - * Retrieve an item from the cache driver. - * - * @param string $key - * @return mixed - */ - protected function retrieve($key) - { - $cache = $this->table()->where('key', '=', $this->key.$key)->first(); - - if ( ! is_null($cache)) - { - if (time() >= $cache->expiration) return $this->forget($key); - - return unserialize($cache->value); - } - } - - /** - * Write an item to the cache for a given number of minutes. - * - * - * // Put an item in the cache for 15 minutes - * Cache::put('name', 'Taylor', 15); - * - * - * @param string $key - * @param mixed $value - * @param int $minutes - * @return void - */ - public function put($key, $value, $minutes) - { - $key = $this->key.$key; - - $value = serialize($value); - - $expiration = $this->expiration($minutes); - - // To update the value, we'll first attempt an insert against the - // database and if we catch an exception we'll assume that the - // primary key already exists in the table and update. - try - { - $this->table()->insert(compact('key', 'value', 'expiration')); - } - catch (\Exception $e) - { - $this->table()->where('key', '=', $key)->update(compact('value', 'expiration')); - } - } - - /** - * Write an item to the cache for five years. - * - * @param string $key - * @param mixed $value - * @return void - */ - public function forever($key, $value) - { - return $this->put($key, $value, 2628000); - } - - /** - * Delete an item from the cache. - * - * @param string $key - * @return void - */ - public function forget($key) - { - $this->table()->where('key', '=', $this->key.$key)->delete(); - } - - /** - * Get a query builder for the database table. - * - * @return Laravel\Database\Query - */ - protected function table() - { - $connection = DB::connection(Config::get('cache.database.connection')); - - return $connection->table(Config::get('cache.database.table')); - } - -} \ No newline at end of file diff --git a/laravel/cache/drivers/driver.php b/laravel/cache/drivers/driver.php deleted file mode 100644 index 5df317be..00000000 --- a/laravel/cache/drivers/driver.php +++ /dev/null @@ -1,113 +0,0 @@ - - * // Get an item from the cache driver - * $name = Cache::driver('name'); - * - * // Return a default value if the requested item isn't cached - * $name = Cache::get('name', 'Taylor'); - * - * - * @param string $key - * @param mixed $default - * @return mixed - */ - public function get($key, $default = null) - { - return ( ! is_null($item = $this->retrieve($key))) ? $item : value($default); - } - - /** - * Retrieve an item from the cache driver. - * - * @param string $key - * @return mixed - */ - abstract protected function retrieve($key); - - /** - * Write an item to the cache for a given number of minutes. - * - * - * // Put an item in the cache for 15 minutes - * Cache::put('name', 'Taylor', 15); - * - * - * @param string $key - * @param mixed $value - * @param int $minutes - * @return void - */ - abstract public function put($key, $value, $minutes); - - /** - * Get an item from the cache, or cache and return the default value. - * - * - * // Get an item from the cache, or cache a value for 15 minutes - * $name = Cache::remember('name', 'Taylor', 15); - * - * // Use a closure for deferred execution - * $count = Cache::remember('count', function() { return User::count(); }, 15); - * - * - * @param string $key - * @param mixed $default - * @param int $minutes - * @param string $function - * @return mixed - */ - public function remember($key, $default, $minutes, $function = 'put') - { - if ( ! is_null($item = $this->get($key, null))) return $item; - - $this->$function($key, $default = value($default), $minutes); - - return $default; - } - - /** - * Get an item from the cache, or cache the default value forever. - * - * @param string $key - * @param mixed $default - * @return mixed - */ - public function sear($key, $default) - { - return $this->remember($key, $default, null, 'forever'); - } - - /** - * Delete an item from the cache. - * - * @param string $key - * @return void - */ - abstract public function forget($key); - - /** - * Get the expiration time as a UNIX timestamp. - * - * @param int $minutes - * @return int - */ - protected function expiration($minutes) - { - return time() + ($minutes * 60); - } - -} diff --git a/laravel/cache/drivers/file.php b/laravel/cache/drivers/file.php deleted file mode 100644 index c37520ea..00000000 --- a/laravel/cache/drivers/file.php +++ /dev/null @@ -1,100 +0,0 @@ -path = $path; - } - - /** - * Determine if an item exists in the cache. - * - * @param string $key - * @return bool - */ - public function has($key) - { - return ( ! is_null($this->get($key))); - } - - /** - * Retrieve an item from the cache driver. - * - * @param string $key - * @return mixed - */ - protected function retrieve($key) - { - if ( ! file_exists($this->path.$key)) return null; - - // File based caches store have the expiration timestamp stored in - // UNIX format prepended to their contents. We'll compare the - // timestamp to the current time when we read the file. - if (time() >= substr($cache = file_get_contents($this->path.$key), 0, 10)) - { - return $this->forget($key); - } - - return unserialize(substr($cache, 10)); - } - - /** - * Write an item to the cache for a given number of minutes. - * - * - * // Put an item in the cache for 15 minutes - * Cache::put('name', 'Taylor', 15); - * - * - * @param string $key - * @param mixed $value - * @param int $minutes - * @return void - */ - public function put($key, $value, $minutes) - { - if ($minutes <= 0) return; - - $value = $this->expiration($minutes).serialize($value); - - file_put_contents($this->path.$key, $value, LOCK_EX); - } - - /** - * Write an item to the cache for five years. - * - * @param string $key - * @param mixed $value - * @return void - */ - public function forever($key, $value) - { - return $this->put($key, $value, 2628000); - } - - /** - * Delete an item from the cache. - * - * @param string $key - * @return void - */ - public function forget($key) - { - if (file_exists($this->path.$key)) @unlink($this->path.$key); - } - -} \ No newline at end of file diff --git a/laravel/cache/drivers/memcached.php b/laravel/cache/drivers/memcached.php deleted file mode 100644 index 5a324bf5..00000000 --- a/laravel/cache/drivers/memcached.php +++ /dev/null @@ -1,186 +0,0 @@ -key = $key; - $this->memcache = $memcache; - } - - /** - * Determine if an item exists in the cache. - * - * @param string $key - * @return bool - */ - public function has($key) - { - return ( ! is_null($this->get($key))); - } - - /** - * Retrieve an item from the cache driver. - * - * @param string $key - * @return mixed - */ - protected function retrieve($key) - { - if ($this->sectionable($key)) - { - list($section, $key) = $this->parse($key); - - return $this->get_from_section($section, $key); - } - elseif (($cache = $this->memcache->get($this->key.$key)) !== false) - { - return $cache; - } - } - - /** - * Write an item to the cache for a given number of minutes. - * - * - * // Put an item in the cache for 15 minutes - * Cache::put('name', 'Taylor', 15); - * - * - * @param string $key - * @param mixed $value - * @param int $minutes - * @return void - */ - public function put($key, $value, $minutes) - { - if ($this->sectionable($key)) - { - list($section, $key) = $this->parse($key); - - return $this->put_in_section($section, $key, $value, $minutes); - } - else - { - $this->memcache->set($this->key.$key, $value, $minutes * 60); - } - } - - /** - * Write an item to the cache that lasts forever. - * - * @param string $key - * @param mixed $value - * @return void - */ - public function forever($key, $value) - { - if ($this->sectionable($key)) - { - list($section, $key) = $this->parse($key); - - return $this->forever_in_section($section, $key, $value); - } - else - { - return $this->put($key, $value, 0); - } - } - - /** - * Delete an item from the cache. - * - * @param string $key - * @return void - */ - public function forget($key) - { - if ($this->sectionable($key)) - { - list($section, $key) = $this->parse($key); - - if ($key == '*') - { - $this->forget_section($section); - } - else - { - $this->forget_in_section($section, $key); - } - } - else - { - $this->memcache->delete($this->key.$key); - } - } - - /** - * Delete an entire section from the cache. - * - * @param string $section - * @return int|bool - */ - public function forget_section($section) - { - return $this->memcache->increment($this->key.$this->section_key($section)); - } - - /** - * Get the current section ID for a given section. - * - * @param string $section - * @return int - */ - protected function section_id($section) - { - return $this->sear($this->section_key($section), function() - { - return rand(1, 10000); - }); - } - - /** - * Get a section key name for a given section. - * - * @param string $section - * @return string - */ - protected function section_key($section) - { - return $section.'_section_key'; - } - - /** - * Get a section item key for a given section and key. - * - * @param string $section - * @param string $key - * @return string - */ - protected function section_item_key($section, $key) - { - return $section.'#'.$this->section_id($section).'#'.$key; - } - -} \ No newline at end of file diff --git a/laravel/cache/drivers/memory.php b/laravel/cache/drivers/memory.php deleted file mode 100644 index 9f57592c..00000000 --- a/laravel/cache/drivers/memory.php +++ /dev/null @@ -1,151 +0,0 @@ -get($key))); - } - - /** - * Retrieve an item from the cache driver. - * - * @param string $key - * @return mixed - */ - protected function retrieve($key) - { - if ($this->sectionable($key)) - { - list($section, $key) = $this->parse($key); - - return $this->get_from_section($section, $key); - } - else - { - return array_get($this->storage, $key); - } - } - - /** - * Write an item to the cache for a given number of minutes. - * - * - * // Put an item in the cache for 15 minutes - * Cache::put('name', 'Taylor', 15); - * - * - * @param string $key - * @param mixed $value - * @param int $minutes - * @return void - */ - public function put($key, $value, $minutes) - { - if ($this->sectionable($key)) - { - list($section, $key) = $this->parse($key); - - return $this->put_in_section($section, $key, $value, $minutes); - } - else - { - array_set($this->storage, $key, $value); - } - } - - /** - * Write an item to the cache that lasts forever. - * - * @param string $key - * @param mixed $value - * @return void - */ - public function forever($key, $value) - { - if ($this->sectionable($key)) - { - list($section, $key) = $this->parse($key); - - return $this->forever_in_section($section, $key, $value); - } - else - { - $this->put($key, $value, 0); - } - } - - /** - * Delete an item from the cache. - * - * @param string $key - * @return void - */ - public function forget($key) - { - if ($this->sectionable($key)) - { - list($section, $key) = $this->parse($key); - - if ($key == '*') - { - $this->forget_section($section); - } - else - { - $this->forget_in_section($section, $key); - } - } - else - { - array_forget($this->storage, $key); - } - } - - /** - * Delete an entire section from the cache. - * - * @param string $section - * @return int|bool - */ - public function forget_section($section) - { - array_forget($this->storage, 'section#'.$section); - } - - /** - * Flush the entire cache. - * - * @return void - */ - public function flush() - { - $this->storage = array(); - } - - /** - * Get a section item key for a given section and key. - * - * @param string $section - * @param string $key - * @return string - */ - protected function section_item_key($section, $key) - { - return "section#{$section}.{$key}"; - } - -} \ No newline at end of file diff --git a/laravel/cache/drivers/redis.php b/laravel/cache/drivers/redis.php deleted file mode 100644 index 3195566c..00000000 --- a/laravel/cache/drivers/redis.php +++ /dev/null @@ -1,91 +0,0 @@ -redis = $redis; - } - - /** - * Determine if an item exists in the cache. - * - * @param string $key - * @return bool - */ - public function has($key) - { - return ( ! is_null($this->redis->get($key))); - } - - /** - * Retrieve an item from the cache driver. - * - * @param string $key - * @return mixed - */ - protected function retrieve($key) - { - if ( ! is_null($cache = $this->redis->get($key))) - { - return unserialize($cache); - } - } - - /** - * Write an item to the cache for a given number of minutes. - * - * - * // Put an item in the cache for 15 minutes - * Cache::put('name', 'Taylor', 15); - * - * - * @param string $key - * @param mixed $value - * @param int $minutes - * @return void - */ - public function put($key, $value, $minutes) - { - $this->forever($key, $value); - - $this->redis->expire($key, $minutes * 60); - } - - /** - * Write an item to the cache that lasts forever. - * - * @param string $key - * @param mixed $value - * @return void - */ - public function forever($key, $value) - { - $this->redis->set($key, serialize($value)); - } - - /** - * Delete an item from the cache. - * - * @param string $key - * @return void - */ - public function forget($key) - { - $this->redis->del($key); - } - -} \ No newline at end of file diff --git a/laravel/cache/drivers/sectionable.php b/laravel/cache/drivers/sectionable.php deleted file mode 100644 index 93566989..00000000 --- a/laravel/cache/drivers/sectionable.php +++ /dev/null @@ -1,142 +0,0 @@ -get($this->section_item_key($section, $key), $default); - } - - /** - * Write a sectioned item to the cache. - * - * @param string $section - * @param string $key - * @param mixed $value - * @param int $minutes - * @return void - */ - public function put_in_section($section, $key, $value, $minutes) - { - $this->put($this->section_item_key($section, $key), $value, $minutes); - } - - /** - * Write a sectioned item to the cache that lasts forever. - * - * @param string $section - * @param string $key - * @param mixed $value - * @return void - */ - public function forever_in_section($section, $key, $value) - { - return $this->forever($this->section_item_key($section, $key), $value); - } - - /** - * Get a sectioned item from the cache, or cache and return the default value. - * - * @param string $section - * @param string $key - * @param mixed $default - * @param int $minutes - * @param string $function - * @return mixed - */ - public function remember_in_section($section, $key, $default, $minutes, $function = 'put') - { - $key = $this->section_item_key($section, $key); - - return $this->remember($key, $default, $minutes, $function); - } - - /** - * Get a sectioned item from the cache, or cache the default value forever. - * - * @param string $section - * @param string $key - * @param mixed $default - * @return mixed - */ - public function sear_in_section($section, $key, $default) - { - return $this->sear($this->section_item_key($section, $key), $default); - } - - /** - * Delete a sectioned item from the cache. - * - * @param string $section - * @param string $key - * @return void - */ - public function forget_in_section($section, $key) - { - return $this->forget($this->section_item_key($section, $key)); - } - - /** - * Delete an entire section from the cache. - * - * @param string $section - * @return int|bool - */ - abstract public function forget_section($section); - - /** - * Indicates if a key is sectionable. - * - * @param string $key - * @return bool - */ - protected function sectionable($key) - { - return $this->implicit and $this->sectioned($key); - } - - /** - * Determine if a key is sectioned. - * - * @param string $key - * @return bool - */ - protected function sectioned($key) - { - return str_contains($key, '::'); - } - - /** - * Get the section and key from a sectioned key. - * - * @param string $key - * @return array - */ - protected function parse($key) - { - return explode('::', $key, 2); - } - -} \ No newline at end of file diff --git a/laravel/cache/drivers/wincache.php b/laravel/cache/drivers/wincache.php deleted file mode 100644 index 48f8ca03..00000000 --- a/laravel/cache/drivers/wincache.php +++ /dev/null @@ -1,89 +0,0 @@ -key = $key; - } - - /** - * Determine if an item exists in the cache. - * - * @param string $key - * @return bool - */ - public function has($key) - { - return ( ! is_null($this->get($key))); - } - - /** - * Retrieve an item from the cache driver. - * - * @param string $key - * @return mixed - */ - protected function retrieve($key) - { - if (($cache = wincache_ucache_get($this->key.$key)) !== false) - { - return $cache; - } - } - - /** - * Write an item to the cache for a given number of minutes. - * - * - * // Put an item in the cache for 15 minutes - * Cache::put('name', 'Taylor', 15); - * - * - * @param string $key - * @param mixed $value - * @param int $minutes - * @return void - */ - public function put($key, $value, $minutes) - { - wincache_ucache_add($this->key.$key, $value, $minutes * 60); - } - - /** - * Write an item to the cache that lasts forever. - * - * @param string $key - * @param mixed $value - * @return void - */ - public function forever($key, $value) - { - return $this->put($key, $value, 0); - } - - /** - * Delete an item from the cache. - * - * @param string $key - * @return void - */ - public function forget($key) - { - wincache_ucache_delete($this->key.$key); - } - -} \ No newline at end of file diff --git a/laravel/cli/artisan.php b/laravel/cli/artisan.php deleted file mode 100644 index e7bd130e..00000000 --- a/laravel/cli/artisan.php +++ /dev/null @@ -1,49 +0,0 @@ -getMessage(); -} - -echo PHP_EOL; \ No newline at end of file diff --git a/laravel/cli/command.php b/laravel/cli/command.php deleted file mode 100644 index c6a25ee4..00000000 --- a/laravel/cli/command.php +++ /dev/null @@ -1,198 +0,0 @@ - - * // Call the migrate artisan task - * Command::run(array('migrate')); - * - * // Call the migrate task with some arguments - * Command::run(array('migrate:rollback', 'bundle-name')) - * - * - * @param array $arguments - * @return void - */ - public static function run($arguments = array()) - { - static::validate($arguments); - - list($bundle, $task, $method) = static::parse($arguments[0]); - - // If the task exists within a bundle, we will start the bundle so that any - // dependencies can be registered in the application IoC container. If the - // task is registered in the container, we'll resolve it. - if (Bundle::exists($bundle)) - { - Bundle::start($bundle); - } - - $task = static::resolve($bundle, $task); - - // Once the bundle has been resolved, we'll make sure we could actually - // find that task, and then verify that the method exists on the task - // so we can successfully call it without a problem. - if (is_null($task)) - { - throw new \Exception("Sorry, I can't find that task."); - } - - if (is_callable(array($task, $method))) - { - $task->$method(array_slice($arguments, 1)); - } - else - { - throw new \Exception("Sorry, I can't find that method!"); - } - } - - /** - * Determine if the given command arguments are valid. - * - * @param array $arguments - * @return void - */ - protected static function validate($arguments) - { - if ( ! isset($arguments[0])) - { - throw new \Exception("You forgot to provide the task name."); - } - } - - /** - * Parse the task name to extract the bundle, task, and method. - * - * @param string $task - * @return array - */ - protected static function parse($task) - { - list($bundle, $task) = Bundle::parse($task); - - // Extract the task method from the task string. Methods are called - // on tasks by separating the task and method with a single colon. - // If no task is specified, "run" is used as the default. - if (str_contains($task, ':')) - { - list($task, $method) = explode(':', $task); - } - else - { - $method = 'run'; - } - - return array($bundle, $task, $method); - } - - /** - * Resolve an instance of the given task name. - * - * - * // Resolve an instance of a task - * $task = Command::resolve('application', 'migrate'); - * - * // Resolve an instance of a task within a bundle - * $task = Command::resolve('bundle', 'foo'); - * - * - * @param string $bundle - * @param string $task - * @return object - */ - public static function resolve($bundle, $task) - { - $identifier = Bundle::identifier($bundle, $task); - - // First we'll check to see if the task has been registered in the - // application IoC container. This allows all dependencies to be - // injected into tasks for more flexible testability. - if (IoC::registered("task: {$identifier}")) - { - return IoC::resolve("task: {$identifier}"); - } - - // If the task file exists, we'll format the bundle and task name - // into a task class name and resolve an instance of the class so that - // the requested method may be executed. - if (file_exists($path = Bundle::path($bundle).'tasks/'.$task.EXT)) - { - require_once $path; - - $task = static::format($bundle, $task); - - return new $task; - } - } - - /** - * Parse the command line arguments and return the results. - * - * @param array $argv - * @return array - */ - public static function options($argv) - { - $options = array(); - - $arguments = array(); - - for ($i = 0, $count = count($argv); $i < $count; $i++) - { - $argument = $argv[$i]; - - // If the CLI argument starts with a double hyphen, it is an option, - // so we will extract the value and add it to the array of options - // to be returned by the method. - if (starts_with($argument, '--')) - { - // By default, we will assume the value of the options is true, - // but if the option contains an equals sign, we will take the - // value to the right of the equals sign as the value and - // remove the value from the option key. - list($key, $value) = array(substr($argument, 2), true); - - if (($equals = strpos($argument, '=')) !== false) - { - $key = substr($argument, 2, $equals - 2); - - $value = substr($argument, $equals + 1); - } - - $options[$key] = $value; - } - // If the CLI argument does not start with a double hyphen it's - // simply an argument to be passed to the console task so we'll - // add it to the array of "regular" arguments. - else - { - $arguments[] = $argument; - } - } - - return array($arguments, $options); - } - - /** - * Format a bundle and task into a task class name. - * - * @param string $bundle - * @param string $task - * @return string - */ - protected static function format($bundle, $task) - { - $prefix = Bundle::class_prefix($bundle); - - return '\\'.$prefix.Str::classify($task).'_Task'; - } - -} diff --git a/laravel/cli/dependencies.php b/laravel/cli/dependencies.php deleted file mode 100644 index 2e7f23b6..00000000 --- a/laravel/cli/dependencies.php +++ /dev/null @@ -1,140 +0,0 @@ -repository = $repository; - } - - /** - * Install the given bundles into the application. - * - * @param array $bundles - * @return void - */ - public function install($bundles) - { - foreach ($this->get($bundles) as $bundle) - { - if (Bundle::exists($bundle['name'])) - { - echo "Bundle {$bundle['name']} is already installed."; - - continue; - } - - // Once we have the bundle information, we can resolve an instance - // of a provider and install the bundle into the application and - // all of its registered dependencies as well. - // - // Each bundle provider implements the Provider interface and - // is responsible for retrieving the bundle source from its - // hosting party and installing it into the application. - $path = path('bundle').$this->path($bundle); - - echo "Fetching [{$bundle['name']}]..."; - - $this->download($bundle, $path); - - echo "done! Bundle installed.".PHP_EOL; - } - } - - /** - * Uninstall the given bundles from the application. - * - * @param array $bundles - * @return void - */ - public function uninstall($bundles) - { - if (count($bundles) == 0) - { - throw new \Exception("Tell me what bundle to uninstall."); - } - - foreach ($bundles as $name) - { - if ( ! Bundle::exists($name)) - { - echo "Bundle [{$name}] is not installed."; - continue; - } - - echo "Uninstalling [{$name}]...".PHP_EOL; - $migrator = IoC::resolve('task: migrate'); - $migrator->reset($name); - - $publisher = IoC::resolve('bundle.publisher'); - $publisher->unpublish($name); - - $location = Bundle::path($name); - File::rmdir($location); - - echo "Bundle [{$name}] has been uninstalled!".PHP_EOL; - } - - echo "Now, you have to remove those bundle from your application/bundles.php".PHP_EOL; - } - - /** - * Upgrade the given bundles for the application. - * - * @param array $bundles - * @return void - */ - public function upgrade($bundles) - { - if (count($bundles) == 0) $bundles = Bundle::names(); - - foreach ($bundles as $name) - { - if ( ! Bundle::exists($name)) - { - echo "Bundle [{$name}] is not installed!"; - - continue; - } - - // First we want to retrieve the information for the bundle, such as - // where it is currently installed. This will allow us to upgrade - // the bundle into it's current installation path. - $location = Bundle::path($name); - - // If the bundle exists, we will grab the data about the bundle from - // the API so we can make the right bundle provider for the bundle, - // since we don't know the provider used to install. - $response = $this->retrieve($name); - - if ($response['status'] == 'not-found') - { - continue; - } - - // Once we have the bundle information from the API, we'll simply - // recursively delete the bundle and then re-download it using - // the correct provider assigned to the bundle. - File::rmdir($location); - - $this->download($response['bundle'], $location); - - echo "Bundle [{$name}] has been upgraded!".PHP_EOL; - } - } - - /** - * Gather all of the bundles from the bundle repository. - * - * @param array $bundles - * @return array - */ - protected function get($bundles) - { - $responses = array(); - - foreach ($bundles as $bundle) - { - // First we'll call the bundle repository to gather the bundle data - // array, which contains all of the information needed to install - // the bundle into the Laravel application. - $response = $this->retrieve($bundle); - - if ($response['status'] == 'not-found') - { - throw new \Exception("There is no bundle named [$bundle]."); - } - - // If the bundle was retrieved successfully, we will add it to - // our array of bundles, as well as merge all of the bundle's - // dependencies into the array of responses. - $bundle = $response['bundle']; - - $responses[] = $bundle; - - // We'll also get the bundle's declared dependencies so they - // can be installed along with the bundle, making it easy - // to install a group of bundles. - $dependencies = $this->get($bundle['dependencies']); - - $responses = array_merge($responses, $dependencies); - } - - return $responses; - } - - /** - * Publish bundle assets to the public directory. - * - * @param array $bundles - * @return void - */ - public function publish($bundles) - { - if (count($bundles) == 0) $bundles = Bundle::names(); - - array_walk($bundles, array(IoC::resolve('bundle.publisher'), 'publish')); - } - - /** - * Delete bundle assets from the public directory. - * - * @param array $bundles - * @return void - */ - public function unpublish($bundles) - { - if (count($bundles) == 0) $bundles = Bundle::names(); - - array_walk($bundles, array(IoC::resolve('bundle.publisher'), 'unpublish')); - } - - /** - * Install a bundle using a provider. - * - * @param string $bundle - * @param string $path - * @return void - */ - protected function download($bundle, $path) - { - $provider = "bundle.provider: {$bundle['provider']}"; - - IoC::resolve($provider)->install($bundle, $path); - } - - /** - * Retrieve a bundle from the repository. - * - * @param string $bundle - * @return array - */ - protected function retrieve($bundle) - { - $response = $this->repository->get($bundle); - - if ( ! $response) - { - throw new \Exception("The bundle API is not responding."); - } - - return $response; - } - - /** - * Return the path for a given bundle. - * - * @param array $bundle - * @return string - */ - protected function path($bundle) - { - return array_get($bundle, 'path', $bundle['name']); - } - -} diff --git a/laravel/cli/tasks/bundle/providers/github.php b/laravel/cli/tasks/bundle/providers/github.php deleted file mode 100644 index cc0346ec..00000000 --- a/laravel/cli/tasks/bundle/providers/github.php +++ /dev/null @@ -1,19 +0,0 @@ -download($url)); - - $zip = new \ZipArchive; - - $zip->open($target); - - // Once we have the Zip archive, we can open it and extract it - // into the working directory. By convention, we expect the - // archive to contain one root directory with the bundle. - mkdir($work.'zip'); - - $zip->extractTo($work.'zip'); - - $latest = File::latest($work.'zip')->getRealPath(); - - @chmod($latest, 0777); - - // Once we have the latest modified directory, we should be - // able to move its contents over into the bundles folder - // so the bundle will be usable by the developer. - File::mvdir($latest, $path); - - File::rmdir($work.'zip'); - - $zip->close(); - @unlink($target); - } - - /** - * Download a remote zip archive from a URL. - * - * @param string $url - * @return string - */ - protected function download($url) - { - $remote = file_get_contents($url); - - // If we were unable to download the zip archive correctly - // we'll bomb out since we don't want to extract the last - // zip that was put in the storage directory. - if ($remote === false) - { - throw new \Exception("Error downloading the requested bundle."); - } - - return $remote; - } - -} \ No newline at end of file diff --git a/laravel/cli/tasks/bundle/publisher.php b/laravel/cli/tasks/bundle/publisher.php deleted file mode 100644 index 5beb4fb4..00000000 --- a/laravel/cli/tasks/bundle/publisher.php +++ /dev/null @@ -1,85 +0,0 @@ -move($path.'public', path('public').'bundles'.DS.$bundle); - - echo "Assets published for bundle [$bundle].".PHP_EOL; - } - - /** - * Delete a bundle's assets from the public directory - * - * @param string $bundle - * @return void - */ - public function unpublish($bundle) - { - if ( ! Bundle::exists($bundle)) - { - echo "Bundle [$bundle] is not registered."; - - return; - } - - File::rmdir(path('public').'bundles'.DS.$bundle); - - echo "Assets deleted for bundle [$bundle].".PHP_EOL; - } - - /** - * Copy the contents of a bundle's assets to the public folder. - * - * @param string $source - * @param string $destination - * @return void - */ - protected function move($source, $destination) - { - File::cpdir($source, $destination); - } - - /** - * Get the "to" location of the bundle's assets. - * - * @param string $bundle - * @return string - */ - protected function to($bundle) - { - return path('public').'bundles'.DS.$bundle.DS; - } - - /** - * Get the "from" location of the bundle's assets. - * - * @param string $bundle - * @return string - */ - protected function from($bundle) - { - return Bundle::path($bundle).'public'; - } - -} \ No newline at end of file diff --git a/laravel/cli/tasks/bundle/repository.php b/laravel/cli/tasks/bundle/repository.php deleted file mode 100644 index 2ee43d9c..00000000 --- a/laravel/cli/tasks/bundle/repository.php +++ /dev/null @@ -1,29 +0,0 @@ -api.$bundle); - - return json_decode($bundle, true); - } - -} \ No newline at end of file diff --git a/laravel/cli/tasks/help.json b/laravel/cli/tasks/help.json deleted file mode 100644 index d89a0b2a..00000000 --- a/laravel/cli/tasks/help.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "Application Configuration": { - "key:generate": { - "description": "Generate a secure application key.", - "command": "php artisan key:generate" - } - }, - "Database Tables": { - "session:table": { - "description": "Generate a migration for the sessions database table.", - "command": "php artisan session:table" - } - }, - "Migrations": { - "migrate:install": { - "description": "Create the Laravel migration table.", - "command": "php artisan migrate:install" - }, - "migrate:make": { - "description": "Create a migration.", - "command": "php artisan migrate:make create_users_table" - }, - "migrate": { - "description": "Run outstanding migrations.", - "command": "php artisan migrate" - }, - "migrate:rollback": { - "description": "Roll back the most recent migration.", - "command": "php artisan migrate:rollback" - }, - "migrate:reset": { - "description": "Roll back all migrations.", - "command": "php artisan migrate:reset" - } - }, - "Bundles": { - "bundle:install": { - "description": "Install a bundle.", - "command": "php artisan bundle:install swiftmailer" - }, - "bundle:uninstall": { - "description": "Uninstall a bundle, delete its public, rollback its migrations.", - "command": "php artisan bundle:uninstall swiftmailer" - }, - "bundle:upgrade": { - "description": "Upgrade a bundle.", - "command": "php artisan bundle:upgrade swiftmailer" - }, - "bundle:publish": { - "description": "Publish all bundles' assets.", - "command": "php artisan bundle:publish" - }, - "bundle:unpublish": { - "description": "Delete all bundles' assets from the public directory.", - "command": "php artisan bundle:unpublish" - } - }, - "Unit Testing": { - "test": { - "description": "Run the application's tests.", - "command": "php artisan test" - } - }, - "Routing": { - "route:call": { - "description": "Call a route.", - "command": "php artisan route:call get api/user/1" - } - }, - "Application Keys": { - "key:generate": { - "description": "Generate an application key.", - "command": "php artisan key:generade" - } - }, - "CLI Options": { - "--env=": { - "description": "Set the Laravel environment.", - "command": "php artisan task --env=local" - }, - "--database=": { - "description": "Set the default database connection.", - "command": "php artisan task --database=mysql" - } - } -} \ No newline at end of file diff --git a/laravel/cli/tasks/help.php b/laravel/cli/tasks/help.php deleted file mode 100644 index 929c4ff8..00000000 --- a/laravel/cli/tasks/help.php +++ /dev/null @@ -1,34 +0,0 @@ - $commands) - { - if($i++ != 0) echo PHP_EOL; - - echo PHP_EOL . "# $category" . PHP_EOL; - - foreach($commands as $command => $details) - { - echo PHP_EOL . str_pad($command, 20) . str_pad($details->description, 30); - } - } - } -} \ No newline at end of file diff --git a/laravel/cli/tasks/key.php b/laravel/cli/tasks/key.php deleted file mode 100644 index 0c08a84f..00000000 --- a/laravel/cli/tasks/key.php +++ /dev/null @@ -1,57 +0,0 @@ -path = path('app').'config/application'.EXT; - } - - /** - * Generate a random key for the application. - * - * @param array $arguments - * @return void - */ - public function generate($arguments = array()) - { - // By default the Crypter class uses AES-256 encryption which uses - // a 32 byte input vector, so that is the length of string we will - // generate for the application token unless another length is - // specified through the CLI. - $key = Str::random(array_get($arguments, 0, 32)); - - $config = File::get($this->path); - - $config = str_replace("'key' => '',", "'key' => '{$key}',", $config, $count); - - File::put($this->path, $config); - - if ($count > 0) - { - echo "Configuration updated with secure key!"; - } - else - { - echo "An application key already exists!"; - } - - echo PHP_EOL; - } - -} \ No newline at end of file diff --git a/laravel/cli/tasks/migrate/database.php b/laravel/cli/tasks/migrate/database.php deleted file mode 100644 index 31fcf110..00000000 --- a/laravel/cli/tasks/migrate/database.php +++ /dev/null @@ -1,84 +0,0 @@ -table()->insert(compact('bundle', 'name', 'batch')); - } - - /** - * Delete a row from the migration table. - * - * @param string $bundle - * @param string $name - * @return void - */ - public function delete($bundle, $name) - { - $this->table()->where_bundle_and_name($bundle, $name)->delete(); - } - - /** - * Return an array of the last batch of migrations. - * - * @return array - */ - public function last() - { - $table = $this->table(); - - // First we need to grab the last batch ID from the migration table, - // as this will allow us to grab the latest batch of migrations - // that need to be run for a rollback command. - $id = $this->batch(); - - // Once we have the batch ID, we will pull all of the rows for that - // batch. Then we can feed the results into the resolve method to - // get the migration instances for the command. - return $table->where_batch($id)->order_by('name', 'desc')->get(); - } - - /** - * Get all of the migrations that have run for a bundle. - * - * @param string $bundle - * @return array - */ - public function ran($bundle) - { - return $this->table()->where_bundle($bundle)->lists('name'); - } - - /** - * Get the maximum batch ID from the migration table. - * - * @return int - */ - public function batch() - { - return $this->table()->max('batch'); - } - - /** - * Get a database query instance for the migration table. - * - * @return Laravel\Database\Query - */ - protected function table() - { - return DB::connection(Request::server('cli.db'))->table('laravel_migrations'); - } - -} \ No newline at end of file diff --git a/laravel/cli/tasks/migrate/migrator.php b/laravel/cli/tasks/migrate/migrator.php deleted file mode 100644 index 5913b984..00000000 --- a/laravel/cli/tasks/migrate/migrator.php +++ /dev/null @@ -1,278 +0,0 @@ -resolver = $resolver; - $this->database = $database; - } - - /** - * Run a database migration command. - * - * @param array $arguments - * @return void - */ - public function run($arguments = array()) - { - // If no arguments were passed to the task, we will just migrate - // to the latest version across all bundles. Otherwise, we will - // parse the arguments to determine the bundle for which the - // database migrations should be run. - if (count($arguments) == 0) - { - $this->migrate(); - } - else - { - $this->migrate(array_get($arguments, 0)); - } - } - - /** - * Run the outstanding migrations for a given bundle. - * - * @param string $bundle - * @param int $version - * @return void - */ - public function migrate($bundle = null, $version = null) - { - $migrations = $this->resolver->outstanding($bundle); - - if (count($migrations) == 0) - { - echo "No outstanding migrations."; - - return; - } - - // We need to grab the latest batch ID and increment it by one. - // This allows us to group the migrations so we can easily - // determine which migrations need to roll back. - $batch = $this->database->batch() + 1; - - foreach ($migrations as $migration) - { - $migration['migration']->up(); - - echo 'Migrated: '.$this->display($migration).PHP_EOL; - - // After running a migration, we log its execution in the migration - // table so that we can easily determine which migrations we'll - // reverse in the event of a migration rollback. - $this->database->log($migration['bundle'], $migration['name'], $batch); - } - } - - /** - * Rollback the latest migration command. - * - * @param array $arguments - * @return bool - */ - public function rollback($arguments = array()) - { - $migrations = $this->resolver->last(); - - // If bundles supplied, filter migrations to rollback only bundles' - // migrations. - if (count($arguments) > 0) - { - $bundles = $arguments; - - if ( ! is_array($bundles)) $bundles = array($bundles); - - $migrations = array_filter($migrations, function($migration) use ($bundles) - { - return in_array($migration['bundle'], $bundles); - }); - } - - if (count($migrations) == 0) - { - echo "Nothing to rollback.".PHP_EOL; - - return false; - } - - // The "last" method on the resolver returns an array of migrations, - // along with their bundles and names. We will iterate through each - // migration and run the "down" method. - foreach (array_reverse($migrations) as $migration) - { - $migration['migration']->down(); - - echo 'Rolled back: '.$this->display($migration).PHP_EOL; - - // By only removing the migration after it has successfully rolled back, - // we can re-run the rollback command in the event of any errors with - // the migration and pick up where we left off. - $this->database->delete($migration['bundle'], $migration['name']); - } - - return true; - } - - /** - * Rollback all of the executed migrations. - * - * @param array $arguments - * @return void - */ - public function reset($arguments = array()) - { - while ($this->rollback($arguments)) {}; - } - - /** - * Reset the database to pristine state and run all migrations - * - * @param array $arguments - * @return void - */ - public function rebuild() - { - // Clean the database - $this->reset(); - - echo PHP_EOL; - - // Re-run all migrations - $this->migrate(); - - echo 'The database was successfully rebuilt'.PHP_EOL; - } - - /** - * Install the database tables used by the migration system. - * - * @return void - */ - public function install() - { - Schema::table('laravel_migrations', function($table) - { - $table->create(); - - // Migrations can be run for a specific bundle, so we'll use - // the bundle name and string migration name as a unique ID - // for the migrations, allowing us to easily identify which - // migrations have been run for each bundle. - $table->string('bundle', 50); - - $table->string('name', 200); - - // When running a migration command, we will store a batch - // ID with each of the rows on the table. This will allow - // us to grab all of the migrations that were run for the - // last command when performing rollbacks. - $table->integer('batch'); - - $table->primary(array('bundle', 'name')); - }); - - echo "Migration table created successfully."; - } - - /** - * Generate a new migration file. - * - * @param array $arguments - * @return string - */ - public function make($arguments = array()) - { - if (count($arguments) == 0) - { - throw new \Exception("I need to know what to name the migration."); - } - - list($bundle, $migration) = Bundle::parse($arguments[0]); - - // The migration path is prefixed with the date timestamp, which - // is a better way of ordering migrations than a simple integer - // incrementation, since developers may start working on the - // next migration at the same time unknowingly. - $prefix = date('Y_m_d_His'); - - $path = Bundle::path($bundle).'migrations'.DS; - - // If the migration directory does not exist for the bundle, - // we will create the directory so there aren't errors when - // when we try to write the migration file. - if ( ! is_dir($path)) mkdir($path); - - $file = $path.$prefix.'_'.$migration.EXT; - - File::put($file, $this->stub($bundle, $migration)); - - echo "Great! New migration created!"; - - // Once the migration has been created, we'll return the - // migration file name so it can be used by the task - // consumer if necessary for further work. - return $file; - } - - /** - * Get the stub migration with the proper class name. - * - * @param string $bundle - * @param string $migration - * @return string - */ - protected function stub($bundle, $migration) - { - $stub = File::get(path('sys').'cli/tasks/migrate/stub'.EXT); - - $prefix = Bundle::class_prefix($bundle); - - // The class name is formatted similarly to tasks and controllers, - // where the bundle name is prefixed to the class if it is not in - // the default "application" bundle. - $class = $prefix.Str::classify($migration); - - return str_replace('{{class}}', $class, $stub); - } - - /** - * Get the migration bundle and name for display. - * - * @param array $migration - * @return string - */ - protected function display($migration) - { - return $migration['bundle'].'/'.$migration['name']; - } - -} \ No newline at end of file diff --git a/laravel/cli/tasks/migrate/resolver.php b/laravel/cli/tasks/migrate/resolver.php deleted file mode 100644 index 0e144b4a..00000000 --- a/laravel/cli/tasks/migrate/resolver.php +++ /dev/null @@ -1,175 +0,0 @@ -database = $database; - } - - /** - * Resolve all of the outstanding migrations for a bundle. - * - * @param string $bundle - * @return array - */ - public function outstanding($bundle = null) - { - $migrations = array(); - - // If no bundle was given to the command, we'll grab every bundle for - // the application, including the "application" bundle, which is not - // returned by "all" method on the Bundle class. - if (is_null($bundle)) - { - $bundles = array_merge(Bundle::names(), array('application')); - } - else - { - $bundles = array($bundle); - } - - foreach ($bundles as $bundle) - { - // First we need to grab all of the migrations that have already - // run for this bundle, as well as all of the migration files - // for the bundle. Once we have these, we can determine which - // migrations are still outstanding. - $ran = $this->database->ran($bundle); - - $files = $this->migrations($bundle); - - // To find outstanding migrations, we will simply iterate over - // the migration files and add the files that do not exist in - // the array of ran migrations to the outstanding array. - foreach ($files as $key => $name) - { - if ( ! in_array($name, $ran)) - { - $migrations[] = compact('bundle', 'name'); - } - } - } - - return $this->resolve($migrations); - } - - /** - * Resolve an array of the last batch of migrations. - * - * @return array - */ - public function last() - { - return $this->resolve($this->database->last()); - } - - /** - * Resolve an array of migration instances. - * - * @param array $migrations - * @return array - */ - protected function resolve($migrations) - { - $instances = array(); - - foreach ($migrations as $migration) - { - $migration = (array) $migration; - - // The migration array contains the bundle name, so we will get the - // path to the bundle's migrations and resolve an instance of the - // migration using the name. - $bundle = $migration['bundle']; - - $path = Bundle::path($bundle).'migrations/'; - - // Migrations are not resolved through the auto-loader, so we will - // manually instantiate the migration class instances for each of - // the migration names we're given. - $name = $migration['name']; - - require_once $path.$name.EXT; - - // Since the migration name will begin with the numeric ID, we'll - // slice off the ID so we are left with the migration class name. - // The IDs are for sorting when resolving outstanding migrations. - // - // Migrations that exist within bundles other than the default - // will be prefixed with the bundle name to avoid any possible - // naming collisions with other bundle's migrations. - $prefix = Bundle::class_prefix($bundle); - - $class = $prefix.\Laravel\Str::classify(substr($name, 18)); - - $migration = new $class; - - // When adding to the array of instances, we will actually - // add the migration instance, the bundle, and the name. - // This allows the migrator to log the bundle and name - // when the migration is executed. - $instances[] = compact('bundle', 'name', 'migration'); - } - - // At this point the migrations are only sorted within their - // bundles so we need to resort them by name to ensure they - // are in a consistent order. - usort($instances, function($a, $b) - { - return strcmp($a['name'], $b['name']); - }); - - return $instances; - } - - /** - * Grab all of the migration filenames for a bundle. - * - * @param string $bundle - * @return array - */ - protected function migrations($bundle) - { - $files = glob(Bundle::path($bundle).'migrations/*_*'.EXT); - - // When open_basedir is enabled, glob will return false on an - // empty directory, so we will return an empty array in this - // case so the application doesn't bomb out. - if ($files === false) - { - return array(); - } - - // Once we have the array of files in the migration directory, - // we'll take the basename of the file and remove the PHP file - // extension, which isn't needed. - foreach ($files as &$file) - { - $file = str_replace(EXT, '', basename($file)); - } - - // We'll also sort the files so that the earlier migrations - // will be at the front of the array and will be resolved - // first by this class' resolve method. - sort($files); - - return $files; - } - -} \ No newline at end of file diff --git a/laravel/cli/tasks/migrate/stub.php b/laravel/cli/tasks/migrate/stub.php deleted file mode 100644 index 6ce685f4..00000000 --- a/laravel/cli/tasks/migrate/stub.php +++ /dev/null @@ -1,25 +0,0 @@ -route(); - - echo PHP_EOL; - } - - /** - * Dump the results of the currently established route. - * - * @return void - */ - protected function route() - { - // We'll call the router using the method and URI specified by - // the developer on the CLI. If a route is found, we will not - // run the filters, but simply dump the result. - $route = Router::route(Request::method(), $_SERVER['REQUEST_URI']); - - if ( ! is_null($route)) - { - var_dump($route->response()); - } - else - { - echo '404: Not Found'; - } - } - -} diff --git a/laravel/cli/tasks/session/manager.php b/laravel/cli/tasks/session/manager.php deleted file mode 100644 index ebf30a0c..00000000 --- a/laravel/cli/tasks/session/manager.php +++ /dev/null @@ -1,93 +0,0 @@ -generate(); - - // To create the session table, we will actually create a database - // migration and then run it. This allows the application to stay - // portable through the framework's migrations system. - $migration = $migrator->make(array('create_session_table')); - - $stub = path('sys').'cli/tasks/session/migration'.EXT; - - File::put($migration, File::get($stub)); - - // By default no session driver is set within the configuration. - // Since the developer is requesting that the session table be - // created on the database, we'll set it. - $this->driver('database'); - - echo PHP_EOL; - - $migrator->run(); - } - - /** - * Sweep the expired sessions from storage. - * - * @param array $arguments - * @return void - */ - public function sweep($arguments = array()) - { - $driver = Session::factory(Config::get('session.driver')); - - // If the driver implements the "Sweeper" interface, we know that it - // can sweep expired sessions from storage. Not all drivers need be - // sweepers since they do their own. - if ($driver instanceof Sweeper) - { - $lifetime = Config::get('session.lifetime'); - - $driver->sweep(time() - ($lifetime * 60)); - } - - echo "The session table has been swept!"; - } - - /** - * Set the session driver to a given value. - * - * @param string $driver - * @return void - */ - protected function driver($driver) - { - // By default no session driver is set within the configuration. - // This method will replace the empty driver option with the - // driver specified in the arguments. - $config = File::get(path('app').'config/session'.EXT); - - $config = str_replace( - "'driver' => '',", - "'driver' => 'database',", - $config - ); - - File::put(path('app').'config/session'.EXT, $config); - } - -} \ No newline at end of file diff --git a/laravel/cli/tasks/session/migration.php b/laravel/cli/tasks/session/migration.php deleted file mode 100644 index 8ef8632e..00000000 --- a/laravel/cli/tasks/session/migration.php +++ /dev/null @@ -1,40 +0,0 @@ -create(); - - // The session table consists simply of an ID, a UNIX timestamp to - // indicate the expiration time, and a blob field which will hold - // the serialized form of the session payload. - $table->string('id')->length(40)->primary('session_primary'); - - $table->integer('last_activity'); - - $table->text('data'); - }); - } - - /** - * Revert the changes to the database. - * - * @return void - */ - public function down() - { - Schema::table(Config::get('session.table'), function($table) - { - $table->drop(); - }); - } - -} \ No newline at end of file diff --git a/laravel/cli/tasks/task.php b/laravel/cli/tasks/task.php deleted file mode 100644 index 0ed4e2c1..00000000 --- a/laravel/cli/tasks/task.php +++ /dev/null @@ -1,3 +0,0 @@ -bundle($bundles); - } - - /** - * Run the tests for the Laravel framework. - * - * @return void - */ - public function core() - { - $this->base_path = path('sys').'tests'.DS; - $this->stub(path('sys').'tests'.DS.'cases'); - - $this->test(); - } - - /** - * Run the tests for a given bundle. - * - * @param array $bundles - * @return void - */ - public function bundle($bundles = array()) - { - if (count($bundles) == 0) - { - $bundles = Bundle::names(); - } - - $this->base_path = path('sys').'cli'.DS.'tasks'.DS.'test'.DS; - - foreach ($bundles as $bundle) - { - // To run PHPUnit for the application, bundles, and the framework - // from one task, we'll dynamically stub PHPUnit.xml files via - // the task and point the test suite to the correct directory - // based on what was requested. - if (is_dir($path = Bundle::path($bundle).'tests')) - { - $this->stub($path); - - $this->test(); - } - } - } - - /** - * Run PHPUnit with the temporary XML configuration. - * - * @return void - */ - protected function test() - { - // We'll simply fire off PHPUnit with the configuration switch - // pointing to our requested configuration file. This allows - // us to flexibly run tests for any setup. - $path = 'phpunit.xml'; - - // fix the spaced directories problem when using the command line - // strings with spaces inside should be wrapped in quotes. - $esc_path = escapeshellarg($path); - - passthru('phpunit --configuration '.$esc_path, $status); - - @unlink($path); - - // Pass through the exit status - exit($status); - } - - /** - * Write a stub phpunit.xml file to the base directory. - * - * @param string $directory - * @return void - */ - protected function stub($directory) - { - $path = path('sys').'cli/tasks/test/'; - - $stub = File::get($path.'stub.xml'); - - // The PHPUnit bootstrap file contains several items that are swapped - // at test time. This allows us to point PHPUnit at a few different - // locations depending on what the developer wants to test. - foreach (array('bootstrap', 'directory') as $item) - { - $stub = $this->{"swap_{$item}"}($stub, $directory); - } - - File::put(path('base').'phpunit.xml', $stub); - } - - /** - * Swap the bootstrap file in the stub. - * - * @param string $stub - * @param string $directory - * @return string - */ - protected function swap_bootstrap($stub, $directory) - { - return str_replace('{{bootstrap}}', $this->base_path.'phpunit.php', $stub); - } - - /** - * Swap the directory in the stub. - * - * @param string $stub - * @param string $directory - * @return string - */ - protected function swap_directory($stub, $directory) - { - return str_replace('{{directory}}', $directory, $stub); - } - -} \ No newline at end of file diff --git a/laravel/cli/tasks/test/stub.xml b/laravel/cli/tasks/test/stub.xml deleted file mode 100644 index d8f569fe..00000000 --- a/laravel/cli/tasks/test/stub.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - {{directory}} - - - \ No newline at end of file diff --git a/laravel/config.php b/laravel/config.php deleted file mode 100644 index ac46693b..00000000 --- a/laravel/config.php +++ /dev/null @@ -1,235 +0,0 @@ - - * // Determine if the "session" configuration file exists - * $exists = Config::has('session'); - * - * // Determine if the "timezone" option exists in the configuration - * $exists = Config::has('application.timezone'); - * - * - * @param string $key - * @return bool - */ - public static function has($key) - { - return ! is_null(static::get($key)); - } - - /** - * Get a configuration item. - * - * If no item is requested, the entire configuration array will be returned. - * - * - * // Get the "session" configuration array - * $session = Config::get('session'); - * - * // Get a configuration item from a bundle's configuration file - * $name = Config::get('admin::names.first'); - * - * // Get the "timezone" option from the "application" configuration file - * $timezone = Config::get('application.timezone'); - * - * - * @param string $key - * @param mixed $default - * @return array - */ - public static function get($key, $default = null) - { - list($bundle, $file, $item) = static::parse($key); - - if ( ! static::load($bundle, $file)) return value($default); - - $items = static::$items[$bundle][$file]; - - // If a specific configuration item was not requested, the key will be null, - // meaning we'll return the entire array of configuration items from the - // requested configuration file. Otherwise we can return the item. - if (is_null($item)) - { - return $items; - } - else - { - return array_get($items, $item, $default); - } - } - - /** - * Set a configuration item's value. - * - * - * // Set the "session" configuration array - * Config::set('session', $array); - * - * // Set a configuration option that belongs by a bundle - * Config::set('admin::names.first', 'Taylor'); - * - * // Set the "timezone" option in the "application" configuration file - * Config::set('application.timezone', 'UTC'); - * - * - * @param string $key - * @param mixed $value - * @return void - */ - public static function set($key, $value) - { - list($bundle, $file, $item) = static::parse($key); - - static::load($bundle, $file); - - // If the item is null, it means the developer wishes to set the entire - // configuration array to a given value, so we will pass the entire - // array for the bundle into the array_set method. - if (is_null($item)) - { - array_set(static::$items[$bundle], $file, $value); - } - else - { - array_set(static::$items[$bundle][$file], $item, $value); - } - } - - /** - * Parse a key and return its bundle, file, and key segments. - * - * Configuration items are named using the {bundle}::{file}.{item} convention. - * - * @param string $key - * @return array - */ - protected static function parse($key) - { - // First, we'll check the keyed cache of configuration items, as this will - // be the fastest method of retrieving the configuration option. After an - // item is parsed, it is always stored in the cache by its key. - if (array_key_exists($key, static::$cache)) - { - return static::$cache[$key]; - } - - $bundle = Bundle::name($key); - - $segments = explode('.', Bundle::element($key)); - - // If there are not at least two segments in the array, it means that the - // developer is requesting the entire configuration array to be returned. - // If that is the case, we'll make the item field "null". - if (count($segments) >= 2) - { - $parsed = array($bundle, $segments[0], implode('.', array_slice($segments, 1))); - } - else - { - $parsed = array($bundle, $segments[0], null); - } - - return static::$cache[$key] = $parsed; - } - - /** - * Load all of the configuration items from a configuration file. - * - * @param string $bundle - * @param string $file - * @return bool - */ - public static function load($bundle, $file) - { - if (isset(static::$items[$bundle][$file])) return true; - - // We allow a "config.loader" event to be registered which is responsible for - // returning an array representing the configuration for the bundle and file - // requested. This allows many types of config "drivers". - $config = Event::first(static::loader, func_get_args()); - - // If configuration items were actually found for the bundle and file, we - // will add them to the configuration array and return true, otherwise - // we will return false indicating the file was not found. - if (count($config) > 0) - { - static::$items[$bundle][$file] = $config; - } - - return isset(static::$items[$bundle][$file]); - } - - /** - * Load the configuration items from a configuration file. - * - * @param string $bundle - * @param string $file - * @return array - */ - public static function file($bundle, $file) - { - $config = array(); - - // Configuration files cascade. Typically, the bundle configuration array is - // loaded first, followed by the environment array, providing the convenient - // cascading of configuration options across environments. - foreach (static::paths($bundle) as $directory) - { - if ($directory !== '' and file_exists($path = $directory.$file.EXT)) - { - $config = array_merge($config, require $path); - } - } - - return $config; - } - - /** - * Get the array of configuration paths that should be searched for a bundle. - * - * @param string $bundle - * @return array - */ - protected static function paths($bundle) - { - $paths[] = Bundle::path($bundle).'config/'; - - // Configuration files can be made specific for a given environment. If an - // environment has been set, we will merge the environment configuration - // in last, so that it overrides all other options. - if ( ! is_null(Request::env())) - { - $paths[] = $paths[count($paths) - 1].Request::env().'/'; - } - - return $paths; - } - -} \ No newline at end of file diff --git a/laravel/cookie.php b/laravel/cookie.php deleted file mode 100644 index 503732f1..00000000 --- a/laravel/cookie.php +++ /dev/null @@ -1,172 +0,0 @@ - - * // Get the value of the "favorite" cookie - * $favorite = Cookie::get('favorite'); - * - * // Get the value of a cookie or return a default value - * $favorite = Cookie::get('framework', 'Laravel'); - * - * - * @param string $name - * @param mixed $default - * @return string - */ - public static function get($name, $default = null) - { - if (isset(static::$jar[$name])) return static::parse(static::$jar[$name]['value']); - - if ( ! is_null($value = Request::foundation()->cookies->get($name))) - { - return static::parse($value); - } - - return value($default); - } - - /** - * Set the value of a cookie. - * - * - * // Set the value of the "favorite" cookie - * Cookie::put('favorite', 'Laravel'); - * - * // Set the value of the "favorite" cookie for twenty minutes - * Cookie::put('favorite', 'Laravel', 20); - * - * - * @param string $name - * @param string $value - * @param int $expiration - * @param string $path - * @param string $domain - * @param bool $secure - * @return void - */ - public static function put($name, $value, $expiration = 0, $path = '/', $domain = null, $secure = false) - { - if ($expiration !== 0) - { - $expiration = time() + ($expiration * 60); - } - - $value = static::hash($value).'+'.$value; - - // If the secure option is set to true, yet the request is not over HTTPS - // we'll throw an exception to let the developer know that they are - // attempting to send a secure cookie over the insecure HTTP. - if ($secure and ! Request::secure()) - { - throw new \Exception("Attempting to set secure cookie over HTTP."); - } - - static::$jar[$name] = compact('name', 'value', 'expiration', 'path', 'domain', 'secure'); - } - - /** - * Set a "permanent" cookie. The cookie will last for one year. - * - * - * // Set a cookie that should last one year - * Cookie::forever('favorite', 'Blue'); - * - * - * @param string $name - * @param string $value - * @param string $path - * @param string $domain - * @param bool $secure - * @return bool - */ - public static function forever($name, $value, $path = '/', $domain = null, $secure = false) - { - return static::put($name, $value, static::forever, $path, $domain, $secure); - } - - /** - * Delete a cookie. - * - * @param string $name - * @param string $path - * @param string $domain - * @param bool $secure - * @return bool - */ - public static function forget($name, $path = '/', $domain = null, $secure = false) - { - return static::put($name, null, -2000, $path, $domain, $secure); - } - - /** - * Hash the given cookie value. - * - * @param string $value - * @return string - */ - public static function hash($value) - { - return hash_hmac('sha1', $value, Config::get('application.key')); - } - - /** - * Parse a hash fingerprinted cookie value. - * - * @param string $value - * @return string - */ - protected static function parse($value) - { - $segments = explode('+', $value); - - // First we will make sure the cookie actually has enough segments to even - // be valid as being set by the application. If it does not we will go - // ahead and throw exceptions now since there the cookie is invalid. - if ( ! (count($segments) >= 2)) - { - return null; - } - - $value = implode('+', array_slice($segments, 1)); - - // Now we will check if the SHA-1 hash present in the first segment matches - // the ShA-1 hash of the rest of the cookie value, since the hash should - // have been set when the cookie was first created by the application. - if ($segments[0] == static::hash($value)) - { - return $value; - } - - return null; - } - -} diff --git a/laravel/core.php b/laravel/core.php deleted file mode 100644 index 784f65d9..00000000 --- a/laravel/core.php +++ /dev/null @@ -1,243 +0,0 @@ - path('sys'))); - -/* -|-------------------------------------------------------------------------- -| Register Eloquent Mappings -|-------------------------------------------------------------------------- -| -| A few of the Eloquent ORM classes use a non PSR-0 naming standard so -| we will just map them with hard-coded paths here since PSR-0 uses -| underscores as directory hierarchy indicators. -| -*/ - -Autoloader::map(array( - 'Laravel\\Database\\Eloquent\\Relationships\\Belongs_To' - => path('sys').'database/eloquent/relationships/belongs_to'.EXT, - 'Laravel\\Database\\Eloquent\\Relationships\\Has_Many' - => path('sys').'database/eloquent/relationships/has_many'.EXT, - 'Laravel\\Database\\Eloquent\\Relationships\\Has_Many_And_Belongs_To' - => path('sys').'database/eloquent/relationships/has_many_and_belongs_to'.EXT, - 'Laravel\\Database\\Eloquent\\Relationships\\Has_One' - => path('sys').'database/eloquent/relationships/has_one'.EXT, - 'Laravel\\Database\\Eloquent\\Relationships\\Has_One_Or_Many' - => path('sys').'database/eloquent/relationships/has_one_or_many'.EXT, -)); - -/* -|-------------------------------------------------------------------------- -| Register The Symfony Components -|-------------------------------------------------------------------------- -| -| Laravel makes use of the Symfony components where the situation is -| applicable and it is possible to do so. This allows us to focus -| on the parts of the framework that are unique and not re-do -| plumbing code that others have written. -| -*/ - -Autoloader::namespaces(array( - 'Symfony\Component\Console' - => path('sys').'vendor/Symfony/Component/Console', - 'Symfony\Component\HttpFoundation' - => path('sys').'vendor/Symfony/Component/HttpFoundation', -)); - -/* -|-------------------------------------------------------------------------- -| Magic Quotes Strip Slashes -|-------------------------------------------------------------------------- -| -| Even though "Magic Quotes" are deprecated in PHP 5.3.x, they may still -| be enabled on the server. To account for this, we will strip slashes -| on all input arrays if magic quotes are enabled for the server. -| -*/ - -if (magic_quotes()) -{ - $magics = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); - - foreach ($magics as &$magic) - { - $magic = array_strip_slashes($magic); - } -} - -/* -|-------------------------------------------------------------------------- -| Create The HttpFoundation Request -|-------------------------------------------------------------------------- -| -| Laravel uses the HttpFoundation Symfony component to handle the request -| and response functionality for the framework. This allows us to not -| worry about that boilerplate code and focus on what matters. -| -*/ - -use Symfony\Component\HttpFoundation\LaravelRequest as RequestFoundation; - -Request::$foundation = RequestFoundation::createFromGlobals(); - -/* -|-------------------------------------------------------------------------- -| Determine The Application Environment -|-------------------------------------------------------------------------- -| -| Next, we're ready to determine the application environment. This may be -| set either via the command line options or via the mapping of URIs to -| environments that lives in the "paths.php" file for the application -| and is parsed. When determining the CLI environment, the "--env" -| CLI option overrides the mapping in "paths.php". -| -*/ - -if (Request::cli()) -{ - $environment = get_cli_option('env', getenv('LARAVEL_ENV')); - - if (empty($environment)) - { - $environment = Request::detect_env($environments, gethostname()); - } -} -else -{ - $root = Request::foundation()->getRootUrl(); - - $environment = Request::detect_env($environments, $root); -} - -/* -|-------------------------------------------------------------------------- -| Set The Application Environment -|-------------------------------------------------------------------------- -| -| Once we have determined the application environment, we will set it on -| the global server array of the HttpFoundation request. This makes it -| available throughout the application, though it is mainly only -| used to determine which configuration files to merge in. -| -*/ - -if (isset($environment)) -{ - Request::set_env($environment); -} - -/* -|-------------------------------------------------------------------------- -| Set The CLI Options Array -|-------------------------------------------------------------------------- -| -| If the current request is from the Artisan command-line interface, we -| will parse the command line arguments and options and set them the -| array of options in the $_SERVER global array for convenience. -| -*/ - -if (Request::cli()) -{ - $console = CLI\Command::options($_SERVER['argv']); - - list($arguments, $options) = $console; - - $options = array_change_key_case($options, CASE_UPPER); - - $_SERVER['CLI'] = $options; -} - -/* -|-------------------------------------------------------------------------- -| Register The Laravel Bundles -|-------------------------------------------------------------------------- -| -| Finally we will register all of the bundles that have been defined for -| the application. None of them will be started yet, but will be set up -| so that they may be started by the developer at any time. -| -*/ - -$bundles = require path('app').'bundles'.EXT; - -foreach ($bundles as $bundle => $config) -{ - Bundle::register($bundle, $config); -} diff --git a/laravel/crypter.php b/laravel/crypter.php deleted file mode 100644 index 18dd51bd..00000000 --- a/laravel/crypter.php +++ /dev/null @@ -1,178 +0,0 @@ - - * // Get the default database connection for the application - * $connection = DB::connection(); - * - * // Get a specific connection by passing the connection name - * $connection = DB::connection('mysql'); - * - * - * @param string $connection - * @return Database\Connection - */ - public static function connection($connection = null) - { - if (is_null($connection)) $connection = Config::get('database.default'); - - if ( ! isset(static::$connections[$connection])) - { - $config = Config::get("database.connections.{$connection}"); - - if (is_null($config)) - { - throw new \Exception("Database connection is not defined for [$connection]."); - } - - static::$connections[$connection] = new Connection(static::connect($config), $config); - } - - return static::$connections[$connection]; - } - - /** - * Get a PDO database connection for a given database configuration. - * - * @param array $config - * @return PDO - */ - protected static function connect($config) - { - return static::connector($config['driver'])->connect($config); - } - - /** - * Create a new database connector instance. - * - * @param string $driver - * @return Database\Connectors\Connector - */ - protected static function connector($driver) - { - if (isset(static::$registrar[$driver])) - { - $resolver = static::$registrar[$driver]['connector']; - - return $resolver(); - } - - switch ($driver) - { - case 'sqlite': - return new Database\Connectors\SQLite; - - case 'mysql': - return new Database\Connectors\MySQL; - - case 'pgsql': - return new Database\Connectors\Postgres; - - case 'sqlsrv': - return new Database\Connectors\SQLServer; - - default: - throw new \Exception("Database driver [$driver] is not supported."); - } - } - - /** - * Begin a fluent query against a table. - * - * @param string $table - * @param string $connection - * @return Database\Query - */ - public static function table($table, $connection = null) - { - return static::connection($connection)->table($table); - } - - /** - * Create a new database expression instance. - * - * Database expressions are used to inject raw SQL into a fluent query. - * - * @param string $value - * @return Expression - */ - public static function raw($value) - { - return new Expression($value); - } - - /** - * Escape a string for usage in a query. - * - * This uses the correct quoting mechanism for the default database connection. - * - * @param string $value - * @return string - */ - public static function escape($value) - { - return static::connection()->pdo->quote($value); - } - - /** - * Get the profiling data for all queries. - * - * @return array - */ - public static function profile() - { - return Database\Connection::$queries; - } - - /** - * Get the last query that was executed. - * - * Returns false if no queries have been executed yet. - * - * @return string - */ - public static function last_query() - { - return end(Database\Connection::$queries); - } - - /** - * Register a database connector and grammars. - * - * @param string $name - * @param Closure $connector - * @param Closure $query - * @param Closure $schema - * @return void - */ - public static function extend($name, Closure $connector, $query = null, $schema = null) - { - if (is_null($query)) $query = '\Laravel\Database\Query\Grammars\Grammar'; - - static::$registrar[$name] = compact('connector', 'query', 'schema'); - } - - /** - * Magic Method for calling methods on the default database connection. - * - * - * // Get the driver name for the default database connection - * $driver = DB::driver(); - * - * // Execute a fluent query on the default database connection - * $users = DB::table('users')->get(); - * - */ - public static function __callStatic($method, $parameters) - { - return call_user_func_array(array(static::connection(), $method), $parameters); - } - -} \ No newline at end of file diff --git a/laravel/database/connection.php b/laravel/database/connection.php deleted file mode 100644 index 938ae97f..00000000 --- a/laravel/database/connection.php +++ /dev/null @@ -1,336 +0,0 @@ -pdo = $pdo; - $this->config = $config; - } - - /** - * Begin a fluent query against a table. - * - * - * // Start a fluent query against the "users" table - * $query = DB::connection()->table('users'); - * - * // Start a fluent query against the "users" table and get all the users - * $users = DB::connection()->table('users')->get(); - * - * - * @param string $table - * @return Query - */ - public function table($table) - { - return new Query($this, $this->grammar(), $table); - } - - /** - * Create a new query grammar for the connection. - * - * @return Query\Grammars\Grammar - */ - protected function grammar() - { - if (isset($this->grammar)) return $this->grammar; - - if (isset(\Laravel\Database::$registrar[$this->driver()])) - { - return $this->grammar = \Laravel\Database::$registrar[$this->driver()]['query'](); - } - - switch ($this->driver()) - { - case 'mysql': - return $this->grammar = new Query\Grammars\MySQL($this); - - case 'sqlite': - return $this->grammar = new Query\Grammars\SQLite($this); - - case 'sqlsrv': - return $this->grammar = new Query\Grammars\SQLServer($this); - - case 'pgsql': - return $this->grammar = new Query\Grammars\Postgres($this); - - default: - return $this->grammar = new Query\Grammars\Grammar($this); - } - } - - /** - * Execute a callback wrapped in a database transaction. - * - * @param callback $callback - * @return bool - */ - public function transaction($callback) - { - $this->pdo->beginTransaction(); - - // After beginning the database transaction, we will call the callback - // so that it can do its database work. If an exception occurs we'll - // rollback the transaction and re-throw back to the developer. - try - { - call_user_func($callback); - } - catch (\Exception $e) - { - $this->pdo->rollBack(); - - throw $e; - } - - return $this->pdo->commit(); - } - - /** - * Execute a SQL query against the connection and return a single column result. - * - * - * // Get the total number of rows on a table - * $count = DB::connection()->only('select count(*) from users'); - * - * // Get the sum of payment amounts from a table - * $sum = DB::connection()->only('select sum(amount) from payments') - * - * - * @param string $sql - * @param array $bindings - * @return mixed - */ - public function only($sql, $bindings = array()) - { - $results = (array) $this->first($sql, $bindings); - - return reset($results); - } - - /** - * Execute a SQL query against the connection and return the first result. - * - * - * // Execute a query against the database connection - * $user = DB::connection()->first('select * from users'); - * - * // Execute a query with bound parameters - * $user = DB::connection()->first('select * from users where id = ?', array($id)); - * - * - * @param string $sql - * @param array $bindings - * @return object - */ - public function first($sql, $bindings = array()) - { - if (count($results = $this->query($sql, $bindings)) > 0) - { - return $results[0]; - } - } - - /** - * Execute a SQL query and return an array of StdClass objects. - * - * @param string $sql - * @param array $bindings - * @return array - */ - public function query($sql, $bindings = array()) - { - $sql = trim($sql); - - list($statement, $result) = $this->execute($sql, $bindings); - - // The result we return depends on the type of query executed against the - // database. On SELECT clauses, we will return the result set, for update - // and deletes we will return the affected row count. - if (stripos($sql, 'select') === 0 || stripos($sql, 'show') === 0) - { - return $this->fetch($statement, Config::get('database.fetch')); - } - elseif (stripos($sql, 'update') === 0 or stripos($sql, 'delete') === 0) - { - return $statement->rowCount(); - } - // For insert statements that use the "returning" clause, which is allowed - // by database systems such as Postgres, we need to actually return the - // real query result so the consumer can get the ID. - elseif (stripos($sql, 'insert') === 0 and stripos($sql, 'returning') !== false) - { - return $this->fetch($statement, Config::get('database.fetch')); - } - else - { - return $result; - } - } - - /** - * Execute a SQL query against the connection. - * - * The PDO statement and boolean result will be returned in an array. - * - * @param string $sql - * @param array $bindings - * @return array - */ - protected function execute($sql, $bindings = array()) - { - $bindings = (array) $bindings; - - // Since expressions are injected into the query as strings, we need to - // remove them from the array of bindings. After we have removed them, - // we'll reset the array so there are not gaps within the keys. - $bindings = array_filter($bindings, function($binding) - { - return ! $binding instanceof Expression; - }); - - $bindings = array_values($bindings); - - $sql = $this->grammar()->shortcut($sql, $bindings); - - // Next we need to translate all DateTime bindings to their date-time - // strings that are compatible with the database. Each grammar may - // define it's own date-time format according to its needs. - $datetime = $this->grammar()->datetime; - - for ($i = 0; $i < count($bindings); $i++) - { - if ($bindings[$i] instanceof \DateTime) - { - $bindings[$i] = $bindings[$i]->format($datetime); - } - } - - // Each database operation is wrapped in a try / catch so we can wrap - // any database exceptions in our custom exception class, which will - // set the message to include the SQL and query bindings. - try - { - $statement = $this->pdo->prepare($sql); - - $start = microtime(true); - - $result = $statement->execute($bindings); - } - // If an exception occurs, we'll pass it into our custom exception - // and set the message to include the SQL and query bindings so - // debugging is much easier on the developer. - catch (\Exception $exception) - { - $exception = new Exception($sql, $bindings, $exception); - - throw $exception; - } - - // Once we have executed the query, we log the SQL, bindings, and - // execution time in a static array that is accessed by all of - // the connections actively being used by the application. - if (Config::get('database.profile')) - { - $this->log($sql, $bindings, $start); - } - - return array($statement, $result); - } - - /** - * Fetch all of the rows for a given statement. - * - * @param PDOStatement $statement - * @param int $style - * @return array - */ - protected function fetch($statement, $style) - { - // If the fetch style is "class", we'll hydrate an array of PHP - // stdClass objects as generic containers for the query rows, - // otherwise we'll just use the fetch style value. - if ($style === PDO::FETCH_CLASS) - { - return $statement->fetchAll(PDO::FETCH_CLASS, 'stdClass'); - } - else - { - return $statement->fetchAll($style); - } - } - - /** - * Log the query and fire the core query event. - * - * @param string $sql - * @param array $bindings - * @param int $start - * @return void - */ - protected function log($sql, $bindings, $start) - { - $time = number_format((microtime(true) - $start) * 1000, 2); - - Event::fire('laravel.query', array($sql, $bindings, $time)); - - static::$queries[] = compact('sql', 'bindings', 'time'); - } - - /** - * Get the driver name for the database connection. - * - * @return string - */ - public function driver() - { - return $this->config['driver']; - } - - /** - * Magic Method for dynamically beginning queries on database tables. - */ - public function __call($method, $parameters) - { - return $this->table($method); - } - -} diff --git a/laravel/database/connectors/connector.php b/laravel/database/connectors/connector.php deleted file mode 100644 index 93be707e..00000000 --- a/laravel/database/connectors/connector.php +++ /dev/null @@ -1,41 +0,0 @@ - PDO::CASE_LOWER, - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, - PDO::ATTR_STRINGIFY_FETCHES => false, - PDO::ATTR_EMULATE_PREPARES => false, - ); - - /** - * Establish a PDO database connection. - * - * @param array $config - * @return PDO - */ - abstract public function connect($config); - - /** - * Get the PDO connection options for the configuration. - * - * Developer specified options will override the default connection options. - * - * @param array $config - * @return array - */ - protected function options($config) - { - $options = (isset($config['options'])) ? $config['options'] : array(); - - return $options + $this->options; - } - -} \ No newline at end of file diff --git a/laravel/database/connectors/mysql.php b/laravel/database/connectors/mysql.php deleted file mode 100644 index 0ea5eba2..00000000 --- a/laravel/database/connectors/mysql.php +++ /dev/null @@ -1,46 +0,0 @@ -options($config)); - - // If a character set has been specified, we'll execute a query against - // the database to set the correct character set. By default, this is - // set to UTF-8 which should be fine for most scenarios. - if (isset($config['charset'])) - { - $connection->prepare("SET NAMES '{$config['charset']}'")->execute(); - } - - return $connection; - } - -} \ No newline at end of file diff --git a/laravel/database/connectors/postgres.php b/laravel/database/connectors/postgres.php deleted file mode 100644 index 34120fc4..00000000 --- a/laravel/database/connectors/postgres.php +++ /dev/null @@ -1,59 +0,0 @@ - PDO::CASE_LOWER, - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, - PDO::ATTR_STRINGIFY_FETCHES => false, - ); - - /** - * Establish a PDO database connection. - * - * @param array $config - * @return PDO - */ - public function connect($config) - { - extract($config); - - $host_dsn = isset($host) ? 'host='.$host.';' : ''; - - $dsn = "pgsql:{$host_dsn}dbname={$database}"; - - // The developer has the freedom of specifying a port for the PostgresSQL - // database or the default port (5432) will be used by PDO to create the - // connection to the database for the developer. - if (isset($config['port'])) - { - $dsn .= ";port={$config['port']}"; - } - - $connection = new PDO($dsn, $username, $password, $this->options($config)); - - // If a character set has been specified, we'll execute a query against - // the database to set the correct character set. By default, this is - // set to UTF-8 which should be fine for most scenarios. - if (isset($config['charset'])) - { - $connection->prepare("SET NAMES '{$config['charset']}'")->execute(); - } - - // If a schema has been specified, we'll execute a query against - // the database to set the search path. - if (isset($config['schema'])) - { - $connection->prepare("SET search_path TO {$config['schema']}")->execute(); - } - - return $connection; - } - -} \ No newline at end of file diff --git a/laravel/database/connectors/sqlite.php b/laravel/database/connectors/sqlite.php deleted file mode 100644 index 1e2fc7e5..00000000 --- a/laravel/database/connectors/sqlite.php +++ /dev/null @@ -1,28 +0,0 @@ -options($config); - - // SQLite provides supported for "in-memory" databases, which exist only for - // lifetime of the request. Any given in-memory database may only have one - // PDO connection open to it at a time. These are mainly for tests. - if ($config['database'] == ':memory:') - { - return new PDO('sqlite::memory:', null, null, $options); - } - - $path = path('storage').'database'.DS.$config['database'].'.sqlite'; - - return new PDO('sqlite:'.$path, null, null, $options); - } - -} diff --git a/laravel/database/connectors/sqlserver.php b/laravel/database/connectors/sqlserver.php deleted file mode 100644 index 1da35063..00000000 --- a/laravel/database/connectors/sqlserver.php +++ /dev/null @@ -1,45 +0,0 @@ - PDO::CASE_LOWER, - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, - PDO::ATTR_STRINGIFY_FETCHES => false, - ); - - /** - * Establish a PDO database connection. - * - * @param array $config - * @return PDO - */ - public function connect($config) - { - extract($config); - - // Format the SQL Server connection string. This connection string format can - // also be used to connect to Azure SQL Server databases. The port is defined - // directly after the server name, so we'll create that first. - $port = (isset($port)) ? ','.$port : ''; - - //check for dblib for mac users connecting to mssql (utilizes freetds) - if (in_array('dblib',PDO::getAvailableDrivers())) - { - $dsn = "dblib:host={$host}{$port};dbname={$database}"; - } - else - { - $dsn = "sqlsrv:Server={$host}{$port};Database={$database}"; - } - - return new PDO($dsn, $username, $password, $this->options($config)); - } - -} \ No newline at end of file diff --git a/laravel/database/eloquent/model.php b/laravel/database/eloquent/model.php deleted file mode 100644 index cb555de4..00000000 --- a/laravel/database/eloquent/model.php +++ /dev/null @@ -1,798 +0,0 @@ -exists = $exists; - - $this->fill($attributes); - } - - /** - * Hydrate the model with an array of attributes. - * - * @param array $attributes - * @param bool $raw - * @return Model - */ - public function fill(array $attributes, $raw = false) - { - foreach ($attributes as $key => $value) - { - // If the "raw" flag is set, it means that we'll just load every value from - // the array directly into the attributes, without any accessibility or - // mutators being accounted for. What you pass in is what you get. - if ($raw) - { - $this->set_attribute($key, $value); - - continue; - } - - // If the "accessible" property is an array, the developer is limiting the - // attributes that may be mass assigned, and we need to verify that the - // current attribute is included in that list of allowed attributes. - if (is_array(static::$accessible)) - { - if (in_array($key, static::$accessible)) - { - $this->$key = $value; - } - } - - // If the "accessible" property is not an array, no attributes have been - // white-listed and we are free to set the value of the attribute to - // the value that has been passed into the method without a check. - else - { - $this->$key = $value; - } - } - - // If the original attribute values have not been set, we will set - // them to the values passed to this method allowing us to easily - // check if the model has changed since hydration. - if (count($this->original) === 0) - { - $this->original = $this->attributes; - } - - return $this; - } - - /** - * Fill the model with the contents of the array. - * - * No mutators or accessibility checks will be accounted for. - * - * @param array $attributes - * @return Model - */ - public function fill_raw(array $attributes) - { - return $this->fill($attributes, true); - } - - /** - * Set the accessible attributes for the given model. - * - * @param array $attributes - * @return void - */ - public static function accessible($attributes = null) - { - if (is_null($attributes)) return static::$accessible; - - static::$accessible = $attributes; - } - - /** - * Create a new model and store it in the database. - * - * If save is successful, the model will be returned, otherwise false. - * - * @param array $attributes - * @return Model|false - */ - public static function create($attributes) - { - $model = new static($attributes); - - $success = $model->save(); - - return ($success) ? $model : false; - } - - /** - * Update a model instance in the database. - * - * @param mixed $id - * @param array $attributes - * @return int - */ - public static function update($id, $attributes) - { - $model = new static(array(), true); - - $model->fill($attributes); - - if (static::$timestamps) $model->timestamp(); - - return $model->query()->where($model->key(), '=', $id)->update($model->attributes); - } - - /** - * Get all of the models in the database. - * - * @return array - */ - public static function all() - { - return with(new static)->query()->get(); - } - - /** - * The relationships that should be eagerly loaded by the query. - * - * @param array $includes - * @return Model - */ - public function _with($includes) - { - $this->includes = (array) $includes; - - return $this; - } - - /** - * Get the query for a one-to-one association. - * - * @param string $model - * @param string $foreign - * @return Relationship - */ - public function has_one($model, $foreign = null) - { - return $this->has_one_or_many(__FUNCTION__, $model, $foreign); - } - - /** - * Get the query for a one-to-many association. - * - * @param string $model - * @param string $foreign - * @return Relationship - */ - public function has_many($model, $foreign = null) - { - return $this->has_one_or_many(__FUNCTION__, $model, $foreign); - } - - /** - * Get the query for a one-to-one / many association. - * - * @param string $type - * @param string $model - * @param string $foreign - * @return Relationship - */ - protected function has_one_or_many($type, $model, $foreign) - { - if ($type == 'has_one') - { - return new Relationships\Has_One($this, $model, $foreign); - } - else - { - return new Relationships\Has_Many($this, $model, $foreign); - } - } - - /** - * Get the query for a one-to-one (inverse) relationship. - * - * @param string $model - * @param string $foreign - * @return Relationship - */ - public function belongs_to($model, $foreign = null) - { - // If no foreign key is specified for the relationship, we will assume that the - // name of the calling function matches the foreign key. For example, if the - // calling function is "manager", we'll assume the key is "manager_id". - if (is_null($foreign)) - { - list(, $caller) = debug_backtrace(false); - - $foreign = "{$caller['function']}_id"; - } - - return new Relationships\Belongs_To($this, $model, $foreign); - } - - /** - * Get the query for a many-to-many relationship. - * - * @param string $model - * @param string $table - * @param string $foreign - * @param string $other - * @return Has_Many_And_Belongs_To - */ - public function has_many_and_belongs_to($model, $table = null, $foreign = null, $other = null) - { - return new Has_Many_And_Belongs_To($this, $model, $table, $foreign, $other); - } - - /** - * Save the model and all of its relations to the database. - * - * @return bool - */ - public function push() - { - $this->save(); - - // To sync all of the relationships to the database, we will simply spin through - // the relationships, calling the "push" method on each of the models in that - // given relationship, this should ensure that each model is saved. - foreach ($this->relationships as $name => $models) - { - if ( ! is_array($models)) - { - $models = array($models); - } - - foreach ($models as $model) - { - $model->push(); - } - } - } - - /** - * Save the model instance to the database. - * - * @return bool - */ - public function save() - { - if ( ! $this->dirty()) return true; - - if (static::$timestamps) - { - $this->timestamp(); - } - - $this->fire_event('saving'); - - // If the model exists, we only need to update it in the database, and the update - // will be considered successful if there is one affected row returned from the - // fluent query instance. We'll set the where condition automatically. - if ($this->exists) - { - $query = $this->query()->where(static::$key, '=', $this->get_key()); - - $result = $query->update($this->get_dirty()) === 1; - - if ($result) $this->fire_event('updated'); - } - - // If the model does not exist, we will insert the record and retrieve the last - // insert ID that is associated with the model. If the ID returned is numeric - // then we can consider the insert successful. - else - { - $id = $this->query()->insert_get_id($this->attributes, $this->key()); - - $this->set_key($id); - - $this->exists = $result = is_numeric($this->get_key()); - - if ($result) $this->fire_event('created'); - } - - // After the model has been "saved", we will set the original attributes to - // match the current attributes so the model will not be viewed as being - // dirty and subsequent calls won't hit the database. - $this->original = $this->attributes; - - if ($result) - { - $this->fire_event('saved'); - } - - return $result; - } - - /** - * Delete the model from the database. - * - * @return int - */ - public function delete() - { - if ($this->exists) - { - $this->fire_event('deleting'); - - $result = $this->query()->where(static::$key, '=', $this->get_key())->delete(); - - $this->fire_event('deleted'); - - return $result; - } - } - - /** - * Set the update and creation timestamps on the model. - * - * @return void - */ - public function timestamp() - { - $this->updated_at = new \DateTime; - - if ( ! $this->exists) $this->created_at = $this->updated_at; - } - - /** - *Updates the timestamp on the model and immediately saves it. - * - * @return void - */ - public function touch() - { - $this->timestamp(); - $this->save(); - } - - /** - * Get a new fluent query builder instance for the model. - * - * @return Query - */ - protected function _query() - { - return new Query($this); - } - - /** - * Sync the original attributes with the current attributes. - * - * @return bool - */ - final public function sync() - { - $this->original = $this->attributes; - - return true; - } - - /** - * Determine if a given attribute has changed from its original state. - * - * @param string $attribute - * @return bool - */ - public function changed($attribute) - { - return array_get($this->attributes, $attribute) != array_get($this->original, $attribute); - } - - /** - * Determine if the model has been changed from its original state. - * - * Models that haven't been persisted to storage are always considered dirty. - * - * @return bool - */ - public function dirty() - { - return ! $this->exists or count($this->get_dirty()) > 0; - } - - /** - * Get the name of the table associated with the model. - * - * @return string - */ - public function table() - { - return static::$table ?: strtolower(Str::plural(class_basename($this))); - } - - /** - * Get the dirty attributes for the model. - * - * @return array - */ - public function get_dirty() - { - $dirty = array(); - - foreach ($this->attributes as $key => $value) - { - if ( ! array_key_exists($key, $this->original) or $value != $this->original[$key]) - { - $dirty[$key] = $value; - } - } - - return $dirty; - } - - /** - * Get the value of the primary key for the model. - * - * @return int - */ - public function get_key() - { - return array_get($this->attributes, static::$key); - } - - /** - * Set the value of the primary key for the model. - * - * @param int $value - * @return void - */ - public function set_key($value) - { - return $this->set_attribute(static::$key, $value); - } - - /** - * Get a given attribute from the model. - * - * @param string $key - */ - public function get_attribute($key) - { - return array_get($this->attributes, $key); - } - - /** - * Set an attribute's value on the model. - * - * @param string $key - * @param mixed $value - * @return void - */ - public function set_attribute($key, $value) - { - $this->attributes[$key] = $value; - } - - /** - * Remove an attribute from the model. - * - * @param string $key - */ - final public function purge($key) - { - unset($this->original[$key]); - - unset($this->attributes[$key]); - } - - /** - * Get the model attributes and relationships in array form. - * - * @return array - */ - public function to_array() - { - $attributes = array(); - - // First we need to gather all of the regular attributes. If the attribute - // exists in the array of "hidden" attributes, it will not be added to - // the array so we can easily exclude things like passwords, etc. - foreach (array_keys($this->attributes) as $attribute) - { - if ( ! in_array($attribute, static::$hidden)) - { - $attributes[$attribute] = $this->$attribute; - } - } - - foreach ($this->relationships as $name => $models) - { - // Relationships can be marked as "hidden", too. - if (in_array($name, static::$hidden)) continue; - - // If the relationship is not a "to-many" relationship, we can just - // to_array the related model and add it as an attribute to the - // array of existing regular attributes we gathered. - if ($models instanceof Model) - { - $attributes[$name] = $models->to_array(); - } - - // If the relationship is a "to-many" relationship we need to spin - // through each of the related models and add each one with the - // to_array method, keying them both by name and ID. - elseif (is_array($models)) - { - $attributes[$name] = array(); - - foreach ($models as $id => $model) - { - $attributes[$name][$id] = $model->to_array(); - } - } - elseif (is_null($models)) - { - $attributes[$name] = $models; - } - } - - return $attributes; - } - - /** - * Fire a given event for the model. - * - * @param string $event - * @return array - */ - protected function fire_event($event) - { - $events = array("eloquent.{$event}", "eloquent.{$event}: ".get_class($this)); - - Event::fire($events, array($this)); - } - - /** - * Handle the dynamic retrieval of attributes and associations. - * - * @param string $key - * @return mixed - */ - public function __get($key) - { - // First we will check to see if the requested key is an already loaded - // relationship and return it if it is. All relationships are stored - // in the special relationships array so they are not persisted. - if (array_key_exists($key, $this->relationships)) - { - return $this->relationships[$key]; - } - - // Next we'll check if the requested key is in the array of attributes - // for the model. These are simply regular properties that typically - // correspond to a single column on the database for the model. - elseif (array_key_exists($key, $this->attributes)) - { - return $this->{"get_{$key}"}(); - } - - // If the item is not a loaded relationship, it may be a relationship - // that hasn't been loaded yet. If it is, we will lazy load it and - // set the value of the relationship in the relationship array. - elseif (method_exists($this, $key)) - { - return $this->relationships[$key] = $this->$key()->results(); - } - - // Finally we will just assume the requested key is just a regular - // attribute and attempt to call the getter method for it, which - // will fall into the __call method if one doesn't exist. - else - { - return $this->{"get_{$key}"}(); - } - } - - /** - * Handle the dynamic setting of attributes. - * - * @param string $key - * @param mixed $value - * @return void - */ - public function __set($key, $value) - { - $this->{"set_{$key}"}($value); - } - - /** - * Determine if an attribute exists on the model. - * - * @param string $key - * @return bool - */ - public function __isset($key) - { - foreach (array('attributes', 'relationships') as $source) - { - if (array_key_exists($key, $this->{$source})) return ! empty($this->{$source}[$key]); - } - - return false; - } - - /** - * Remove an attribute from the model. - * - * @param string $key - * @return void - */ - public function __unset($key) - { - foreach (array('attributes', 'relationships') as $source) - { - unset($this->{$source}[$key]); - } - } - - /** - * Handle dynamic method calls on the model. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - $meta = array('key', 'table', 'connection', 'sequence', 'per_page', 'timestamps'); - - // If the method is actually the name of a static property on the model we'll - // return the value of the static property. This makes it convenient for - // relationships to access these values off of the instances. - if (in_array($method, $meta)) - { - return static::$$method; - } - - $underscored = array('with', 'query'); - - // Some methods need to be accessed both staticly and non-staticly so we'll - // keep underscored methods of those methods and intercept calls to them - // here so they can be called either way on the model instance. - if (in_array($method, $underscored)) - { - return call_user_func_array(array($this, '_'.$method), $parameters); - } - - // First we want to see if the method is a getter / setter for an attribute. - // If it is, we'll call the basic getter and setter method for the model - // to perform the appropriate action based on the method. - if (starts_with($method, 'get_')) - { - return $this->get_attribute(substr($method, 4)); - } - elseif (starts_with($method, 'set_')) - { - $this->set_attribute(substr($method, 4), $parameters[0]); - } - - // Finally we will assume that the method is actually the beginning of a - // query, such as "where", and will create a new query instance and - // call the method on the query instance, returning it after. - else - { - return call_user_func_array(array($this->query(), $method), $parameters); - } - } - - /** - * Dynamically handle static method calls on the model. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public static function __callStatic($method, $parameters) - { - $model = get_called_class(); - - return call_user_func_array(array(new $model, $method), $parameters); - } - -} \ No newline at end of file diff --git a/laravel/database/eloquent/pivot.php b/laravel/database/eloquent/pivot.php deleted file mode 100644 index ba2279e0..00000000 --- a/laravel/database/eloquent/pivot.php +++ /dev/null @@ -1,61 +0,0 @@ -pivot_table = $table; - $this->pivot_connection = $connection; - - parent::__construct(array(), true); - } - - /** - * Get the name of the pivot table. - * - * @return string - */ - public function table() - { - return $this->pivot_table; - } - - /** - * Get the connection used by the pivot table. - * - * @return string - */ - public function connection() - { - return $this->pivot_connection; - } - -} \ No newline at end of file diff --git a/laravel/database/eloquent/query.php b/laravel/database/eloquent/query.php deleted file mode 100644 index 2d162e8e..00000000 --- a/laravel/database/eloquent/query.php +++ /dev/null @@ -1,296 +0,0 @@ -model = ($model instanceof Model) ? $model : new $model; - - $this->table = $this->table(); - } - - /** - * Find a model by its primary key. - * - * @param mixed $id - * @param array $columns - * @return mixed - */ - public function find($id, $columns = array('*')) - { - $model = $this->model; - - $this->table->where($model::$key, '=', $id); - - return $this->first($columns); - } - - /** - * Get the first model result for the query. - * - * @param array $columns - * @return mixed - */ - public function first($columns = array('*')) - { - $results = $this->hydrate($this->model, $this->table->take(1)->get($columns)); - - return (count($results) > 0) ? head($results) : null; - } - - /** - * Get all of the model results for the query. - * - * @param array $columns - * @return array - */ - public function get($columns = array('*')) - { - return $this->hydrate($this->model, $this->table->get($columns)); - } - - /** - * Get an array of paginated model results. - * - * @param int $per_page - * @param array $columns - * @return Paginator - */ - public function paginate($per_page = null, $columns = array('*')) - { - $per_page = $per_page ?: $this->model->per_page(); - - // First we'll grab the Paginator instance and get the results. Then we can - // feed those raw database results into the hydrate method to get models - // for the results, which we'll set on the paginator and return it. - $paginator = $this->table->paginate($per_page, $columns); - - $paginator->results = $this->hydrate($this->model, $paginator->results); - - return $paginator; - } - - /** - * Hydrate an array of models from the given results. - * - * @param Model $model - * @param array $results - * @return array - */ - public function hydrate($model, $results) - { - $class = get_class($model); - - $models = array(); - - // We'll spin through the array of database results and hydrate a model - // for each one of the records. We will also set the "exists" flag to - // "true" so that the model will be updated when it is saved. - foreach ((array) $results as $result) - { - $result = (array) $result; - - $new = new $class(array(), true); - - // We need to set the attributes manually in case the accessible property is - // set on the array which will prevent the mass assignemnt of attributes if - // we were to pass them in using the constructor or fill methods. - $new->fill_raw($result); - - $models[] = $new; - } - - if (count($results) > 0) - { - foreach ($this->model_includes() as $relationship => $constraints) - { - // If the relationship is nested, we will skip loading it here and let - // the load method parse and set the nested eager loads on the right - // relationship when it is getting ready to eager load. - if (str_contains($relationship, '.')) - { - continue; - } - - $this->load($models, $relationship, $constraints); - } - } - - // The many to many relationships may have pivot table column on them - // so we will call the "clean" method on the relationship to remove - // any pivot columns that are on the model. - if ($this instanceof Relationships\Has_Many_And_Belongs_To) - { - $this->hydrate_pivot($models); - } - - return $models; - } - - /** - * Hydrate an eagerly loaded relationship on the model results. - * - * @param array $results - * @param string $relationship - * @param array|null $constraints - * @return void - */ - protected function load(&$results, $relationship, $constraints) - { - $query = $this->model->$relationship(); - - $query->model->includes = $this->nested_includes($relationship); - - // We'll remove any of the where clauses from the relationship to give - // the relationship the opportunity to set the constraints for an - // eager relationship using a separate, specific method. - $query->table->reset_where(); - - $query->eagerly_constrain($results); - - // Constraints may be specified in-line for the eager load by passing - // a Closure as the value portion of the eager load. We can use the - // query builder's nested query support to add the constraints. - if ( ! is_null($constraints)) - { - $query->table->where_nested($constraints); - } - - $query->initialize($results, $relationship); - - $query->match($relationship, $results, $query->get()); - } - - /** - * Gather the nested includes for a given relationship. - * - * @param string $relationship - * @return array - */ - protected function nested_includes($relationship) - { - $nested = array(); - - foreach ($this->model_includes() as $include => $constraints) - { - // To get the nested includes, we want to find any includes that begin - // the relationship and a dot, then we will strip off the leading - // nesting indicator and set the include in the array. - if (starts_with($include, $relationship.'.')) - { - $nested[substr($include, strlen($relationship.'.'))] = $constraints; - } - } - - return $nested; - } - - /** - * Get the eagerly loaded relationships for the model. - * - * @return array - */ - protected function model_includes() - { - $includes = array(); - - foreach ($this->model->includes as $relationship => $constraints) - { - // When eager loading relationships, constraints may be set on the eager - // load definition; however, is none are set, we need to swap the key - // and the value of the array since there are no constraints. - if (is_numeric($relationship)) - { - list($relationship, $constraints) = array($constraints, null); - } - - $includes[$relationship] = $constraints; - } - - return $includes; - } - - /** - * Get a fluent query builder for the model. - * - * @return Query - */ - protected function table() - { - return $this->connection()->table($this->model->table()); - } - - /** - * Get the database connection for the model. - * - * @return Connection - */ - public function connection() - { - return Database::connection($this->model->connection()); - } - - /** - * Handle dynamic method calls to the query. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - $result = call_user_func_array(array($this->table, $method), $parameters); - - // Some methods may get their results straight from the fluent query - // builder such as the aggregate methods. If the called method is - // one of these, we will just return the result straight away. - if (in_array($method, $this->passthru)) - { - return $result; - } - - return $this; - } - -} \ No newline at end of file diff --git a/laravel/database/eloquent/relationships/belongs_to.php b/laravel/database/eloquent/relationships/belongs_to.php deleted file mode 100644 index 0336025f..00000000 --- a/laravel/database/eloquent/relationships/belongs_to.php +++ /dev/null @@ -1,129 +0,0 @@ -get_dirty() : $attributes; - - return $this->model->update($this->foreign_value(), $attributes); - } - - /** - * Set the proper constraints on the relationship table. - * - * @return void - */ - protected function constrain() - { - $this->table->where($this->model->key(), '=', $this->foreign_value()); - } - - /** - * Initialize a relationship on an array of parent models. - * - * @param array $parents - * @param string $relationship - * @return void - */ - public function initialize(&$parents, $relationship) - { - foreach ($parents as &$parent) - { - $parent->relationships[$relationship] = null; - } - } - - /** - * Set the proper constraints on the relationship table for an eager load. - * - * @param array $results - * @return void - */ - public function eagerly_constrain($results) - { - $keys = array(); - - // Inverse one-to-many relationships require us to gather the keys from the - // parent models and use those keys when setting the constraint since we - // are looking for the parent of a child model in this relationship. - foreach ($results as $result) - { - if ( ! is_null($key = $result->{$this->foreign_key()})) - { - $keys[] = $key; - } - } - - if (count($keys) == 0) $keys = array(0); - - $this->table->where_in($this->model->key(), array_unique($keys)); - } - - /** - * Match eagerly loaded child models to their parent models. - * - * @param array $children - * @param array $parents - * @return void - */ - public function match($relationship, &$children, $parents) - { - $foreign = $this->foreign_key(); - - $dictionary = array(); - - foreach ($parents as $parent) - { - $dictionary[$parent->get_key()] = $parent; - } - - foreach ($children as $child) - { - if (array_key_exists($child->$foreign, $dictionary)) - { - $child->relationships[$relationship] = $dictionary[$child->$foreign]; - } - } - } - - /** - * Get the value of the foreign key from the base model. - * - * @return mixed - */ - public function foreign_value() - { - return $this->base->get_attribute($this->foreign); - } - - /** - * Bind an object over a belongs-to relation using its id. - * - * @return Eloquent - */ - - public function bind($id) - { - $this->base->fill(array($this->foreign => $id))->save(); - - return $this->base; - } - -} \ No newline at end of file diff --git a/laravel/database/eloquent/relationships/has_many.php b/laravel/database/eloquent/relationships/has_many.php deleted file mode 100644 index b791a542..00000000 --- a/laravel/database/eloquent/relationships/has_many.php +++ /dev/null @@ -1,110 +0,0 @@ -table->lists($this->model->key()); - - foreach ($models as $attributes) - { - $class = get_class($this->model); - - // If the "attributes" are actually an array of the related model we'll - // just use the existing instance instead of creating a fresh model - // instance for the attributes. This allows for validation. - if ($attributes instanceof $class) - { - $model = $attributes; - } - else - { - $model = $this->fresh_model($attributes); - } - - // We'll need to associate the model with its parent, so we'll set the - // foreign key on the model to the key of the parent model, making - // sure that the two models are associated in the database. - $foreign = $this->foreign_key(); - - $model->$foreign = $this->base->get_key(); - - $id = $model->get_key(); - - $model->exists = ( ! is_null($id) and in_array($id, $current)); - - // Before saving we'll force the entire model to be "dirty" so all of - // the attributes are saved. It shouldn't affect the updates as - // saving all the attributes shouldn't hurt anything. - $model->original = array(); - - $model->save(); - } - - return true; - } - - /** - * Initialize a relationship on an array of parent models. - * - * @param array $parents - * @param string $relationship - * @return void - */ - public function initialize(&$parents, $relationship) - { - foreach ($parents as &$parent) - { - $parent->relationships[$relationship] = array(); - } - } - - /** - * Match eagerly loaded child models to their parent models. - * - * @param array $parents - * @param array $children - * @return void - */ - public function match($relationship, &$parents, $children) - { - $foreign = $this->foreign_key(); - - $dictionary = array(); - - foreach ($children as $child) - { - $dictionary[$child->$foreign][] = $child; - } - - foreach ($parents as $parent) - { - if (array_key_exists($key = $parent->get_key(), $dictionary)) - { - $parent->relationships[$relationship] = $dictionary[$key]; - } - } - } - -} \ No newline at end of file diff --git a/laravel/database/eloquent/relationships/has_many_and_belongs_to.php b/laravel/database/eloquent/relationships/has_many_and_belongs_to.php deleted file mode 100644 index 7dc8b0a3..00000000 --- a/laravel/database/eloquent/relationships/has_many_and_belongs_to.php +++ /dev/null @@ -1,437 +0,0 @@ -other = $other; - - $this->joining = $table ?: $this->joining($model, $associated); - - // If the Pivot table is timestamped, we'll set the timestamp columns to be - // fetched when the pivot table models are fetched by the developer else - // the ID will be the only "extra" column fetched in by default. - if (Pivot::$timestamps) - { - $this->with[] = 'created_at'; - - $this->with[] = 'updated_at'; - } - - parent::__construct($model, $associated, $foreign); - } - - /** - * Determine the joining table name for the relationship. - * - * By default, the name is the models sorted and joined with underscores. - * - * @return string - */ - protected function joining($model, $associated) - { - $models = array(class_basename($model), class_basename($associated)); - - sort($models); - - return strtolower($models[0].'_'.$models[1]); - } - - /** - * Get the properly hydrated results for the relationship. - * - * @return array - */ - public function results() - { - return parent::get(); - } - - /** - * Insert a new record into the joining table of the association. - * - * @param Model|int $id - * @param array $attributes - * @return bool - */ - public function attach($id, $attributes = array()) - { - if ($id instanceof Model) $id = $id->get_key(); - - $joining = array_merge($this->join_record($id), $attributes); - - return $this->insert_joining($joining); - } - - /** - * Detach a record from the joining table of the association. - * - * @param array|Model|int $ids - * @return bool - */ - public function detach($ids) - { - if ($ids instanceof Model) $ids = array($ids->get_key()); - elseif ( ! is_array($ids)) $ids = array($ids); - - return $this->pivot()->where_in($this->other_key(), $ids)->delete(); - } - - /** - * Sync the joining table with the array of given IDs. - * - * @param array $ids - * @return bool - */ - public function sync($ids) - { - $current = $this->pivot()->lists($this->other_key()); - $ids = (array) $ids; - - // First we need to attach any of the associated models that are not currently - // in the joining table. We'll spin through the given IDs, checking to see - // if they exist in the array of current ones, and if not we insert. - foreach ($ids as $id) - { - if ( ! in_array($id, $current)) - { - $this->attach($id); - } - } - - // Next we will take the difference of the current and given IDs and detach - // all of the entities that exists in the current array but are not in - // the array of IDs given to the method, finishing the sync. - $detach = array_diff($current, $ids); - - if (count($detach) > 0) - { - $this->detach($detach); - } - } - - /** - * Insert a new record for the association. - * - * @param Model|array $attributes - * @param array $joining - * @return bool - */ - public function insert($attributes, $joining = array()) - { - // If the attributes are actually an instance of a model, we'll just grab the - // array of attributes off of the model for saving, allowing the developer - // to easily validate the joining models before inserting them. - if ($attributes instanceof Model) - { - $attributes = $attributes->attributes; - } - - $model = $this->model->create($attributes); - - // If the insert was successful, we'll insert a record into the joining table - // using the new ID that was just inserted into the related table, allowing - // the developer to not worry about maintaining the join table. - if ($model instanceof Model) - { - $joining = array_merge($this->join_record($model->get_key()), $joining); - - $result = $this->insert_joining($joining); - } - - return $model instanceof Model and $result; - } - - /** - * Delete all of the records from the joining table for the model. - * - * @return int - */ - public function delete() - { - return $this->pivot()->delete(); - } - - /** - * Create an array representing a new joining record for the association. - * - * @param int $id - * @return array - */ - protected function join_record($id) - { - return array($this->foreign_key() => $this->base->get_key(), $this->other_key() => $id); - } - - /** - * Insert a new record into the joining table of the association. - * - * @param array $attributes - * @return void - */ - protected function insert_joining($attributes) - { - if (Pivot::$timestamps) - { - $attributes['created_at'] = new \DateTime; - - $attributes['updated_at'] = $attributes['created_at']; - } - - return $this->joining_table()->insert($attributes); - } - - /** - * Get a fluent query for the joining table of the relationship. - * - * @return Query - */ - protected function joining_table() - { - return $this->connection()->table($this->joining); - } - - /** - * Set the proper constraints on the relationship table. - * - * @return void - */ - protected function constrain() - { - $other = $this->other_key(); - - $foreign = $this->foreign_key(); - - $this->set_select($foreign, $other)->set_join($other)->set_where($foreign); - } - - /** - * Set the SELECT clause on the query builder for the relationship. - * - * @param string $foreign - * @param string $other - * @return void - */ - protected function set_select($foreign, $other) - { - $columns = array($this->model->table().'.*'); - - $this->with = array_merge($this->with, array($foreign, $other)); - - // Since pivot tables may have extra information on them that the developer - // needs we allow an extra array of columns to be specified that will be - // fetched from the pivot table and hydrate into the pivot model. - foreach ($this->with as $column) - { - $columns[] = $this->joining.'.'.$column.' as pivot_'.$column; - } - - $this->table->select($columns); - - return $this; - } - - /** - * Set the JOIN clause on the query builder for the relationship. - * - * @param string $other - * @return void - */ - protected function set_join($other) - { - $this->table->join($this->joining, $this->associated_key(), '=', $this->joining.'.'.$other); - - return $this; - } - - /** - * Set the WHERE clause on the query builder for the relationship. - * - * @param string $foreign - * @return void - */ - protected function set_where($foreign) - { - $this->table->where($this->joining.'.'.$foreign, '=', $this->base->get_key()); - - return $this; - } - - /** - * Initialize a relationship on an array of parent models. - * - * @param array $parents - * @param string $relationship - * @return void - */ - public function initialize(&$parents, $relationship) - { - foreach ($parents as &$parent) - { - $parent->relationships[$relationship] = array(); - } - } - - /** - * Set the proper constraints on the relationship table for an eager load. - * - * @param array $results - * @return void - */ - public function eagerly_constrain($results) - { - $this->table->where_in($this->joining.'.'.$this->foreign_key(), $this->keys($results)); - } - - /** - * Match eagerly loaded child models to their parent models. - * - * @param array $parents - * @param array $children - * @return void - */ - public function match($relationship, &$parents, $children) - { - $foreign = $this->foreign_key(); - - $dictionary = array(); - - foreach ($children as $child) - { - $dictionary[$child->pivot->$foreign][] = $child; - } - - foreach ($parents as $parent) - { - if (array_key_exists($key = $parent->get_key(), $dictionary)) - { - $parent->relationships[$relationship] = $dictionary[$key]; - } - } - } - - /** - * Hydrate the Pivot model on an array of results. - * - * @param array $results - * @return void - */ - protected function hydrate_pivot(&$results) - { - foreach ($results as &$result) - { - // Every model result for a many-to-many relationship needs a Pivot instance - // to represent the pivot table's columns. Sometimes extra columns are on - // the pivot table that may need to be accessed by the developer. - $pivot = new Pivot($this->joining, $this->model->connection()); - - // If the attribute key starts with "pivot_", we know this is a column on - // the pivot table, so we will move it to the Pivot model and purge it - // from the model since it actually belongs to the pivot model. - foreach ($result->attributes as $key => $value) - { - if (starts_with($key, 'pivot_')) - { - $pivot->{substr($key, 6)} = $value; - - $result->purge($key); - } - } - - // Once we have completed hydrating the pivot model instance, we'll set - // it on the result model's relationships array so the developer can - // quickly and easily access any pivot table information. - $result->relationships['pivot'] = $pivot; - - $pivot->sync() and $result->sync(); - } - } - - /** - * Set the columns on the joining table that should be fetched. - * - * @param array $column - * @return Relationship - */ - public function with($columns) - { - $columns = (is_array($columns)) ? $columns : func_get_args(); - - // The "with" array contains a couple of columns by default, so we will just - // merge in the developer specified columns here, and we will make sure - // the values of the array are unique to avoid duplicates. - $this->with = array_unique(array_merge($this->with, $columns)); - - $this->set_select($this->foreign_key(), $this->other_key()); - - return $this; - } - - /** - * Get a relationship instance of the pivot table. - * - * @return Has_Many - */ - public function pivot() - { - $pivot = new Pivot($this->joining, $this->model->connection()); - - return new Has_Many($this->base, $pivot, $this->foreign_key()); - } - - /** - * Get the other or associated key for the relationship. - * - * @return string - */ - protected function other_key() - { - return Relationship::foreign($this->model, $this->other); - } - - /** - * Get the fully qualified associated table's primary key. - * - * @return string - */ - protected function associated_key() - { - return $this->model->table().'.'.$this->model->key(); - } - -} \ No newline at end of file diff --git a/laravel/database/eloquent/relationships/has_one.php b/laravel/database/eloquent/relationships/has_one.php deleted file mode 100644 index 5a9ea760..00000000 --- a/laravel/database/eloquent/relationships/has_one.php +++ /dev/null @@ -1,57 +0,0 @@ -relationships[$relationship] = null; - } - } - - /** - * Match eagerly loaded child models to their parent models. - * - * @param array $parents - * @param array $children - * @return void - */ - public function match($relationship, &$parents, $children) - { - $foreign = $this->foreign_key(); - - $dictionary = array(); - - foreach ($children as $child) - { - $dictionary[$child->$foreign] = $child; - } - - foreach ($parents as $parent) - { - if (array_key_exists($key = $parent->get_key(), $dictionary)) - { - $parent->relationships[$relationship] = $dictionary[$key]; - } - } - } - -} \ No newline at end of file diff --git a/laravel/database/eloquent/relationships/has_one_or_many.php b/laravel/database/eloquent/relationships/has_one_or_many.php deleted file mode 100644 index e7bfc0b0..00000000 --- a/laravel/database/eloquent/relationships/has_one_or_many.php +++ /dev/null @@ -1,68 +0,0 @@ -set_attribute($this->foreign_key(), $this->base->get_key()); - - return $attributes->save() ? $attributes : false; - } - else - { - $attributes[$this->foreign_key()] = $this->base->get_key(); - - return $this->model->create($attributes); - } - } - - /** - * Update a record for the association. - * - * @param array $attributes - * @return bool - */ - public function update(array $attributes) - { - if ($this->model->timestamps()) - { - $attributes['updated_at'] = new \DateTime; - } - - return $this->table->update($attributes); - } - - /** - * Set the proper constraints on the relationship table. - * - * @return void - */ - protected function constrain() - { - $this->table->where($this->foreign_key(), '=', $this->base->get_key()); - } - - /** - * Set the proper constraints on the relationship table for an eager load. - * - * @param array $results - * @return void - */ - public function eagerly_constrain($results) - { - $this->table->where_in($this->foreign_key(), $this->keys($results)); - } - -} \ No newline at end of file diff --git a/laravel/database/eloquent/relationships/relationship.php b/laravel/database/eloquent/relationships/relationship.php deleted file mode 100644 index 99785d3a..00000000 --- a/laravel/database/eloquent/relationships/relationship.php +++ /dev/null @@ -1,135 +0,0 @@ -foreign = $foreign; - - // We will go ahead and set the model and associated instances on the - // relationship to match the relationship targets passed in from the - // model. These will allow us to gather the relationship info. - if ($associated instanceof Model) - { - $this->model = $associated; - } - else - { - $this->model = new $associated; - } - - // For relationships, we'll set the base model to be the model being - // associated from. This model contains the value of the foreign - // key needed to connect to the associated model. - if ($model instanceof Model) - { - $this->base = $model; - } - else - { - $this->base = new $model; - } - - // Next we'll set the fluent query builder for the relationship and - // constrain the query such that it only returns the models that - // are appropriate for the relationship. - $this->table = $this->table(); - - $this->constrain(); - } - - /** - * Get the foreign key name for the given model. - * - * @param string $model - * @param string $foreign - * @return string - */ - public static function foreign($model, $foreign = null) - { - if ( ! is_null($foreign)) return $foreign; - - // If the model is an object we'll simply get the class of the object and - // then take the basename, which is simply the object name minus the - // namespace, and we'll append "_id" to the name. - if (is_object($model)) - { - $model = class_basename($model); - } - - return strtolower(basename($model).'_id'); - } - - /** - * Get a freshly instantiated instance of the related model class. - * - * @param array $attributes - * @return Model - */ - protected function fresh_model($attributes = array()) - { - $class = get_class($this->model); - - return new $class($attributes); - } - - /** - * Get the foreign key for the relationship. - * - * @return string - */ - public function foreign_key() - { - return static::foreign($this->base, $this->foreign); - } - - /** - * Gather all the primary keys from a result set. - * - * @param array $results - * @return array - */ - public function keys($results) - { - $keys = array(); - - foreach ($results as $result) - { - $keys[] = $result->get_key(); - } - - return array_unique($keys); - } - - /** - * The relationships that should be eagerly loaded by the query. - * - * @param array $includes - * @return Relationship - */ - public function with($includes) - { - $this->model->includes = (array) $includes; - - return $this; - } - -} \ No newline at end of file diff --git a/laravel/database/exception.php b/laravel/database/exception.php deleted file mode 100644 index d9d390b4..00000000 --- a/laravel/database/exception.php +++ /dev/null @@ -1,54 +0,0 @@ -inner = $inner; - - $this->setMessage($sql, $bindings); - - // Set the exception code - $this->code = $inner->getCode(); - } - - /** - * Get the inner exception. - * - * @return Exception - */ - public function getInner() - { - return $this->inner; - } - - /** - * Set the exception message to include the SQL and bindings. - * - * @param string $sql - * @param array $bindings - * @return void - */ - protected function setMessage($sql, $bindings) - { - $this->message = $this->inner->getMessage(); - - $this->message .= "\n\nSQL: ".$sql."\n\nBindings: ".var_export($bindings, true); - } - -} \ No newline at end of file diff --git a/laravel/database/expression.php b/laravel/database/expression.php deleted file mode 100644 index f92eed6a..00000000 --- a/laravel/database/expression.php +++ /dev/null @@ -1,43 +0,0 @@ -value = $value; - } - - /** - * Get the string value of the database expression. - * - * @return string - */ - public function get() - { - return $this->value; - } - - /** - * Get the string value of the database expression. - * - * @return string - */ - public function __toString() - { - return $this->get(); - } - -} \ No newline at end of file diff --git a/laravel/database/grammar.php b/laravel/database/grammar.php deleted file mode 100644 index 0ff5bd14..00000000 --- a/laravel/database/grammar.php +++ /dev/null @@ -1,174 +0,0 @@ -connection = $connection; - } - - /** - * Wrap a table in keyword identifiers. - * - * @param string $table - * @return string - */ - public function wrap_table($table) - { - // Expressions should be injected into the query as raw strings - // so we do not want to wrap them in any way. We will just return - // the string value from the expression to be included. - if ($table instanceof Expression) - { - return $this->wrap($table); - } - - $prefix = ''; - - // Tables may be prefixed with a string. This allows developers to - // prefix tables by application on the same database which may be - // required in some brown-field situations. - if (isset($this->connection->config['prefix'])) - { - $prefix = $this->connection->config['prefix']; - } - - return $this->wrap($prefix.$table); - } - - /** - * Wrap a value in keyword identifiers. - * - * @param string $value - * @return string - */ - public function wrap($value) - { - // Expressions should be injected into the query as raw strings - // so we do not want to wrap them in any way. We will just return - // the string value from the expression to be included. - if ($value instanceof Expression) - { - return $value->get(); - } - - // If the value being wrapped contains a column alias, we need to - // wrap it a little differently as each segment must be wrapped - // and not the entire string. - if (strpos(strtolower($value), ' as ') !== false) - { - $segments = explode(' ', $value); - - return sprintf( - '%s AS %s', - $this->wrap($segments[0]), - $this->wrap($segments[2]) - ); - } - - // Since columns may be prefixed with their corresponding table - // name so as to not make them ambiguous, we will need to wrap - // the table and the column in keyword identifiers. - $segments = explode('.', $value); - - foreach ($segments as $key => $value) - { - if ($key == 0 and count($segments) > 1) - { - $wrapped[] = $this->wrap_table($value); - } - else - { - $wrapped[] = $this->wrap_value($value); - } - } - - return implode('.', $wrapped); - } - - /** - * Wrap a single string value in keyword identifiers. - * - * @param string $value - * @return string - */ - protected function wrap_value($value) - { - return ($value !== '*') ? sprintf($this->wrapper, $value) : $value; - } - - /** - * Create query parameters from an array of values. - * - * - * Returns "?, ?, ?", which may be used as PDO place-holders - * $parameters = $grammar->parameterize(array(1, 2, 3)); - * - * // Returns "?, "Taylor"" since an expression is used - * $parameters = $grammar->parameterize(array(1, DB::raw('Taylor'))); - * - * - * @param array $values - * @return string - */ - final public function parameterize($values) - { - return implode(', ', array_map(array($this, 'parameter'), $values)); - } - - /** - * Get the appropriate query parameter string for a value. - * - * - * // Returns a "?" PDO place-holder - * $value = $grammar->parameter('Taylor Otwell'); - * - * // Returns "Taylor Otwell" as the raw value of the expression - * $value = $grammar->parameter(DB::raw('Taylor Otwell')); - * - * - * @param mixed $value - * @return string - */ - final public function parameter($value) - { - return ($value instanceof Expression) ? $value->get() : '?'; - } - - /** - * Create a comma-delimited list of wrapped column names. - * - * - * // Returns ""Taylor", "Otwell"" when the identifier is quotes - * $columns = $grammar->columnize(array('Taylor', 'Otwell')); - * - * - * @param array $columns - * @return string - */ - final public function columnize($columns) - { - return implode(', ', array_map(array($this, 'wrap'), $columns)); - } - -} \ No newline at end of file diff --git a/laravel/database/query.php b/laravel/database/query.php deleted file mode 100755 index 73e45fe6..00000000 --- a/laravel/database/query.php +++ /dev/null @@ -1,950 +0,0 @@ -from = $table; - $this->grammar = $grammar; - $this->connection = $connection; - } - - /** - * Force the query to return distinct results. - * - * @return Query - */ - public function distinct() - { - $this->distinct = true; - return $this; - } - - /** - * Add an array of columns to the SELECT clause. - * - * @param array $columns - * @return Query - */ - public function select($columns = array('*')) - { - $this->selects = (array) $columns; - return $this; - } - - /** - * Add a join clause to the query. - * - * @param string $table - * @param string $column1 - * @param string $operator - * @param string $column2 - * @param string $type - * @return Query - */ - public function join($table, $column1, $operator = null, $column2 = null, $type = 'INNER') - { - // If the "column" is really an instance of a Closure, the developer is - // trying to create a join with a complex "ON" clause. So, we will add - // the join, and then call the Closure with the join/ - if ($column1 instanceof Closure) - { - $this->joins[] = new Query\Join($type, $table); - - call_user_func($column1, end($this->joins)); - } - - // If the column is just a string, we can assume that the join just - // has a simple on clause, and we'll create the join instance and - // add the clause automatically for the develoepr. - else - { - $join = new Query\Join($type, $table); - - $join->on($column1, $operator, $column2); - - $this->joins[] = $join; - } - - return $this; - } - - /** - * Add a left join to the query. - * - * @param string $table - * @param string $column1 - * @param string $operator - * @param string $column2 - * @return Query - */ - public function left_join($table, $column1, $operator = null, $column2 = null) - { - return $this->join($table, $column1, $operator, $column2, 'LEFT'); - } - - /** - * Reset the where clause to its initial state. - * - * @return void - */ - public function reset_where() - { - list($this->wheres, $this->bindings) = array(array(), array()); - } - - /** - * Add a raw where condition to the query. - * - * @param string $where - * @param array $bindings - * @param string $connector - * @return Query - */ - public function raw_where($where, $bindings = array(), $connector = 'AND') - { - $this->wheres[] = array('type' => 'where_raw', 'connector' => $connector, 'sql' => $where); - - $this->bindings = array_merge($this->bindings, $bindings); - - return $this; - } - - /** - * Add a raw or where condition to the query. - * - * @param string $where - * @param array $bindings - * @return Query - */ - public function raw_or_where($where, $bindings = array()) - { - return $this->raw_where($where, $bindings, 'OR'); - } - - /** - * Add a where condition to the query. - * - * @param string $column - * @param string $operator - * @param mixed $value - * @param string $connector - * @return Query - */ - public function where($column, $operator = null, $value = null, $connector = 'AND') - { - // If a Closure is passed into the method, it means a nested where - // clause is being initiated, so we will take a different course - // of action than when the statement is just a simple where. - if ($column instanceof Closure) - { - return $this->where_nested($column, $connector); - } - - $type = 'where'; - - $this->wheres[] = compact('type', 'column', 'operator', 'value', 'connector'); - - $this->bindings[] = $value; - - return $this; - } - - /** - * Add an or where condition to the query. - * - * @param string $column - * @param string $operator - * @param mixed $value - * @return Query - */ - public function or_where($column, $operator = null, $value = null) - { - return $this->where($column, $operator, $value, 'OR'); - } - - /** - * Add an or where condition for the primary key to the query. - * - * @param mixed $value - * @return Query - */ - public function or_where_id($value) - { - return $this->or_where('id', '=', $value); - } - - /** - * Add a where in condition to the query. - * - * @param string $column - * @param array $values - * @param string $connector - * @param bool $not - * @return Query - */ - public function where_in($column, $values, $connector = 'AND', $not = false) - { - $type = ($not) ? 'where_not_in' : 'where_in'; - - $this->wheres[] = compact('type', 'column', 'values', 'connector'); - - $this->bindings = array_merge($this->bindings, $values); - - return $this; - } - - /** - * Add an or where in condition to the query. - * - * @param string $column - * @param array $values - * @return Query - */ - public function or_where_in($column, $values) - { - return $this->where_in($column, $values, 'OR'); - } - - /** - * Add a where not in condition to the query. - * - * @param string $column - * @param array $values - * @param string $connector - * @return Query - */ - public function where_not_in($column, $values, $connector = 'AND') - { - return $this->where_in($column, $values, $connector, true); - } - - /** - * Add an or where not in condition to the query. - * - * @param string $column - * @param array $values - * @return Query - */ - public function or_where_not_in($column, $values) - { - return $this->where_not_in($column, $values, 'OR'); - } - - /** - * Add a BETWEEN condition to the query - * - * @param string $column - * @param mixed $min - * @param mixed $max - * @param string $connector - * @param boolean $not - * @return Query - */ - public function where_between($column, $min, $max, $connector = 'AND', $not = false) - { - $type = ($not) ? 'where_not_between' : 'where_between'; - - $this->wheres[] = compact('type', 'column', 'min', 'max', 'connector'); - - $this->bindings[] = $min; - $this->bindings[] = $max; - - return $this; - } - - /** - * Add a OR BETWEEN condition to the query - * - * @param string $column - * @param mixed $min - * @param mixed $max - * @return Query - */ - public function or_where_between($column, $min, $max) - { - return $this->where_between($column, $min, $max, 'OR'); - } - - /** - * Add a NOT BETWEEN condition to the query - * - * @param string $column - * @param mixed $min - * @param mixed $max - * @return Query - */ - public function where_not_between($column, $min, $max, $connector = 'AND') - { - return $this->where_between($column, $min, $max, $connector, true); - } - - /** - * Add a OR NOT BETWEEN condition to the query - * - * @param string $column - * @param mixed $min - * @param mixed $max - * @return Query - */ - public function or_where_not_between($column, $min, $max) - { - return $this->where_not_between($column, $min, $max, 'OR'); - } - - /** - * Add a where null condition to the query. - * - * @param string $column - * @param string $connector - * @param bool $not - * @return Query - */ - public function where_null($column, $connector = 'AND', $not = false) - { - $type = ($not) ? 'where_not_null' : 'where_null'; - - $this->wheres[] = compact('type', 'column', 'connector'); - - return $this; - } - - /** - * Add an or where null condition to the query. - * - * @param string $column - * @return Query - */ - public function or_where_null($column) - { - return $this->where_null($column, 'OR'); - } - - /** - * Add a where not null condition to the query. - * - * @param string $column - * @param string $connector - * @return Query - */ - public function where_not_null($column, $connector = 'AND') - { - return $this->where_null($column, $connector, true); - } - - /** - * Add an or where not null condition to the query. - * - * @param string $column - * @return Query - */ - public function or_where_not_null($column) - { - return $this->where_not_null($column, 'OR'); - } - - /** - * Add a nested where condition to the query. - * - * @param Closure $callback - * @param string $connector - * @return Query - */ - public function where_nested($callback, $connector = 'AND') - { - $type = 'where_nested'; - - // To handle a nested where statement, we will actually instantiate a new - // Query instance and run the callback over that instance, which will - // allow the developer to have a fresh query instance - $query = new Query($this->connection, $this->grammar, $this->from); - - call_user_func($callback, $query); - - // Once the callback has been run on the query, we will store the nested - // query instance on the where clause array so that it's passed to the - // query's query grammar instance when building. - if ($query->wheres !== null) - { - $this->wheres[] = compact('type', 'query', 'connector'); - } - - $this->bindings = array_merge($this->bindings, $query->bindings); - - return $this; - } - - /** - * Add dynamic where conditions to the query. - * - * @param string $method - * @param array $parameters - * @return Query - */ - private function dynamic_where($method, $parameters) - { - $finder = substr($method, 6); - - $flags = PREG_SPLIT_DELIM_CAPTURE; - - $segments = preg_split('/(_and_|_or_)/i', $finder, -1, $flags); - - // The connector variable will determine which connector will be used - // for the condition. We'll change it as we come across new boolean - // connectors in the dynamic method string. - // - // The index variable helps us get the correct parameter value for - // the where condition. We increment it each time we add another - // condition to the query's where clause. - $connector = 'AND'; - - $index = 0; - - foreach ($segments as $segment) - { - // If the segment is not a boolean connector, we can assume it it is - // a column name, and we'll add it to the query as a new constraint - // of the query's where clause and keep iterating the segments. - if ($segment != '_and_' and $segment != '_or_') - { - $this->where($segment, '=', $parameters[$index], $connector); - - $index++; - } - // Otherwise, we will store the connector so we know how the next - // where clause we find in the query should be connected to the - // previous one and will add it when we find the next one. - else - { - $connector = trim(strtoupper($segment), '_'); - } - } - - return $this; - } - - /** - * Add a grouping to the query. - * - * @param string $column - * @return Query - */ - public function group_by($column) - { - $this->groupings[] = $column; - return $this; - } - - /** - * Add a having to the query. - * - * @param string $column - * @param string $operator - * @param mixed $value - */ - public function having($column, $operator, $value) - { - $this->havings[] = compact('column', 'operator', 'value'); - - $this->bindings[] = $value; - - return $this; - } - - /** - * Add an ordering to the query. - * - * @param string $column - * @param string $direction - * @return Query - */ - public function order_by($column, $direction = 'asc') - { - $this->orderings[] = compact('column', 'direction'); - return $this; - } - - /** - * Set the query offset. - * - * @param int $value - * @return Query - */ - public function skip($value) - { - $this->offset = $value; - return $this; - } - - /** - * Set the query limit. - * - * @param int $value - * @return Query - */ - public function take($value) - { - $this->limit = $value; - return $this; - } - - /** - * Set the query limit and offset for a given page. - * - * @param int $page - * @param int $per_page - * @return Query - */ - public function for_page($page, $per_page) - { - return $this->skip(($page - 1) * $per_page)->take($per_page); - } - - /** - * Find a record by the primary key. - * - * @param int $id - * @param array $columns - * @return object - */ - public function find($id, $columns = array('*')) - { - return $this->where('id', '=', $id)->first($columns); - } - - /** - * Execute the query as a SELECT statement and return a single column. - * - * @param string $column - * @return mixed - */ - public function only($column) - { - $sql = $this->grammar->select($this->select(array($column))); - - return $this->connection->only($sql, $this->bindings); - } - - /** - * Execute the query as a SELECT statement and return the first result. - * - * @param array $columns - * @return mixed - */ - public function first($columns = array('*')) - { - $columns = (array) $columns; - - // Since we only need the first result, we'll go ahead and set the - // limit clause to 1, since this will be much faster than getting - // all of the rows and then only returning the first. - $results = $this->take(1)->get($columns); - - return (count($results) > 0) ? $results[0] : null; - } - - /** - * Get an array with the values of a given column. - * - * @param string $column - * @param string $key - * @return array - */ - public function lists($column, $key = null) - { - $columns = (is_null($key)) ? array($column) : array($column, $key); - - $results = $this->get($columns); - - // First we will get the array of values for the requested column. - // Of course, this array will simply have numeric keys. After we - // have this array we will determine if we need to key the array - // by another column from the result set. - $values = array_map(function($row) use ($column) - { - return $row->$column; - - }, $results); - - // If a key was provided, we will extract an array of keys and - // set the keys on the array of values using the array_combine - // function provided by PHP, which should give us the proper - // array form to return from the method. - if ( ! is_null($key) && count($results)) - { - return array_combine(array_map(function($row) use ($key) - { - return $row->$key; - - }, $results), $values); - } - - return $values; - } - - /** - * Execute the query as a SELECT statement. - * - * @param array $columns - * @return array - */ - public function get($columns = array('*')) - { - if (is_null($this->selects)) $this->select($columns); - - $sql = $this->grammar->select($this); - - $results = $this->connection->query($sql, $this->bindings); - - // If the query has an offset and we are using the SQL Server grammar, - // we need to spin through the results and remove the "rownum" from - // each of the objects since there is no "offset". - if ($this->offset > 0 and $this->grammar instanceof SQLServer) - { - array_walk($results, function($result) - { - unset($result->rownum); - }); - } - - // Reset the SELECT clause so more queries can be performed using - // the same instance. This is helpful for getting aggregates and - // then getting actual results from the query. - $this->selects = null; - - return $results; - } - - /** - * Get an aggregate value. - * - * @param string $aggregator - * @param array $columns - * @return mixed - */ - public function aggregate($aggregator, $columns) - { - // We'll set the aggregate value so the grammar does not try to compile - // a SELECT clause on the query. If an aggregator is present, it's own - // grammar function will be used to build the SQL syntax. - $this->aggregate = compact('aggregator', 'columns'); - - $sql = $this->grammar->select($this); - - $result = $this->connection->only($sql, $this->bindings); - - // Reset the aggregate so more queries can be performed using the same - // instance. This is helpful for getting aggregates and then getting - // actual results from the query such as during paging. - $this->aggregate = null; - - return $result; - } - - /** - * Get the paginated query results as a Paginator instance. - * - * @param int $per_page - * @param array $columns - * @return Paginator - */ - public function paginate($per_page = 20, $columns = array('*')) - { - // Because some database engines may throw errors if we leave orderings - // on the query when retrieving the total number of records, we'll drop - // all of the ordreings and put them back on the query. - list($orderings, $this->orderings) = array($this->orderings, null); - - $total = $this->count(reset($columns)); - - $page = Paginator::page($total, $per_page); - - $this->orderings = $orderings; - - // Now we're ready to get the actual pagination results from the table - // using the for_page and get methods. The "for_page" method provides - // a convenient way to set the paging limit and offset. - $results = $this->for_page($page, $per_page)->get($columns); - - return Paginator::make($results, $total, $per_page); - } - - /** - * Insert an array of values into the database table. - * - * @param array $values - * @return bool - */ - public function insert($values) - { - // Force every insert to be treated like a batch insert to make creating - // the binding array simpler since we can just spin through the inserted - // rows as if there/ was more than one every time. - if ( ! is_array(reset($values))) $values = array($values); - - $bindings = array(); - - // We need to merge the the insert values into the array of the query - // bindings so that they will be bound to the PDO statement when it - // is executed by the database connection. - foreach ($values as $value) - { - $bindings = array_merge($bindings, array_values($value)); - } - - $sql = $this->grammar->insert($this, $values); - - return $this->connection->query($sql, $bindings); - } - - /** - * Insert an array of values into the database table and return the key. - * - * @param array $values - * @param string $column - * @return mixed - */ - public function insert_get_id($values, $column = 'id') - { - $sql = $this->grammar->insert_get_id($this, $values, $column); - - $result = $this->connection->query($sql, array_values($values)); - - // If the key is not auto-incrementing, we will just return the inserted value - if (isset($values[$column])) - { - return $values[$column]; - } - else if ($this->grammar instanceof Postgres) - { - return (int) $result[0]->$column; - } - else - { - return (int) $this->connection->pdo->lastInsertId(); - } - } - - /** - * Increment the value of a column by a given amount. - * - * @param string $column - * @param int $amount - * @return int - */ - public function increment($column, $amount = 1) - { - return $this->adjust($column, $amount, ' + '); - } - - /** - * Decrement the value of a column by a given amount. - * - * @param string $column - * @param int $amount - * @return int - */ - public function decrement($column, $amount = 1) - { - return $this->adjust($column, $amount, ' - '); - } - - /** - * Adjust the value of a column up or down by a given amount. - * - * @param string $column - * @param int $amount - * @param string $operator - * @return int - */ - protected function adjust($column, $amount, $operator) - { - $wrapped = $this->grammar->wrap($column); - - // To make the adjustment to the column, we'll wrap the expression in an - // Expression instance, which forces the adjustment to be injected into - // the query as a string instead of bound. - $value = Database::raw($wrapped.$operator.$amount); - - return $this->update(array($column => $value)); - } - - /** - * Update an array of values in the database table. - * - * @param array $values - * @return int - */ - public function update($values) - { - // For update statements, we need to merge the bindings such that the update - // values occur before the where bindings in the array since the sets will - // precede any of the where clauses in the SQL syntax that is generated. - $bindings = array_merge(array_values($values), $this->bindings); - - $sql = $this->grammar->update($this, $values); - - return $this->connection->query($sql, $bindings); - } - - /** - * Execute the query as a DELETE statement. - * - * Optionally, an ID may be passed to the method do delete a specific row. - * - * @param int $id - * @return int - */ - public function delete($id = null) - { - // If an ID is given to the method, we'll set the where clause to - // match on the value of the ID. This allows the developer to - // quickly delete a row by its primary key value. - if ( ! is_null($id)) - { - $this->where('id', '=', $id); - } - - $sql = $this->grammar->delete($this); - - return $this->connection->query($sql, $this->bindings); - } - - /** - * Magic Method for handling dynamic functions. - * - * This method handles calls to aggregates as well as dynamic where clauses. - */ - public function __call($method, $parameters) - { - if (strpos($method, 'where_') === 0) - { - return $this->dynamic_where($method, $parameters, $this); - } - - // All of the aggregate methods are handled by a single method, so we'll - // catch them all here and then pass them off to the agregate method - // instead of creating methods for each one of them. - if (in_array($method, array('count', 'min', 'max', 'avg', 'sum'))) - { - if (count($parameters) == 0) $parameters[0] = '*'; - - return $this->aggregate(strtoupper($method), (array) $parameters[0]); - } - - throw new \Exception("Method [$method] is not defined on the Query class."); - } - -} diff --git a/laravel/database/query/grammars/grammar.php b/laravel/database/query/grammars/grammar.php deleted file mode 100755 index d5d8a2e7..00000000 --- a/laravel/database/query/grammars/grammar.php +++ /dev/null @@ -1,491 +0,0 @@ -concatenate($this->components($query)); - } - - /** - * Generate the SQL for every component of the query. - * - * @param Query $query - * @return array - */ - final protected function components($query) - { - // Each portion of the statement is compiled by a function corresponding - // to an item in the components array. This lets us to keep the creation - // of the query very granular and very flexible. - foreach ($this->components as $component) - { - if ( ! is_null($query->$component)) - { - $sql[$component] = call_user_func(array($this, $component), $query); - } - } - - return (array) $sql; - } - - /** - * Concatenate an array of SQL segments, removing those that are empty. - * - * @param array $components - * @return string - */ - final protected function concatenate($components) - { - return implode(' ', array_filter($components, function($value) - { - return (string) $value !== ''; - })); - } - - /** - * Compile the SELECT clause for a query. - * - * @param Query $query - * @return string - */ - protected function selects(Query $query) - { - if ( ! is_null($query->aggregate)) return; - - $select = ($query->distinct) ? 'SELECT DISTINCT ' : 'SELECT '; - - return $select.$this->columnize($query->selects); - } - - /** - * Compile an aggregating SELECT clause for a query. - * - * @param Query $query - * @return string - */ - protected function aggregate(Query $query) - { - $column = $this->columnize($query->aggregate['columns']); - - // If the "distinct" flag is set and we're not aggregating everything - // we'll set the distinct clause on the query, since this is used - // to count all of the distinct values in a column, etc. - if ($query->distinct and $column !== '*') - { - $column = 'DISTINCT '.$column; - } - - return 'SELECT '.$query->aggregate['aggregator'].'('.$column.') AS '.$this->wrap('aggregate'); - } - - /** - * Compile the FROM clause for a query. - * - * @param Query $query - * @return string - */ - protected function from(Query $query) - { - return 'FROM '.$this->wrap_table($query->from); - } - - /** - * Compile the JOIN clauses for a query. - * - * @param Query $query - * @return string - */ - protected function joins(Query $query) - { - // We need to iterate through each JOIN clause that is attached to the - // query and translate it into SQL. The table and the columns will be - // wrapped in identifiers to avoid naming collisions. - foreach ($query->joins as $join) - { - $table = $this->wrap_table($join->table); - - $clauses = array(); - - // Each JOIN statement may have multiple clauses, so we will iterate - // through each clause creating the conditions then we'll join all - // of them together at the end to build the clause. - foreach ($join->clauses as $clause) - { - extract($clause); - - $column1 = $this->wrap($column1); - - $column2 = $this->wrap($column2); - - $clauses[] = "{$connector} {$column1} {$operator} {$column2}"; - } - - // The first clause will have a connector on the front, but it is - // not needed on the first condition, so we will strip it off of - // the condition before adding it to the array of joins. - $search = array('AND ', 'OR '); - - $clauses[0] = str_replace($search, '', $clauses[0]); - - $clauses = implode(' ', $clauses); - - $sql[] = "{$join->type} JOIN {$table} ON {$clauses}"; - } - - // Finally, we should have an array of JOIN clauses that we can - // implode together and return as the complete SQL for the - // join clause of the query under construction. - return implode(' ', $sql); - } - - /** - * Compile the WHERE clause for a query. - * - * @param Query $query - * @return string - */ - final protected function wheres(Query $query) - { - if (is_null($query->wheres)) return ''; - - // Each WHERE clause array has a "type" that is assigned by the query - // builder, and each type has its own compiler function. We will call - // the appropriate compiler for each where clause. - foreach ($query->wheres as $where) - { - $sql[] = $where['connector'].' '.$this->{$where['type']}($where); - } - - if (isset($sql)) - { - // We attach the boolean connector to every where segment just - // for convenience. Once we have built the entire clause we'll - // remove the first instance of a connector. - return 'WHERE '.preg_replace('/AND |OR /', '', implode(' ', $sql), 1); - } - } - - /** - * Compile a nested WHERE clause. - * - * @param array $where - * @return string - */ - protected function where_nested($where) - { - return '('.substr($this->wheres($where['query']), 6).')'; - } - - /** - * Compile a simple WHERE clause. - * - * @param array $where - * @return string - */ - protected function where($where) - { - $parameter = $this->parameter($where['value']); - - return $this->wrap($where['column']).' '.$where['operator'].' '.$parameter; - } - - /** - * Compile a WHERE IN clause. - * - * @param array $where - * @return string - */ - protected function where_in($where) - { - $parameters = $this->parameterize($where['values']); - - return $this->wrap($where['column']).' IN ('.$parameters.')'; - } - - /** - * Compile a WHERE NOT IN clause. - * - * @param array $where - * @return string - */ - protected function where_not_in($where) - { - $parameters = $this->parameterize($where['values']); - - return $this->wrap($where['column']).' NOT IN ('.$parameters.')'; - } - - /** - * Compile a WHERE BETWEEN clause - * - * @param array $where - * @return string - */ - protected function where_between($where) - { - $min = $this->parameter($where['min']); - $max = $this->parameter($where['max']); - - return $this->wrap($where['column']).' BETWEEN '.$min.' AND '.$max; - } - - /** - * Compile a WHERE NOT BETWEEN clause - * @param array $where - * @return string - */ - protected function where_not_between($where) - { - $min = $this->parameter($where['min']); - $max = $this->parameter($where['max']); - - return $this->wrap($where['column']).' NOT BETWEEN '.$min.' AND '.$max; - } - - /** - * Compile a WHERE NULL clause. - * - * @param array $where - * @return string - */ - protected function where_null($where) - { - return $this->wrap($where['column']).' IS NULL'; - } - - /** - * Compile a WHERE NULL clause. - * - * @param array $where - * @return string - */ - protected function where_not_null($where) - { - return $this->wrap($where['column']).' IS NOT NULL'; - } - - /** - * Compile a raw WHERE clause. - * - * @param array $where - * @return string - */ - final protected function where_raw($where) - { - return $where['sql']; - } - - /** - * Compile the GROUP BY clause for a query. - * - * @param Query $query - * @return string - */ - protected function groupings(Query $query) - { - return 'GROUP BY '.$this->columnize($query->groupings); - } - - /** - * Compile the HAVING clause for a query. - * - * @param Query $query - * @return string - */ - protected function havings(Query $query) - { - if (is_null($query->havings)) return ''; - - foreach ($query->havings as $having) - { - $sql[] = 'AND '.$this->wrap($having['column']).' '.$having['operator'].' '.$this->parameter($having['value']); - } - - return 'HAVING '.preg_replace('/AND /', '', implode(' ', $sql), 1); - } - - /** - * Compile the ORDER BY clause for a query. - * - * @param Query $query - * @return string - */ - protected function orderings(Query $query) - { - foreach ($query->orderings as $ordering) - { - $sql[] = $this->wrap($ordering['column']).' '.strtoupper($ordering['direction']); - } - - return 'ORDER BY '.implode(', ', $sql); - } - - /** - * Compile the LIMIT clause for a query. - * - * @param Query $query - * @return string - */ - protected function limit(Query $query) - { - return 'LIMIT '.$query->limit; - } - - /** - * Compile the OFFSET clause for a query. - * - * @param Query $query - * @return string - */ - protected function offset(Query $query) - { - return 'OFFSET '.$query->offset; - } - - /** - * Compile a SQL INSERT statement from a Query instance. - * - * This method handles the compilation of single row inserts and batch inserts. - * - * @param Query $query - * @param array $values - * @return string - */ - public function insert(Query $query, $values) - { - $table = $this->wrap_table($query->from); - - // Force every insert to be treated like a batch insert. This simply makes - // creating the SQL syntax a little easier on us since we can always treat - // the values as if it contains multiple inserts. - if ( ! is_array(reset($values))) $values = array($values); - - // Since we only care about the column names, we can pass any of the insert - // arrays into the "columnize" method. The columns should be the same for - // every record inserted into the table. - $columns = $this->columnize(array_keys(reset($values))); - - // Build the list of parameter place-holders of values bound to the query. - // Each insert should have the same number of bound parameters, so we can - // just use the first array of values. - $parameters = $this->parameterize(reset($values)); - - $parameters = implode(', ', array_fill(0, count($values), "($parameters)")); - - return "INSERT INTO {$table} ({$columns}) VALUES {$parameters}"; - } - - /** - * Compile a SQL INSERT and get ID statement from a Query instance. - * - * @param Query $query - * @param array $values - * @param string $column - * @return string - */ - public function insert_get_id(Query $query, $values, $column) - { - return $this->insert($query, $values); - } - - /** - * Compile a SQL UPDATE statement from a Query instance. - * - * @param Query $query - * @param array $values - * @return string - */ - public function update(Query $query, $values) - { - $table = $this->wrap_table($query->from); - - // Each column in the UPDATE statement needs to be wrapped in the keyword - // identifiers, and a place-holder needs to be created for each value in - // the array of bindings, so we'll build the sets first. - foreach ($values as $column => $value) - { - $columns[] = $this->wrap($column).' = '.$this->parameter($value); - } - - $columns = implode(', ', $columns); - - // UPDATE statements may be constrained by a WHERE clause, so we'll run - // the entire where compilation process for those constraints. This is - // easily achieved by passing it to the "wheres" method. - return trim("UPDATE {$table} SET {$columns} ".$this->wheres($query)); - } - - /** - * Compile a SQL DELETE statement from a Query instance. - * - * @param Query $query - * @return string - */ - public function delete(Query $query) - { - $table = $this->wrap_table($query->from); - - return trim("DELETE FROM {$table} ".$this->wheres($query)); - } - - /** - * Transform an SQL short-cuts into real SQL for PDO. - * - * @param string $sql - * @param array $bindings - * @return string - */ - public function shortcut($sql, &$bindings) - { - // Laravel provides an easy short-cut notation for writing raw WHERE IN - // statements. If (...) is in the query, it will be replaced with the - // correct number of parameters based on the query bindings. - if (strpos($sql, '(...)') !== false) - { - for ($i = 0; $i < count($bindings); $i++) - { - // If the binding is an array, we can just assume it's used to fill a - // where in condition, so we'll just replace the next place-holder - // in the query with the constraint and splice the bindings. - if (is_array($bindings[$i])) - { - $parameters = $this->parameterize($bindings[$i]); - - array_splice($bindings, $i, 1, $bindings[$i]); - - $sql = preg_replace('~\(\.\.\.\)~', "({$parameters})", $sql, 1); - } - } - } - - return trim($sql); - } - -} \ No newline at end of file diff --git a/laravel/database/query/grammars/mysql.php b/laravel/database/query/grammars/mysql.php deleted file mode 100644 index 37692e0a..00000000 --- a/laravel/database/query/grammars/mysql.php +++ /dev/null @@ -1,12 +0,0 @@ -insert($query, $values)." RETURNING $column"; - } - -} \ No newline at end of file diff --git a/laravel/database/query/grammars/sqlite.php b/laravel/database/query/grammars/sqlite.php deleted file mode 100644 index 26aabd8f..00000000 --- a/laravel/database/query/grammars/sqlite.php +++ /dev/null @@ -1,70 +0,0 @@ -orderings as $ordering) - { - $sql[] = $this->wrap($ordering['column']).' COLLATE NOCASE '.strtoupper($ordering['direction']); - } - - return 'ORDER BY '.implode(', ', $sql); - } - - /** - * Compile a SQL INSERT statement from a Query instance. - * - * This method handles the compilation of single row inserts and batch inserts. - * - * @param Query $query - * @param array $values - * @return string - */ - public function insert(Query $query, $values) - { - // Essentially we will force every insert to be treated as a batch insert which - // simply makes creating the SQL easier for us since we can utilize the same - // basic routine regardless of an amount of records given to us to insert. - $table = $this->wrap_table($query->from); - - if ( ! is_array(reset($values))) - { - $values = array($values); - } - - // If there is only one record being inserted, we will just use the usual query - // grammar insert builder because no special syntax is needed for the single - // row inserts in SQLite. However, if there are multiples, we'll continue. - if (count($values) == 1) - { - return parent::insert($query, $values[0]); - } - - $names = $this->columnize(array_keys($values[0])); - - $columns = array(); - - // SQLite requires us to build the multi-row insert as a listing of select with - // unions joining them together. So we'll build out this list of columns and - // then join them all together with select unions to complete the queries. - foreach (array_keys($values[0]) as $column) - { - $columns[] = '? AS '.$this->wrap($column); - } - - $columns = array_fill(9, count($values), implode(', ', $columns)); - - return "INSERT INTO $table ($names) SELECT ".implode(' UNION SELECT ', $columns); - } - -} \ No newline at end of file diff --git a/laravel/database/query/grammars/sqlserver.php b/laravel/database/query/grammars/sqlserver.php deleted file mode 100644 index f912f562..00000000 --- a/laravel/database/query/grammars/sqlserver.php +++ /dev/null @@ -1,140 +0,0 @@ -offset > 0) - { - return $this->ansi_offset($query, $sql); - } - - // Once all of the clauses have been compiled, we can join them all as - // one statement. Any segments that are null or an empty string will - // be removed from the array before imploding. - return $this->concatenate($sql); - } - - /** - * Compile the SELECT clause for a query. - * - * @param Query $query - * @return string - */ - protected function selects(Query $query) - { - if ( ! is_null($query->aggregate)) return; - - $select = ($query->distinct) ? 'SELECT DISTINCT ' : 'SELECT '; - - // Instead of using a "LIMIT" keyword, SQL Server uses the TOP keyword - // within the SELECT statement. So, if we have a limit, we will add - // it to the query here if there is not an OFFSET present. - if ($query->limit > 0 and $query->offset <= 0) - { - $select .= 'TOP '.$query->limit.' '; - } - - return $select.$this->columnize($query->selects); - } - - /** - * Generate the ANSI standard SQL for an offset clause. - * - * @param Query $query - * @param array $components - * @return array - */ - protected function ansi_offset(Query $query, $components) - { - // An ORDER BY clause is required to make this offset query work, so if - // one doesn't exist, we'll just create a dummy clause to trick the - // database and pacify it so it doesn't complain about the query. - if ( ! isset($components['orderings'])) - { - $components['orderings'] = 'ORDER BY (SELECT 0)'; - } - - // We need to add the row number to the query so we can compare it to - // the offset and limit values given for the statement. So we'll add - // an expression to the select for the row number. - $orderings = $components['orderings']; - - $components['selects'] .= ", ROW_NUMBER() OVER ({$orderings}) AS RowNum"; - - unset($components['orderings']); - - $start = $query->offset + 1; - - // Next we need to calculate the constraint that should be placed on - // the row number to get the correct offset and limit on the query. - // If there is not a limit, we'll just handle the offset. - if ($query->limit > 0) - { - $finish = $query->offset + $query->limit; - - $constraint = "BETWEEN {$start} AND {$finish}"; - } - else - { - $constraint = ">= {$start}"; - } - - // We're finally ready to build the final SQL query so we'll create - // a common table expression with the query and select all of the - // results with row numbers between the limit and offset. - $sql = $this->concatenate($components); - - return "SELECT * FROM ($sql) AS TempTable WHERE RowNum {$constraint}"; - } - - /** - * Compile the LIMIT clause for a query. - * - * @param Query $query - * @return string - */ - protected function limit(Query $query) - { - return ''; - } - - /** - * Compile the OFFSET clause for a query. - * - * @param Query $query - * @return string - */ - protected function offset(Query $query) - { - return ''; - } - -} \ No newline at end of file diff --git a/laravel/database/query/join.php b/laravel/database/query/join.php deleted file mode 100644 index ff3c0141..00000000 --- a/laravel/database/query/join.php +++ /dev/null @@ -1,68 +0,0 @@ -type = $type; - $this->table = $table; - } - - /** - * Add an ON clause to the join. - * - * @param string $column1 - * @param string $operator - * @param string $column2 - * @param string $connector - * @return Join - */ - public function on($column1, $operator, $column2, $connector = 'AND') - { - $this->clauses[] = compact('column1', 'operator', 'column2', 'connector'); - - return $this; - } - - /** - * Add an OR ON clause to the join. - * - * @param string $column1 - * @param string $operator - * @param string $column2 - * @return Join - */ - public function or_on($column1, $operator, $column2) - { - return $this->on($column1, $operator, $column2, 'OR'); - } - -} \ No newline at end of file diff --git a/laravel/database/schema.php b/laravel/database/schema.php deleted file mode 100644 index c37fcd63..00000000 --- a/laravel/database/schema.php +++ /dev/null @@ -1,194 +0,0 @@ -create(); - - call_user_func($callback, $table); - - return static::execute($table); - } - - /** - * Rename a database table in the schema. - * - * @param string $table - * @param string $new_name - * @return void - */ - public static function rename($table, $new_name) - { - $table = new Schema\Table($table); - - // To indicate that the table needs to be renamed, we will run the - // "rename" command on the table instance and pass the instance to - // the execute method as calling a Closure isn't needed. - $table->rename($new_name); - - return static::execute($table); - } - - /** - * Drop a database table from the schema. - * - * @param string $table - * @param string $connection - * @return void - */ - public static function drop($table, $connection = null) - { - $table = new Schema\Table($table); - - $table->on($connection); - - // To indicate that the table needs to be dropped, we will run the - // "drop" command on the table instance and pass the instance to - // the execute method as calling a Closure isn't needed. - $table->drop(); - - return static::execute($table); - } - - /** - * Execute the given schema operation against the database. - * - * @param Schema\Table $table - * @return void - */ - public static function execute($table) - { - // The implications method is responsible for finding any fluently - // defined indexes on the schema table and adding the explicit - // commands that are needed for the schema instance. - static::implications($table); - - foreach ($table->commands as $command) - { - $connection = DB::connection($table->connection); - - $grammar = static::grammar($connection); - - // Each grammar has a function that corresponds to the command type and - // is for building that command's SQL. This lets the SQL syntax builds - // stay granular across various database systems. - if (method_exists($grammar, $method = $command->type)) - { - $statements = $grammar->$method($table, $command); - - // Once we have the statements, we will cast them to an array even - // though not all of the commands return an array just in case it - // needs multiple queries to complete. - foreach ((array) $statements as $statement) - { - $connection->query($statement); - } - } - } - } - - /** - * Add any implicit commands to the schema table operation. - * - * @param Schema\Table $table - * @return void - */ - protected static function implications($table) - { - // If the developer has specified columns for the table and the table is - // not being created, we'll assume they simply want to add the columns - // to the table and generate the add command. - if (count($table->columns) > 0 and ! $table->creating()) - { - $command = new Fluent(array('type' => 'add')); - - array_unshift($table->commands, $command); - } - - // For some extra syntax sugar, we'll check for any implicit indexes - // on the table since the developer may specify the index type on - // the fluent column declaration for convenience. - foreach ($table->columns as $column) - { - foreach (array('primary', 'unique', 'fulltext', 'index') as $key) - { - if (isset($column->$key)) - { - if ($column->$key === true) - { - $table->$key($column->name); - } - else - { - $table->$key($column->name, $column->$key); - } - } - } - } - } - - /** - * Create the appropriate schema grammar for the driver. - * - * @param Connection $connection - * @return Grammar - */ - public static function grammar(Connection $connection) - { - $driver = $connection->driver(); - - if (isset(\Laravel\Database::$registrar[$driver])) - { - return \Laravel\Database::$registrar[$driver]['schema'](); - } - - switch ($driver) - { - case 'mysql': - return new Schema\Grammars\MySQL($connection); - - case 'pgsql': - return new Schema\Grammars\Postgres($connection); - - case 'sqlsrv': - return new Schema\Grammars\SQLServer($connection); - - case 'sqlite': - return new Schema\Grammars\SQLite($connection); - } - - throw new \Exception("Schema operations not supported for [$driver]."); - } - -} diff --git a/laravel/database/schema/grammars/grammar.php b/laravel/database/schema/grammars/grammar.php deleted file mode 100644 index c33d8dd7..00000000 --- a/laravel/database/schema/grammars/grammar.php +++ /dev/null @@ -1,126 +0,0 @@ -name; - - // We need to wrap both of the table names in quoted identifiers to protect - // against any possible keyword collisions, both the table on which the - // command is being executed and the referenced table are wrapped. - $table = $this->wrap($table); - - $on = $this->wrap_table($command->on); - - // Next we need to columnize both the command table's columns as well as - // the columns referenced by the foreign key. We'll cast the referenced - // columns to an array since they aren't by the fluent command. - $foreign = $this->columnize($command->columns); - - $referenced = $this->columnize((array) $command->references); - - $sql = "ALTER TABLE $table ADD CONSTRAINT $name "; - - $sql .= "FOREIGN KEY ($foreign) REFERENCES $on ($referenced)"; - - // Finally we will check for any "on delete" or "on update" options for - // the foreign key. These control the behavior of the constraint when - // an update or delete statement is run against the record. - if ( ! is_null($command->on_delete)) - { - $sql .= " ON DELETE {$command->on_delete}"; - } - - if ( ! is_null($command->on_update)) - { - $sql .= " ON UPDATE {$command->on_update}"; - } - - return $sql; - } - - /** - * Generate the SQL statement for a drop table command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop(Table $table, Fluent $command) - { - return 'DROP TABLE '.$this->wrap($table); - } - - /** - * Drop a constraint from the table. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - protected function drop_constraint(Table $table, Fluent $command) - { - return "ALTER TABLE ".$this->wrap($table)." DROP CONSTRAINT ".$command->name; - } - - /** - * Wrap a value in keyword identifiers. - * - * @param Table|string $value - * @return string - */ - public function wrap($value) - { - // This method is primarily for convenience so we can just pass a - // column or table instance into the wrap method without sending - // in the name each time we need to wrap one of these objects. - if ($value instanceof Table) - { - return $this->wrap_table($value->name); - } - elseif ($value instanceof Fluent) - { - $value = $value->name; - } - - return parent::wrap($value); - } - - /** - * Get the appropriate data type definition for the column. - * - * @param Fluent $column - * @return string - */ - protected function type(Fluent $column) - { - return $this->{'type_'.$column->type}($column); - } - - /** - * Format a value so that it can be used in SQL DEFAULT clauses. - * @param mixed $value - * @return string - */ - protected function default_value($value) - { - if (is_bool($value)) - { - return intval($value); - } - - return strval($value); - } - -} \ No newline at end of file diff --git a/laravel/database/schema/grammars/mysql.php b/laravel/database/schema/grammars/mysql.php deleted file mode 100644 index 93b22a4e..00000000 --- a/laravel/database/schema/grammars/mysql.php +++ /dev/null @@ -1,421 +0,0 @@ -columns($table)); - - // First we will generate the base table creation statement. Other than auto - // incrementing keys, no indexes will be created during the first creation - // of the table as they're added in separate commands. - $sql = 'CREATE TABLE '.$this->wrap($table).' ('.$columns.')'; - - if ( ! is_null($table->engine)) - { - $sql .= ' ENGINE = '.$table->engine; - } - - return $sql; - } - - /** - * Generate the SQL statements for a table modification command. - * - * @param Table $table - * @param Fluent $command - * @return array - */ - public function add(Table $table, Fluent $command) - { - $columns = $this->columns($table); - - // Once we have the array of column definitions, we need to add "add" to the - // front of each definition, then we'll concatenate the definitions - // using commas like normal and generate the SQL. - $columns = implode(', ', array_map(function($column) - { - return 'ADD '.$column; - - }, $columns)); - - return 'ALTER TABLE '.$this->wrap($table).' '.$columns; - } - - /** - * Create the individual column definitions for the table. - * - * @param Table $table - * @return array - */ - protected function columns(Table $table) - { - $columns = array(); - - foreach ($table->columns as $column) - { - // Each of the data type's have their own definition creation method, - // which is responsible for creating the SQL for the type. This lets - // us to keep the syntax easy and fluent, while translating the - // types to the correct types. - $sql = $this->wrap($column).' '.$this->type($column); - - $elements = array('unsigned', 'nullable', 'defaults', 'incrementer'); - - foreach ($elements as $element) - { - $sql .= $this->$element($table, $column); - } - - $columns[] = $sql; - } - - return $columns; - } - - /** - * Get the SQL syntax for indicating if a column is unsigned. - * - * @param Table $table - * @param Fluent $column - * @return string - */ - protected function unsigned(Table $table, Fluent $column) - { - if ($column->type == 'integer' && ($column->unsigned || $column->increment)) - { - return ' UNSIGNED'; - } - } - - /** - * Get the SQL syntax for indicating if a column is nullable. - * - * @param Table $table - * @param Fluent $column - * @return string - */ - protected function nullable(Table $table, Fluent $column) - { - return ($column->nullable) ? ' NULL' : ' NOT NULL'; - } - - /** - * Get the SQL syntax for specifying a default value on a column. - * - * @param Table $table - * @param Fluent $column - * @return string - */ - protected function defaults(Table $table, Fluent $column) - { - if ( ! is_null($column->default)) - { - return " DEFAULT '".$this->default_value($column->default)."'"; - } - } - - /** - * Get the SQL syntax for defining an auto-incrementing column. - * - * @param Table $table - * @param Fluent $column - * @return string - */ - protected function incrementer(Table $table, Fluent $column) - { - if ($column->type == 'integer' and $column->increment) - { - return ' AUTO_INCREMENT PRIMARY KEY'; - } - } - - /** - * Generate the SQL statement for creating a primary key. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function primary(Table $table, Fluent $command) - { - return $this->key($table, $command->name(null), 'PRIMARY KEY'); - } - - /** - * Generate the SQL statement for creating a unique index. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function unique(Table $table, Fluent $command) - { - return $this->key($table, $command, 'UNIQUE'); - } - - /** - * Generate the SQL statement for creating a full-text index. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function fulltext(Table $table, Fluent $command) - { - return $this->key($table, $command, 'FULLTEXT'); - } - - /** - * Generate the SQL statement for creating a regular index. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function index(Table $table, Fluent $command) - { - return $this->key($table, $command, 'INDEX'); - } - - /** - * Generate the SQL statement for creating a new index. - * - * @param Table $table - * @param Fluent $command - * @param string $type - * @return string - */ - protected function key(Table $table, Fluent $command, $type) - { - $keys = $this->columnize($command->columns); - - $name = $command->name; - - return 'ALTER TABLE '.$this->wrap($table)." ADD {$type} {$name}({$keys})"; - } - - /** - * Generate the SQL statement for a rename table command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function rename(Table $table, Fluent $command) - { - return 'RENAME TABLE '.$this->wrap($table).' TO '.$this->wrap($command->name); - } - - /** - * Generate the SQL statement for a drop column command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_column(Table $table, Fluent $command) - { - $columns = array_map(array($this, 'wrap'), $command->columns); - - // Once we the array of column names, we need to add "drop" to the front - // of each column, then we'll concatenate the columns using commas and - // generate the alter statement SQL. - $columns = implode(', ', array_map(function($column) - { - return 'DROP '.$column; - - }, $columns)); - - return 'ALTER TABLE '.$this->wrap($table).' '.$columns; - } - - /** - * Generate the SQL statement for a drop primary key command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_primary(Table $table, Fluent $command) - { - return 'ALTER TABLE '.$this->wrap($table).' DROP PRIMARY KEY'; - } - - /** - * Generate the SQL statement for a drop unique key command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_unique(Table $table, Fluent $command) - { - return $this->drop_key($table, $command); - } - - /** - * Generate the SQL statement for a drop full-text key command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_fulltext(Table $table, Fluent $command) - { - return $this->drop_key($table, $command); - } - - /** - * Generate the SQL statement for a drop unique key command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_index(Table $table, Fluent $command) - { - return $this->drop_key($table, $command); - } - - /** - * Generate the SQL statement for a drop key command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - protected function drop_key(Table $table, Fluent $command) - { - return 'ALTER TABLE '.$this->wrap($table)." DROP INDEX {$command->name}"; - } - - /** - * Drop a foreign key constraint from the table. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_foreign(Table $table, Fluent $command) - { - return "ALTER TABLE ".$this->wrap($table)." DROP FOREIGN KEY ".$command->name; - } - - /** - * Generate the data-type definition for a string. - * - * @param Fluent $column - * @return string - */ - protected function type_string(Fluent $column) - { - return 'VARCHAR('.$column->length.')'; - } - - /** - * Generate the data-type definition for an integer. - * - * @param Fluent $column - * @return string - */ - protected function type_integer(Fluent $column) - { - return 'INT'; - } - - /** - * Generate the data-type definition for an integer. - * - * @param Fluent $column - * @return string - */ - protected function type_float(Fluent $column) - { - return 'FLOAT'; - } - - /** - * Generate the data-type definition for a decimal. - * - * @param Fluent $column - * @return string - */ - protected function type_decimal(Fluent $column) - { - return "DECIMAL({$column->precision}, {$column->scale})"; - } - - /** - * Generate the data-type definition for a boolean. - * - * @param Fluent $column - * @return string - */ - protected function type_boolean(Fluent $column) - { - return 'TINYINT(1)'; - } - - /** - * Generate the data-type definition for a date. - * - * @param Fluent $column - * @return string - */ - protected function type_date(Fluent $column) - { - return 'DATETIME'; - } - - /** - * Generate the data-type definition for a timestamp. - * - * @param Fluent $column - * @return string - */ - protected function type_timestamp(Fluent $column) - { - return 'TIMESTAMP'; - } - - /** - * Generate the data-type definition for a text column. - * - * @param Fluent $column - * @return string - */ - protected function type_text(Fluent $column) - { - return 'TEXT'; - } - - /** - * Generate the data-type definition for a blob. - * - * @param Fluent $column - * @return string - */ - protected function type_blob(Fluent $column) - { - return 'BLOB'; - } - -} diff --git a/laravel/database/schema/grammars/postgres.php b/laravel/database/schema/grammars/postgres.php deleted file mode 100644 index 1382acc5..00000000 --- a/laravel/database/schema/grammars/postgres.php +++ /dev/null @@ -1,407 +0,0 @@ -columns($table)); - - // First we will generate the base table creation statement. Other than auto - // incrementing keys, no indexes will be created during the first creation - // of the table as they're added in separate commands. - $sql = 'CREATE TABLE '.$this->wrap($table).' ('.$columns.')'; - - return $sql; - } - - /** - * Generate the SQL statements for a table modification command. - * - * @param Table $table - * @param Fluent $command - * @return array - */ - public function add(Table $table, Fluent $command) - { - $columns = $this->columns($table); - - // Once we have the array of column definitions, we need to add "add" to the - // front of each definition, then we'll concatenate the definitions - // using commas like normal and generate the SQL. - $columns = implode(', ', array_map(function($column) - { - return 'ADD COLUMN '.$column; - - }, $columns)); - - return 'ALTER TABLE '.$this->wrap($table).' '.$columns; - } - - /** - * Create the individual column definitions for the table. - * - * @param Table $table - * @return array - */ - protected function columns(Table $table) - { - $columns = array(); - - foreach ($table->columns as $column) - { - // Each of the data type's have their own definition creation method, - // which is responsible for creating the SQL for the type. This lets - // us to keep the syntax easy and fluent, while translating the - // types to the types used by the database. - $sql = $this->wrap($column).' '.$this->type($column); - - $elements = array('incrementer', 'nullable', 'defaults'); - - foreach ($elements as $element) - { - $sql .= $this->$element($table, $column); - } - - $columns[] = $sql; - } - - return $columns; - } - - /** - * Get the SQL syntax for indicating if a column is nullable. - * - * @param Table $table - * @param Fluent $column - * @return string - */ - protected function nullable(Table $table, Fluent $column) - { - return ($column->nullable) ? ' NULL' : ' NOT NULL'; - } - - /** - * Get the SQL syntax for specifying a default value on a column. - * - * @param Table $table - * @param Fluent $column - * @return string - */ - protected function defaults(Table $table, Fluent $column) - { - if ( ! is_null($column->default)) - { - return " DEFAULT '".$this->default_value($column->default)."'"; - } - } - - /** - * Get the SQL syntax for defining an auto-incrementing column. - * - * @param Table $table - * @param Fluent $column - * @return string - */ - protected function incrementer(Table $table, Fluent $column) - { - // We don't actually need to specify an "auto_increment" keyword since we - // handle the auto-increment definition in the type definition for - // integers by changing the type to "serial". - if ($column->type == 'integer' and $column->increment) - { - return ' PRIMARY KEY'; - } - } - - /** - * Generate the SQL statement for creating a primary key. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function primary(Table $table, Fluent $command) - { - $columns = $this->columnize($command->columns); - - return 'ALTER TABLE '.$this->wrap($table)." ADD PRIMARY KEY ({$columns})"; - } - - /** - * Generate the SQL statement for creating a unique index. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function unique(Table $table, Fluent $command) - { - $table = $this->wrap($table); - - $columns = $this->columnize($command->columns); - - return "ALTER TABLE $table ADD CONSTRAINT ".$command->name." UNIQUE ($columns)"; - } - - /** - * Generate the SQL statement for creating a full-text index. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function fulltext(Table $table, Fluent $command) - { - $name = $command->name; - - $columns = $this->columnize($command->columns); - - return "CREATE INDEX {$name} ON ".$this->wrap($table)." USING gin({$columns})"; - } - - /** - * Generate the SQL statement for creating a regular index. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function index(Table $table, Fluent $command) - { - return $this->key($table, $command); - } - - /** - * Generate the SQL statement for creating a new index. - * - * @param Table $table - * @param Fluent $command - * @param bool $unique - * @return string - */ - protected function key(Table $table, Fluent $command, $unique = false) - { - $columns = $this->columnize($command->columns); - - $create = ($unique) ? 'CREATE UNIQUE' : 'CREATE'; - - return $create." INDEX {$command->name} ON ".$this->wrap($table)." ({$columns})"; - } - - /** - * Generate the SQL statement for a rename table command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function rename(Table $table, Fluent $command) - { - return 'ALTER TABLE '.$this->wrap($table).' RENAME TO '.$this->wrap($command->name); - } - - /** - * Generate the SQL statement for a drop column command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_column(Table $table, Fluent $command) - { - $columns = array_map(array($this, 'wrap'), $command->columns); - - // Once we the array of column names, we need to add "drop" to the front - // of each column, then we'll concatenate the columns using commas and - // generate the alter statement SQL. - $columns = implode(', ', array_map(function($column) - { - return 'DROP COLUMN '.$column; - - }, $columns)); - - return 'ALTER TABLE '.$this->wrap($table).' '.$columns; - } - - /** - * Generate the SQL statement for a drop primary key command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_primary(Table $table, Fluent $command) - { - return 'ALTER TABLE '.$this->wrap($table).' DROP CONSTRAINT '.$table->name.'_pkey'; - } - - /** - * Generate the SQL statement for a drop unique key command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_unique(Table $table, Fluent $command) - { - return $this->drop_constraint($table, $command); - } - - /** - * Generate the SQL statement for a drop full-text key command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_fulltext(Table $table, Fluent $command) - { - return $this->drop_key($table, $command); - } - - /** - * Generate the SQL statement for a drop index command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_index(Table $table, Fluent $command) - { - return $this->drop_key($table, $command); - } - - /** - * Generate the SQL statement for a drop key command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - protected function drop_key(Table $table, Fluent $command) - { - return 'DROP INDEX '.$command->name; - } - - /** - * Drop a foreign key constraint from the table. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_foreign(Table $table, Fluent $command) - { - return $this->drop_constraint($table, $command); - } - - /** - * Generate the data-type definition for a string. - * - * @param Fluent $column - * @return string - */ - protected function type_string(Fluent $column) - { - return 'VARCHAR('.$column->length.')'; - } - - /** - * Generate the data-type definition for an integer. - * - * @param Fluent $column - * @return string - */ - protected function type_integer(Fluent $column) - { - return ($column->increment) ? 'SERIAL' : 'BIGINT'; - } - - /** - * Generate the data-type definition for an integer. - * - * @param Fluent $column - * @return string - */ - protected function type_float(Fluent $column) - { - return 'REAL'; - } - - /** - * Generate the data-type definition for a decimal. - * - * @param Fluent $column - * @return string - */ - protected function type_decimal(Fluent $column) - { - return "DECIMAL({$column->precision}, {$column->scale})"; - } - - /** - * Generate the data-type definition for a boolean. - * - * @param Fluent $column - * @return string - */ - protected function type_boolean(Fluent $column) - { - return 'SMALLINT'; - } - - /** - * Generate the data-type definition for a date. - * - * @param Fluent $column - * @return string - */ - protected function type_date(Fluent $column) - { - return 'TIMESTAMP(0) WITHOUT TIME ZONE'; - } - - /** - * Generate the data-type definition for a timestamp. - * - * @param Fluent $column - * @return string - */ - protected function type_timestamp(Fluent $column) - { - return 'TIMESTAMP'; - } - - /** - * Generate the data-type definition for a text column. - * - * @param Fluent $column - * @return string - */ - protected function type_text(Fluent $column) - { - return 'TEXT'; - } - - /** - * Generate the data-type definition for a blob. - * - * @param Fluent $column - * @return string - */ - protected function type_blob(Fluent $column) - { - return 'BYTEA'; - } - -} \ No newline at end of file diff --git a/laravel/database/schema/grammars/sqlite.php b/laravel/database/schema/grammars/sqlite.php deleted file mode 100644 index 975c4137..00000000 --- a/laravel/database/schema/grammars/sqlite.php +++ /dev/null @@ -1,351 +0,0 @@ -columns($table)); - - // First we will generate the base table creation statement. Other than incrementing - // keys, no indexes will be created during the first creation of the table since - // they will be added in separate commands. - $sql = 'CREATE TABLE '.$this->wrap($table).' ('.$columns; - - // SQLite does not allow adding a primary key as a command apart from the creation - // of the table, so we'll need to sniff out any primary keys here and add them to - // the table now during this command. - $primary = array_first($table->commands, function($key, $value) - { - return $value->type == 'primary'; - }); - - // If we found primary keys in the array of commands, we'll create the SQL for - // the key addition and append it to the SQL table creation statement for - // the schema table so the index is properly generated. - if ( ! is_null($primary)) - { - $columns = $this->columnize($primary->columns); - - $sql .= ", PRIMARY KEY ({$columns})"; - } - - return $sql .= ')'; - } - - /** - * Generate the SQL statements for a table modification command. - * - * @param Table $table - * @param Fluent $command - * @return array - */ - public function add(Table $table, Fluent $command) - { - $columns = $this->columns($table); - - // Once we have the array of column definitions, we need to add "add" to the - // front of each definition, then we'll concatenate the definitions - // using commas like normal and generate the SQL. - $columns = array_map(function($column) - { - return 'ADD COLUMN '.$column; - - }, $columns); - - // SQLite only allows one column to be added in an ALTER statement, - // so we will create an array of statements and return them all to - // the schema manager for separate execution. - foreach ($columns as $column) - { - $sql[] = 'ALTER TABLE '.$this->wrap($table).' '.$column; - } - - return (array) $sql; - } - - /** - * Create the individual column definitions for the table. - * - * @param Table $table - * @return array - */ - protected function columns(Table $table) - { - $columns = array(); - - foreach ($table->columns as $column) - { - // Each of the data type's have their own definition creation method - // which is responsible for creating the SQL for the type. This lets - // us keep the syntax easy and fluent, while translating the - // types to the types used by the database. - $sql = $this->wrap($column).' '.$this->type($column); - - $elements = array('nullable', 'defaults', 'incrementer'); - - foreach ($elements as $element) - { - $sql .= $this->$element($table, $column); - } - - $columns[] = $sql; - } - - return $columns; - } - - /** - * Get the SQL syntax for indicating if a column is nullable. - * - * @param Table $table - * @param Fluent $column - * @return string - */ - protected function nullable(Table $table, Fluent $column) - { - return ' NULL'; - } - - /** - * Get the SQL syntax for specifying a default value on a column. - * - * @param Table $table - * @param Fluent $column - * @return string - */ - protected function defaults(Table $table, Fluent $column) - { - if ( ! is_null($column->default)) - { - return ' DEFAULT '.$this->wrap($this->default_value($column->default)); - } - } - - /** - * Get the SQL syntax for defining an auto-incrementing column. - * - * @param Table $table - * @param Fluent $column - * @return string - */ - protected function incrementer(Table $table, Fluent $column) - { - if ($column->type == 'integer' and $column->increment) - { - return ' PRIMARY KEY AUTOINCREMENT'; - } - } - - /** - * Generate the SQL statement for creating a unique index. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function unique(Table $table, Fluent $command) - { - return $this->key($table, $command, true); - } - - /** - * Generate the SQL statement for creating a full-text index. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function fulltext(Table $table, Fluent $command) - { - $columns = $this->columnize($command->columns); - - return 'CREATE VIRTUAL TABLE '.$this->wrap($table)." USING fts4({$columns})"; - } - - /** - * Generate the SQL statement for creating a regular index. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function index(Table $table, Fluent $command) - { - return $this->key($table, $command); - } - - /** - * Generate the SQL statement for creating a new index. - * - * @param Table $table - * @param Fluent $command - * @param bool $unique - * @return string - */ - protected function key(Table $table, Fluent $command, $unique = false) - { - $columns = $this->columnize($command->columns); - - $create = ($unique) ? 'CREATE UNIQUE' : 'CREATE'; - - return $create." INDEX {$command->name} ON ".$this->wrap($table)." ({$columns})"; - } - - /** - * Generate the SQL statement for a rename table command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function rename(Table $table, Fluent $command) - { - return 'ALTER TABLE '.$this->wrap($table).' RENAME TO '.$this->wrap($command->name); - } - - /** - * Generate the SQL statement for a drop unique key command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_unique(Table $table, Fluent $command) - { - return $this->drop_key($table, $command); - } - - /** - * Generate the SQL statement for a drop unique key command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_index(Table $table, Fluent $command) - { - return $this->drop_key($table, $command); - } - - /** - * Generate the SQL statement for a drop key command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - protected function drop_key(Table $table, Fluent $command) - { - return 'DROP INDEX '.$this->wrap($command->name); - } - - /** - * Generate the data-type definition for a string. - * - * @param Fluent $column - * @return string - */ - protected function type_string(Fluent $column) - { - return 'VARCHAR'; - } - - /** - * Generate the data-type definition for an integer. - * - * @param Fluent $column - * @return string - */ - protected function type_integer(Fluent $column) - { - return 'INTEGER'; - } - - /** - * Generate the data-type definition for an integer. - * - * @param Fluent $column - * @return string - */ - protected function type_float(Fluent $column) - { - return 'FLOAT'; - } - - /** - * Generate the data-type definition for a decimal. - * - * @param Fluent $column - * @return string - */ - protected function type_decimal(Fluent $column) - { - return 'FLOAT'; - } - - /** - * Generate the data-type definition for a boolean. - * - * @param Fluent $column - * @return string - */ - protected function type_boolean(Fluent $column) - { - return 'INTEGER'; - } - - /** - * Generate the data-type definition for a date. - * - * @param Fluent $column - * @return string - */ - protected function type_date(Fluent $column) - { - return 'DATETIME'; - } - - /** - * Generate the data-type definition for a timestamp. - * - * @param Fluent $column - * @return string - */ - protected function type_timestamp(Fluent $column) - { - return 'DATETIME'; - } - - /** - * Generate the data-type definition for a text column. - * - * @param Fluent $column - * @return string - */ - protected function type_text(Fluent $column) - { - return 'TEXT'; - } - - /** - * Generate the data-type definition for a blob. - * - * @param Fluent $column - * @return string - */ - protected function type_blob(Fluent $column) - { - return 'BLOB'; - } - -} \ No newline at end of file diff --git a/laravel/database/schema/grammars/sqlserver.php b/laravel/database/schema/grammars/sqlserver.php deleted file mode 100644 index a9164fd6..00000000 --- a/laravel/database/schema/grammars/sqlserver.php +++ /dev/null @@ -1,425 +0,0 @@ -columns($table)); - - // First we will generate the base table creation statement. Other than auto - // incrementing keys, no indexes will be created during the first creation - // of the table as they're added in separate commands. - $sql = 'CREATE TABLE '.$this->wrap($table).' ('.$columns.')'; - - return $sql; - } - - /** - * Generate the SQL statements for a table modification command. - * - * @param Table $table - * @param Fluent $command - * @return array - */ - public function add(Table $table, Fluent $command) - { - $columns = $this->columns($table); - - // Once we have the array of column definitions, we need to add "add" to the - // front of each definition, then we'll concatenate the definitions - // using commas like normal and generate the SQL. - $columns = implode(', ', array_map(function($column) - { - return 'ADD '.$column; - - }, $columns)); - - return 'ALTER TABLE '.$this->wrap($table).' '.$columns; - } - - /** - * Create the individual column definitions for the table. - * - * @param Table $table - * @return array - */ - protected function columns(Table $table) - { - $columns = array(); - - foreach ($table->columns as $column) - { - // Each of the data type's have their own definition creation method, - // which is responsible for creating the SQL for the type. This lets - // us to keep the syntax easy and fluent, while translating the - // types to the types used by the database. - $sql = $this->wrap($column).' '.$this->type($column); - - $elements = array('incrementer', 'nullable', 'defaults'); - - foreach ($elements as $element) - { - $sql .= $this->$element($table, $column); - } - - $columns[] = $sql; - } - - return $columns; - } - - /** - * Get the SQL syntax for indicating if a column is nullable. - * - * @param Table $table - * @param Fluent $column - * @return string - */ - protected function nullable(Table $table, Fluent $column) - { - return ($column->nullable) ? ' NULL' : ' NOT NULL'; - } - - /** - * Get the SQL syntax for specifying a default value on a column. - * - * @param Table $table - * @param Fluent $column - * @return string - */ - protected function defaults(Table $table, Fluent $column) - { - if ( ! is_null($column->default)) - { - return " DEFAULT '".$this->default_value($column->default)."'"; - } - } - - /** - * Get the SQL syntax for defining an auto-incrementing column. - * - * @param Table $table - * @param Fluent $column - * @return string - */ - protected function incrementer(Table $table, Fluent $column) - { - if ($column->type == 'integer' and $column->increment) - { - return ' IDENTITY PRIMARY KEY'; - } - } - - /** - * Generate the SQL statement for creating a primary key. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function primary(Table $table, Fluent $command) - { - $name = $command->name; - - $columns = $this->columnize($command->columns); - - return 'ALTER TABLE '.$this->wrap($table)." ADD CONSTRAINT {$name} PRIMARY KEY ({$columns})"; - } - - /** - * Generate the SQL statement for creating a unique index. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function unique(Table $table, Fluent $command) - { - return $this->key($table, $command, true); - } - - /** - * Generate the SQL statement for creating a full-text index. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function fulltext(Table $table, Fluent $command) - { - $columns = $this->columnize($command->columns); - - $table = $this->wrap($table); - - // SQL Server requires the creation of a full-text "catalog" before creating - // a full-text index, so we'll first create the catalog then add another - // separate statement for the index. - $sql[] = "CREATE FULLTEXT CATALOG {$command->catalog}"; - - $create = "CREATE FULLTEXT INDEX ON ".$table." ({$columns}) "; - - // Full-text indexes must specify a unique, non-null column as the index - // "key" and this should have been created manually by the developer in - // a separate column addition command. - $sql[] = $create .= "KEY INDEX {$command->key} ON {$command->catalog}"; - - return $sql; - } - - /** - * Generate the SQL statement for creating a regular index. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function index(Table $table, Fluent $command) - { - return $this->key($table, $command); - } - - /** - * Generate the SQL statement for creating a new index. - * - * @param Table $table - * @param Fluent $command - * @param bool $unique - * @return string - */ - protected function key(Table $table, Fluent $command, $unique = false) - { - $columns = $this->columnize($command->columns); - - $create = ($unique) ? 'CREATE UNIQUE' : 'CREATE'; - - return $create." INDEX {$command->name} ON ".$this->wrap($table)." ({$columns})"; - } - - /** - * Generate the SQL statement for a rename table command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function rename(Table $table, Fluent $command) - { - return 'ALTER TABLE '.$this->wrap($table).' RENAME TO '.$this->wrap($command->name); - } - - /** - * Generate the SQL statement for a drop column command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_column(Table $table, Fluent $command) - { - $columns = array_map(array($this, 'wrap'), $command->columns); - - // Once we have the array of column names, we need to add "drop" to the front - // of each column, then we'll concatenate the columns using commas and - // generate the alter statement SQL. - $columns = implode(', ', array_map(function($column) - { - return 'DROP '.$column; - - }, $columns)); - - return 'ALTER TABLE '.$this->wrap($table).' '.$columns; - } - - /** - * Generate the SQL statement for a drop primary key command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_primary(Table $table, Fluent $command) - { - return 'ALTER TABLE '.$this->wrap($table).' DROP CONSTRAINT '.$command->name; - } - - /** - * Generate the SQL statement for a drop unique key command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_unique(Table $table, Fluent $command) - { - return $this->drop_key($table, $command); - } - - /** - * Generate the SQL statement for a drop full-text key command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_fulltext(Table $table, Fluent $command) - { - $sql[] = "DROP FULLTEXT INDEX ".$command->name; - - $sql[] = "DROP FULLTEXT CATALOG ".$command->catalog; - - return $sql; - } - - /** - * Generate the SQL statement for a drop index command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_index(Table $table, Fluent $command) - { - return $this->drop_key($table, $command); - } - - /** - * Generate the SQL statement for a drop key command. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - protected function drop_key(Table $table, Fluent $command) - { - return "DROP INDEX {$command->name} ON ".$this->wrap($table); - } - - /** - * Drop a foreign key constraint from the table. - * - * @param Table $table - * @param Fluent $command - * @return string - */ - public function drop_foreign(Table $table, Fluent $command) - { - return $this->drop_constraint($table, $command); - } - - /** - * Generate the data-type definition for a string. - * - * @param Fluent $column - * @return string - */ - protected function type_string(Fluent $column) - { - return 'NVARCHAR('.$column->length.')'; - } - - /** - * Generate the data-type definition for an integer. - * - * @param Fluent $column - * @return string - */ - protected function type_integer(Fluent $column) - { - return 'INT'; - } - - /** - * Generate the data-type definition for an integer. - * - * @param Fluent $column - * @return string - */ - protected function type_float(Fluent $column) - { - return 'FLOAT'; - } - - /** - * Generate the data-type definition for a decimal. - * - * @param Fluent $column - * @return string - */ - protected function type_decimal(Fluent $column) - { - return "DECIMAL({$column->precision}, {$column->scale})"; - } - - /** - * Generate the data-type definition for a boolean. - * - * @param Fluent $column - * @return string - */ - protected function type_boolean(Fluent $column) - { - return 'TINYINT'; - } - - /** - * Generate the data-type definition for a date. - * - * @param Fluent $column - * @return string - */ - protected function type_date(Fluent $column) - { - return 'DATETIME'; - } - - /** - * Generate the data-type definition for a timestamp. - * - * @param Fluent $column - * @return string - */ - protected function type_timestamp(Fluent $column) - { - return 'TIMESTAMP'; - } - - /** - * Generate the data-type definition for a text column. - * - * @param Fluent $column - * @return string - */ - protected function type_text(Fluent $column) - { - return 'NVARCHAR(MAX)'; - } - - /** - * Generate the data-type definition for a blob. - * - * @param Fluent $column - * @return string - */ - protected function type_blob(Fluent $column) - { - return 'VARBINARY(MAX)'; - } - -} \ No newline at end of file diff --git a/laravel/database/schema/table.php b/laravel/database/schema/table.php deleted file mode 100644 index c728260c..00000000 --- a/laravel/database/schema/table.php +++ /dev/null @@ -1,425 +0,0 @@ -name = $name; - } - - /** - * Indicate that the table should be created. - * - * @return Fluent - */ - public function create() - { - return $this->command(__FUNCTION__); - } - - /** - * Create a new primary key on the table. - * - * @param string|array $columns - * @param string $name - * @return Fluent - */ - public function primary($columns, $name = null) - { - return $this->key(__FUNCTION__, $columns, $name); - } - - /** - * Create a new unique index on the table. - * - * @param string|array $columns - * @param string $name - * @return Fluent - */ - public function unique($columns, $name = null) - { - return $this->key(__FUNCTION__, $columns, $name); - } - - /** - * Create a new full-text index on the table. - * - * @param string|array $columns - * @param string $name - * @return Fluent - */ - public function fulltext($columns, $name = null) - { - return $this->key(__FUNCTION__, $columns, $name); - } - - /** - * Create a new index on the table. - * - * @param string|array $columns - * @param string $name - * @return Fluent - */ - public function index($columns, $name = null) - { - return $this->key(__FUNCTION__, $columns, $name); - } - - /** - * Add a foreign key constraint to the table. - * - * @param string|array $columns - * @param string $name - * @return Fluent - */ - public function foreign($columns, $name = null) - { - return $this->key(__FUNCTION__, $columns, $name); - } - - /** - * Create a command for creating any index. - * - * @param string $type - * @param string|array $columns - * @param string $name - * @return Fluent - */ - public function key($type, $columns, $name) - { - $columns = (array) $columns; - - // If no index name was specified, we will concatenate the columns and - // append the index type to the name to generate a unique name for - // the index that can be used when dropping indexes. - if (is_null($name)) - { - $name = str_replace(array('-', '.'), '_', $this->name); - - $name = $name.'_'.implode('_', $columns).'_'.$type; - } - - return $this->command($type, compact('name', 'columns')); - } - - /** - * Rename the database table. - * - * @param string $name - * @return Fluent - */ - public function rename($name) - { - return $this->command(__FUNCTION__, compact('name')); - } - - /** - * Drop the database table. - * - * @return Fluent - */ - public function drop() - { - return $this->command(__FUNCTION__); - } - - /** - * Drop a column from the table. - * - * @param string|array $columns - * @return void - */ - public function drop_column($columns) - { - return $this->command(__FUNCTION__, array('columns' => (array) $columns)); - } - - /** - * Drop a primary key from the table. - * - * @param string $name - * @return void - */ - public function drop_primary($name = null) - { - return $this->drop_key(__FUNCTION__, $name); - } - - /** - * Drop a unique index from the table. - * - * @param string $name - * @return void - */ - public function drop_unique($name) - { - return $this->drop_key(__FUNCTION__, $name); - } - - /** - * Drop a full-text index from the table. - * - * @param string $name - * @return void - */ - public function drop_fulltext($name) - { - return $this->drop_key(__FUNCTION__, $name); - } - - /** - * Drop an index from the table. - * - * @param string $name - * @return void - */ - public function drop_index($name) - { - return $this->drop_key(__FUNCTION__, $name); - } - - /** - * Drop a foreign key constraint from the table. - * - * @param string $name - * @return void - */ - public function drop_foreign($name) - { - return $this->drop_key(__FUNCTION__, $name); - } - - /** - * Create a command to drop any type of index. - * - * @param string $type - * @param string $name - * @return Fluent - */ - protected function drop_key($type, $name) - { - return $this->command($type, compact('name')); - } - - /** - * Add an auto-incrementing integer to the table. - * - * @param string $name - * @return Fluent - */ - public function increments($name) - { - return $this->integer($name, true); - } - - /** - * Add a string column to the table. - * - * @param string $name - * @param int $length - * @return Fluent - */ - public function string($name, $length = 200) - { - return $this->column(__FUNCTION__, compact('name', 'length')); - } - - /** - * Add an integer column to the table. - * - * @param string $name - * @param bool $increment - * @return Fluent - */ - public function integer($name, $increment = false) - { - return $this->column(__FUNCTION__, compact('name', 'increment')); - } - - /** - * Add a float column to the table. - * - * @param string $name - * @return Fluent - */ - public function float($name) - { - return $this->column(__FUNCTION__, compact('name')); - } - - /** - * Add a decimal column to the table. - * - * @param string $name - * @param int $precision - * @param int $scale - * @return Fluent - */ - public function decimal($name, $precision, $scale) - { - return $this->column(__FUNCTION__, compact('name', 'precision', 'scale')); - } - - /** - * Add a boolean column to the table. - * - * @param string $name - * @return Fluent - */ - public function boolean($name) - { - return $this->column(__FUNCTION__, compact('name')); - } - - /** - * Create date-time columns for creation and update timestamps. - * - * @return void - */ - public function timestamps() - { - $this->date('created_at'); - - $this->date('updated_at'); - } - - /** - * Add a date-time column to the table. - * - * @param string $name - * @return Fluent - */ - public function date($name) - { - return $this->column(__FUNCTION__, compact('name')); - } - - /** - * Add a timestamp column to the table. - * - * @param string $name - * @return Fluent - */ - public function timestamp($name) - { - return $this->column(__FUNCTION__, compact('name')); - } - - /** - * Add a text column to the table. - * - * @param string $name - * @return Fluent - */ - public function text($name) - { - return $this->column(__FUNCTION__, compact('name')); - } - - /** - * Add a blob column to the table. - * - * @param string $name - * @return Fluent - */ - public function blob($name) - { - return $this->column(__FUNCTION__, compact('name')); - } - - /** - * Set the database connection for the table operation. - * - * @param string $connection - * @return void - */ - public function on($connection) - { - $this->connection = $connection; - } - - /** - * Determine if the schema table has a creation command. - * - * @return bool - */ - public function creating() - { - return ! is_null(array_first($this->commands, function($key, $value) - { - return $value->type == 'create'; - })); - } - - /** - * Create a new fluent command instance. - * - * @param string $type - * @param array $parameters - * @return Fluent - */ - protected function command($type, $parameters = array()) - { - $parameters = array_merge(compact('type'), $parameters); - - return $this->commands[] = new Fluent($parameters); - } - - /** - * Create a new fluent column instance. - * - * @param string $type - * @param array $parameters - * @return Fluent - */ - protected function column($type, $parameters = array()) - { - $parameters = array_merge(compact('type'), $parameters); - - return $this->columns[] = new Fluent($parameters); - } - -} \ No newline at end of file diff --git a/laravel/documentation/artisan/commands.md b/laravel/documentation/artisan/commands.md deleted file mode 100644 index 0a2dd5ff..00000000 --- a/laravel/documentation/artisan/commands.md +++ /dev/null @@ -1,110 +0,0 @@ -# Artisan Commands - -## Contents - -- [Help](#help) -- [Application Configuration](#application-configuration) -- [Sessions](#sessions) -- [Migrations](#migrations) -- [Bundles](#bundles) -- [Tasks](#tasks) -- [Unit Tests](#unit-tests) -- [Routing](#routing) -- [Application Keys](#keys) -- [CLI Options](#cli-options) - - -## Help - -Description | Command -------------- | ------------- -View a list of available artisan commands. | `php artisan help:commands` - - -## Application Configuration [(More Information)](/docs/install#basic-configuration) - -Description | Command -------------- | ------------- -Generate a secure application key. An application key will not be generated unless the field in **config/application.php** is empty. | `php artisan key:generate` - - -## Database Sessions [(More Information)](/docs/session/config#database) - -Description | Command -------------- | ------------- -Create a session table | `php artisan session:table` - - -## Migrations [(More Information)](/docs/database/migrations) - -Description | Command -------------- | ------------- -Create the Laravel migration table | `php artisan migrate:install` -Creating a migration | `php artisan migrate:make create_users_table` -Creating a migration for a bundle | `php artisan migrate:make bundle::tablename` -Running outstanding migrations | `php artisan migrate` -Running outstanding migrations in the application | `php artisan migrate application` -Running all outstanding migrations in a bundle | `php artisan migrate bundle` -Rolling back the last migration operation | `php artisan migrate:rollback` -Roll back all migrations that have ever run | `php artisan migrate:reset` - - -## Bundles [(More Information)](/docs/bundles) - -Description | Command -------------- | ------------- -Install a bundle | `php artisan bundle:install eloquent` -Upgrade a bundle | `php artisan bundle:upgrade eloquent` -Upgrade all bundles | `php artisan bundle:upgrade` -Publish a bundle assets | `php artisan bundle:publish bundle_name` -Publish all bundles assets | `php artisan bundle:publish` - -
    -> **Note:** After installing you need to [register the bundle](../bundles/#registering-bundles) - - -## Tasks [(More Information)](/docs/artisan/tasks) - -Description | Command -------------- | ------------- -Calling a task | `php artisan notify` -Calling a task and passing arguments | `php artisan notify taylor` -Calling a specific method on a task | `php artisan notify:urgent` -Running a task on a bundle | `php artisan admin::generate` -Running a specific method on a bundle | `php artisan admin::generate:list` - - -## Unit Tests [(More Information)](/docs/testing) - -Description | Command -------------- | ------------- -Running the application tests | `php artisan test` -Running the bundle tests | `php artisan test bundle-name` - - -## Routing [(More Information)](/docs/routing) - -Description | Command -------------- | ------------- -Calling a route | `php artisan route:call get api/user/1` - -
    -> **Note:** You can replace get with post, put, delete, etc. - - -## Application Keys - -Description | Command -------------- | ------------- -Generate an application key | `php artisan key:generate` - -
    -> **Note:** You can specify an alternate key length by adding an extra argument to the command. - - -## CLI Options - -Description | Command -------------- | ------------- -Setting the Laravel environment | `php artisan foo --env=local` -Setting the default database connection | `php artisan foo --database=sqlitename` diff --git a/laravel/documentation/artisan/tasks.md b/laravel/documentation/artisan/tasks.md deleted file mode 100644 index 4f2fb7de..00000000 --- a/laravel/documentation/artisan/tasks.md +++ /dev/null @@ -1,108 +0,0 @@ -# Tasks - -## Contents - -- [The Basics](#the-basics) -- [Creating & Running Tasks](#creating-tasks) -- [Bundle Tasks](#bundle-tasks) -- [CLI Options](#cli-options) - - -## The Basics - -Laravel's command-line tool is called Artisan. Artisan can be used to run "tasks" such as migrations, cronjobs, unit-tests, or anything that you want. - - -## Creating & Running Tasks - -To create a task create a new class in your **application/tasks** directory. The class name should be suffixed with "_Task", and should at least have a "run" method, like this: - -#### Creating a task class: - - class Notify_Task { - - public function run($arguments) - { - // Do awesome notifying… - } - - } - -Now you can call the "run" method of your task via the command-line. You can even pass arguments: - -#### Calling a task from the command line: - - php artisan notify - -#### Calling a task and passing arguments: - - php artisan notify taylor - -#### Calling a task from your application: - - Command::run(array('notify')); - -#### Calling a task from your application with arguments: - - Command::run(array('notify', 'taylor')); - -Remember, you can call specific methods on your task, so, let's add an "urgent" method to the notify task: - -#### Adding a method to the task: - - class Notify_Task { - - public function run($arguments) - { - // Do awesome notifying… - } - - public function urgent($arguments) - { - // This is urgent! - } - - } - -Now we can call our "urgent" method: - -#### Calling a specific method on a task: - - php artisan notify:urgent - - -## Bundle Tasks - -To create a task for your bundle just prefix the bundle name to the class name of your task. So, if your bundle was named "admin", a task might look like this: - -#### Creating a task class that belongs to a bundle: - - class Admin_Generate_Task { - - public function run($arguments) - { - // Generate the admin! - } - - } - -To run your task just use the usual Laravel double-colon syntax to indicate the bundle: - -#### Running a task belonging to a bundle: - - php artisan admin::generate - -#### Running a specific method on a task belonging to a bundle: - - php artisan admin::generate:list - - -## CLI Options - -#### Setting the Laravel environment: - - php artisan foo --env=local - -#### Setting the default database connection: - - php artisan foo --database=sqlite diff --git a/laravel/documentation/auth/config.md b/laravel/documentation/auth/config.md deleted file mode 100644 index a1609320..00000000 --- a/laravel/documentation/auth/config.md +++ /dev/null @@ -1,38 +0,0 @@ -# Auth Configuration - -## Contents - -- [The Basics](#the-basics) -- [The Authentication Driver](#driver) -- [The Default "Username"](#username) -- [Authentication Model](#model) -- [Authentication Table](#table) - - -## The Basics - -Most interactive applications have the ability for users to login and logout. Laravel provides a simple class to help you validate user credentials and retrieve information about the current user of your application. - -To get started, let's look over the **application/config/auth.php** file. The authentication configuration contains some basic options to help you get started with authentication. - - -## The Authentication Driver - -Laravel's authentication is driver based, meaning the responsibility for retrieving users during authentication is delegated to various "drivers". Two are included out of the box: Eloquent and Fluent, but you are free to write your own drivers if needed! - -The **Eloquent** driver uses the Eloquent ORM to load the users of your application, and is the default authentication driver. The **Fluent** driver uses the fluent query builder to load your users. - - -## The Default "Username" - -The second option in the configuration file determines the default "username" of your users. This will typically correspond to a database column in your "users" table, and will usually be "email" or "username". - - -## Authentication Model - -When using the **Eloquent** authentication driver, this option determines the Eloquent model that should be used when loading users. - - -## Authentication Table - -When using the **Fluent** authentication drivers, this option determines the database table containing the users of your application. \ No newline at end of file diff --git a/laravel/documentation/auth/usage.md b/laravel/documentation/auth/usage.md deleted file mode 100644 index 915c1671..00000000 --- a/laravel/documentation/auth/usage.md +++ /dev/null @@ -1,86 +0,0 @@ -# Authentication Usage - -## Contents - -- [Salting & Hashing](#hash) -- [Logging In](#login) -- [Protecting Routes](#filter) -- [Retrieving The Logged In User](#user) -- [Logging Out](#logout) -- [Writing Custom Drivers](#drivers) - -> **Note:** Before using the Auth class, you must [specify a session driver](/docs/session/config). - - -## Salting & Hashing - -If you are using the Auth class, you are strongly encouraged to hash and salt all passwords. Web development must be done responsibly. Salted, hashed passwords make a rainbow table attack against your user's passwords impractical. - -Salting and hashing passwords is done using the **Hash** class. The Hash class uses the **bcrypt** hashing algorithm. Check out this example: - - $password = Hash::make('secret'); - -The **make** method of the Hash class will return a 60 character hashed string. - -You can compare an unhashed value against a hashed one using the **check** method on the **Hash** class: - - if (Hash::check('secret', $hashed_value)) - { - return 'The password is valid!'; - } - - -## Logging In - -Logging a user into your application is simple using the **attempt** method on the Auth class. Simply pass the username and password of the user to the method. The credentials should be contained in an array, which allows for maximum flexibility across drivers, as some drivers may require a different number of arguments. The login method will return **true** if the credentials are valid. Otherwise, **false** will be returned: - - $credentials = array('username' => 'example@gmail.com', 'password' => 'secret'); - - if (Auth::attempt($credentials)) - { - return Redirect::to('user/profile'); - } - -If the user's credentials are valid, the user ID will be stored in the session and the user will be considered "logged in" on subsequent requests to your application. - -To determine if the user of your application is logged in, call the **check** method: - - if (Auth::check()) - { - return "You're logged in!"; - } - -Use the **login** method to login a user without checking their credentials, such as after a user first registers to use your application. Just pass the user's ID: - - Auth::login($user->id); - - Auth::login(15); - - -## Protecting Routes - -It is common to limit access to certain routes only to logged in users. In Laravel this is accomplished using the [auth filter](/docs/routing#filters). If the user is logged in, the request will proceed as normal; however, if the user is not logged in, they will be redirected to the "login" [named route](/docs/routing#named-routes). - -To protect a route, simply attach the **auth** filter: - - Route::get('admin', array('before' => 'auth', function() {})); - -> **Note:** You are free to edit the **auth** filter however you like. A default implementation is located in **application/routes.php**. - - -## Retrieving The Logged In User - -Once a user has logged in to your application, you can access the user model via the **user** method on the Auth class: - - return Auth::user()->email; - -> **Note:** If the user is not logged in, the **user** method will return NULL. - - -## Logging Out - -Ready to log the user out of your application? - - Auth::logout(); - -This method will remove the user ID from the session, and the user will no longer be considered logged in on subsequent requests to your application. \ No newline at end of file diff --git a/laravel/documentation/bundles.md b/laravel/documentation/bundles.md deleted file mode 100644 index ae9ff72a..00000000 --- a/laravel/documentation/bundles.md +++ /dev/null @@ -1,214 +0,0 @@ -# Bundles - -## Contents - -- [The Basics](#the-basics) -- [Creating Bundles](#creating-bundles) -- [Registering Bundles](#registering-bundles) -- [Bundles & Class Loading](#bundles-and-class-loading) -- [Starting Bundles](#starting-bundles) -- [Routing To Bundles](#routing-to-bundles) -- [Using Bundles](#using-bundles) -- [Bundle Assets](#bundle-assets) -- [Installing Bundles](#installing-bundles) -- [Upgrading Bundles](#upgrading-bundles) - - -## The Basics - -Bundles are the heart of the improvements that were made in Laravel 3.0. They are a simple way to group code into convenient "bundles". A bundle can have it's own views, configuration, routes, migrations, tasks, and more. A bundle could be everything from a database ORM to a robust authentication system. Modularity of this scope is an important aspect that has driven virtually all design decisions within Laravel. In many ways you can actually think of the application folder as the special default bundle with which Laravel is pre-programmed to load and use. - - -## Creating Bundles - -The first step in creating a bundle is to create a folder for the bundle within your **bundles** directory. For this example, let's create an "admin" bundle, which could house the administrator back-end to our application. The **application/start.php** file provides some basic configuration that helps to define how our application will run. Likewise we'll create a **start.php** file within our new bundle folder for the same purpose. It is run every time the bundle is loaded. Let's create it: - -#### Creating a bundle start.php file: - - Bundle::path('admin').'models', - )); - -In this start file we've told the auto-loader that classes that are namespaced to "Admin" should be loaded out of our bundle's models directory. You can do anything you want in your start file, but typically it is used for registering classes with the auto-loader. **In fact, you aren't required to create a start file for your bundle.** - -Next, we'll look at how to register this bundle with our application! - - -## Registering Bundles - -Now that we have our admin bundle, we need to register it with Laravel. Pull open your **application/bundles.php** file. This is where you register all bundles used by your application. Let's add ours: - -#### Registering a simple bundle: - - return array('admin'), - -By convention, Laravel will assume that the Admin bundle is located at the root level of the bundle directory, but we can specify another location if we wish: - -#### Registering a bundle with a custom location: - - return array( - - 'admin' => array('location' => 'userscape/admin'), - - ); - -Now Laravel will look for our bundle in **bundles/userscape/admin**. - - -## Bundles & Class Loading - -Typically, a bundle's **start.php** file only contains auto-loader registrations. So, you may want to just skip **start.php** and declare your bundle's mappings right in its registration array. Here's how: - -#### Defining auto-loader mappings in a bundle registration: - - return array( - - 'admin' => array( - 'autoloads' => array( - 'map' => array( - 'Admin' => '(:bundle)/admin.php', - ), - 'namespaces' => array( - 'Admin' => '(:bundle)/lib', - ), - 'directories' => array( - '(:bundle)/models', - ), - ), - ), - - ); - -Notice that each of these options corresponds to a function on the Laravel [auto-loader](/docs/loading). In fact, the value of the option will automatically be passed to the corresponding function on the auto-loader. - -You may have also noticed the **(:bundle)** place-holder. For convenience, this will automatically be replaced with the path to the bundle. It's a piece of cake. - - -## Starting Bundles - -So our bundle is created and registered, but we can't use it yet. First, we need to start it: - -#### Starting a bundle: - - Bundle::start('admin'); - -This tells Laravel to run the **start.php** file for the bundle, which will register its classes in the auto-loader. The start method will also load the **routes.php** file for the bundle if it is present. - -> **Note:** The bundle will only be started once. Subsequent calls to the start method will be ignored. - -If you use a bundle throughout your application, you may want it to start on every request. If this is the case, you can configure the bundle to auto-start in your **application/bundles.php** file: - -#### Configuration a bundle to auto-start: - - return array( - - 'admin' => array('auto' => true), - - ); - -You do not always need to explicitly start a bundle. In fact, you can usually code as if the bundle was auto-started and Laravel will take care of the rest. For example, if you attempt to use a bundle views, configurations, languages, routes or filters, the bundle will automatically be started! - -Each time a bundle is started, it fires an event. You can listen for the starting of bundles like so: - -#### Listen for a bundle's start event: - - Event::listen('laravel.started: admin', function() - { - // The "admin" bundle has started… - }); - -It is also possible to "disable" a bundle so that it will never be started. - -#### Disabling a bundle so it can't be started: - - Bundle::disable('admin'); - - -## Routing To Bundles - -Refer to the documentation on [bundle routing](/docs/routing#bundle-routes) and [bundle controllers](/docs/controllers#bundle-controllers) for more information on routing and bundles. - - -## Using Bundles - -As mentioned previously, bundles can have views, configuration, language files and more. Laravel uses a double-colon syntax for loading these items. So, let's look at some examples: - -#### Loading a bundle view: - - return View::make('bundle::view'); - -#### Loading a bundle configuration item: - - return Config::get('bundle::file.option'); - -#### Loading a bundle language line: - - return Lang::line('bundle::file.line'); - -Sometimes you may need to gather more "meta" information about a bundle, such as whether it exists, its location, or perhaps its entire configuration array. Here's how: - -#### Determine whether a bundle exists: - - Bundle::exists('admin'); - -#### Retrieving the installation location of a bundle: - - $location = Bundle::path('admin'); - -#### Retrieving the configuration array for a bundle: - - $config = Bundle::get('admin'); - -#### Retrieving the names of all installed bundles: - - $names = Bundle::names(); - - -## Bundle Assets - -If your bundle contains views, it is likely you have assets such as JavaScript and images that need to be available in the **public** directory of the application. No problem. Just create **public** folder within your bundle and place all of your assets in this folder. - -Great! But, how do they get into the application's **public** folder. The Laravel "Artisan" command-line provides a simple command to copy all of your bundle's assets to the public directory. Here it is: - -#### Publish bundle assets into the public directory: - - php artisan bundle:publish - -This command will create a folder for the bundle's assets within the application's **public/bundles** directory. For example, if your bundle is named "admin", a **public/bundles/admin** folder will be created, which will contain all of the files in your bundle's public folder. - -For more information on conveniently getting the path to your bundle assets once they are in the public directory, refer to the documentation on [asset management](/docs/views/assets#bundle-assets). - - -## Installing Bundles - -Of course, you may always install bundles manually; however, the "Artisan" CLI provides an awesome method of installing and upgrading your bundle. The framework uses simple Zip extraction to install the bundle. Here's how it works. - -#### Installing a bundle via Artisan: - - php artisan bundle:install eloquent - -Great! Now that you're bundle is installed, you're ready to [register it](#registering-bundles) and [publish its assets](#bundle-assets). - -Need a list of available bundles? Check out the Laravel [bundle directory](http://bundles.laravel.com) - - -## Upgrading Bundles - -When you upgrade a bundle, Laravel will automatically remove the old bundle and install a fresh copy. - -#### Upgrading a bundle via Artisan: - - php artisan bundle:upgrade eloquent - -> **Note:** After upgrading the bundle, you may need to [re-publish its assets](#bundle-assets). - -**Important:** Since the bundle is totally removed on an upgrade, you must be aware of any changes you have made to the bundle code before upgrading. You may need to change some configuration options in a bundle. Instead of modifying the bundle code directly, use the bundle start events to set them. Place something like this in your **application/start.php** file. - -#### Listening for a bundle's start event: - - Event::listen('laravel.started: admin', function() - { - Config::set('admin::file.option', true); - }); \ No newline at end of file diff --git a/laravel/documentation/cache/config.md b/laravel/documentation/cache/config.md deleted file mode 100644 index 39f80c4c..00000000 --- a/laravel/documentation/cache/config.md +++ /dev/null @@ -1,79 +0,0 @@ -# Cache Configuration - -## Contents - -- [The Basics](#the-basics) -- [Database](#database) -- [Memcached](#memcached) -- [Redis](#redis) -- [Cache Keys](#keys) -- [In-Memory Cache](#memory) - - -## The Basics - -Imagine your application displays the ten most popular songs as voted on by your users. Do you really need to look up these ten songs every time someone visits your site? What if you could store them for 10 minutes, or even an hour, allowing you to dramatically speed up your application? Laravel's caching makes it simple. - -Laravel provides five cache drivers out of the box: - -- File System -- Database -- Memcached -- APC -- Redis -- Memory (Arrays) - -By default, Laravel is configured to use the **file** system cache driver. It's ready to go out of the box with no configuration. The file system driver stores cached items as files in the **cache** directory. If you're satisfied with this driver, no other configuration is required. You're ready to start using it. - -> **Note:** Before using the file system cache driver, make sure your **storage/cache** directory is writeable. - - -## Database - -The database cache driver uses a given database table as a simple key-value store. To get started, first set the name of the database table in **application/config/cache.php**: - - 'database' => array('table' => 'laravel_cache'), - -Next, create the table on your database. The table should have three columns: - -- key (varchar) -- value (text) -- expiration (integer) - -That's it. Once your configuration and table is setup, you're ready to start caching! - - -## Memcached - -[Memcached](http://memcached.org) is an ultra-fast, open-source distributed memory object caching system used by sites such as Wikipedia and Facebook. Before using Laravel's Memcached driver, you will need to install and configure Memcached and the PHP Memcache extension on your server. - -Once Memcached is installed on your server you must set the **driver** in the **application/config/cache.php** file: - - 'driver' => 'memcached' - -Then, add your Memcached servers to the **servers** array: - - 'servers' => array( - array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100), - ) - - -## Redis - -[Redis](http://redis.io) is an open source, advanced key-value store. It is often referred to as a data structure server since keys can contain [strings](http://redis.io/topics/data-types#strings), [hashes](http://redis.io/topics/data-types#hashes), [lists](http://redis.io/topics/data-types#lists), [sets](http://redis.io/topics/data-types#sets), and [sorted sets](http://redis.io/topics/data-types#sorted-sets). - -Before using the Redis cache driver, you must [configure your Redis servers](/docs/database/redis#config). Now you can just set the **driver** in the **application/config/cache.php** file: - - 'driver' => 'redis' - - -### Cache Keys - -To avoid naming collisions with other applications using APC, Redis, or a Memcached server, Laravel prepends a **key** to each item stored in the cache using these drivers. Feel free to change this value: - - 'key' => 'laravel' - - -### In-Memory Cache - -The "memory" cache driver does not actually cache anything to disk. It simply maintains an internal array of the cache data for the current request. This makes it perfect for unit testing your application in isolation from any storage mechanism. It should never be used as a "real" cache driver. \ No newline at end of file diff --git a/laravel/documentation/cache/usage.md b/laravel/documentation/cache/usage.md deleted file mode 100644 index adc2f2e8..00000000 --- a/laravel/documentation/cache/usage.md +++ /dev/null @@ -1,59 +0,0 @@ -# Cache Usage - -## Contents - -- [Storing Items](#put) -- [Retrieving Items](#get) -- [Removing Items](#forget) - - -## Storing Items - -Storing items in the cache is simple. Simply call the **put** method on the Cache class: - - Cache::put('name', 'Taylor', 10); - -The first parameter is the **key** to the cache item. You will use this key to retrieve the item from the cache. The second parameter is the **value** of the item. The third parameter is the number of **minutes** you want the item to be cached. - -You may also cache something "forever" if you do not want the cache to expire: - - Cache::forever('name', 'Taylor'); - -> **Note:** It is not necessary to serialize objects when storing them in the cache. - - -## Retrieving Items - -Retrieving items from the cache is even more simple than storing them. It is done using the **get** method. Just mention the key of the item you wish to retrieve: - - $name = Cache::get('name'); - -By default, NULL will be returned if the cached item has expired or does not exist. However, you may pass a different default value as a second parameter to the method: - - $name = Cache::get('name', 'Fred'); - -Now, "Fred" will be returned if the "name" cache item has expired or does not exist. - -What if you need a value from your database if a cache item doesn't exist? The solution is simple. You can pass a closure into the **get** method as a default value. The closure will only be executed if the cached item doesn't exist: - - $users = Cache::get('count', function() {return DB::table('users')->count();}); - -Let's take this example a step further. Imagine you want to retrieve the number of registered users for your application; however, if the value is not cached, you want to store the default value in the cache using the **remember** method: - - $users = Cache::remember('count', function() {return DB::table('users')->count();}, 5); - -Let's talk through that example. If the **count** item exists in the cache, it will be returned. If it doesn't exist, the result of the closure will be stored in the cache for five minutes **and** be returned by the method. Slick, huh? - -Laravel even gives you a simple way to determine if a cached item exists using the **has** method: - - if (Cache::has('name')) - { - $name = Cache::get('name'); - } - - -## Removing Items - -Need to get rid of a cached item? No problem. Just mention the name of the item to the **forget** method: - - Cache::forget('name'); \ No newline at end of file diff --git a/laravel/documentation/changes.md b/laravel/documentation/changes.md deleted file mode 100644 index 2f76114d..00000000 --- a/laravel/documentation/changes.md +++ /dev/null @@ -1,453 +0,0 @@ -# Laravel Change Log - -## Contents - -- [Laravel 3.2.13](#3.2.13) -- [Upgrading From 3.2.12](#upgrade-3.2.13) -- [Laravel 3.2.12](#3.2.12) -- [Upgrading From 3.2.11](#upgrade-3.2.12) -- [Laravel 3.2.11](#3.2.11) -- [Upgrading From 3.2.10](#upgrade-3.2.11) -- [Laravel 3.2.10](#3.2.10) -- [Upgrading From 3.2.9](#upgrade-3.2.10) -- [Laravel 3.2.9](#3.2.9) -- [Upgrading From 3.2.8](#upgrade-3.2.9) -- [Laravel 3.2.8](#3.2.8) -- [Upgrading From 3.2.7](#upgrade-3.2.8) -- [Laravel 3.2.7](#3.2.7) -- [Upgrading From 3.2.6](#upgrade-3.2.7) -- [Laravel 3.2.6](#3.2.6) -- [Upgrading From 3.2.5](#upgrade-3.2.6) -- [Laravel 3.2.5](#3.2.5) -- [Upgrading From 3.2.4](#upgrade-3.2.5) -- [Laravel 3.2.4](#3.2.4) -- [Upgrading From 3.2.3](#upgrade-3.2.4) -- [Laravel 3.2.3](#3.2.3) -- [Upgrading From 3.2.2](#upgrade-3.2.3) -- [Laravel 3.2.2](#3.2.2) -- [Upgrading From 3.2.1](#upgrade-3.2.2) -- [Laravel 3.2.1](#3.2.1) -- [Upgrading From 3.2](#upgrade-3.2.1) -- [Laravel 3.2](#3.2) -- [Upgrading From 3.1](#upgrade-3.2) -- [Laravel 3.1.9](#3.1.9) -- [Upgrading From 3.1.8](#upgrade-3.1.9) -- [Laravel 3.1.8](#3.1.8) -- [Upgrading From 3.1.7](#upgrade-3.1.8) -- [Laravel 3.1.7](#3.1.7) -- [Upgrading From 3.1.6](#upgrade-3.1.7) -- [Laravel 3.1.6](#3.1.6) -- [Upgrading From 3.1.5](#upgrade-3.1.6) -- [Laravel 3.1.5](#3.1.5) -- [Upgrading From 3.1.4](#upgrade-3.1.5) -- [Laravel 3.1.4](#3.1.4) -- [Upgrading From 3.1.3](#upgrade-3.1.4) -- [Laravel 3.1.3](#3.1.3) -- [Upgrading From 3.1.2](#uprade-3.1.3) -- [Laravel 3.1.2](#3.1.2) -- [Upgrading From 3.1.1](#upgrade-3.1.2) -- [Laravel 3.1.1](#3.1.1) -- [Upgrading From 3.1](#upgrade-3.1.1) -- [Laravel 3.1](#3.1) -- [Upgrading From 3.0](#upgrade-3.1) - - -## Laravel 3.2.13 - -- Upgraded Symfony HttpFoundation to 2.1.6. -- Various framework fixes. - - -### Upgrading From 3.2.12 - -- Replace the **laravel** folder. - - -## Laravel 3.2.12 - -- Clear sections on a complete render operation. - - -### Upgrading From 3.2.11 - -- Replace the **laravel** folder. - - -## Laravel 3.2.11 - -- Improve performance of Eloquent eager load matching. -- Check `gethostname` on environment detection. - - -### Upgrading From 3.2.10 - -- Replace the **laravel** folder. - - -## Laravel 3.2.10 - -- Fix bug in Eloquent model. - - -### Upgrading From 3.2.9 - -- Replace the **laravel** folder. - - -## Laravel 3.2.9 - -- Always log exceptions even when there are "logger" event listeners. -- Fix nasty view exception messages. - - -### Upgrading From 3.2.8 - -- Replace the **laravel** folder. - - -## Laravel 3.2.8 - -- Fix double slash bug in URLs when using languages and no "index.php". -- Fix possible security issue in Auth "remember me" cookies. - - -### Upgrading From 3.2.7 - -- Replace the **laravel** folder. - - -## Laravel 3.2.7 - -- Fix bug in Eloquent `to_array` method. -- Fix bug in displaying of generic error page. - - -### Upgrading From 3.2.6 - -- Replace the **laravel** folder. - - -## Laravel 3.2.6 - -- Revert Blade code back to 3.2.3 tag. - - -### Upgrading From 3.2.5 - -- Replace the **laravel** folder. - - -## Laravel 3.2.5 - -- Revert nested where code back to 3.2.3 tag. - - -### Upgrading From 3.2.4 - -- Replace the **laravel** folder. - - -## Laravel 3.2.4 - -- Speed up many to many eager loading mapping. -- Tweak the Eloquent::changed() method. -- Various bug fixes and improvements. - - -### Upgrading From 3.2.3 - -- Replace the **laravel** folder. - - -## Laravel 3.2.3 - -- Fixed eager loading bug in Eloquent. -- Added `laravel.resolving` event for all IoC resolutions. - - -### Upgrading From 3.2.2 - -- Replace the **laravel** folder. - - -## Laravel 3.2.2 - -- Overall improvement of Postgres support. -- Fix issue in SQL Server Schema grammar. -- Fix issue with eager loading and `first` or `find`. -- Fix bug causing parameters to not be passed to `IoC::resolve`. -- Allow the specification of hostnames in environment setup. -- Added `DB::last_query` method. -- Added `password` option to Auth configuration. - - -### Upgrading From 3.2.1 - -- Replace the **laravel** folder. - - -## Laravel 3.2.1 - -- Fixed bug in cookie retrieval when cookie is set on same request. -- Fixed bug in SQL Server grammar for primary keys. -- Fixed bug in Validator on PHP 5.4. -- If HTTP / HTTPS is not specified for generated links, current protocol is used. -- Fix bug in Eloquent auth driver. -- Added `format` method to message container. - - -### Upgrading From 3.2 - -- Replace the **laravel** folder. - - -## Laravel 3.2 - -- [Added `to_array` method to the base Eloquent model](/docs/database/eloquent#to-array). -- [Added `$hidden` static variable to the base Eloquent model](/docs/database/eloquent#to-array). -- [Added `sync` method to has\_many\_and\_belongs\_to Eloquent relationship](/docs/database/eloquent#sync-method). -- [Added `save` method to has\_many Eloquent relationship](/docs/database/eloquent#has-many-save). -- [Added `unless` structure to Blade template engine](/docs/views/templating#blade-unless). -- [Added Blade comments](/docs/views/templating#blade-comments). -- [Added simpler environment management](/docs/install#environments). -- Added `Blade::extend()` method to define custom blade compilers. -- Added `View::exists` method. -- Use [Memcached](http://php.net/manual/en/book.memcached.php) API instead of older [Memcache](http://php.net/manual/en/book.memcache.php) API. -- Added support for bundles outside of the bundle directory. -- Added support for DateTime database query bindings. -- Migrated to the Symfony HttpFoundation component for core request / response handling. -- Fixed the passing of strings into the `Input::except` method. -- Fixed replacement of optional parameters in `URL::transpose` method. -- Improved `update` handling on `Has_Many` and `Has_One` relationships. -- Improved View performance by only loading contents from file once. -- Fix handling of URLs beginning with hashes in `URL::to`. -- Fix the resolution of unset Eloquent attributes. -- Allows pivot table timestamps to be disabled. -- Made the `get_timestamp` Eloquent method static. -- `Request::secure` now takes `application.ssl` configuration option into consideration. -- Simplified the `paths.php` file. -- Only write file caches if number of minutes is greater than zero. -- Added `$default` parameter to Bundle::option method. -- Fixed bug present when using Eloquent models with Twig. -- Allow multiple views to be registered for a single composer. -- Added `Request::set_env` method. -- `Schema::drop` now accepts `$connection` as second parameter. -- Added `Input::merge` method. -- Added `Input::replace` method. -- Added saving, saved, updating, creating, deleting, and deleted events to Eloquent. -- Added new `Sectionable` interface to allow cache drivers to simulate namespacing. -- Added support for `HAVING` SQL clauses. -- Added `array_pluck` helper, similar to pluck method in Underscore.js. -- Allow the registration of custom cache and session drivers. -- Allow the specification of a separate asset base URL for using CDNs. -- Allow a `starter` Closure to be defined in `bundles.php` to be run on Bundle::start. -- Allow the registration of custom database drivers. -- New, driver based authentication system. -- Added Input::json() method for working with applications using Backbone.js or similar. -- Added Response::json method for creating JSON responses. -- Added Response::eloquent method for creating Eloquent responses. -- Fixed bug when using many-to-many relationships on non-default database connection. -- Added true reflection based IoC to container. -- Added `Request::route()->controller` and `Request::route()->controller_action`. -- Added `Event::queue`, `Event::flusher`, and `Event::flush` methods to Event class. -- Added `array_except` and `array_only` helpers, similar to `Input::except` and `Input::only` but for arbitrary arrays. - - -### Upgrading From 3.1 - -- Add new `asset_url` and `profiler` options to application configuration. -- Replace **auth** configuration file. - -Add the following entry to the `aliases` array in `config/application.php`.. - - 'Profiler' => 'Laravel\\Profiling\\Profiler', - -Add the following code above `Blade::sharpen()` in `application/start.php`.. - - if (Config::get('application.profiler')) - { - Profiler::attach(); - } - -- Upgrade the **paths.php** file. -- Replace the **laravel** folder. - - -## Laravel 3.1.9 - -- Fixes cookie session driver bug that caused infinite loop on some occasions. - - -### Upgrading From 3.1.8 - -- Replace the **laravel** folder. - - -## Laravel 3.1.8 - -- Fixes possible WSOD when using Blade's @include expression. - - -### Upgrading From 3.1.7 - -- Replace the **laravel** folder. - - -## Laravel 3.1.7 - -- Fixes custom validation language line loading from bundles. -- Fixes double-loading of classes when overriding the core. -- Classify migration names. - - -### Upgrading From 3.1.6 - -- Replace the **laravel** folder. - - -## Laravel 3.1.6 - -- Fixes many-to-many eager loading in Eloquent. - - -### Upgrading From 3.1.5 - -- Replace the **laravel** folder. - - -## Laravel 3.1.5 - -- Fixes bug that could allow secure cookies to be sent over HTTP. - - -### Upgrading From 3.1.4 - -- Replace the **laravel** folder. - - -## Laravel 3.1.4 - -- Fixes Response header casing bug. -- Fixes SQL "where in" (…) short-cut bug. - - -### Upgrading From 3.1.3 - -- Replace the **laravel** folder. - - -## Laravel 3.1.3 - -- Fixes **delete** method in Eloquent models. - - -### Upgrade From 3.1.2 - -- Replace the **laravel** folder. - - -## Laravel 3.1.2 - -- Fixes Eloquent query method constructor conflict. - - -### Upgrade From 3.1.1 - -- Replace the **laravel** folder. - - -## Laravel 3.1.1 - -- Fixes Eloquent model hydration bug involving custom setters. - - -### Upgrading From 3.1 - -- Replace the **laravel** folder. - - -## Laravel 3.1 - -- Added events to logger for more flexibility. -- Added **database.fetch** configuration option. -- Added controller factories for injecting any IoC. -- Added **link_to_action** HTML helpers. -- Added ability to set default value on Config::get. -- Added the ability to add pattern based filters. -- Improved session ID assignment. -- Added support for "unsigned" integers in schema builder. -- Added config, view, and lang loaders. -- Added more logic to **application/start.php** for more flexibility. -- Added foreign key support to schema builder. -- Postgres "unique" indexes are now added with ADD CONSTRAINT. -- Added "Event::until" method. -- Added "memory" cache and session drivers. -- Added Controller::detect method. -- Added Cache::forever method. -- Controller layouts now resolved in Laravel\Controller __construct. -- Rewrote Eloquent and included in core. -- Added "match" validation rule. -- Fixed table prefix bug. -- Added Form::macro method. -- Added HTML::macro method. -- Added Route::forward method. -- Prepend table name to default index names in schema. -- Added "forelse" to Blade. -- Added View::render_each. -- Able to specify full path to view (path: ). -- Added support for Blade template inheritance. -- Added "before" and "after" validation checks for dates. - - -### Upgrading From 3.0 - -#### Replace your **application/start.php** file. - -The default **start.php** file has been expanded in order to give you more flexibility over the loading of your language, configuration, and view files. To upgrade your file, copy your current file and paste it at the bottom of a copy of the new Laravel 3.1 start file. Next, scroll up in the **start** file until you see the default Autoloader registrations (line 61 and line 76). Delete both of these sections since you just pasted your previous auto-loader registrations at the bottom of the file. - -#### Remove the **display** option from your **errors** configuration file. - -This option is now set at the beginning of your **application/start** file. - -#### Call the parent controller's constructor from your controller. - -Simply add a **parent::__construct();** to to any of your controllers that have a constructor. - -#### Prefix Laravel migration created indexes with their table name. - -If you have created indexes on tables using the Laravel migration system and you used to the default index naming scheme provided by Laravel, prefix the index names with their table name on your database. So, if the current index name is "id_unique" on the "users" table, make the index name "users_id_unique". - -#### Add alias for Eloquent in your application configuration. - -Add the following to the **aliases** array in your **application/config/application.php** file: - - 'Eloquent' => 'Laravel\\Database\\Eloquent\\Model', - 'Blade' => 'Laravel\\Blade', - -#### Update Eloquent many-to-many tables. - -Eloquent now maintains **created_at** and **updated_at** column on many-to-many intermediate tables by default. Simply add these columns to your tables. Also, many-to-many tables are now the singular model names concatenated with an underscore. For example, if the relationship is between User and Role, the intermediate table name should be **role_user**. - -#### Remove Eloquent bundle. - -If you are using the Eloquent bundle with your installation, you can remove it from your bundles directory and your **application/bundles.php** file. Eloquent version 2 is included in the core in Laravel 3.1. Your models can also now extend simply **Eloquent** instead of **Eloquent\Model**. - -#### Update your **config/strings.php** file. - -English pluralization and singularization is now automatic. Just completely replace your **application/config/strings.php** file. - -#### Add the **fetch** option to your database configuration file. - -A new **fetch** option allows you to specify in which format you receive your database results. Just copy and paste the option from the new **application/config/database.php** file. - -#### Add **database** option to your Redis configuration. - -If you are using Redis, add the "database" option to your Redis connection configurations. The "database" value can be zero by default. - - 'redis' => array( - 'default' => array( - 'host' => '127.0.0.1', - 'port' => 6379, - 'database' => 0 - ), - ), diff --git a/laravel/documentation/config.md b/laravel/documentation/config.md deleted file mode 100644 index ae741386..00000000 --- a/laravel/documentation/config.md +++ /dev/null @@ -1,34 +0,0 @@ -# Runtime Configuration - -## Contents - -- [The Basics](#the-basics) -- [Retrieving Options](#retrieving-options) -- [Setting Options](#setting-options) - - -## The Basics - -Sometimes you may need to get and set configuration options at runtime. For this you'll use the **Config** class, which utilizes Laravel's "dot" syntax for accessing configuration files and items. - - -## Retrieving Options - -#### Retrieve a configuration option: - - $value = Config::get('application.url'); - -#### Return a default value if the option doesn't exist: - - $value = Config::get('application.timezone', 'UTC'); - -#### Retrieve an entire configuration array: - - $options = Config::get('database'); - - -## Setting Options - -#### Set a configuration option: - - Config::set('cache.driver', 'apc'); \ No newline at end of file diff --git a/laravel/documentation/contents.md b/laravel/documentation/contents.md deleted file mode 100644 index 909da4c5..00000000 --- a/laravel/documentation/contents.md +++ /dev/null @@ -1,119 +0,0 @@ -### General -- [Laravel Overview](/docs/home) -- [Change Log](/docs/changes) -- [Installation & Setup](/docs/install) - - [Requirements](/docs/install#requirements) - - [Installation](/docs/install#installation) - - [Server Configuration](/docs/install#server-configuration) - - [Basic Configuration](/docs/install#basic-configuration) - - [Environments](/docs/install#environments) - - [Cleaner URLs](/docs/install#cleaner-urls) -- [Routing](/docs/routing) - - [The Basics](/docs/routing#the-basics) - - [Wildcards](/docs/routing#wildcards) - - [The 404 Event](/docs/routing#the-404-event) - - [Filters](/docs/routing#filters) - - [Pattern Filters](/docs/routing#pattern-filters) - - [Global Filters](/docs/routing#global-filters) - - [Route Groups](/docs/routing#route-groups) - - [Named Routes](/docs/routing#named-routes) - - [HTTPS Routes](/docs/routing#https-routes) - - [Bundle Routes](/docs/routing#bundle-routes) - - [Controller Routing](/docs/routing#controller-routing) - - [CLI Route Testing](/docs/routing#cli-route-testing) -- [Controllers](/docs/controllers) - - [The Basics](/docs/controllers#the-basics) - - [Controller Routing](/docs/controllers#controller-routing) - - [Bundle Controllers](/docs/controllers#bundle-controllers) - - [Action Filters](/docs/controllers#action-filters) - - [Nested Controllers](/docs/controllers#nested-controllers) - - [RESTful Controllers](/docs/controllers#restful-controllers) - - [Dependency Injection](/docs/controllers#dependency-injection) - - [Controller Factory](/docs/controllers#controller-factory) -- [Models & Libraries](/docs/models) -- [Views & Responses](/docs/views) - - [The Basics](/docs/views#basics) - - [Binding Data To Views](/docs/views#binding-data-to-views) - - [Nesting Views](/docs/views#nesting-views) - - [Named Views](/docs/views#named-views) - - [View Composers](/docs/views#view-composers) - - [Redirects](/docs/views#redirects) - - [Redirecting With Data](/docs/views#redirecting-with-flash-data) - - [Downloads](/docs/views#downloads) - - [Errors](/docs/views#errors) - - [Managing Assets](/docs/views/assets) - - [Templating](/docs/views/templating) - - [Pagination](/docs/views/pagination) - - [Building HTML](/docs/views/html) - - [Building Forms](/docs/views/forms) -- [Input & Cookies](/docs/input) - - [Input](/docs/input#input) - - [Files](/docs/input#files) - - [Old Input](/docs/input#old-input) - - [Redirecting With Old Input](/docs/input#redirecting-with-old-input) - - [Cookies](/docs/input#cookies) -- [Bundles](/docs/bundles) - - [The Basics](/docs/bundles#the-basics) - - [Creating Bundles](/docs/bundles#creating-bundles) - - [Registering Bundles](/docs/bundles#registering-bundles) - - [Bundles & Class Loading](/docs/bundles#bundles-and-class-loading) - - [Starting Bundles](/docs/bundles#starting-bundles) - - [Routing To Bundles](/docs/bundles#routing-to-bundles) - - [Using Bundles](/docs/bundles#using-bundles) - - [Bundle Assets](/docs/bundles#bundle-assets) - - [Installing Bundles](/docs/bundles#installing-bundles) - - [Upgrading Bundles](/docs/bundles#upgrading-bundles) -- [Class Auto Loading](/docs/loading) -- [Errors & Logging](/docs/logging) -- [Profiler](/docs/profiler) -- [Runtime Configuration](/docs/config) -- [Examining Requests](/docs/requests) -- [Generating URLs](/docs/urls) -- [Events](/docs/events) -- [Validation](/docs/validation) -- [Working With Files](/docs/files) -- [Working With Strings](/docs/strings) -- [Localization](/docs/localization) -- [Encryption](/docs/encryption) -- [IoC Container](/docs/ioc) -- [Unit Testing](/docs/testing) - -### Database - -- [Configuration](/docs/database/config) -- [Raw Queries](/docs/database/raw) -- [Fluent Query Builder](/docs/database/fluent) -- [Eloquent ORM](/docs/database/eloquent) -- [Schema Builder](/docs/database/schema) -- [Migrations](/docs/database/migrations) -- [Redis](/docs/database/redis) - -### Caching - -- [Configuration](/docs/cache/config) -- [Usage](/docs/cache/usage) - -### Sessions - -- [Configuration](/docs/session/config) -- [Usage](/docs/session/usage) - -### Authentication - -- [Configuration](/docs/auth/config) -- [Usage](/docs/auth/usage) - -### Artisan CLI - -- [Tasks](/docs/artisan/tasks) - - [The Basics](/docs/artisan/tasks#the-basics) - - [Creating & Running Tasks](/docs/artisan/tasks#creating-tasks) - - [Bundle Tasks](/docs/artisan/tasks#bundle-tasks) - - [CLI Options](/docs/artisan/tasks#cli-options) -- [Commands](/docs/artisan/commands) - -### Contributing - -- [Laravel on GitHub](/docs/contrib/github) -- [Command Line](/docs/contrib/command-line) -- [TortoiseGit](/docs/contrib/tortoisegit) diff --git a/laravel/documentation/contrib/command-line.md b/laravel/documentation/contrib/command-line.md deleted file mode 100644 index 0602c2e2..00000000 --- a/laravel/documentation/contrib/command-line.md +++ /dev/null @@ -1,128 +0,0 @@ -# Contributing to Laravel via Command-Line - -## Contents - -- [Getting Started](#getting-started) -- [Forking Laravel](#forking-laravel) -- [Cloning Laravel](#cloning-laravel) -- [Adding your Fork](#adding-your-fork) -- [Creating Branches](#creating-branches) -- [Committing](#committing) -- [Submitting a Pull Request](#submitting-a-pull-request) -- [What's Next?](#whats-next) - - -## Getting Started - -This tutorial explains the basics of contributing to a project on [GitHub](https://github.com/) via the command-line. The workflow can apply to most projects on GitHub, but in this case, we will be focused on the [Laravel](https://github.com/laravel/laravel) project. This tutorial is applicable to OSX, Linux and Windows. - -This tutorial assumes you have installed [Git](http://git-scm.com/) and you have created a [GitHub account](https://github.com/signup/free). If you haven't already, look at the [Laravel on GitHub](/docs/contrib/github) documentation in order to familiarize yourself with Laravel's repositories and branches. - - -## Forking Laravel - -Login to GitHub and visit the [Laravel Repository](https://github.com/laravel/laravel). Click on the **Fork** button. This will create your own fork of Laravel in your own GitHub account. Your Laravel fork will be located at **https://github.com/username/laravel** (your GitHub username will be used in place of *username*). - - -## Cloning Laravel - -Open up the command-line or terminal and make a new directory where you can make development changes to Laravel: - - # mkdir laravel-develop - # cd laravel-develop - -Next, clone the Laravel repository (not your fork you made): - - # git clone https://github.com/laravel/laravel.git . - -> **Note**: The reason you are cloning the original Laravel repository (and not the fork you made) is so you can always pull down the most recent changes from the Laravel repository to your local repository. - - -## Adding your Fork - -Next, it's time to add the fork you made as a **remote repository**: - - # git remote add fork git@github.com:username/laravel.git - -Remember to replace *username** with your GitHub username. *This is case-sensitive*. You can verify that your fork was added by typing: - - # git remote - -Now you have a pristine clone of the Laravel repository along with your fork as a remote repository. You are ready to begin branching for new features or fixing bugs. - - -## Creating Branches - -First, make sure you are working in the **develop** branch. If you submit changes to the **master** branch, it is unlikely they will be pulled in anytime in the near future. For more information on this, read the documentation for [Laravel on GitHub](/docs/contrib/github). To switch to the develop branch: - - # git checkout develop - -Next, you want to make sure you are up-to-date with the latest Laravel repository. If any new features or bug fixes have been added to the Laravel project since you cloned it, this will ensure that your local repository has all of those changes. This important step is the reason we originally cloned the Laravel repository instead of your own fork. - - # git pull origin develop - -Now you are ready to create a new branch for your new feature or bug-fix. When you create a new branch, use a self-descriptive naming convention. For example, if you are going to fix a bug in Eloquent, name your branch *bug/eloquent*: - - # git branch bug/eloquent - # git checkout bug/eloquent - Switched to branch 'bug/eloquent' - -Or if there is a new feature to add or change to the documentation that you want to make, for example, the localization documentation: - - # git branch feature/localization-docs - # git checkout feature/localization-docs - Switched to branch 'feature/localization-docs' - -> **Note:** Create one new branch for every new feature or bug-fix. This will encourage organization, limit interdependency between new features/fixes and will make it easy for the Laravel team to merge your changes into the Laravel core. - -Now that you have created your own branch and have switched to it, it's time to make your changes to the code. Add your new feature or fix that bug. - - -## Committing - -Now that you have finished coding and testing your changes, it's time to commit them to your local repository. First, add the files that you changed/added: - - # git add laravel/documentation/localization.md - -Next, commit the changes to the repository: - - # git commit -s -m "I added some more stuff to the Localization documentation." - -- **-s** means that you are signing-off on your commit with your name. This tells the Laravel team know that you personally agree to your code being added to the Laravel core. -- **-m** is the message that goes with your commit. Provide a brief explanation of what you added or changed. - - -## Pushing to your Fork - -Now that your local repository has your committed changes, it's time to push (or sync) your new branch to your fork that is hosted in GitHub: - - # git push fork feature/localization-docs - -Your branch has been successfully pushed to your fork on GitHub. - - -## Submitting a Pull Request - -The final step is to submit a pull request to the Laravel repository. This means that you are requesting that the Laravel team pull and merge your changes to the Laravel core. In your browser, visit your Laravel fork at [https://github.com/username/laravel](https://github.com/username/laravel). Click on **Pull Request**. Next, make sure you choose the proper base and head repositories and branches: - -- **base repo:** laravel/laravel -- **base branch:** develop -- **head repo:** username/laravel -- **head branch:** feature/localization-docs - -Use the form to write a more detailed description of the changes you made and why you made them. Finally, click **Send pull request**. That's it! The changes you made have been submitted to the Laravel team. - - -## What's Next? - -Do you have another feature you want to add or another bug you need to fix? First, make sure you always base your new branch off of the develop branch: - - # git checkout develop - -Then, pull down the latest changes from Laravel's repository: - - # git pull origin develop - -Now you are ready to create a new branch and start coding again! - -> [Jason Lewis](http://jasonlewis.me/)'s blog post [Contributing to a GitHub Project](http://jasonlewis.me/blog/2012/06/how-to-contributing-to-a-github-project) was the primary inspiration for this tutorial. diff --git a/laravel/documentation/contrib/github.md b/laravel/documentation/contrib/github.md deleted file mode 100644 index 7d3687ec..00000000 --- a/laravel/documentation/contrib/github.md +++ /dev/null @@ -1,46 +0,0 @@ -# Laravel on GitHub - -## Contents - -- [The Basics](#the-basics) -- [Repositories](#repositories) -- [Branches](#branches) -- [Pull Requests](#pull-requests) - - -## The Basics - -Because Laravel's development and source control is done through GitHub, anyone is able to make contributions to it. Anyone can fix bugs, add features or improve the documentation. - -After submitting proposed changes to the project, the Laravel team will review the changes and make the decision to commit them to Laravel's core. - - -## Repositories - -Laravel's home on GitHub is at [github.com/laravel](https://github.com/laravel). Laravel has several repositories. For basic contributions, the only repository you need to pay attention to is the **laravel** repository, located at [github.com/laravel/laravel](https://github.com/laravel/laravel). - - -## Branches - -The **laravel** repository has multiple branches, each serving a specific purpose: - -- **master** - This is the Laravel release branch. Active development does not happen on this branch. This branch is only for the most recent, stable Laravel core code. When you download Laravel from [laravel.com](http://laravel.com/), you are downloading directly from this master branch. *Do not make pull requests to this branch.* -- **develop** - This is the working development branch. All proposed code changes and contributions by the community are pulled into this branch. *When you make a pull request to the Laravel project, this is the branch you want to pull-request into.* - -Once certain milestones have been reached and/or Taylor Otwell and the Laravel team is happy with the stability and additional features of the current development branch, the changes in the **develop** branch are pulled into the **master** branch, thus creating and releasing the newest stable version of Laravel for the world to use. - - -## Pull Requests - -[GitHub pull requests](https://help.github.com/articles/using-pull-requests) are a great way for everyone in the community to contribute to the Laravel codebase. Found a bug? Just fix it in your fork and submit a pull request. This will then be reviewed, and, if found as good, merged into the main repository. - -In order to keep the codebase clean, stable and at high quality, even with so many people contributing, some guidelines are necessary for high-quality pull requests: - -- **Branch:** Unless they are immediate documentation fixes relevant for old versions, pull requests should be sent to the `develop` branch only. Make sure to select that branch as target when creating the pull request (GitHub will not automatically select it.) -- **Documentation:** If you are adding a new feature or changing the API in any relevant way, this should be documented. The documentation files can be found directly in the core repository. -- **Unit tests:** To keep old bugs from re-appearing and generally hold quality at a high level, the Laravel core is thoroughly unit-tested. Thus, when you create a pull request, it is expected that you unit test any new code you add. For any bug you fix, you should also add regression tests to make sure the bug will never appear again. If you are unsure about how to write tests, the core team or other contributors will gladly help. - -*Further Reading* - - - [Contributing to Laravel via Command-Line](/docs/contrib/command-line) - - [Contributing to Laravel using TortoiseGit](/docs/contrib/tortoisegit) diff --git a/laravel/documentation/contrib/tortoisegit.md b/laravel/documentation/contrib/tortoisegit.md deleted file mode 100644 index 96f1d9b9..00000000 --- a/laravel/documentation/contrib/tortoisegit.md +++ /dev/null @@ -1,114 +0,0 @@ -# Contributing to Laravel using TortoiseGit - -## Contents - -- [Getting Started](#getting-started) -- [Forking Laravel](#forking-laravel) -- [Cloning Laravel](#cloning-laravel) -- [Adding your Fork](#adding-your-fork) -- [Creating Branches](#creating-branches) -- [Committing](#committing) -- [Submitting a Pull Request](#submitting-a-pull-request) -- [What's Next?](#whats-next) - - -## Getting Started - -This tutorial explains the basics of contributing to a project on [GitHub](https://github.com/) using [TortoiseGit](http://code.google.com/p/tortoisegit/) for Windows. The workflow can apply to most projects on GitHub, but in this case, we will be focused on the [Laravel](https://github.com/laravel/laravel) project. - -This tutorial assumes you have installed TortoiseGit for Windows and you have created a GitHub account. If you haven't already, look at the [Laravel on GitHub](/docs/contrib/github) documentation in order to familiarize yourself with Laravel's repositories and branches. - - -## Forking Laravel - -Login to GitHub and visit the [Laravel Repository](https://github.com/laravel/laravel). Click on the **Fork** button. This will create your own fork of Laravel in your own GitHub account. Your Laravel fork will be located at **https://github.com/username/laravel** (your GitHub username will be used in place of *username*). - - -## Cloning Laravel - -Open up Windows Explorer and create a new directory where you can make development changes to Laravel. - -- Right-click the Laravel directory to bring up the context menu. Click on **Git Clone…** -- Git clone - - **Url:** https://github.com/laravel/laravel.git - - **Directory:** the directory that you just created in the previous step - - Click **OK** - -> **Note**: The reason you are cloning the original Laravel repository (and not the fork you made) is so you can always pull down the most recent changes from the Laravel repository to your local repository. - - -## Adding your Fork - -After the cloning process is complete, it's time to add the fork you made as a **remote repository**. - -- Right-click the Laravel directory and goto **TortoiseGit > Settings** -- Goto the **Git/Remote** section. Add a new remote: - - **Remote**: fork - - **URL**: https://github.com/username/laravel.git - - Click **Add New/Save** - - Click **OK** - -Remember to replace *username* with your GitHub username. *This is case-sensitive*. - - -## Creating Branches - -Now you are ready to create a new branch for your new feature or bug-fix. When you create a new branch, use a self-descriptive naming convention. For example, if you are going to fix a bug in Eloquent, name your branch *bug/eloquent*. Or if you were going to make changes to the localization documentation, name your branch *feature/localization-docs*. A good naming convention will encourage organization and help others understand the purpose of your branch. - -- Right-click the Laravel directory and goto **TortoiseGit > Create Branch** - - **Branch:** feature/localization-docs - - **Base On Branch:** remotes/origin/develop - - **Check** *Track* - - **Check** *Switch to new branch* - - Click **OK** - -This will create your new *feature/localization-docs* branch and switch you to it. - -> **Note:** Create one new branch for every new feature or bug-fix. This will encourage organization, limit interdependency between new features/fixes and will make it easy for the Laravel team to merge your changes into the Laravel core. - -Now that you have created your own branch and have switched to it, it's time to make your changes to the code. Add your new feature or fix that bug. - - -##Committing - -Now that you have finished coding and testing your changes, it's time to commit them to your local repository: - -- Right-click the Laravel directory and goto **Git Commit -> "feature/localization-docs"…** -- Commit - - **Message:** Provide a brief explaination of what you added or changed - - Click **Sign** - This tells the Laravel team know that you personally agree to your code being added to the Laravel core - - **Changes made:** Check all changed/added files - - Click **OK** - - -## Pushing to your Fork - -Now that your local repository has your committed changes, it's time to push (or sync) your new branch to your fork that is hosted in GitHub: - -- Right-click the Laravel directory and goto **Git Sync…** -- Git Syncronization - - **Local Branch:** feature/localization-docs - - **Remote Branch:** leave this blank - - **Remote URL:** fork - - Click **Push** - - When asked for "username:" enter your GitHub *case-sensitive* username - - When asked for "password:" enter your GitHub *case-sensitive* account - -Your branch has been successfully pushed to your fork on GitHub. - - -## Submitting a Pull Request - -The final step is to submit a pull request to the Laravel repository. This means that you are requesting that the Laravel team pull and merge your changes to the Laravel core. In your browser, visit your Laravel fork at [https://github.com/username/laravel](https://github.com/username/laravel). Click on **Pull Request**. Next, make sure you choose the proper base and head repositories and branches: - -- **base repo:** laravel/laravel -- **base branch:** develop -- **head repo:** username/laravel -- **head branch:** feature/localization-docs - -Use the form to write a more detailed description of the changes you made and why you made them. Finally, click **Send pull request**. That's it! The changes you made have been submitted to the Laravel team. - - -## What's Next? - -Do you have another feature you want to add or another bug you need to fix? Just follow the same instructions as before in the [Creating Branches](#creating-branches) section. Just remember to always create a new branch for every new feature/fix and don't forget to always base your new branches off of the *remotes/origin/develop* branch. diff --git a/laravel/documentation/controllers.md b/laravel/documentation/controllers.md deleted file mode 100644 index 7bece18b..00000000 --- a/laravel/documentation/controllers.md +++ /dev/null @@ -1,206 +0,0 @@ -# Controllers - -## Contents - -- [The Basics](#the-basics) -- [Controller Routing](#controller-routing) -- [Bundle Controllers](#bundle-controllers) -- [Action Filters](#action-filters) -- [Nested Controllers](#nested-controllers) -- [Controller Layouts](#controller-layouts) -- [RESTful Controllers](#restful-controllers) -- [Dependency Injection](#dependency-injection) -- [Controller Factory](#controller-factory) - - -## The Basics - -Controllers are classes that are responsible for accepting user input and managing interactions between models, libraries, and views. Typically, they will ask a model for data, and then return a view that presents that data to the user. - -The usage of controllers is the most common method of implementing application logic in modern web-development. However, Laravel also empowers developers to implement their application logic within routing declarations. This is explored in detail in the [routing document](/docs/routing). New users are encouraged to start with controllers. There is nothing that route-based application logic can do that controllers can't. - -Controller classes should be stored in **application/controllers** and should extend the Base\_Controller class. A Home\_Controller class is included with Laravel. - -#### Creating a simple controller: - - class Admin_Controller extends Base_Controller - { - - public function action_index() - { - // - } - - } - -**Actions** are the name of controller methods that are intended to be web-accessible. Actions should be prefixed with "action\_". All other methods, regardless of scope, will not be web-accessible. - -> **Note:** The Base\_Controller class extends the main Laravel Controller class, and gives you a convenient place to put methods that are common to many controllers. - - -## Controller Routing - -It is important to be aware that all routes in Laravel must be explicitly defined, including routes to controllers. - -This means that controller methods that have not been exposed through route registration **cannot** be accessed. It's possible to automatically expose all methods within a controller using controller route registration. Controller route registrations are typically defined in **application/routes.php**. - -Check [the routing page](/docs/routing#controller-routing) for more information on routing to controllers. - - -## Bundle Controllers - -Bundles are Laravel's modular package system. Bundles can be easily configured to handle requests to your application. We'll be going over [bundles in more detail](/docs/bundles) in another document. - -Creating controllers that belong to bundles is almost identical to creating your application controllers. Just prefix the controller class name with the name of the bundle, so if your bundle is named "admin", your controller classes would look like this: - -#### Creating a bundle controller class: - - class Admin_Home_Controller extends Base_Controller - { - - public function action_index() - { - return "Hello Admin!"; - } - - } - -But, how do you register a bundle controller with the router? It's simple. Here's what it looks like: - -#### Registering a bundle's controller with the router: - - Route::controller('admin::home'); - -Great! Now we can access our "admin" bundle's home controller from the web! - -> **Note:** Throughout Laravel the double-colon syntax is used to denote bundles. More information on bundles can be found in the [bundle documentation](/docs/bundles). - - -## Action Filters - -Action filters are methods that can be run before or after a controller action. With Laravel you don't only have control over which filters are assigned to which actions. But, you can also choose which http verbs (post, get, put, and delete) will activate a filter. - -You can assign "before" and "after" filters to controller actions within the controller's constructor. - -#### Attaching a filter to all actions: - - $this->filter('before', 'auth'); - -In this example the 'auth' filter will be run before every action within this controller. The auth action comes out-of-the-box with Laravel and can be found in **application/routes.php**. The auth filter verifies that a user is logged in and redirects them to 'login' if they are not. - -#### Attaching a filter to only some actions: - - $this->filter('before', 'auth')->only(array('index', 'list')); - -In this example the auth filter will be run before the action_index() or action_list() methods are run. Users must be logged in before having access to these pages. However, no other actions within this controller require an authenticated session. - -#### Attaching a filter to all except a few actions: - - $this->filter('before', 'auth')->except(array('add', 'posts')); - -Much like the previous example, this declaration ensures that the auth filter is run on only some of this controller's actions. Instead of declaring to which actions the filter applies we are instead declaring the actions that will not require authenticated sessions. It can sometimes be safer to use the 'except' method as it's possible to add new actions to this controller and to forget to add them to only(). This could potentially lead your controller's action being unintentionally accessible by users who haven't been authenticated. - -#### Attaching a filter to run on POST: - - $this->filter('before', 'csrf')->on('post'); - -This example shows how a filter can be run only on a specific http verb. In this case we're running the csrf filter only when a form post is made. The csrf filter is designed to prevent form posts from other systems (spam bots for example) and comes by default with Laravel. You can find the csrf filter in **application/routes.php**. - -*Further Reading:* - -- *[Route Filters](/docs/routing#filters)* - - -## Nested Controllers - -Controllers may be located within any number of sub-directories within the main **application/controllers** folder. - -Define the controller class and store it in **controllers/admin/panel.php**. - - class Admin_Panel_Controller extends Base_Controller - { - - public function action_index() - { - // - } - - } - -#### Register the nested controller with the router using "dot" syntax: - - Route::controller('admin.panel'); - -> **Note:** When using nested controllers, always register your controllers from most nested to least nested in order to avoid shadowing controller routes. - -#### Access the "index" action of the controller: - - http://localhost/admin/panel - - -## Controller Layouts - -Full documentation on using layouts with Controllers [can be found on the Templating page](/docs/views/templating). - - -## RESTful Controllers - -Instead of prefixing controller actions with "action_", you may prefix them with the HTTP verb they should respond to. - -#### Adding the RESTful property to the controller: - - class Home_Controller extends Base_Controller - { - - public $restful = true; - - } - -#### Building RESTful controller actions: - - class Home_Controller extends Base_Controller - { - - public $restful = true; - - public function get_index() - { - // - } - - public function post_index() - { - // - } - - } - -This is particularly useful when building CRUD methods as you can separate the logic which populates and renders a form from the logic that validates and stores the results. - - -## Dependency Injection - -If you are focusing on writing testable code, you will probably want to inject dependencies into the constructor of your controller. No problem. Just register your controller in the [IoC container](/docs/ioc). When registering the controller with the container, prefix the key with **controller**. So, in our **application/start.php** file, we could register our user controller like so: - - IoC::register('controller: user', function() - { - return new User_Controller; - }); - -When a request to a controller enters your application, Laravel will automatically determine if the controller is registered in the container, and if it is, will use the container to resolve an instance of the controller. - -> **Note:** Before diving into controller dependency injection, you may wish to read the documentation on Laravel's beautiful [IoC container](/docs/ioc). - - -## Controller Factory - -If you want even more control over the instantiation of your controllers, such as using a third-party IoC container, you'll need to use the Laravel controller factory. - -**Register an event to handle controller instantiation:** - - Event::listen(Controller::factory, function($controller) - { - return new $controller; - }); - -The event will receive the class name of the controller that needs to be resolved. All you need to do is return an instance of the controller. diff --git a/laravel/documentation/database/config.md b/laravel/documentation/database/config.md deleted file mode 100644 index b593dbc6..00000000 --- a/laravel/documentation/database/config.md +++ /dev/null @@ -1,70 +0,0 @@ -# Database Configuration - -## Contents - -- [Quick Start Using SQLite](#quick) -- [Configuring Other Databases](#server) -- [Setting The Default Connection Name](#default) -- [Overwriting The Default PDO Options](#options) - -Laravel supports the following databases out of the box: - -- MySQL -- PostgreSQL -- SQLite -- SQL Server - -All of the database configuration options live in the **application/config/database.php** file. - - -## Quick Start Using SQLite - -[SQLite](http://sqlite.org) is an awesome, zero-configuration database system. By default, Laravel is configured to use a SQLite database. Really, you don't have to change anything. Just drop a SQLite database named **application.sqlite** into the **application/storage/database** directory. You're done. - -Of course, if you want to name your database something besides "application", you can modify the database option in the SQLite section of the **application/config/database.php** file: - - 'sqlite' => array( - 'driver' => 'sqlite', - 'database' => 'your_database_name', - ) - -If your application receives less than 100,000 hits per day, SQLite should be suitable for production use in your application. Otherwise, consider using MySQL or PostgreSQL. - -> **Note:** Need a good SQLite manager? Check out this [Firefox extension](https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/). - - -## Configuring Other Databases - -If you are using MySQL, SQL Server, or PostgreSQL, you will need to edit the configuration options in **application/config/database.php**. In the configuration file you can find sample configurations for each of these systems. Just change the options as necessary for your server and set the default connection name. - - -## Setting The Default Connection Name - -As you have probably noticed, each database connection defined in the **application/config/database.php** file has a name. By default, there are three connections defined: **sqlite**, **mysql**, **sqlsrv**, and **pgsql**. You are free to change these connection names. The default connection can be specified via the **default** option: - - 'default' => 'sqlite'; - -The default connection will always be used by the [fluent query builder](/docs/database/fluent). If you need to change the default connection during a request, use the **Config::set** method. - - -##Overwriting The Default PDO Options - -The PDO connector class (**laravel/database/connectors/connector.php**) has a set of default PDO attributes defined which can be overwritten in the options array for each system. For example, one of the default attributes is to force column names to lowercase (**PDO::CASE_LOWER**) even if they are defined in UPPERCASE or CamelCase in the table. Therefore, under the default attributes, query result object variables would only be accessible in lowercase. -An example of the MySQL system settings with added default PDO attributes: - - 'mysql' => array( - 'driver' => 'mysql', - 'host' => 'localhost', - 'database' => 'database', - 'username' => 'root', - 'password' => '', - 'charset' => 'utf8', - 'prefix' => '', - PDO::ATTR_CASE => PDO::CASE_LOWER, - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, - PDO::ATTR_STRINGIFY_FETCHES => false, - PDO::ATTR_EMULATE_PREPARES => false, - ), - -More about the PDO connection attributes can be found [in the PHP manual](http://php.net/manual/en/pdo.setattribute.php). \ No newline at end of file diff --git a/laravel/documentation/database/eloquent.md b/laravel/documentation/database/eloquent.md deleted file mode 100644 index 81a9973f..00000000 --- a/laravel/documentation/database/eloquent.md +++ /dev/null @@ -1,565 +0,0 @@ -# Eloquent ORM - -## Contents - -- [The Basics](#the-basics) -- [Conventions](#conventions) -- [Retrieving Models](#get) -- [Aggregates](#aggregates) -- [Inserting & Updating Models](#save) -- [Relationships](#relationships) -- [Inserting Related Models](#inserting-related-models) -- [Working With Intermediate Tables](#intermediate-tables) -- [Eager Loading](#eager) -- [Constraining Eager Loads](#constraining-eager-loads) -- [Setter & Getter Methods](#getter-and-setter-methods) -- [Mass-Assignment](#mass-assignment) -- [Converting Models To Arrays](#to-array) -- [Deleting Models](#delete) - - -## The Basics - -An ORM is an [object-relational mapper](http://en.wikipedia.org/wiki/Object-relational_mapping), and Laravel has one that you will absolutely love to use. It is named "Eloquent" because it allows you to work with your database objects and relationships using an eloquent and expressive syntax. In general, you will define one Eloquent model for each table in your database. To get started, let's define a simple model: - - class User extends Eloquent {} - -Nice! Notice that our model extends the **Eloquent** class. This class will provide all of the functionality you need to start working eloquently with your database. - -> **Note:** Typically, Eloquent models live in the **application/models** directory. - - -## Conventions - -Eloquent makes a few basic assumptions about your database structure: - -- Each table should have a primary key named **id**. -- Each table name should be the plural form of its corresponding model name. - -Sometimes you may wish to use a table name other than the plural form of your model, or a different primary key column. No problem. Just add a static **table** property your model: - - class User extends Eloquent { - - public static $table = 'my_users'; - - public static $key = 'my_primary_key'; - - } - - -## Retrieving Models - -Retrieving models using Eloquent is refreshingly simple. The most basic way to retrieve an Eloquent model is the static **find** method. This method will return a single model by primary key with properties corresponding to each column on the table: - - $user = User::find(1); - - echo $user->email; - -The find method will execute a query that looks something like this: - - SELECT * FROM "users" WHERE "id" = 1 - -Need to retrieve an entire table? Just use the static **all** method: - - $users = User::all(); - - foreach ($users as $user) - { - echo $user->email; - } - -Of course, retrieving an entire table isn't very helpful. Thankfully, **every method that is available through the fluent query builder is available in Eloquent**. Just begin querying your model with a static call to one of the [query builder](/docs/database/fluent) methods, and execute the query using the **get** or **first** method. The get method will return an array of models, while the first method will return a single model: - - $user = User::where('email', '=', $email)->first(); - - $user = User::where_email($email)->first(); - - $users = User::where_in('id', array(1, 2, 3))->or_where('email', '=', $email)->get(); - - $users = User::order_by('votes', 'desc')->take(10)->get(); - -> **Note:** If no results are found, the **first** method will return NULL. The **all** and **get** methods return an empty array. - - -## Aggregates - -Need to get a **MIN**, **MAX**, **AVG**, **SUM**, or **COUNT** value? Just pass the column to the appropriate method: - - $min = User::min('id'); - - $max = User::max('id'); - - $avg = User::avg('id'); - - $sum = User::sum('id'); - - $count = User::count(); - -Of course, you may wish to limit the query using a WHERE clause first: - - $count = User::where('id', '>', 10)->count(); - - -## Inserting & Updating Models - -Inserting Eloquent models into your tables couldn't be easier. First, instantiate a new model. Second, set its properties. Third, call the **save** method: - - $user = new User; - - $user->email = 'example@gmail.com'; - $user->password = 'secret'; - - $user->save(); - -Alternatively, you may use the **create** method, which will insert a new record into the database and return the model instance for the newly inserted record, or **false** if the insert failed. - - $user = User::create(array('email' => 'example@gmail.com')); - -Updating models is just as simple. Instead of instantiating a new model, retrieve one from your database. Then, set its properties and save: - - $user = User::find(1); - - $user->email = 'new_email@gmail.com'; - $user->password = 'new_secret'; - - $user->save(); - -Need to maintain creation and update timestamps on your database records? With Eloquent, you don't have to worry about it. Just add a static **timestamps** property to your model: - - class User extends Eloquent { - - public static $timestamps = true; - - } - -Next, add **created_at** and **updated_at** date columns to your table. Now, whenever you save the model, the creation and update timestamps will be set automatically. You're welcome. - -In some cases it may be useful to update the **updated_at** date column without actually modifying any data within the model. Simply use the **touch** method, which will also automatically save the changes immediately: - - $comment = Comment::find(1); - $comment->touch(); - -You can also use the **timestamp** function to update the **updated_at** date column without saving the model immediately. Note that if you are actually modifying the model's data this is handled behind the scenes: - - $comment = Comment::find(1); - $comment->timestamp(); - //do something else here, but not modifying the $comment model data - $comment->save(); - -> **Note:** You can change the default timezone of your application in the **application/config/application.php** file. - - -## Relationships - -Unless you're doing it wrong, your database tables are probably related to one another. For instance, an order may belong to a user. Or, a post may have many comments. Eloquent makes defining relationships and retrieving related models simple and intuitive. Laravel supports three types of relationships: - -- [One-To-One](#one-to-one) -- [One-To-Many](#one-to-many) -- [Many-To-Many](#many-to-many) - -To define a relationship on an Eloquent model, you simply create a method that returns the result of either the **has\_one**, **has\_many**, **belongs\_to**, or **has\_many\_and\_belongs\_to** method. Let's examine each one in detail. - - -### One-To-One - -A one-to-one relationship is the most basic form of relationship. For example, let's pretend a user has one phone. Simply describe this relationship to Eloquent: - - class User extends Eloquent { - - public function phone() - { - return $this->has_one('Phone'); - } - - } - -Notice that the name of the related model is passed to the **has_one** method. You can now retrieve the phone of a user through the **phone** method: - - $phone = User::find(1)->phone()->first(); - -Let's examine the SQL performed by this statement. Two queries will be performed: one to retrieve the user and one to retrieve the user's phone: - - SELECT * FROM "users" WHERE "id" = 1 - - SELECT * FROM "phones" WHERE "user_id" = 1 - -Note that Eloquent assumes the foreign key of the relationship will be **user\_id**. Most foreign keys will follow this **model\_id** convention; however, if you want to use a different column name as the foreign key, just pass it in the second parameter to the method: - - return $this->has_one('Phone', 'my_foreign_key'); - -Want to just retrieve the user's phone without calling the first method? No problem. Just use the **dynamic phone property**. Eloquent will automatically load the relationship for you, and is even smart enough to know whether to call the get (for one-to-many relationships) or first (for one-to-one relationships) method: - - $phone = User::find(1)->phone; - -What if you need to retrieve a phone's user? Since the foreign key (**user\_id**) is on the phones table, we should describe this relationship using the **belongs\_to** method. It makes sense, right? Phones belong to users. When using the **belongs\_to** method, the name of the relationship method should correspond to the foreign key (sans the **\_id**). Since the foreign key is **user\_id**, your relationship method should be named **user**: - - class Phone extends Eloquent { - - public function user() - { - return $this->belongs_to('User'); - } - - } - -Great! You can now access a User model through a Phone model using either your relationship method or dynamic property: - - echo Phone::find(1)->user()->first()->email; - - echo Phone::find(1)->user->email; - - -### One-To-Many - -Assume a blog post has many comments. It's easy to define this relationship using the **has_many** method: - - class Post extends Eloquent { - - public function comments() - { - return $this->has_many('Comment'); - } - - } - -Now, simply access the post comments through the relationship method or dynamic property: - - $comments = Post::find(1)->comments()->get(); - - $comments = Post::find(1)->comments; - -Both of these statements will execute the following SQL: - - SELECT * FROM "posts" WHERE "id" = 1 - - SELECT * FROM "comments" WHERE "post_id" = 1 - -Want to join on a different foreign key? No problem. Just pass it in the second parameter to the method: - - return $this->has_many('Comment', 'my_foreign_key'); - -You may be wondering: _If the dynamic properties return the relationship and require less keystrokes, why would I ever use the relationship methods?_ Actually, relationship methods are very powerful. They allow you to continue to chain query methods before retrieving the relationship. Check this out: - - echo Post::find(1)->comments()->order_by('votes', 'desc')->take(10)->get(); - - -### Many-To-Many - -Many-to-many relationships are the most complicated of the three relationships. But don't worry, you can do this. For example, assume a User has many Roles, but a Role can also belong to many Users. Three database tables must be created to accomplish this relationship: a **users** table, a **roles** table, and a **role_user** table. The structure for each table looks like this: - -**users:** - - id - INTEGER - email - VARCHAR - -**roles:** - - id - INTEGER - name - VARCHAR - -**role_user:** - - id - INTEGER - user_id - INTEGER - role_id - INTEGER - -Tables contain many records and are consequently plural. Pivot tables used in **has\_many\_and\_belongs\_to** relationships are named by combining the singular names of the two related models arranged alphabetically and concatenating them with an underscore. - -Now you're ready to define the relationship on your models using the **has\_many\_and\_belongs\_to** method: - - class User extends Eloquent { - - public function roles() - { - return $this->has_many_and_belongs_to('Role'); - } - - } - -Great! Now it's time to retrieve a user's roles: - - $roles = User::find(1)->roles()->get(); - -Or, as usual, you may retrieve the relationship through the dynamic roles property: - - $roles = User::find(1)->roles; - -If your table names don't follow conventions, simply pass the table name in the second parameter to the **has\_and\_belongs\_to\_many** method: - - class User extends Eloquent { - - public function roles() - { - return $this->has_many_and_belongs_to('Role', 'user_roles'); - } - - } - -By default only certain fields from the pivot table will be returned (the two **id** fields, and the timestamps). If your pivot table contains additional columns, you can fetch them too by using the **with()** method : - - class User extends Eloquent { - - public function roles() - { - return $this->has_many_and_belongs_to('Role', 'user_roles')->with('column'); - } - - } - - -## Inserting Related Models - -Let's assume you have a **Post** model that has many comments. Often you may want to insert a new comment for a given post. Instead of manually setting the **post_id** foreign key on your model, you may insert the new comment from it's owning Post model. Here's what it looks like: - - $comment = new Comment(array('message' => 'A new comment.')); - - $post = Post::find(1); - - $comment = $post->comments()->insert($comment); - -When inserting related models through their parent model, the foreign key will automatically be set. So, in this case, the "post_id" was automatically set to "1" on the newly inserted comment. - - -When working with `has_many` relationships, you may use the `save` method to insert / update related models: - - $comments = array( - array('message' => 'A new comment.'), - array('message' => 'A second comment.'), - ); - - $post = Post::find(1); - - $post->comments()->save($comments); - -### Inserting Related Models (Many-To-Many) - -This is even more helpful when working with many-to-many relationships. For example, consider a **User** model that has many roles. Likewise, the **Role** model may have many users. So, the intermediate table for this relationship has "user_id" and "role_id" columns. Now, let's insert a new Role for a User: - - $role = new Role(array('title' => 'Admin')); - - $user = User::find(1); - - $role = $user->roles()->insert($role); - -Now, when the Role is inserted, not only is the Role inserted into the "roles" table, but a record in the intermediate table is also inserted for you. It couldn't be easier! - -However, you may often only want to insert a new record into the intermediate table. For example, perhaps the role you wish to attach to the user already exists. Just use the attach method: - - $user->roles()->attach($role_id); - -It's also possible to attach data for fields in the intermediate table (pivot table), to do this add a second array variable to the attach command containing the data you want to attach: - - $user->roles()->attach($role_id, array('expires' => $expires)); - - -Alternatively, you can use the `sync` method, which accepts an array of IDs to "sync" with the intermediate table. After this operation is complete, only the IDs in the array will be on the intermediate table. - - $user->roles()->sync(array(1, 2, 3)); - - -## Working With Intermediate Tables - -As your probably know, many-to-many relationships require the presence of an intermediate table. Eloquent makes it a breeze to maintain this table. For example, let's assume we have a **User** model that has many roles. And, likewise, a **Role** model that has many users. So the intermediate table has "user_id" and "role_id" columns. We can access the pivot table for the relationship like so: - - $user = User::find(1); - - $pivot = $user->roles()->pivot(); - -Once we have an instance of the pivot table, we can use it just like any other Eloquent model: - - foreach ($user->roles()->pivot()->get() as $row) - { - // - } - -You may also access the specific intermediate table row associated with a given record. For example: - - $user = User::find(1); - - foreach ($user->roles as $role) - { - echo $role->pivot->created_at; - } - -Notice that each related **Role** model we retrieved is automatically assigned a **pivot** attribute. This attribute contains a model representing the intermediate table record associated with that related model. - -Sometimes you may wish to remove all of the record from the intermediate table for a given model relationship. For instance, perhaps you want to remove all of the assigned roles from a user. Here's how to do it: - - $user = User::find(1); - - $user->roles()->delete(); - -Note that this does not delete the roles from the "roles" table, but only removes the records from the intermediate table which associated the roles with the given user. - - -## Eager Loading - -Eager loading exists to alleviate the N + 1 query problem. Exactly what is this problem? Well, pretend each Book belongs to an Author. We would describe this relationship like so: - - class Book extends Eloquent { - - public function author() - { - return $this->belongs_to('Author'); - } - - } - -Now, examine the following code: - - foreach (Book::all() as $book) - { - echo $book->author->name; - } - -How many queries will be executed? Well, one query will be executed to retrieve all of the books from the table. However, another query will be required for each book to retrieve the author. To display the author name for 25 books would require **26 queries**. See how the queries can add up fast? - -Thankfully, you can eager load the author models using the **with** method. Simply mention the **function name** of the relationship you wish to eager load: - - foreach (Book::with('author')->get() as $book) - { - echo $book->author->name; - } - -In this example, **only two queries will be executed**! - - SELECT * FROM "books" - - SELECT * FROM "authors" WHERE "id" IN (1, 2, 3, 4, 5, …) - -Obviously, wise use of eager loading can dramatically increase the performance of your application. In the example above, eager loading cut the execution time in half. - -Need to eager load more than one relationship? It's easy: - - $books = Book::with(array('author', 'publisher'))->get(); - -> **Note:** When eager loading, the call to the static **with** method must always be at the beginning of the query. - -You may even eager load nested relationships. For example, let's assume our **Author** model has a "contacts" relationship. We can eager load both of the relationships from our Book model like so: - - $books = Book::with(array('author', 'author.contacts'))->get(); - -If you find yourself eager loading the same models often, you may want to use **$includes** in the model. - - class Book extends Eloquent { - - public $includes = array('author'); - - public function author() - { - return $this->belongs_to('Author'); - } - - } - -**$includes** takes the same arguments that **with** takes. The following is now eagerly loaded. - - foreach (Book::all() as $book) - { - echo $book->author->name; - } - -> **Note:** Using **with** will override a models **$includes**. - - -## Constraining Eager Loads - -Sometimes you may wish to eager load a relationship, but also specify a condition for the eager load. It's simple. Here's what it looks like: - - $users = User::with(array('posts' => function($query) - { - $query->where('title', 'like', '%first%'); - - }))->get(); - -In this example, we're eager loading the posts for the users, but only if the post's "title" column contains the word "first". - - -## Getter & Setter Methods - -Setters allow you to handle attribute assignment with custom methods. Define a setter by appending "set_" to the intended attribute's name. - - public function set_password($password) - { - $this->set_attribute('hashed_password', Hash::make($password)); - } - -Call a setter method as a variable (without parenthesis) using the name of the method without the "set_" prefix. - - $this->password = "my new password"; - -Getters are very similar. They can be used to modify attributes before they're returned. Define a getter by appending "get_" to the intended attribute's name. - - public function get_published_date() - { - return date('M j, Y', $this->get_attribute('published_at')); - } - -Call the getter method as a variable (without parenthesis) using the name of the method without the "get_" prefix. - - echo $this->published_date; - - -## Mass-Assignment - -Mass-assignment is the practice of passing an associative array to a model method which then fills the model's attributes with the values from the array. Mass-assignment can be done by passing an array to the model's constructor: - - $user = new User(array( - 'username' => 'first last', - 'password' => 'disgaea' - )); - - $user->save(); - -Or, mass-assignment may be accomplished using the **fill** method. - - $user = new User; - - $user->fill(array( - 'username' => 'first last', - 'password' => 'disgaea' - )); - - $user->save(); - -By default, all attribute key/value pairs will be stored during mass-assignment. However, it is possible to create a white-list of attributes that will be set. If the accessible attribute white-list is set then no attributes other than those specified will be set during mass-assignment. - -You can specify accessible attributes by assigning the **$accessible** static array. Each element contains the name of a white-listed attribute. - - public static $accessible = array('email', 'password', 'name'); - -Alternatively, you may use the **accessible** method from your model: - - User::accessible(array('email', 'password', 'name')); - -> **Note:** Utmost caution should be taken when mass-assigning using user-input. Technical oversights could cause serious security vulnerabilities. - - -## Converting Models To Arrays - -When building JSON APIs, you will often need to convert your models to array so they can be easily serialized. It's really simple. - -#### Convert a model to an array: - - return json_encode($user->to_array()); - -The `to_array` method will automatically grab all of the attributes on your model, as well as any loaded relationships. - -Sometimes you may wish to limit the attributes that are included in your model's array, such as passwords. To do this, add a `hidden` attribute definition to your model: - -#### Excluding attributes from the array: - - class User extends Eloquent { - - public static $hidden = array('password'); - - } - - -## Deleting Models - -Because Eloquent inherits all the features and methods of Fluent queries, deleting models is a snap: - - $author->delete(); - -Note, however, than this won't delete any related models (e.g. all the author's Book models will still exist), unless you have set up [foreign keys](/docs/database/schema#foreign-keys) and cascading deletes. diff --git a/laravel/documentation/database/fluent.md b/laravel/documentation/database/fluent.md deleted file mode 100644 index 307488ea..00000000 --- a/laravel/documentation/database/fluent.md +++ /dev/null @@ -1,304 +0,0 @@ -# Fluent Query Builder - -## Contents - -- [The Basics](#the-basics) -- [Retrieving Records](#get) -- [Building Where Clauses](#where) -- [Nested Where Clauses](#nested-where) -- [Dynamic Where Clauses](#dynamic) -- [Table Joins](#joins) -- [Ordering Results](#ordering) -- [Grouping Results](#grouping) -- [Skip & Take](#limit) -- [Aggregates](#aggregates) -- [Expressions](#expressions) -- [Inserting Records](#insert) -- [Updating Records](#update) -- [Deleting Records](#delete) - -## The Basics - -The Fluent Query Builder is Laravel's powerful fluent interface for building SQL queries and working with your database. All queries use prepared statements and are protected against SQL injection. - -You can begin a fluent query using the **table** method on the DB class. Just mention the table you wish to query: - - $query = DB::table('users'); - -You now have a fluent query builder for the "users" table. Using this query builder, you can retrieve, insert, update, or delete records from the table. - - -## Retrieving Records - -#### Retrieving an array of records from the database: - - $users = DB::table('users')->get(); - -> **Note:** The **get** method returns an array of objects with properties corresponding to the column on the table. - -#### Retrieving a single record from the database: - - $user = DB::table('users')->first(); - -#### Retrieving a single record by its primary key: - - $user = DB::table('users')->find($id); - -> **Note:** If no results are found, the **first** method will return NULL. The **get** method will return an empty array. - -#### Retrieving the value of a single column from the database: - - $email = DB::table('users')->where('id', '=', 1)->only('email'); - -#### Only selecting certain columns from the database: - - $user = DB::table('users')->get(array('id', 'email as user_email')); - -#### Retrieving an array with the values of a given column: - - $users = DB::table('users')->take(10)->lists('email', 'id'); - -> **Note:** Second parameter is optional - -#### Selecting distinct results from the database: - - $user = DB::table('users')->distinct()->get(); - - -## Building Where Clauses - -### where and or\_where - -There are a variety of methods to assist you in building where clauses. The most basic of these methods are the **where** and **or_where** methods. Here is how to use them: - - return DB::table('users') - ->where('id', '=', 1) - ->or_where('email', '=', 'example@gmail.com') - ->first(); - -Of course, you are not limited to simply checking equality. You may also use **greater-than**, **less-than**, **not-equal**, and **like**: - - return DB::table('users') - ->where('id', '>', 1) - ->or_where('name', 'LIKE', '%Taylor%') - ->first(); - -As you may have assumed, the **where** method will add to the query using an AND condition, while the **or_where** method will use an OR condition. - -### where\_in, where\_not\_in, or\_where\_in, and or\_where\_not\_in - -The suite of **where_in** methods allows you to easily construct queries that search an array of values: - - DB::table('users')->where_in('id', array(1, 2, 3))->get(); - - DB::table('users')->where_not_in('id', array(1, 2, 3))->get(); - - DB::table('users') - ->where('email', '=', 'example@gmail.com') - ->or_where_in('id', array(1, 2, 3)) - ->get(); - - DB::table('users') - ->where('email', '=', 'example@gmail.com') - ->or_where_not_in('id', array(1, 2, 3)) - ->get(); - -### where\_null, where\_not\_null, or\_where\_null, and or\_where\_not\_null - -The suite of **where_null** methods makes checking for NULL values a piece of cake: - - return DB::table('users')->where_null('updated_at')->get(); - - return DB::table('users')->where_not_null('updated_at')->get(); - - return DB::table('users') - ->where('email', '=', 'example@gmail.com') - ->or_where_null('updated_at') - ->get(); - - return DB::table('users') - ->where('email', '=', 'example@gmail.com') - ->or_where_not_null('updated_at') - ->get(); - -### where\_between, where\_not\_between, or\_where\_between, and or\_where\_not\_between - -The suite of **where_between** methods makes checking if values fall BETWEEN a minimum and maximum super easy : - - return DB::table('users')->where_between($column, $min, $max)->get(); - - return DB::table('users')->where_between('updated_at', '2000-10-10', '2012-10-10')->get(); - - return DB::table('users')->where_not_between('updated_at', '2000-10-10', '2012-01-01')->get(); - - return DB::table('users') - ->where('email', '=', 'example@gmail.com') - ->or_where_between('updated_at', '2000-10-10', '2012-01-01') - ->get(); - - return DB::table('users') - ->where('email', '=', 'example@gmail.com') - ->or_where_not_between('updated_at', '2000-10-10', '2012-01-01') - ->get(); - - -## Nested Where Clauses - -You may discover the need to group portions of a WHERE clause within parentheses. Just pass a Closure as parameter to the **where** or **or_where** methods: - - $users = DB::table('users') - ->where('id', '=', 1) - ->or_where(function($query) - { - $query->where('age', '>', 25); - $query->where('votes', '>', 100); - }) - ->get(); - -The example above would generate a query that looks like: - - SELECT * FROM "users" WHERE "id" = ? OR ("age" > ? AND "votes" > ?) - - -## Dynamic Where Clauses - -Dynamic where methods are great way to increase the readability of your code. Here are some examples: - - $user = DB::table('users')->where_email('example@gmail.com')->first(); - - $user = DB::table('users')->where_email_and_password('example@gmail.com', 'secret'); - - $user = DB::table('users')->where_id_or_name(1, 'Fred'); - - - -## Table Joins - -Need to join to another table? Try the **join** and **left\_join** methods: - - DB::table('users') - ->join('phone', 'users.id', '=', 'phone.user_id') - ->get(array('users.email', 'phone.number')); - -The **table** you wish to join is passed as the first parameter. The remaining three parameters are used to construct the **ON** clause of the join. - -Once you know how to use the join method, you know how to **left_join**. The method signatures are the same: - - DB::table('users') - ->left_join('phone', 'users.id', '=', 'phone.user_id') - ->get(array('users.email', 'phone.number')); - -You may also specify multiple conditions for an **ON** clause by passing a Closure as the second parameter of the join: - - DB::table('users') - ->join('phone', function($join) - { - $join->on('users.id', '=', 'phone.user_id'); - $join->or_on('users.id', '=', 'phone.contact_id'); - }) - ->get(array('users.email', 'phone.number')); - - -## Ordering Results - -You can easily order the results of your query using the **order_by** method. Simply mention the column and direction (desc or asc) of the sort: - - return DB::table('users')->order_by('email', 'desc')->get(); - -Of course, you may sort on as many columns as you wish: - - return DB::table('users') - ->order_by('email', 'desc') - ->order_by('name', 'asc') - ->get(); - - -## Grouping Results - -You can easily group the results of your query using the **group_by** method: - - return DB::table(...)->group_by('email')->get(); - - -## Skip & Take - -If you would like to **LIMIT** the number of results returned by your query, you can use the **take** method: - - return DB::table('users')->take(10)->get(); - -To set the **OFFSET** of your query, use the **skip** method: - - return DB::table('users')->skip(10)->get(); - - -## Aggregates - -Need to get a **MIN**, **MAX**, **AVG**, **SUM**, or **COUNT** value? Just pass the column to the query: - - $min = DB::table('users')->min('age'); - - $max = DB::table('users')->max('weight'); - - $avg = DB::table('users')->avg('salary'); - - $sum = DB::table('users')->sum('votes'); - - $count = DB::table('users')->count(); - -Of course, you may wish to limit the query using a WHERE clause first: - - $count = DB::table('users')->where('id', '>', 10)->count(); - - -## Expressions - -Sometimes you may need to set the value of a column to a SQL function such as **NOW()**. Usually a reference to now() would automatically be quoted and escaped. To prevent this use the **raw** method on the **DB** class. Here's what it looks like: - - DB::table('users')->update(array('updated_at' => DB::raw('NOW()'))); - -The **raw** method tells the query to inject the contents of the expression into the query as a string rather than a bound parameter. For example, you can also use expressions to increment column values: - - DB::table('users')->update(array('votes' => DB::raw('votes + 1'))); - -Of course, convenient methods are provided for **increment** and **decrement**: - - DB::table('users')->increment('votes'); - - DB::table('users')->decrement('votes'); - - -## Inserting Records - -The insert method expects an array of values to insert. The insert method will return true or false, indicating whether the query was successful: - - DB::table('users')->insert(array('email' => 'example@gmail.com')); - -Inserting a record that has an auto-incrementing ID? You can use the **insert\_get\_id** method to insert a record and retrieve the ID: - - $id = DB::table('users')->insert_get_id(array('email' => 'example@gmail.com')); - -> **Note:** The **insert\_get\_id** method expects the name of the auto-incrementing column to be "id". - - -## Updating Records - -To update records simply pass an array of values to the **update** method: - - $affected = DB::table('users')->update(array('email' => 'new_email@gmail.com')); - -Of course, when you only want to update a few records, you should add a WHERE clause before calling the update method: - - $affected = DB::table('users') - ->where('id', '=', 1) - ->update(array('email' => 'new_email@gmail.com')); - - -## Deleting Records - -When you want to delete records from your database, simply call the **delete** method: - - $affected = DB::table('users')->where('id', '=', 1)->delete(); - -Want to quickly delete a record by its ID? No problem. Just pass the ID into the delete method: - - $affected = DB::table('users')->delete(1); \ No newline at end of file diff --git a/laravel/documentation/database/migrations.md b/laravel/documentation/database/migrations.md deleted file mode 100644 index 8ebf7082..00000000 --- a/laravel/documentation/database/migrations.md +++ /dev/null @@ -1,76 +0,0 @@ -# Migrations - -## Contents - -- [The Basics](#the-basics) -- [Prepping Your Database](#prepping-your-database) -- [Creating Migrations](#creating-migrations) -- [Running Migrations](#running-migrations) -- [Rolling Back](#rolling-back) - - -## The Basics - -Think of migrations as a type of version control for your database. Let's say your working on a team, and you all have local databases for development. Good ole' Eric makes a change to the database and checks in his code that uses the new column. You pull in the code, and your application breaks because you don't have the new column. What do you do? Migrations are the answer. Let's dig in deeper to find out how to use them! - - -## Prepping Your Database - -Before you can run migrations, we need to do some work on your database. Laravel uses a special table to keep track of which migrations have already run. To create this table, just use the Artisan command-line: - -**Creating the Laravel migrations table:** - - php artisan migrate:install - - -## Creating Migrations - -You can easily create migrations through Laravel's "Artisan" CLI. It looks like this: - -**Creating a migration** - - php artisan migrate:make create_users_table - -Now, check your **application/migrations** folder. You should see your brand new migration! Notice that it also contains a timestamp. This allows Laravel to run your migrations in the correct order. - -You may also create migrations for a bundle. - -**Creating a migration for a bundle:** - - php artisan migrate:make bundle::create_users_table - -*Further Reading:* - -- [Schema Builder](/docs/database/schema) - - -## Running Migrations - -**Running all outstanding migrations in application and bundles:** - - php artisan migrate - -**Running all outstanding migrations in the application:** - - php artisan migrate application - -**Running all outstanding migrations in a bundle:** - - php artisan migrate bundle - - -## Rolling Back - -When you roll back a migration, Laravel rolls back the entire migration "operation". So, if the last migration command ran 122 migrations, all 122 migrations would be rolled back. - -**Rolling back the last migration operation:** - - php artisan migrate:rollback - -**Roll back all migrations that have ever run:** - - php artisan migrate:reset - -**Roll back everything and run all migrations again:** - - php artisan migrate:rebuild diff --git a/laravel/documentation/database/raw.md b/laravel/documentation/database/raw.md deleted file mode 100644 index 424ba27d..00000000 --- a/laravel/documentation/database/raw.md +++ /dev/null @@ -1,56 +0,0 @@ -# Raw Queries - -## Contents - -- [The Basics](#the-basics) -- [Other Query Methods](#other-query-methods) -- [PDO Connections](#pdo-connections) - - -## The Basics - -The **query** method is used to execute arbitrary, raw SQL against your database connection. - -#### Selecting records from the database: - - $users = DB::query('select * from users'); - -#### Selecting records from the database using bindings: - - $users = DB::query('select * from users where name = ?', array('test')); - -#### Inserting a record into the database - - $success = DB::query('insert into users values (?, ?)', $bindings); - -#### Updating table records and getting the number of affected rows: - - $affected = DB::query('update users set name = ?', $bindings); - -#### Deleting from a table and getting the number of affected rows: - - $affected = DB::query('delete from users where id = ?', array(1)); - - -## Other Query Methods - -Laravel provides a few other methods to make querying your database simple. Here's an overview: - -#### Running a SELECT query and returning the first result: - - $user = DB::first('select * from users where id = 1'); - -#### Running a SELECT query and getting the value of a single column: - - $email = DB::only('select email from users where id = 1'); - - -## PDO Connections - -Sometimes you may wish to access the raw PDO connection behind the Laravel Connection object. - -#### Get the raw PDO connection for a database: - - $pdo = DB::connection('sqlite')->pdo; - -> **Note:** If no connection name is specified, the **default** connection will be returned. \ No newline at end of file diff --git a/laravel/documentation/database/redis.md b/laravel/documentation/database/redis.md deleted file mode 100644 index 42c6d90e..00000000 --- a/laravel/documentation/database/redis.md +++ /dev/null @@ -1,58 +0,0 @@ -# Redis - -## Contents - -- [The Basics](#the-basics) -- [Configuration](#config) -- [Usage](#usage) - - -## The Basics - -[Redis](http://redis.io) is an open source, advanced key-value store. It is often referred to as a data structure server since keys can contain [strings](http://redis.io/topics/data-types#strings), [hashes](http://redis.io/topics/data-types#hashes), [lists](http://redis.io/topics/data-types#lists), [sets](http://redis.io/topics/data-types#sets), and [sorted sets](http://redis.io/topics/data-types#sorted-sets). - - -## Configuration - -The Redis configuration for your application lives in the **application/config/database.php** file. Within this file, you will see a **redis** array containing the Redis servers used by your application: - - 'redis' => array( - - 'default' => array('host' => '127.0.0.1', 'port' => 6379), - - ), - -The default server configuration should suffice for development. However, you are free to modify this array based on your environment. Simply give each Redis server a name, and specify the host and port used by the server. - - -## Usage - -You may get a Redis instance by calling the **db** method on the **Redis** class: - - $redis = Redis::db(); - -This will give you an instance of the **default** Redis server. You may pass the server name to the **db** method to get a specific server as defined in your Redis configuration: - - $redis = Redis::db('redis_2'); - -Great! Now that we have an instance of the Redis client, we may issue any of the [Redis commands](http://redis.io/commands) to the instance. Laravel uses magic methods to pass the commands to the Redis server: - - $redis->set('name', 'Taylor'); - - $name = $redis->get('name'); - - $values = $redis->lrange('names', 5, 10); - -Notice the arguments to the command are simply passed into the magic method. Of course, you are not required to use the magic methods, you may also pass commands to the server using the **run** method: - - $values = $redis->run('lrange', array(5, 10)); - -Just want to execute commands on the default Redis server? You can just use static magic methods on the Redis class: - - Redis::set('name', 'Taylor'); - - $name = Redis::get('name'); - - $values = Redis::lrange('names', 5, 10); - -> **Note:** Redis [cache](/docs/cache/config#redis) and [session](/docs/session/config#redis) drivers are included with Laravel. \ No newline at end of file diff --git a/laravel/documentation/database/schema.md b/laravel/documentation/database/schema.md deleted file mode 100644 index 904edbba..00000000 --- a/laravel/documentation/database/schema.md +++ /dev/null @@ -1,154 +0,0 @@ -# Schema Builder - -## Contents - -- [The Basics](#the-basics) -- [Creating & Dropping Tables](#creating-dropping-tables) -- [Adding Columns](#adding-columns) -- [Dropping Columns](#dropping-columns) -- [Adding Indexes](#adding-indexes) -- [Dropping Indexes](#dropping-indexes) -- [Foreign Keys](#foreign-keys) - - -## The Basics - -The Schema Builder provides methods for creating and modifying your database tables. Using a fluent syntax, you can work with your tables without using any vendor specific SQL. - -*Further Reading:* - -- [Migrations](/docs/database/migrations) - - -## Creating & Dropping Tables - -The **Schema** class is used to create and modify tables. Let's jump right into an example: - -#### Creating a simple database table: - - Schema::create('users', function($table) - { - $table->increments('id'); - }); - -Let's go over this example. The **create** method tells the Schema builder that this is a new table, so it should be created. In the second argument, we passed a Closure which receives a Table instance. Using this Table object, we can fluently add and drop columns and indexes on the table. - -#### Dropping a table from the database: - - Schema::drop('users'); - -#### Dropping a table from a given database connection: - - Schema::drop('users', 'connection_name'); - -Sometimes you may need to specify the database connection on which the schema operation should be performed. - -#### Specifying the connection to run the operation on: - - Schema::create('users', function($table) - { - $table->on('connection'); - }); - - -## Adding Columns - -The fluent table builder's methods allow you to add columns without using vendor specific SQL. Let's go over it's methods: - -Command | Description -------------- | ------------- -`$table->increments('id');` | Incrementing ID to the table -`$table->string('email');` | VARCHAR equivalent column -`$table->string('name', 100);` | VARCHAR equivalent with a length -`$table->integer('votes');` | INTEGER equivalent to the table -`$table->float('amount');` | FLOAT equivalent to the table -`$table->decimal('amount', 5, 2);` | DECIMAL equivalent with a precision and scale -`$table->boolean('confirmed');` | BOOLEAN equivalent to the table -`$table->date('created_at');` | DATE equivalent to the table -`$table->timestamp('added_on');` | TIMESTAMP equivalent to the table -`$table->timestamps();` | Adds **created\_at** and **updated\_at** columns -`$table->text('description');` | TEXT equivalent to the table -`$table->blob('data');` | BLOB equivalent to the table -`->nullable()` | Designate that the column allows NULL values -`->default($value)` | Declare a default value for a column -`->unsigned()` | Set INTEGER to UNSIGNED - -> **Note:** Laravel's "boolean" type maps to a small integer column on all database systems. - -#### Example of creating a table and adding columns - - Schema::table('users', function($table) - { - $table->create(); - $table->increments('id'); - $table->string('username'); - $table->string('email'); - $table->string('phone')->nullable(); - $table->text('about'); - $table->timestamps(); - }); - - -## Dropping Columns - -#### Dropping a column from a database table: - - $table->drop_column('name'); - -#### Dropping several columns from a database table: - - $table->drop_column(array('name', 'email')); - - -## Adding Indexes - -The Schema builder supports several types of indexes. There are two ways to add the indexes. Each type of index has its method; however, you can also fluently define an index on the same line as a column addition. Let's take a look: - -#### Fluently creating a string column with an index: - - $table->string('email')->unique(); - -If defining the indexes on a separate line is more your style, here are example of using each of the index methods: - -Command | Description -------------- | ------------- -`$table->primary('id');` | Adding a primary key -`$table->primary(array('fname', 'lname'));` | Adding composite keys -`$table->unique('email');` | Adding a unique index -`$table->fulltext('description');` | Adding a full-text index -`$table->index('state');` | Adding a basic index - - -## Dropping Indexes - -To drop indexes you must specify the index's name. Laravel assigns a reasonable name to all indexes. Simply concatenate the table name and the names of the columns in the index, then append the type of the index. Let's take a look at some examples: - -Command | Description -------------- | ------------- -`$table->drop_primary('users_id_primary');` | Dropping a primary key from the "users" table -`$table->drop_unique('users_email_unique');` | Dropping a unique index from the "users" table -`$table->drop_fulltext('profile_description_fulltext');` | Dropping a full-text index from the "profile" table -`$table->drop_index('geo_state_index');` | Dropping a basic index from the "geo" table - - -## Foreign Keys - -You may easily add foreign key constraints to your table using Schema's fluent interface. For example, let's assume you have a **user_id** on a **posts** table, which references the **id** column of the **users** table. Here's how to add a foreign key constraint for the column: - - $table->foreign('user_id')->references('id')->on('users'); - -You may also specify options for the "on delete" and "on update" actions of the foreign key: - - $table->foreign('user_id')->references('id')->on('users')->on_delete('restrict'); - - $table->foreign('user_id')->references('id')->on('users')->on_update('cascade'); - -You may also easily drop a foreign key constraint. The default foreign key names follow the [same convention](#dropping-indexes) as the other indexes created by the Schema builder. Here's an example: - - $table->drop_foreign('posts_user_id_foreign'); - -> **Note:** The field referenced in the foreign key is very likely an auto increment and therefore automatically an unsigned integer. Please make sure to create the foreign key field with **unsigned()** as both fields have to be the exact same type, the engine on both tables has to be set to **InnoDB**, and the referenced table must be created **before** the table with the foreign key. - - $table->engine = 'InnoDB'; - - $table->integer('user_id')->unsigned(); \ No newline at end of file diff --git a/laravel/documentation/encryption.md b/laravel/documentation/encryption.md deleted file mode 100644 index 9d7e6cee..00000000 --- a/laravel/documentation/encryption.md +++ /dev/null @@ -1,30 +0,0 @@ -# Encryption - -## Contents - -- [The Basics](#the-basics) -- [Encrypting A String](#encrypt) -- [Decrypting A String](#decrypt) - - -## The Basics - -Laravel's **Crypter** class provides a simple interface for handling secure, two-way encryption. By default, the Crypter class provides strong AES-256 encryption and decryption out of the box via the Mcrypt PHP extension. - -> **Note:** Don't forget to install the Mcrypt PHP extension on your server. - - -## Encrypting A String - -#### Encrypting a given string: - - $encrypted = Crypter::encrypt($value); - - -## Decrypting A String - -#### Decrypting a string: - - $decrypted = Crypter::decrypt($encrypted); - -> **Note:** It's incredibly important to point out that the decrypt method will only decrypt strings that were encrypted using **your** application key. \ No newline at end of file diff --git a/laravel/documentation/events.md b/laravel/documentation/events.md deleted file mode 100644 index e678bb5e..00000000 --- a/laravel/documentation/events.md +++ /dev/null @@ -1,100 +0,0 @@ -# Events - -## Contents - -- [The Basics](#the-basics) -- [Firing Events](#firing-events) -- [Listening To Events](#listening-to-events) -- [Queued Events](#queued-events) -- [Laravel Events](#laravel-events) - - -## The Basics - -Events can provide a great away to build de-coupled applications, and allow plug-ins to tap into the core of your application without modifying its code. - - -## Firing Events - -To fire an event, just tell the **Event** class the name of the event you want to fire: - -#### Firing an event: - - $responses = Event::fire('loaded'); - -Notice that we assigned the result of the **fire** method to a variable. This method will return an array containing the responses of all the event's listeners. - -Sometimes you may want to fire an event, but just get the first response. Here's how: - -#### Firing an event and retrieving the first response: - - $response = Event::first('loaded'); - -> **Note:** The **first** method will still fire all of the handlers listening to the event, but will only return the first response. - -The **Event::until** method will execute the event handlers until the first non-null response is returned. - -#### Firing an event until the first non-null response: - - $response = Event::until('loaded'); - - -## Listening To Events - -So, what good are events if nobody is listening? Register an event handler that will be called when an event fires: - -#### Registering an event handler: - - Event::listen('loaded', function() - { - // I'm executed on the "loaded" event! - }); - -The Closure we provided to the method will be executed each time the "loaded" event is fired. - - -## Queued Events - -Sometimes you may wish to "queue" an event for firing, but not fire it immediately. This is possible using the `queue` and `flush` methods. First, throw an event on a given queue with a unique identifier: - -#### Registering a queued event: - - Event::queue('foo', $user->id, array($user)); - -This method accepts three parameters. The first is the name of the queue, the second is a unique identifier for this item on the queue, and the third is an array of data to pass to the queue flusher. - -Next, we'll register a flusher for the `foo` queue: - -#### Registering an event flusher: - - Event::flusher('foo', function($key, $user) - { - // - }); - -Note that the event flusher receives two arguments. The first, is the unique identifier for the queued event, which in this case would be the user's ID. The second (and any remaining) parameters would be the payload items for the queued event. - -Finally, we can run our flusher and flush all queued events using the `flush` method: - - Event::flush('foo'); - - -## Laravel Events - -There are several events that are fired by the Laravel core. Here they are: - -#### Event fired when a bundle is started: - - Event::listen('laravel.started: bundle', function() {}); - -#### Event fired when a database query is executed: - - Event::listen('laravel.query', function($sql, $bindings, $time) {}); - -#### Event fired right before response is sent to browser: - - Event::listen('laravel.done', function($response) {}); - -#### Event fired when a messaged is logged using the Log class: - - Event::listen('laravel.log', function($type, $message) {}); \ No newline at end of file diff --git a/laravel/documentation/files.md b/laravel/documentation/files.md deleted file mode 100644 index ebff9e81..00000000 --- a/laravel/documentation/files.md +++ /dev/null @@ -1,92 +0,0 @@ -# Working With Files - -## Contents - -- [Reading Files](#get) -- [Writing Files](#put) -- [Removing files](#delete) -- [File Uploads](#upload) -- [File Extensions](#ext) -- [Checking File Types](#is) -- [Getting MIME Types](#mime) -- [Copying Directories](#cpdir) -- [Removing Directories](#rmdir) - - -## Reading Files - -#### Getting the contents of a file: - - $contents = File::get('path/to/file'); - - -## Writing Files - -#### Writing to a file: - - File::put('path/to/file', 'file contents'); - -#### Appending to a file: - - File::append('path/to/file', 'appended file content'); - - -## Removing Files - -#### Deleting a single file: - - File::delete('path/to/file'); - - -## File Uploads - -#### Moving a $_FILE to a permanent location: - - Input::upload('picture', 'path/to/pictures', 'filename.ext'); - -> **Note:** You can easily validate file uploads using the [Validator class](/docs/validation). - - -## File Extensions - -#### Getting the extension from a filename: - - File::extension('picture.png'); - - -## Checking File Types - -#### Determining if a file is given type: - - if (File::is('jpg', 'path/to/file.jpg')) - { - // - } - -The **is** method does not simply check the file extension. The Fileinfo PHP extension will be used to read the content of the file and determine the actual MIME type. - -> **Note:** You may pass any of the extensions defined in the **application/config/mimes.php** file to the **is** method. -> **Note:** The Fileinfo PHP extension is required for this functionality. More information can be found on the [PHP Fileinfo page](http://php.net/manual/en/book.fileinfo.php). - - -## Getting MIME Types - -#### Getting the MIME type associated with an extension: - - echo File::mime('gif'); // outputs 'image/gif' - -> **Note:** This method simply returns the MIME type defined for the extension in the **application/config/mimes.php** file. - - -## Copying Directories - -#### Recursively copy a directory to a given location: - - File::cpdir($directory, $destination); - - -## Removing Directories - -#### Recursively delete a directory: - - File::rmdir($directory); \ No newline at end of file diff --git a/laravel/documentation/home.md b/laravel/documentation/home.md deleted file mode 100644 index 695526cc..00000000 --- a/laravel/documentation/home.md +++ /dev/null @@ -1,59 +0,0 @@ -# Laravel Documentation - -- [The Basics](#the-basics) -- [Who Will Enjoy Laravel?](#who-will-enjoy-laravel) -- [What Makes Laravel Different?](#laravel-is-different) -- [Application Structure](#application-structure) -- [Laravel's Community](#laravel-community) -- [License Information](#laravel-license) - - -## The Basics - -Welcome to the Laravel documentation. These documents were designed to function both as a getting-started guide and as a feature reference. Even though you may jump into any section and start learning, we recommend reading the documentation in order as it allows us to progressively establish concepts that will be used in later documents. - - -## Who Will Enjoy Laravel? - -Laravel is a powerful framework that emphasizes flexibility and expressiveness. Users new to Laravel will enjoy the same ease of development that is found in the most popular and lightweight PHP frameworks. More experienced users will appreciate the opportunity to modularize their code in ways that are not possible with other frameworks. Laravel's flexibility will allow your organization to update and mold the application over time as is needed and its expressiveness will allow you and your team to develop code that is both concise and easily read. - - - -## What Makes Laravel Different? - -There are many ways in which Laravel differentiates itself from other frameworks. Here are a few examples that we think make good bullet points: - -- **Bundles** are Laravel's modular packaging system. [The Laravel Bundle Repository](http://bundles.laravel.com/) is already populated with quite a few features that can be easily added to your application. You can either download a bundle repository to your bundles directory or use the "Artisan" command-line tool to automatically install them. -- **The Eloquent ORM** is the most advanced PHP ActiveRecord implementation available. With the capacity to easily apply constraints to both relationships and nested eager-loading you'll have complete control over your data with all of the conveniences of ActiveRecord. Eloquent natively supports all of the methods from Laravel's Fluent query-builder. -- **Application Logic** can be implemented within your application either using controllers (which many web-developers are already familiar with) or directly into route declarations using syntax similar to the Sinatra framework. Laravel is designed with the philosophy of giving a developer the flexibility that they need to create everything from very small sites to massive enterprise applications. -- **Reverse Routing** allows you to create links to named routes. When creating links just use the route's name and Laravel will automatically insert the correct URI. This allows you to change your routes at a later time and Laravel will update all of the relevant links site-wide. -- **Restful Controllers** are an optional way to separate your GET and POST request logic. In a login example your controller's get_login() action would serve up the form and your controller's post_login() action would accept the posted form, validate, and either redirect to the login form with an error message or redirect your user to their dashboard. -- **Class Auto Loading** keeps you from having to maintain an autoloader configuration and from loading unnecessary components when they won't be used. Want to use a library or model? Don't bother loading it, just use it. Laravel will handle the rest. -- **View Composers** are blocks of code that can be run when a view is loaded. A good example of this would be a blog side-navigation view that contains a list of random blog posts. Your composer would contain the logic to load the blog posts so that all you have to do is load the view and it's all ready for you. This keeps you from having to make sure that your controllers load the a bunch of data from your models for views that are unrelated to that method's page content. -- **The IoC container** (Inversion of Control) gives you a method for generating new objects and optionally instantiating and referencing singletons. IoC means that you'll rarely ever need to bootstrap any external libraries. It also means that you can access these objects from anywhere in your code without needing to deal with an inflexible monolithic structure. -- **Migrations** are version control for your database schemas and they are directly integrated into Laravel. You can both generate and run migrations using the "Artisan" command-line utility. Once another member makes schema changes you can update your local copy from the repository and run migrations. Now you're up to date, too! -- **Unit-Testing** is an important part of Laravel. Laravel itself sports hundreds of tests to help ensure that new changes don't unexpectedly break anything. This is one of the reasons why Laravel is widely considered to have some of the most stable releases in the industry. Laravel also makes it easy for you to write unit-tests for your own code. You can then run tests with the "Artisan" command-line utility. -- **Automatic Pagination** prevents your application logic from being cluttered up with a bunch of pagination configuration. Instead of pulling in the current page, getting a count of db records, and selected your data using a limit/offset just call 'paginate' and tell Laravel where to output the paging links in your view. Laravel automatically does the rest. Laravel's pagination system was designed to be easy to implement and easy to change. It's also important to note that just because Laravel can handle these things automatically doesn't mean that you can't call and configure these systems manually if you prefer. - -These are just a few ways in which Laravel differentiates itself from other PHP frameworks. All of these features and many more are discussed thoroughly in this documentation. - - -## Application Structure - -Laravel's directory structure is designed to be familiar to users of other popular PHP frameworks. Web applications of any shape or size can easily be created using this structure similarly to the way that they would be created in other frameworks. - -However due to Laravel's unique architecture, it is possible for developers to create their own infrastructure that is specifically designed for their application. This may be most beneficial to large projects such as content-management-systems. This kind of architectural flexibility is unique to Laravel. - -Throughout the documentation we'll specify the default locations for declarations where appropriate. - - -## Laravel's Community - -Laravel is lucky to be supported by rapidly growing, friendly and enthusiastic community. The [Laravel Forums](http://forums.laravel.com) are a great place to find help, make a suggestion, or just see what other people are saying. - -Many of us hang out every day in the #laravel IRC channel on FreeNode. [Here's a forum post explaining how you can join us.](http://forums.laravel.com/viewtopic.php?id=671) Hanging out in the IRC channel is a really great way to learn more about web-development using Laravel. You're welcome to ask questions, answer other people's questions, or just hang out and learn from other people's questions being answered. We love Laravel and would love to talk to you about it, so don't be a stranger! - - -## License Information - -Laravel is open-sourced software licensed under the [MIT License](http://www.opensource.org/licenses/mit-license.php). \ No newline at end of file diff --git a/laravel/documentation/input.md b/laravel/documentation/input.md deleted file mode 100644 index a4002c41..00000000 --- a/laravel/documentation/input.md +++ /dev/null @@ -1,160 +0,0 @@ -# Input & Cookies - -## Contents - -- [Input](#input) -- [JSON Input](#json) -- [Files](#files) -- [Old Input](#old-input) -- [Redirecting With Old Input](#redirecting-with-old-input) -- [Cookies](#cookies) -- [Merging & Replacing](#merge) - - -## Input - -The **Input** class handles input that comes into your application via GET, POST, PUT, or DELETE requests. Here are some examples of how to access input data using the Input class: - -#### Retrieve a value from the input array: - - $email = Input::get('email'); - -> **Note:** The "get" method is used for all request types (GET, POST, PUT, and DELETE), not just GET requests. - -#### Retrieve all input from the input array: - - $input = Input::get(); - -#### Retrieve all input including the $_FILES array: - - $input = Input::all(); - -By default, *null* will be returned if the input item does not exist. However, you may pass a different default value as a second parameter to the method: - -#### Returning a default value if the requested input item doesn't exist: - - $name = Input::get('name', 'Fred'); - -#### Using a Closure to return a default value: - - $name = Input::get('name', function() {return 'Fred';}); - -#### Determining if the input contains a given item: - - if (Input::has('name')) … - -> **Note:** The "has" method will return *false* if the input item is an empty string. - - -## JSON Input - -When working with JavaScript MVC frameworks like Backbone.js, you will need to get the JSON posted by the application. To make your life easier, we've included the `Input::json` method: - -#### Get JSON input to the application: - - $data = Input::json(); - - -## Files - -#### Retrieving all items from the $_FILES array: - - $files = Input::file(); - -#### Retrieving an item from the $_FILES array: - - $picture = Input::file('picture'); - -#### Retrieving a specific item from a $_FILES array: - - $size = Input::file('picture.size'); - -> **Note:** In order to use file uploads, you must use `Form::open_for_files()` or manually enable `multipart/form-data`. - -*Further Reading:* - -- *[Opening Forms](/docs/views/forms#opening-a-form)* - - -## Old Input - -You'll commonly need to re-populate forms after invalid form submissions. Laravel's Input class was designed with this problem in mind. Here's an example of how you can easily retrieve the input from the previous request. First, you need to flash the input data to the session: - -#### Flashing input to the session: - - Input::flash(); - -#### Flashing selected input to the session: - - Input::flash('only', array('username', 'email')); - - Input::flash('except', array('password', 'credit_card')); - -#### Retrieving a flashed input item from the previous request: - - $name = Input::old('name'); - -> **Note:** You must specify a session driver before using the "old" method. - -*Further Reading:* - -- *[Sessions](/docs/session/config)* - - -## Redirecting With Old Input - -Now that you know how to flash input to the session. Here's a shortcut that you can use when redirecting that prevents you from having to micro-manage your old input in that way: - -#### Flashing input from a Redirect instance: - - return Redirect::to('login')->with_input(); - -#### Flashing selected input from a Redirect instance: - - return Redirect::to('login')->with_input('only', array('username')); - - return Redirect::to('login')->with_input('except', array('password')); - - -## Cookies - -Laravel provides a nice wrapper around the $_COOKIE array. However, there are a few things you should be aware of before using it. First, all Laravel cookies contain a "signature hash". This allows the framework to verify that the cookie has not been modified on the client. Secondly, when setting cookies, the cookies are not immediately sent to the browser, but are pooled until the end of the request and then sent together. This means that you will not be able to both set a cookie and retrieve the value that you set in the same request. - -#### Retrieving a cookie value: - - $name = Cookie::get('name'); - -#### Returning a default value if the requested cookie doesn't exist: - - $name = Cookie::get('name', 'Fred'); - -#### Setting a cookie that lasts for 60 minutes: - - Cookie::put('name', 'Fred', 60); - -#### Creating a "permanent" cookie that lasts five years: - - Cookie::forever('name', 'Fred'); - -#### Deleting a cookie: - - Cookie::forget('name'); - - -## Merging & Replacing - -Sometimes you may wish to merge or replace the current input. Here's how: - -#### Merging new data into the current input: - - Input::merge(array('name' => 'Spock')); - -#### Replacing the entire input array with new data: - - Input::replace(array('doctor' => 'Bones', 'captain' => 'Kirk')); - -## Clearing Input - -To clear all input data for the current request, you may use the `clear` method: - - Input::clear(); \ No newline at end of file diff --git a/laravel/documentation/install.md b/laravel/documentation/install.md deleted file mode 100644 index 1e051e06..00000000 --- a/laravel/documentation/install.md +++ /dev/null @@ -1,124 +0,0 @@ -# Installation & Setup - -## Contents - -- [Requirements](#requirements) -- [Installation](#installation) -- [Server Configuration](#server-configuration) -- [Basic Configuration](#basic-configuration) -- [Environments](#environments) -- [Cleaner URLs](#cleaner-urls) - - -## Requirements - -- Apache, nginx, or another compatible web server. -- Laravel takes advantage of the powerful features that have become available in PHP 5.3. Consequently, PHP 5.3 is a requirement. -- Laravel uses the [FileInfo library](http://php.net/manual/en/book.fileinfo.php) to detect files' mime-types. This is included by default with PHP 5.3. However, Windows users may need to add a line to their php.ini file before the Fileinfo module is enabled. For more information check out the [installation / configuration details on PHP.net](http://php.net/manual/en/fileinfo.installation.php). -- Laravel uses the [Mcrypt library](http://php.net/manual/en/book.mcrypt.php) for encryption and hash generation. Mcrypt typically comes pre-installed. If you can't find Mcrypt in the output of phpinfo() then check the vendor site of your LAMP installation or check out the [installation / configuration details on PHP.net](http://php.net/manual/en/book.mcrypt.php). - - -## Installation - -1. [Download Laravel](http://laravel.com/download) -2. Extract the Laravel archive and upload the contents to your web server. -3. Set the value of the **key** option in the **config/application.php** file to a random, 32 character string. -4. Verify that the `storage/views` directory is writable. -5. Navigate to your application in a web browser. - -If all is well, you should see a pretty Laravel splash page. Get ready, there is lots more to learn! - -### Extra Goodies - -Installing the following goodies will help you take full advantage of Laravel, but they are not required: - -- SQLite, MySQL, PostgreSQL, or SQL Server PDO drivers. -- Memcached or APC. - -### Problems? - -If you are having problems installing, try the following: - -- Make sure the **public** directory is the document root of your web server. (see: Server Configuration below) -- If you are using mod_rewrite, set the **index** option in **application/config/application.php** to an empty string. -- Verify that your storage folder and the folders within are writable by your web server. - - -## Server Configuration - -Like most web-development frameworks, Laravel is designed to protect your application code, bundles, and local storage by placing only files that are necessarily public in the web server's DocumentRoot. This prevents some types of server misconfiguration from making your code (including database passwords and other configuration data) accessible through the web server. It's best to be safe. - -In this example let's imagine that we installed Laravel to the directory **/Users/JonSnow/Sites/MySite**. - -A very basic example of an Apache VirtualHost configuration for MySite might look like this. - - - DocumentRoot /Users/JonSnow/Sites/MySite/public - ServerName mysite.dev - - -Notice that while we installed to **/Users/JonSnow/Sites/MySite** our DocumentRoot points to **/Users/JonSnow/Sites/MySite/public**. - -While pointing the DocumentRoot to the public folder is a commonly used best-practice, it's possible that you may need to use Laravel on a host that does not allow you to update your DocumentRoot. A collection of algorithms to circumvent this need can be found [on the Laravel forums.](http://forums.laravel.com/viewtopic.php?id=1258) - - -## Basic Configuration - -All of the configuration provided are located in your applications config/ directory. We recommend that you read through these files just to get a basic understanding of the options available to you. Pay special attention to the **application/config/application.php** file as it contains the basic configuration options for your application. - -It's **extremely** important that you change the **application key** option before working on your site. This key is used throughout the framework for encryption, hashing, etc. It lives in the **config/application.php** file and should be set to a random, 32 character string. A standards-compliant application key can be automatically generated using the Artisan command-line utility. More information can be found in the [Artisan command index](/docs/artisan/commands). - -> **Note:** If you are using mod_rewrite, you should set the index option to an empty string. - - -## Environments - -Most likely, the configuration options you need for local development are not the same as the options you need on your production server. Laravel's default environment handling mechanism is URL based, which will make setting up environments a breeze. Pop open the `paths.php` file in the root of your Laravel installation. You should see an array like this: - - $environments = array( - - 'local' => array('http://localhost*', '*.dev'), - - ); - -This tells Laravel that any URLs beginning with "localhost" or ending with ".dev" should be considered part of the "local" environment. - -Next, create an **application/config/local** directory. Any files and options you place in this directory will override the options in the base **application/config** directory. For example, you may wish to create an **application.php** file within your new **local** configuration directory: - - return array( - - 'url' => 'http://localhost/laravel/public', - - ); - -In this example, the local **URL** option will override the **URL** option in **application/config/application.php**. Notice that you only need to specify the options you wish to override. - -Isn't it easy? Of course, you are free to create as many environments as you wish! - - -## Cleaner URLs - -Most likely, you do not want your application URLs to contain "index.php". You can remove it using HTTP rewrite rules. If you are using Apache to serve your application, make sure to enable mod_rewrite and create a **.htaccess** file like this one in your **public** directory: - - - RewriteEngine on - - RewriteCond %{REQUEST_FILENAME} !-f - RewriteCond %{REQUEST_FILENAME} !-d - - RewriteRule ^(.*)$ index.php/$1 [L] - - -Is the .htaccess file above not working for you? Try this one: - - Options +FollowSymLinks - RewriteEngine on - - RewriteCond %{REQUEST_FILENAME} !-f - RewriteCond %{REQUEST_FILENAME} !-d - - RewriteRule . index.php [L] - -After setting up HTTP rewriting, you should set the **index** configuration option in **application/config/application.php** to an empty string. - -> **Note:** Each web server has a different method of doing HTTP rewrites, and may require a slightly different .htaccess file. \ No newline at end of file diff --git a/laravel/documentation/ioc.md b/laravel/documentation/ioc.md deleted file mode 100644 index 7df9572b..00000000 --- a/laravel/documentation/ioc.md +++ /dev/null @@ -1,49 +0,0 @@ -# IoC Container - -- [Definition](/docs/ioc#definition) -- [Registering Objects](/docs/ioc#register) -- [Resolving Objects](/docs/ioc#resolve) - - -## Definition - -An IoC container is simply a way of managing the creation of objects. You can use it to define the creation of complex objects, allowing you to resolve them throughout your application using a single line of code. You may also use it to "inject" dependencies into your classes and controllers. - -IoC containers help make your application more flexible and testable. Since you may register alternate implementations of an interface with the container, you may isolate the code you are testing from external dependencies using [stubs and mocks](http://martinfowler.com/articles/mocksArentStubs.html). - - -## Registering Objects - -#### Registering a resolver in the IoC container: - - IoC::register('mailer', function() - { - $transport = Swift_MailTransport::newInstance(); - - return Swift_Mailer::newInstance($transport); - }); - - -Great! Now we have registered a resolver for SwiftMailer in our container. But, what if we don't want the container to create a new mailer instance every time we need one? Maybe we just want the container to return the same instance after the initial instance is created. Just tell the container the object should be a singleton: - -#### Registering a singleton in the container: - - IoC::singleton('mailer', function() - { - // - }); - -You may also register an existing object instance as a singleton in the container. - -#### Registering an existing instance in the container: - - IoC::instance('mailer', $instance); - - -## Resolving Objects - -Now that we have SwiftMailer registered in the container, we can resolve it using the **resolve** method on the **IoC** class: - - $mailer = IoC::resolve('mailer'); - -> **Note:** You may also [register controllers in the container](/docs/controllers#dependency-injection). \ No newline at end of file diff --git a/laravel/documentation/loading.md b/laravel/documentation/loading.md deleted file mode 100644 index 72919d46..00000000 --- a/laravel/documentation/loading.md +++ /dev/null @@ -1,58 +0,0 @@ -# Class Auto Loading - -## Contents - -- [The Basics](#the-basics) -- [Registering Directories](#directories) -- [Registering Mappings](#mappings) -- [Registering Namespaces](#namespaces) - - -## The Basics - -Auto-loading allows you to lazily load class files when they are needed without explicitly *requiring* or *including* them. So, only the classes you actually need are loaded for any given request to your application, and you can just jump right in and start using any class without loading it's related file. - -By default, the **models** and **libraries** directories are registered with the auto-loader in the **application/start.php** file. The loader uses a class to file name loading convention, where all file names are lower-cased. So for instance, a "User" class within the models directory should have a file name of "user.php". You may also nest classes within sub-directories. Just namespace the classes to match the directory structure. So, a "Entities\User" class would have a file name of "entities/user.php" within the models directory. - - -## Registering Directories - -As noted above, the models and libraries directories are registered with the auto-loader by default; however, you may register any directories you like to use the same class to file name loading conventions: - -#### Registering directories with the auto-loader: - - Autoloader::directories(array( - path('app').'entities', - path('app').'repositories', - )); - - -## Registering Mappings - -Sometimes you may wish to manually map a class to its related file. This is the most performant way of loading classes: - -#### Registering a class to file mapping with the auto-loader: - - Autoloader::map(array( - 'User' => path('app').'models/user.php', - 'Contact' => path('app').'models/contact.php', - )); - - -## Registering Namespaces - -Many third-party libraries use the PSR-0 standard for their structure. PSR-0 states that class names should match their file names, and directory structure is indicated by namespaces. If you are using a PSR-0 library, just register it's root namespace and directory with the auto-loader: - -#### Registering a namespace with the auto-loader: - - Autoloader::namespaces(array( - 'Doctrine' => path('libraries').'Doctrine', - )); - -Before namespaces were available in PHP, many projects used underscores to indicate directory structure. If you are using one of these legacy libraries, you can still easily register it with the auto-loader. For example, if you are using SwiftMailer, you may have noticed all classes begin with "Swift_". So, we'll register "Swift" with the auto-loader as the root of an underscored project. - -#### Registering an "underscored" library with the auto-loader: - - Autoloader::underscored(array( - 'Swift' => path('libraries').'SwiftMailer', - )); \ No newline at end of file diff --git a/laravel/documentation/localization.md b/laravel/documentation/localization.md deleted file mode 100644 index 6876f4cb..00000000 --- a/laravel/documentation/localization.md +++ /dev/null @@ -1,70 +0,0 @@ -# Localization - -## Contents - -- [The Basics](#the-basics) -- [Retrieving A Language Line](#get) -- [Place Holders & Replacements](#replace) - - -## The Basics - -Localization is the process of translating your application into different languages. The **Lang** class provides a simple mechanism to help you organize and retrieve the text of your multilingual application. - -All of the language files for your application live under the **application/language** directory. Within the **application/language** directory, you should create a directory for each language your application speaks. So, for example, if your application speaks English and Spanish, you might create **en** and **es** directories under the **language** directory. - -Each language directory may contain many different language files. Each language file is simply an array of string values in that language. In fact, language files are structured identically to configuration files. For example, within the **application/language/en** directory, you could create a **marketing.php** file that looks like this: - -#### Creating a language file: - - return array( - - 'welcome' => 'Welcome to our website!', - - ); - -Next, you should create a corresponding **marketing.php** file within the **application/language/es** directory. The file would look something like this: - - return array( - - 'welcome' => 'Bienvenido a nuestro sitio web!', - - ); - -Nice! Now you know how to get started setting up your language files and directories. Let's keep localizing! - - -## Retrieving A Language Line - -#### Retrieving a language line: - - echo Lang::line('marketing.welcome')->get(); - -#### Retrieving a language line using the "__" helper: - - echo __('marketing.welcome'); - -Notice how a dot was used to separate "marketing" and "welcome"? The text before the dot corresponds to the language file, while the text after the dot corresponds to a specific string within that file. - -Need to retrieve the line in a language other than your default? Not a problem. Just mention the language to the **get** method: - -#### Getting a language line in a given language: - - echo Lang::line('marketing.welcome')->get('es'); - - -## Place Holders & Replacements - -Now, let's work on our welcome message. "Welcome to our website!" is a pretty generic message. It would be helpful to be able to specify the name of the person we are welcoming. But, creating a language line for each user of our application would be time-consuming and ridiculous. Thankfully, you don't have to. You can specify "place-holders" within your language lines. Place-holders are preceded by a colon: - -#### Creating a language line with place-holders: - - 'welcome' => 'Welcome to our website, :name!' - -#### Retrieving a language line with replacements: - - echo Lang::line('marketing.welcome', array('name' => 'Taylor'))->get(); - -#### Retrieving a language line with replacements using "__": - - echo __('marketing.welcome', array('name' => 'Taylor')); \ No newline at end of file diff --git a/laravel/documentation/logging.md b/laravel/documentation/logging.md deleted file mode 100644 index 74678c65..00000000 --- a/laravel/documentation/logging.md +++ /dev/null @@ -1,40 +0,0 @@ -# Errors & Logging - -## Contents - -- [Basic Configuration](#basic-configuration) -- [Logging](#logging) -- [The Logger Class](#the-logger-class) - - -## Basic Configuration - -All of the configuration options regarding errors and logging live in the **application/config/errors.php** file. Let's jump right in. - -### Ignored Errors - -The **ignore** option contains an array of error levels that should be ignored by Laravel. By "ignored", we mean that we won't stop execution of the script on these errors. However, they will be logged when logging is enabled. - -### Error Detail - -The **detail** option indicates if the framework should display the error message and stack trace when an error occurs. For development, you will want this to be **true**. However, in a production environment, set this to **false**. When disabled, the view located in **application/views/error/500.php** will be displayed, which contains a generic error message. - - -## Logging - -To enable logging, set the **log** option in the error configuration to "true". When enabled, the Closure defined by the **logger** configuration item will be executed when an error occurs. This gives you total flexibility in how the error should be logged. You can even e-mail the errors to your development team! - -By default, logs are stored in the **storage/logs** directory, and a new log file is created for each day. This keeps your log files from getting crowded with too many messages. - - -## The Logger Class - -Sometimes you may wish to use Laravel's **Log** class for debugging, or just to log informational messages. Here's how to use it: - -#### Writing a message to the logs: - - Log::write('info', 'This is just an informational message!'); - -#### Using magic methods to specify the log message type: - - Log::info('This is just an informational message!'); \ No newline at end of file diff --git a/laravel/documentation/models.md b/laravel/documentation/models.md deleted file mode 100644 index 3218dc2c..00000000 --- a/laravel/documentation/models.md +++ /dev/null @@ -1,116 +0,0 @@ -# Models & Libraries - -## Contents - -- [Models](#models) -- [Libraries](#libraries) -- [Auto-Loading](#auto-loading) -- [Best Practices](#best-practices) - - -## Models - -Models are the heart of your application. Your application logic (controllers / routes) and views (html) are just the mediums with which users interact with your models. The most typical type of logic contained within a model is [Business Logic](http://en.wikipedia.org/wiki/Business_logic). - -*Some examples of functionality that would exist within a model are:* - -- Database Interactions -- File I/O -- Interactions with Web Services - -For instance, perhaps you are writing a blog. You will likely want to have a "Post" model. Users may want to comment on posts so you'd also have a "Comment" model. If users are going to be commenting then we'll also need a "User" model. Get the idea? - - -## Libraries - -Libraries are classes that perform tasks that aren't specific to your application. For instance, consider a PDF generation library that converts HTML. That task, although complicated, is not specific to your application, so it is considered a "library". - -Creating a library is as easy as creating a class and storing it in the libraries folder. In the following example, we will create a simple library with a method that echos the text that is passed to it. We create the **printer.php** file in the libraries folder with the following code. - - -## Auto Loading - -Libraries and Models are very easy to use thanks to the Laravel auto-loader. To learn more about the auto-loader check out the documentation on [Auto-Loading](/docs/loading). - - -## Best Practices - -We've all head the mantra: "controllers should be thin!" But, how do we apply that in real life? It's possible that part of the problem is the word "model". What does it even mean? Is it even a useful term? Many associate "model" with "database", which leads to having very bloated controllers, with light models that access the database. Let's explore some alternatives. - -What if we just totally scrapped the "models" directory? Let's name it something more useful. In fact, let's just give it the same as our application. Perhaps are our satellite tracking site is named "Trackler", so let's create a "trackler" directory within the application folder. - -Great! Next, let's break our classes into "entities", "services", and "repositories". So, we'll create each of those three directories within our "trackler" folder. Let's explore each one: - -### Entities - -Think of entities as the data containers of your application. They primarily just contain properties. So, in our application, we may have a "Location" entity which has "latitude" and "longitude" properties. It could look something like this: - - latitude = $latitude; - $this->longitude = $longitude; - } - - } - -Looking good. Now that we have an entity, let's explore our other two folders. - -### Services - -Services contain the *processes* of your application. So, let's keep using our Trackler example. Our application might have a form on which a user may enter their GPS location. However, we need to validate that the coordinates are correctly formatted. We need to *validate* the *location entity*. So, within our "services" directory, we could create a "validators" folder with the following class: - - -## Enabling the Profiler - -To enable the profiler, you need to edit **application/config/application.php** and switch the profiler option to **true**. - - 'profiler' => true, - -This will attach the profiler code to **all** responses coming back from your laravel install. - -**Note:** As of the time of this writing a common problem with the profiler being enabled is any requests that return JSON will also include the profiler code, and destroy the JSON syntax in the response. - - -## Logging - -It is possible to use the profiler to the Log viewing portion of the profiler. Throughout your application you can call the logger and have it displayed when the profiler is rendered. - -#### Logging to the profiler: - - Profiler::log('info', 'Log some information to the profiler'); - - -## Timers and Benchmarking - -Timing and benchmarking your app is simple with the ```tick()``` function on the profiler. It allows you to set various different timers in your app and will show you their performance when your app ends execution. - -Each timer can have it's own individual name which gives it a timeline. Every timer with the same name is another 'tick' on that timeline. Each timer can also execute a callback on it to perform other operations. - -#### Using the generic timer timeline - - Profiler::tick(); - Profiler::tick(); - -#### Using multiple named timers with seperate timelines - - Profiler::tick('myTimer'); - Profiler::tick('nextTimer'); - Profiler::tick('myTimer'); - Profiler::tick('nextTimer'); - -#### Using a named timer with a callback - Profiler::tick('myTimer', function($timers) { - echo "I'm inside the timer callback!"; - }); diff --git a/laravel/documentation/requests.md b/laravel/documentation/requests.md deleted file mode 100644 index 5a7426e2..00000000 --- a/laravel/documentation/requests.md +++ /dev/null @@ -1,77 +0,0 @@ -# Examining Requests - -## Contents - -- [Working With The URI](#working-with-the-uri) -- [Other Request Helpers](#other-request-helpers) - - -## Working With The URI - -#### Getting the current URI for the request: - - echo URI::current(); - -#### Getting a specific segment from the URI: - - echo URI::segment(1); - -#### Returning a default value if the segment doesn't exist: - - echo URI::segment(10, 'Foo'); - -#### Getting the full request URI, including query string: - - echo URI::full(); - -Sometimes you may need to determine if the current URI is a given string, or begins with a given string. Here's an example of how you can use the is() method to accomplish this: - -#### Determine if the URI is "home": - - if (URI::is('home')) - { - // The current URI is "home"! - } - -#### Determine if the current URI begins with "docs/": - - if URI::is('docs/*')) - { - // The current URI begins with "docs/"! - } - - -## Other Request Helpers - -#### Getting the current request method: - - echo Request::method(); - -#### Accessing the $_SERVER global array: - - echo Request::server('http_referer'); - -#### Retrieving the requester's IP address: - - echo Request::ip(); - -#### Determining if the current request is using HTTPS: - - if (Request::secure()) - { - // This request is over HTTPS! - } - -#### Determining if the current request is an AJAX request: - - if (Request::ajax()) - { - // This request is using AJAX! - } - -#### Determining if the current requst is via the Artisan CLI: - - if (Request::cli()) - { - // This request came from the CLI! - } \ No newline at end of file diff --git a/laravel/documentation/routing.md b/laravel/documentation/routing.md deleted file mode 100644 index 77ea7355..00000000 --- a/laravel/documentation/routing.md +++ /dev/null @@ -1,339 +0,0 @@ -# Routing - -## Contents - -- [The Basics](#the-basics) -- [Wildcards](#wildcards) -- [The 404 Event](#the-404-event) -- [Filters](#filters) -- [Pattern Filters](#pattern-filters) -- [Global Filters](#global-filters) -- [Route Groups](#route-groups) -- [Named Routes](#named-routes) -- [HTTPS Routes](#https-routes) -- [Bundle Routes](#bundle-routes) -- [Controller Routing](#controller-routing) -- [CLI Route Testing](#cli-route-testing) - - -## The Basics - -Laravel uses the latest features of PHP 5.3 to make routing simple and expressive. It's important that building everything from APIs to complex web applications is as easy as possible. Routes are typically defined in **application/routes.php**. - -Unlike many other frameworks with Laravel it's possible to embed application logic in two ways. While controllers are the most common way to implement application logic it's also possible to embed your logic directly into routes. This is **especially** nice for small sites that contain only a few pages as you don't have to create a bunch of controllers just to expose half a dozen methods or put a handful of unrelated methods into the same controller and then have to manually designate routes that point to them. - -In the following example the first parameter is the route that you're "registering" with the router. The second parameter is the function containing the logic for that route. Routes are defined without a front-slash. The only exception to this is the default route which is represented with **only** a front-slash. - -> **Note:** Routes are evaluated in the order that they are registered, so register any "catch-all" routes at the bottom of your **routes.php** file. - -#### Registering a route that responds to "GET /": - - Route::get('/', function() - { - return "Hello World!"; - }); - -#### Registering a route that is valid for any HTTP verb (GET, POST, PUT, and DELETE): - - Route::any('/', function() - { - return "Hello World!"; - }); - -#### Registering routes for other request methods: - - Route::post('user', function() - { - // - }); - - Route::put('user/(:num)', function($id) - { - // - }); - - Route::delete('user/(:num)', function($id) - { - // - }); - -**Registering a single URI for multiple HTTP verbs:** - - Router::register(array('GET', 'POST'), $uri, $callback); - - -## Wildcards - -#### Forcing a URI segment to be any digit: - - Route::get('user/(:num)', function($id) - { - // - }); - -#### Allowing a URI segment to be any alpha-numeric string: - - Route::get('post/(:any)', function($title) - { - // - }); - -#### Catching the remaining URI without limitations: - - Route::get('files/(:all)', function($path) - { - // - }); - -#### Allowing a URI segment to be optional: - - Route::get('page/(:any?)', function($page = 'index') - { - // - }); - - -## The 404 Event - -If a request enters your application but does not match any existing route, the 404 event will be raised. You can find the default event handler in your **application/routes.php** file. - -#### The default 404 event handler: - - Event::listen('404', function() - { - return Response::error('404'); - }); - -You are free to change this to fit the needs of your application! - -*Further Reading:* - -- *[Events](/docs/events)* - - -## Filters - -Route filters may be run before or after a route is executed. If a "before" filter returns a value, that value is considered the response to the request and the route is not executed, which is convenient when implementing authentication filters, etc. Filters are typically defined in **application/routes.php**. - -#### Registering a filter: - - Route::filter('filter', function() - { - return Redirect::to('home'); - }); - -#### Attaching a filter to a route: - - Route::get('blocked', array('before' => 'filter', function() - { - return View::make('blocked'); - })); - -#### Attaching an "after" filter to a route: - - Route::get('download', array('after' => 'log', function() - { - // - })); - -#### Attaching multiple filters to a route: - - Route::get('create', array('before' => 'auth|csrf', function() - { - // - })); - -#### Passing parameters to filters: - - Route::get('panel', array('before' => 'role:admin', function() - { - // - })); - - -## Pattern Filters - -Sometimes you may want to attach a filter to all requests that begin with a given URI. For example, you may want to attach the "auth" filter to all requests with URIs that begin with "admin". Here's how to do it: - -#### Defining a URI pattern based filter: - - Route::filter('pattern: admin/*', 'auth'); - -Optionally you can register filters directly when attaching filters to a given URI by supplying an array with the name of the filter and a callback. - -#### Defining a filter and URI pattern based filter in one: - - Route::filter('pattern: admin/*', array('name' => 'auth', function() - { - // - })); - - -## Global Filters - -Laravel has two "global" filters that run **before** and **after** every request to your application. You can find them both in the **application/routes.php** file. These filters make great places to start common bundles or add global assets. - -> **Note:** The **after** filter receives the **Response** object for the current request. - - -## Route Groups - -Route groups allow you to attach a set of attributes to a group of routes, allowing you to keep your code neat and tidy. - - Route::group(array('before' => 'auth'), function() - { - Route::get('panel', function() - { - // - }); - - Route::get('dashboard', function() - { - // - }); - }); - - -## Named Routes - -Constantly generating URLs or redirects using a route's URI can cause problems when routes are later changed. Assigning the route a name gives you a convenient way to refer to the route throughout your application. When a route change occurs the generated links will point to the new route with no further configuration needed. - -#### Registering a named route: - - Route::get('/', array('as' => 'home', function() - { - return "Hello World"; - })); - -#### Generating a URL to a named route: - - $url = URL::to_route('home'); - -#### Redirecting to the named route: - - return Redirect::to_route('home'); - -Once you have named a route, you may easily check if the route handling the current request has a given name. - -#### Determine if the route handling the request has a given name: - - if (Request::route()->is('home')) - { - // The "home" route is handling the request! - } - - -## HTTPS Routes - -When defining routes, you may use the "https" attribute to indicate that the HTTPS protocol should be used when generating a URL or Redirect to that route. - -#### Defining an HTTPS route: - - Route::get('login', array('https' => true, function() - { - return View::make('login'); - })); - -#### Using the "secure" short-cut method: - - Route::secure('GET', 'login', function() - { - return View::make('login'); - }); - - -## Bundle Routes - -Bundles are Laravel's modular package system. Bundles can easily be configured to handle requests to your application. We'll be going over [bundles in more detail](/docs/bundles) in another document. For now, read through this section and just be aware that not only can routes be used to expose functionality in bundles, but they can also be registered from within bundles. - -Let's open the **application/bundles.php** file and add something: - -#### Registering a bundle to handle routes: - - return array( - - 'admin' => array('handles' => 'admin'), - - ); - -Notice the new **handles** option in our bundle configuration array? This tells Laravel to load the Admin bundle on any requests where the URI begins with "admin". - -Now you're ready to register some routes for your bundle, so create a **routes.php** file within the root directory of your bundle and add the following: - -#### Registering a root route for a bundle: - - Route::get('(:bundle)', function() - { - return 'Welcome to the Admin bundle!'; - }); - -Let's explore this example. Notice the **(:bundle)** place-holder? That will be replaced with the value of the **handles** clause that you used to register your bundle. This keeps your code [D.R.Y.](http://en.wikipedia.org/wiki/Don't_repeat_yourself) and allows those who use your bundle to change it's root URI without breaking your routes! Nice, right? - -Of course, you can use the **(:bundle)** place-holder for all of your routes, not just your root route. - -#### Registering bundle routes: - - Route::get('(:bundle)/panel', function() - { - return "I handle requests to admin/panel!"; - }); - - -## Controller Routing - -Controllers provide another way to manage your application logic. If you're unfamiliar with controllers you may want to [read about controllers](/docs/controllers) and return to this section. - -It is important to be aware that all routes in Laravel must be explicitly defined, including routes to controllers. This means that controller methods that have not been exposed through route registration **cannot** be accessed. It's possible to automatically expose all methods within a controller using controller route registration. Controller route registrations are typically defined in **application/routes.php**. - -Most likely, you just want to register all of the controllers in your application's "controllers" directory. You can do it in one simple statement. Here's how: - -#### Register all controllers for the application: - - Route::controller(Controller::detect()); - -The **Controller::detect** method simply returns an array of all of the controllers defined for the application. - -If you wish to automatically detect the controllers in a bundle, just pass the bundle name to the method. If no bundle is specified, the application folder's controller directory will be searched. - -> **Note:** It is important to note that this method gives you no control over the order in which controllers are loaded. Controller::detect() should only be used to Route controllers in very small sites. "Manually" routing controllers gives you much more control, is more self-documenting, and is certainly advised. - -#### Register all controllers for the "admin" bundle: - - Route::controller(Controller::detect('admin')); - -#### Registering the "home" controller with the Router: - - Route::controller('home'); - -#### Registering several controllers with the router: - - Route::controller(array('dashboard.panel', 'admin')); - -Once a controller is registered, you may access its methods using a simple URI convention: - - http://localhost/controller/method/arguments - -This convention is similar to that employed by CodeIgniter and other popular frameworks, where the first segment is the controller name, the second is the method, and the remaining segments are passed to the method as arguments. If no method segment is present, the "index" method will be used. - -This routing convention may not be desirable for every situation, so you may also explicitly route URIs to controller actions using a simple, intuitive syntax. - -#### Registering a route that points to a controller action: - - Route::get('welcome', 'home@index'); - -#### Registering a filtered route that points to a controller action: - - Route::get('welcome', array('after' => 'log', 'uses' => 'home@index')); - -#### Registering a named route that points to a controller action: - - Route::get('welcome', array('as' => 'home.welcome', 'uses' => 'home@index')); - - -## CLI Route Testing - -You may test your routes using Laravel's "Artisan" CLI. Simply specify the request method and URI you want to use. The route response will be var_dump'd back to the CLI. - -#### Calling a route via the Artisan CLI: - - php artisan route:call get api/user/1 \ No newline at end of file diff --git a/laravel/documentation/session/config.md b/laravel/documentation/session/config.md deleted file mode 100644 index 14821320..00000000 --- a/laravel/documentation/session/config.md +++ /dev/null @@ -1,108 +0,0 @@ -# Session Configuration - -## Contents - -- [The Basics](#the-basics) -- [Cookie Sessions](#cookie) -- [File System Sessions](#file) -- [Database Sessions](#database) -- [Memcached Sessions](#memcached) -- [Redis Sessions](#redis) -- [In-Memory Sessions](#memory) - - -## The Basics - -The web is a stateless environment. This means that each request to your application is considered unrelated to any previous request. However, **sessions** allow you to store arbitrary data for each visitor to your application. The session data for each visitor is stored on your web server, while a cookie containing a **session ID** is stored on the visitor's machine. This cookie allows your application to "remember" the session for that user and retrieve their session data on subsequent requests to your application. - -> **Note:** Before using sessions, make sure an application key has been specified in the **application/config/application.php** file. - -Six session drivers are available out of the box: - -- Cookie -- File System -- Database -- Memcached -- Redis -- Memory (Arrays) - - -## Cookie Sessions - -Cookie based sessions provide a light-weight and fast mechanism for storing session information. They are also secure. Each cookie is encrypted using strong AES-256 encryption. However, cookies have a four kilobyte storage limit, so you may wish to use another driver if you are storing a lot of data in the session. - -To get started using cookie sessions, just set the driver option in the **application/config/session.php** file: - - 'driver' => 'cookie' - - -## File System Sessions - -Most likely, your application will work great using file system sessions. However, if your application receives heavy traffic or runs on a server farm, use database or Memcached sessions. - -To get started using file system sessions, just set the driver option in the **application/config/session.php** file: - - 'driver' => 'file' - -That's it. You're ready to go! - -> **Note:** File system sessions are stored in the **storage/sessions** directory, so make sure it's writeable. - - -## Database Sessions - -To start using database sessions, you will first need to [configure your database connection](/docs/database/config). - -Next, you will need to create a session table. Below are some SQL statements to help you get started. However, you may also use Laravel's "Artisan" command-line to generate the table for you! - -### Artisan - - php artisan session:table - -### SQLite - - CREATE TABLE "sessions" ( - "id" VARCHAR PRIMARY KEY NOT NULL UNIQUE, - "last_activity" INTEGER NOT NULL, - "data" TEXT NOT NULL - ); - -### MySQL - - CREATE TABLE `sessions` ( - `id` VARCHAR(40) NOT NULL, - `last_activity` INT(10) NOT NULL, - `data` TEXT NOT NULL, - PRIMARY KEY (`id`) - ); - -If you would like to use a different table name, simply change the **table** option in the **application/config/session.php** file: - - 'table' => 'sessions' - -All you need to do now is set the driver in the **application/config/session.php** file: - - 'driver' => 'database' - - -## Memcached Sessions - -Before using Memcached sessions, you must [configure your Memcached servers](/docs/database/config#memcached). - -Just set the driver in the **application/config/session.php** file: - - 'driver' => 'memcached' - - -## Redis Sessions - -Before using Redis sessions, you must [configure your Redis servers](/docs/database/redis#config). - -Just set the driver in the **application/config/session.php** file: - - 'driver' => 'redis' - - -## In-Memory Sessions - -The "memory" session driver just uses a simple array to store your session data for the current request. This driver is perfect for unit testing your application since nothing is written to disk. It shouldn't ever be used as a "real" session driver. \ No newline at end of file diff --git a/laravel/documentation/session/usage.md b/laravel/documentation/session/usage.md deleted file mode 100644 index 1b5c9d5c..00000000 --- a/laravel/documentation/session/usage.md +++ /dev/null @@ -1,79 +0,0 @@ -# Session Usage - -## Contents - -- [Storing Items](#put) -- [Retrieving Items](#get) -- [Removing Items](#forget) -- [Flashing Items](#flash) -- [Regeneration](#regeneration) - - -## Storing Items - -To store items in the session call the put method on the Session class: - - Session::put('name', 'Taylor'); - -The first parameter is the **key** to the session item. You will use this key to retrieve the item from the session. The second parameter is the **value** of the item. - - -## Retrieving Items - -You can use the **get** method on the Session class to retrieve any item in the session, including flash data. Just pass the key of the item you wish to retrieve: - - $name = Session::get('name'); - -By default, NULL will be returned if the session item does not exist. However, you may pass a default value as a second parameter to the get method: - - $name = Session::get('name', 'Fred'); - - $name = Session::get('name', function() {return 'Fred';}); - -Now, "Fred" will be returned if the "name" item does not exist in the session. - -Laravel even provides a simple way to determine if a session item exists using the **has** method: - - if (Session::has('name')) - { - $name = Session::get('name'); - } - - -## Removing Items - -To remove an item from the session use the **forget** method on the Session class: - - Session::forget('name'); - -You can even remove all of the items from the session using the **flush** method: - - Session::flush(); - - -## Flashing Items - -The **flash** method stores an item in the session that will expire after the next request. It's useful for storing temporary data like status or error messages: - - Session::flash('status', 'Welcome Back!'); - -Flash items that are expiring in subsequent requests can be retained for another request by using one of the **reflash** or **keep** methods: - -Retain all items for another request: - - Session::reflash(); - -Retain an individual item for another request: - - Session::keep('status'); - -Retain several items for another request: - - Session::keep(array('status', 'other_item')); - - -## Regeneration - -Sometimes you may want to "regenerate" the session ID. This simply means that a new, random session ID will be assigned to the session. Here's how to do it: - - Session::regenerate(); \ No newline at end of file diff --git a/laravel/documentation/strings.md b/laravel/documentation/strings.md deleted file mode 100644 index 121d9130..00000000 --- a/laravel/documentation/strings.md +++ /dev/null @@ -1,81 +0,0 @@ -# Working With Strings - -## Contents - -- [Capitalization, Etc.](#capitalization) -- [Word & Character Limiting](#limits) -- [Generating Random Strings](#random) -- [Singular & Plural](#singular-and-plural) -- [Slugs](#slugs) - - -## Capitalization, Etc. - -The **Str** class also provides three convenient methods for manipulating string capitalization: **upper**, **lower**, and **title**. These are more intelligent versions of the PHP [strtoupper](http://php.net/manual/en/function.strtoupper.php), [strtolower](http://php.net/manual/en/function.strtolower.php), and [ucwords](http://php.net/manual/en/function.ucwords.php) methods. More intelligent because they can handle UTF-8 input if the [multi-byte string](http://php.net/manual/en/book.mbstring.php) PHP extension is installed on your web server. To use them, just pass a string to the method: - - echo Str::lower('I am a string.'); - // i am a string. - - echo Str::upper('I am a string.'); - // I AM A STRING. - - echo Str::title('I am a string.'); - // I Am A String. - - -## Word & Character Limiting - -#### Limiting the number of characters in a string: - - echo Str::limit("Lorem ipsum dolor sit amet", 10); - // Lorem ipsu... - - echo Str::limit_exact("Lorem ipsum dolor sit amet", 10); - // Lorem i... - -#### Limiting the number of words in a string: - - echo Str::words("Lorem ipsum dolor sit amet", 3); - // Lorem ipsum dolor... - - -## Generating Random Strings - -#### Generating a random string of alpha-numeric characters: - - echo Str::random(32); - -#### Generating a random string of alphabetic characters: - - echo Str::random(32, 'alpha'); - - -## Singular & Plural - -#### Getting the plural form of a word: - - echo Str::plural('user'); - // users - -#### Getting the singular form of a word: - - echo Str::singular('users'); - // user - -#### Getting the plural form if specified value is greater than one: - - echo Str::plural('comment', count($comments)); - - -## Slugs - -#### Generating a URL friendly slug: - - return Str::slug('My First Blog Post!'); - // my-first-blog-post - -#### Generating a URL friendly slug using a given separator: - - return Str::slug('My First Blog Post!', '_'); - // my_first_blog_post - diff --git a/laravel/documentation/testing.md b/laravel/documentation/testing.md deleted file mode 100644 index a7d958c0..00000000 --- a/laravel/documentation/testing.md +++ /dev/null @@ -1,68 +0,0 @@ -# Unit Testing - -## Contents - -- [The Basics](#the-basics) -- [Creating Test Classes](#creating-test-classes) -- [Running Tests](#running-tests) -- [Calling Controllers From Tests](#calling-controllers-from-tests) - - -## The Basics - -Unit Testing allows you to test your code and verify that it is working correctly. In fact, many advocate that you should even write your tests before you write your code! Laravel provides beautiful integration with the popular [PHPUnit](http://www.phpunit.de/manual/current/en/) testing library, making it easy to get started writing your tests. In fact, the Laravel framework itself has hundreds of unit tests! - - -## Creating Test Classes - -All of your application's tests live in the **application/tests** directory. In this directory, you will find a basic **example.test.php** file. Pop it open and look at the class it contains: - - assertTrue(true); - } - - } - -Take special note of the **.test.php** file suffix. This tells Laravel that it should include this class as a test case when running your test. Any files in the test directory that are not named with this suffix will not be considered a test case. - -If you are writing tests for a bundle, just place them in a **tests** directory within the bundle. Laravel will take care of the rest! - -For more information regarding creating test cases, check out the [PHPUnit documentation](http://www.phpunit.de/manual/current/en/). - - -## Running Tests - -To run your tests, you can use Laravel's Artisan command-line utility: - -#### Running the application's tests via the Artisan CLI: - - php artisan test - -#### Running the unit tests for a bundle: - - php artisan test bundle-name - - -## Calling Controllers From Tests - -Here's an example of how you can call your controllers from your tests: - -#### Calling a controller from a test: - - $response = Controller::call('home@index', $parameters); - -#### Resolving an instance of a controller from a test: - - $controller = Controller::resolve('application', 'home@index'); - -> **Note:** The controller's action filters will still run when using Controller::call to execute controller actions. \ No newline at end of file diff --git a/laravel/documentation/urls.md b/laravel/documentation/urls.md deleted file mode 100644 index 8c03f9b1..00000000 --- a/laravel/documentation/urls.md +++ /dev/null @@ -1,109 +0,0 @@ -# Generating URLs - -## Contents - -- [The Basics](#the-basics) -- [URLs To Routes](#urls-to-routes) -- [URLs To Controller Actions](#urls-to-controller-actions) -- [URLs To Assets](#urls-to-assets) -- [URL Helpers](#url-helpers) - - -## The Basics - -#### Retrieving the application's base URL: - - $url = URL::base(); - -#### Generating a URL relative to the base URL: - - $url = URL::to('user/profile'); - -#### Generating a HTTPS URL: - - $url = URL::to_secure('user/login'); - -#### Retrieving the current URL: - - $url = URL::current(); - -#### Retrieving the current URL including query string: - - $url = URL::full(); - - -## URLs To Routes - -#### Generating a URL to a named route: - - $url = URL::to_route('profile'); - -Sometimes you may need to generate a URL to a named route, but also need to specify the values that should be used instead of the route's URI wildcards. It's easy to replace the wildcards with proper values: - -#### Generating a URL to a named route with wildcard values: - - $url = URL::to_route('profile', array($username)); - -*Further Reading:* - -- [Named Routes](/docs/routing#named-routes) - - -## URLs To Controller Actions - -#### Generating a URL to a controller action: - - $url = URL::to_action('user@profile'); - -#### Generating a URL to an action with wildcard values: - - $url = URL::to_action('user@profile', array($username)); - - -## URLs To A Different Language - -#### Generating a URL to the same page in another language: - - $url = URL::to_language('fr'); - -#### Generating a URL to your home page in another language: - - $url = URL::to_language('fr', true); - - -## URLs To Assets - -URLs generated for assets will not contain the "application.index" configuration option. - -#### Generating a URL to an asset: - - $url = URL::to_asset('js/jquery.js'); - - -## URL Helpers - -There are several global functions for generating URLs designed to make your life easier and your code cleaner: - -#### Generating a URL relative to the base URL: - - $url = url('user/profile'); - -#### Generating a URL to an asset: - - $url = asset('js/jquery.js'); - -#### Generating a URL to a named route: - - $url = route('profile'); - -#### Generating a URL to a named route with wildcard values: - - $url = route('profile', array($username)); - -#### Generating a URL to a controller action: - - $url = action('user@profile'); - -#### Generating a URL to an action with wildcard values: - - $url = action('user@profile', array($username)); \ No newline at end of file diff --git a/laravel/documentation/validation.md b/laravel/documentation/validation.md deleted file mode 100644 index aad4150e..00000000 --- a/laravel/documentation/validation.md +++ /dev/null @@ -1,485 +0,0 @@ -# Validation - -## Contents - -- [The Basics](#the-basics) -- [Validation Rules](#validation-rules) -- [Retrieving Error Message](#retrieving-error-messages) -- [Validation Walkthrough](#validation-walkthrough) -- [Custom Error Messages](#custom-error-messages) -- [Custom Validation Rules](#custom-validation-rules) - - -## The Basics - -Almost every interactive web application needs to validate data. For instance, a registration form probably requires the password to be confirmed. Maybe the e-mail address must be unique. Validating data can be a cumbersome process. Thankfully, it isn't in Laravel. The Validator class provides an awesome array of validation helpers to make validating your data a breeze. Let's walk through an example: - -#### Get an array of data you want to validate: - - $input = Input::all(); - -#### Define the validation rules for your data: - - $rules = array( - 'name' => 'required|max:50', - 'email' => 'required|email|unique:users', - ); - -#### Create a Validator instance and validate the data: - - $validation = Validator::make($input, $rules); - - if ($validation->fails()) - { - return $validation->errors; - } - -With the *errors* property, you can access a simple message collector class that makes working with your error messages a piece of cake. Of course, default error messages have been setup for all validation rules. The default messages live at **language/en/validation.php**. - -Now you are familiar with the basic usage of the Validator class. You're ready to dig in and learn about the rules you can use to validate your data! - - -## Validation Rules - -- [Required](#rule-required) -- [Alpha, Alpha Numeric, & Alpha Dash](#rule-alpha) -- [Size](#rule-size) -- [Numeric](#rule-numeric) -- [Inclusion & Exclusion](#rule-in) -- [Confirmation](#rule-confirmation) -- [Acceptance](#rule-acceptance) -- [Same & Different](#same-and-different) -- [Regular Expression Match](#regex-match) -- [Uniqueness & Existence](#rule-unique) -- [Dates](#dates) -- [E-Mail Addresses](#rule-email) -- [URLs](#rule-url) -- [Uploads](#rule-uploads) -- [Arrays](#rule-arrays) - - -### Required - -#### Validate that an attribute is present and is not an empty string: - - 'name' => 'required' - -#### Validate that an attribute is present, when another attribute is present: - 'last_name' => 'required_with:first_name' - - -### Alpha, Alpha Numeric, & Alpha Dash - -#### Validate that an attribute consists solely of letters: - - 'name' => 'alpha' - -#### Validate that an attribute consists of letters and numbers: - - 'username' => 'alpha_num' - -#### Validate that an attribute only contains letters, numbers, dashes, or underscores: - - 'username' => 'alpha_dash' - - -### Size - -#### Validate that an attribute is a given length, or, if an attribute is numeric, is a given value: - - 'name' => 'size:10' - -#### Validate that an attribute size is within a given range: - - 'payment' => 'between:10,50' - -> **Note:** All minimum and maximum checks are inclusive. - -#### Validate that an attribute is at least a given size: - - 'payment' => 'min:10' - -#### Validate that an attribute is no greater than a given size: - - 'payment' => 'max:50' - - -### Numeric - -#### Validate that an attribute is numeric: - - 'payment' => 'numeric' - -#### Validate that an attribute is an integer: - - 'payment' => 'integer' - - -### Inclusion & Exclusion - -#### Validate that an attribute is contained in a list of values: - - 'size' => 'in:small,medium,large' - -#### Validate that an attribute is not contained in a list of values: - - 'language' => 'not_in:cobol,assembler' - - -### Confirmation - -The *confirmed* rule validates that, for a given attribute, a matching *attribute_confirmation* attribute exists. - -#### Validate that an attribute is confirmed: - - 'password' => 'confirmed' - -Given this example, the Validator will make sure that the *password* attribute matches the *password_confirmation* attribute in the array being validated. - - -### Acceptance - -The *accepted* rule validates that an attribute is equal to *yes* or *1*. This rule is helpful for validating checkbox form fields such as "terms of service". - -#### Validate that an attribute is accepted: - - 'terms' => 'accepted' - - -## Same & Different - -#### Validate that an attribute matches another attribute: - - 'token1' => 'same:token2' - -#### Validate that two attributes have different values: - - 'password' => 'different:old_password', - - -### Regular Expression Match - -The *match* rule validates that an attribute matches a given regular expression. - -#### Validate that an attribute matches a regular expression: - - 'username' => 'match:/[a-z]+/'; - - -### Uniqueness & Existence - -#### Validate that an attribute is unique on a given database table: - - 'email' => 'unique:users' - -In the example above, the *email* attribute will be checked for uniqueness on the *users* table. Need to verify uniqueness on a column name other than the attribute name? No problem: - -#### Specify a custom column name for the unique rule: - - 'email' => 'unique:users,email_address' - -Many times, when updating a record, you want to use the unique rule, but exclude the row being updated. For example, when updating a user's profile, you may allow them to change their e-mail address. But, when the *unique* rule runs, you want it to skip the given user since they may not have changed their address, thus causing the *unique* rule to fail. It's easy: - -#### Forcing the unique rule to ignore a given ID: - - 'email' => 'unique:users,email_address,10' - -#### Validate that an attribute exists on a given database table: - - 'state' => 'exists:states' - -#### Specify a custom column name for the exists rule: - - 'state' => 'exists:states,abbreviation' - - -### Dates - -#### Validate that a date attribute is before a given date: - - 'birthdate' => 'before:1986-05-28'; - -#### Validate that a date attribute is after a given date: - - 'birthdate' => 'after:1986-05-28'; - -> **Note:** The **before** and **after** validation rules use the **strtotime** PHP function to convert your date to something the rule can understand. - -#### Validate that a date attribute conforms to a given format: - - 'start_date' => 'date_format:H\\:i'), - -> **Note:** The backslash escapes the colon so that it does not count as a parameter separator. - -The formatting options for the date format are described in the [PHP documentation](http://php.net/manual/en/datetime.createfromformat.php#refsect1-datetime.createfromformat-parameters). - - -### E-Mail Addresses - -#### Validate that an attribute is an e-mail address: - - 'address' => 'email' - -> **Note:** This rule uses the PHP built-in *filter_var* method. - - -### URLs - -#### Validate that an attribute is a URL: - - 'link' => 'url' - -#### Validate that an attribute is an active URL: - - 'link' => 'active_url' - -> **Note:** The *active_url* rule uses *checkdnsr* to verify the URL is active. - - -### Uploads - -The *mimes* rule validates that an uploaded file has a given MIME type. This rule uses the PHP Fileinfo extension to read the contents of the file and determine the actual MIME type. Any extension defined in the *config/mimes.php* file may be passed to this rule as a parameter: - -#### Validate that a file is one of the given types: - - 'picture' => 'mimes:jpg,gif' - -> **Note:** When validating files, be sure to use Input::file() or Input::all() to gather the input. - -#### Validate that a file is an image: - - 'picture' => 'image' - -#### Validate that a file is no more than a given size in kilobytes: - - 'picture' => 'image|max:100' - - -### Arrays - -#### Validate that an attribute is an array - - 'categories' => 'array' - -#### Validate that an attribute is an array, and has exactly 3 elements - - 'categories' => 'array|count:3' - -#### Validate that an attribute is an array, and has between 1 and 3 elements - - 'categories' => 'array|countbetween:1,3' - -#### Validate that an attribute is an array, and has at least 2 elements - - 'categories' => 'array|countmin:2' - -#### Validate that an attribute is an array, and has at most 2 elements - - 'categories' => 'array|countmax:2' - - -## Retrieving Error Messages - -Laravel makes working with your error messages a cinch using a simple error collector class. After calling the *passes* or *fails* method on a Validator instance, you may access the errors via the *errors* property. The error collector has several simple functions for retrieving your messages: - -#### Determine if an attribute has an error message: - - if ($validation->errors->has('email')) - { - // The e-mail attribute has errors… - } - -#### Retrieve the first error message for an attribute: - - echo $validation->errors->first('email'); - -Sometimes you may need to format the error message by wrapping it in HTML. No problem. Along with the :message place-holder, pass the format as the second parameter to the method. - -#### Format an error message: - - echo $validation->errors->first('email', '

    :message

    '); - -#### Get all of the error messages for a given attribute: - - $messages = $validation->errors->get('email'); - -#### Format all of the error messages for an attribute: - - $messages = $validation->errors->get('email', '

    :message

    '); - -#### Get all of the error messages for all attributes: - - $messages = $validation->errors->all(); - -#### Format all of the error messages for all attributes: - - $messages = $validation->errors->all('

    :message

    '); - - -## Validation Walkthrough - -Once you have performed your validation, you need an easy way to get the errors back to the view. Laravel makes it amazingly simple. Let's walk through a typical scenario. We'll define two routes: - - Route::get('register', function() - { - return View::make('user.register'); - }); - - Route::post('register', function() - { - $rules = array(…); - - $validation = Validator::make(Input::all(), $rules); - - if ($validation->fails()) - { - return Redirect::to('register')->with_errors($validation); - } - }); - -Great! So, we have two simple registration routes. One to handle displaying the form, and one to handle the posting of the form. In the POST route, we run some validation over the input. If the validation fails, we redirect back to the registration form and flash the validation errors to the session so they will be available for us to display. - -**But, notice we are not explicitly binding the errors to the view in our GET route**. However, an errors variable ($errors) will still be available in the view. Laravel intelligently determines if errors exist in the session, and if they do, binds them to the view for you. If no errors exist in the session, an empty message container will still be bound to the view. In your views, this allows you to always assume you have a message container available via the errors variable. We love making your life easier. - -For example, if email address validation failed, we can look for 'email' within the $errors session var. - - $errors->has('email') - -Using Blade, we can then conditionally add error messages to our view. - - {{ $errors->has('email') ? 'Invalid Email Address' : 'Condition is false. Can be left blank' }} - -This will also work great when we need to conditionally add classes when using something like Twitter Bootstrap. -For example, if the email address failed validation, we may want to add the "error" class from Bootstrap to our *div class="control-group"* statement. - -
    - -When the validation fails, our rendered view will have the appended *error* class. - -
    - - - - -## Custom Error Messages - -Want to use an error message other than the default? Maybe you even want to use a custom error message for a given attribute and rule. Either way, the Validator class makes it easy. - -#### Create an array of custom messages for the Validator: - - $messages = array( - 'required' => 'The :attribute field is required.', - ); - - $validation = Validator::make(Input::get(), $rules, $messages); - -Great! Now our custom message will be used anytime a required validation check fails. But, what is this **:attribute** stuff in our message? To make your life easier, the Validator class will replace the **:attribute** place-holder with the actual name of the attribute! It will even remove underscores from the attribute name. - -You may also use the **:other**, **:size**, **:min**, **:max**, and **:values** place-holders when constructing your error messages: - -#### Other validation message place-holders: - - $messages = array( - 'same' => 'The :attribute and :other must match.', - 'size' => 'The :attribute must be exactly :size.', - 'between' => 'The :attribute must be between :min - :max.', - 'in' => 'The :attribute must be one of the following types: :values', - ); - -So, what if you need to specify a custom required message, but only for the email attribute? No problem. Just specify the message using an **attribute_rule** naming convention: - -#### Specifying a custom error message for a given attribute: - - $messages = array( - 'email_required' => 'We need to know your e-mail address!', - ); - -In the example above, the custom required message will be used for the email attribute, while the default message will be used for all other attributes. - -However, if you are using many custom error messages, specifying inline may become cumbersome and messy. For that reason, you can specify your custom messages in the **custom** array within the validation language file: - -#### Adding custom error messages to the validation language file: - - 'custom' => array( - 'email_required' => 'We need to know your e-mail address!', - ) - - -## Custom Validation Rules - -Laravel provides a number of powerful validation rules. However, it's very likely that you'll need to eventually create some of your own. There are two simple methods for creating validation rules. Both are solid so use whichever you think best fits your project. - -#### Registering a custom validation rule: - - Validator::register('awesome', function($attribute, $value, $parameters) - { - return $value == 'awesome'; - }); - -In this example we're registering a new validation rule with the validator. The rule receives three arguments. The first is the name of the attribute being validated, the second is the value of the attribute being validated, and the third is an array of parameters that were specified for the rule. - -Here is how your custom validation rule looks when called: - - $rules = array( - 'username' => 'required|awesome', - ); - -Of course, you will need to define an error message for your new rule. You can do this either in an ad-hoc messages array: - - $messages = array( - 'awesome' => 'The attribute value must be awesome!', - ); - - $validator = Validator::make(Input::get(), $rules, $messages); - -Or by adding an entry for your rule in the **language/en/validation.php** file: - - 'awesome' => 'The attribute value must be awesome!', - -As mentioned above, you may even specify and receive a list of parameters in your custom rule: - - // When building your rules array… - - $rules = array( - 'username' => 'required|awesome:yes', - ); - - // In your custom rule… - - Validator::register('awesome', function($attribute, $value, $parameters) - { - return $value == $parameters[0]; - }); - -In this case, the parameters argument of your validation rule would receive an array containing one element: "yes". - -Another method for creating and storing custom validation rules is to extend the Validator class itself. By extending the class you create a new version of the validator that has all of the pre-existing functionality combined with your own custom additions. You can even choose to replace some of the default methods if you'd like. Let's look at an example: - -First, create a class that extends **Laravel\Validator** and place it in your **application/libraries** directory: - -#### Defining a custom validator class: - - -## Registering Assets - -The **Asset** class provides a simple way to manage the CSS and JavaScript used by your application. To register an asset just call the **add** method on the **Asset** class: - -#### Registering an asset: - - Asset::add('jquery', 'js/jquery.js'); - -The **add** method accepts three parameters. The first is the name of the asset, the second is the path to the asset relative to the **public** directory, and the third is a list of asset dependencies (more on that later). Notice that we did not tell the method if we were registering JavaScript or CSS. The **add** method will use the file extension to determine the type of file we are registering. - - -## Dumping Assets - -When you are ready to place the links to the registered assets on your view, you may use the **styles** or **scripts** methods: - -#### Dumping assets into a view: - - - - - - - -## Asset Dependencies - -Sometimes you may need to specify that an asset has dependencies. This means that the asset requires other assets to be declared in your view before it can be declared. Managing asset dependencies couldn't be easier in Laravel. Remember the "names" you gave to your assets? You can pass them as the third parameter to the **add** method to declare dependencies: - -#### Registering a bundle that has dependencies: - - Asset::add('jquery-ui', 'js/jquery-ui.js', 'jquery'); - -In this example, we are registering the **jquery-ui** asset, as well as specifying that it is dependent on the **jquery** asset. Now, when you place the asset links on your views, the jQuery asset will always be declared before the jQuery UI asset. Need to declare more than one dependency? No problem: - -#### Registering an asset that has multiple dependencies: - - Asset::add('jquery-ui', 'js/jquery-ui.js', array('first', 'second')); - - -## Asset Containers - -To increase response time, it is common to place JavaScript at the bottom of HTML documents. But, what if you also need to place some assets in the head of your document? No problem. The asset class provides a simple way to manage asset **containers**. Simply call the **container** method on the Asset class and mention the container name. Once you have a container instance, you are free to add any assets you wish to the container using the same syntax you are used to: - -#### Retrieving an instance of an asset container: - - Asset::container('footer')->add('example', 'js/example.js'); - -#### Dumping that assets from a given container: - - echo Asset::container('footer')->scripts(); - - -## Bundle Assets - -Before learning how to conveniently add and dump bundle assets, you may wish to read the documentation on [creating and publishing bundle assets](/docs/bundles#bundle-assets). - -When registering assets, the paths are typically relative to the **public** directory. However, this is inconvenient when dealing with bundle assets, since they live in the **public/bundles** directory. But, remember, Laravel is here to make your life easier. So, it is simple to specify the bundle which the Asset container is managing. - -#### Specifying the bundle the asset container is managing: - - Asset::container('foo')->bundle('admin'); - -Now, when you add an asset, you can use paths relative to the bundle's public directory. Laravel will automatically generate the correct full paths. \ No newline at end of file diff --git a/laravel/documentation/views/forms.md b/laravel/documentation/views/forms.md deleted file mode 100644 index cee6287a..00000000 --- a/laravel/documentation/views/forms.md +++ /dev/null @@ -1,161 +0,0 @@ -# Building Forms - -## Contents - -- [Opening A Form](#opening-a-form) -- [CSRF Protection](#csrf-protection) -- [Labels](#labels) -- [Text, Text Area, Password & Hidden Fields](#text) -- [File Input](#file) -- [Checkboxes and Radio Buttons](#checkboxes-and-radio-buttons) -- [Drop-Down Lists](#drop-down-lists) -- [Buttons](#buttons) -- [Custom Macros](#custom-macros) - -> **Note:** All input data displayed in form elements is filtered through the HTML::entities method. - - -## Opening A Form - -#### Opening a form to POST to the current URL: - - echo Form::open(); - -#### Opening a form using a given URI and request method: - - echo Form::open('user/profile', 'PUT'); - -#### Opening a Form that POSTS to a HTTPS URL: - - echo Form::open_secure('user/profile'); - -#### Specifying extra HTML attributes on a form open tag: - - echo Form::open('user/profile', 'POST', array('class' => 'awesome')); - -#### Opening a form that accepts file uploads: - - echo Form::open_for_files('users/profile'); - -#### Opening a form that accepts file uploads and uses HTTPS: - - echo Form::open_secure_for_files('users/profile'); - -#### Closing a form: - - echo Form::close(); - - -## CSRF Protection - -Laravel provides an easy method of protecting your application from cross-site request forgeries. First, a random token is placed in your user's session. Don't sweat it, this is done automatically. Next, use the token method to generate a hidden form input field containing the random token on your form: - -#### Generating a hidden field containing the session's CSRF token: - - echo Form::token(); - -#### Attaching the CSRF filter to a route: - - Route::post('profile', array('before' => 'csrf', function() - { - // - })); - -#### Retrieving the CSRF token string: - - $token = Session::token(); - -> **Note:** You must specify a session driver before using the Laravel CSRF protection facilities. - -*Further Reading:* - -- [Route Filters](/docs/routing#filters) -- [Cross-Site Request Forgery](http://en.wikipedia.org/wiki/Cross-site_request_forgery) - - -## Labels - -#### Generating a label element: - - echo Form::label('email', 'E-Mail Address'); - -#### Specifying extra HTML attributes for a label: - - echo Form::label('email', 'E-Mail Address', array('class' => 'awesome')); - -> **Note:** After creating a label, any form element you create with a name matching the label name will automatically receive an ID matching the label name as well. - - -## Text, Text Area, Password & Hidden Fields - -#### Generate a text input element: - - echo Form::text('username'); - -#### Specifying a default value for a text input element: - - echo Form::text('email', 'example@gmail.com'); - -> **Note:** The *hidden* and *textarea* methods have the same signature as the *text* method. You just learned three methods for the price of one! - -#### Generating a password input element: - - echo Form::password('password'); - - -## Checkboxes and Radio Buttons - -#### Generating a checkbox input element: - - echo Form::checkbox('name', 'value'); - -#### Generating a checkbox that is checked by default: - - echo Form::checkbox('name', 'value', true); - -> **Note:** The *radio* method has the same signature as the *checkbox* method. Two for one! - - -## File Input - -#### Generate a file input element: - - echo Form::file('image'); - - -## Drop-Down Lists - -#### Generating a drop-down list from an array of items: - - echo Form::select('size', array('L' => 'Large', 'S' => 'Small')); - -#### Generating a drop-down list with an item selected by default: - - echo Form::select('size', array('L' => 'Large', 'S' => 'Small'), 'S'); - - -## Buttons - -#### Generating a submit button element: - - echo Form::submit('Click Me!'); - -> **Note:** Need to create a button element? Try the *button* method. It has the same signature as *submit*. - - -## Custom Macros - -It's easy to define your own custom Form class helpers called "macros". Here's how it works. First, simply register the macro with a given name and a Closure: - -#### Registering a Form macro: - - Form::macro('my_field', function() - { - return ''; - }); - -Now you can call your macro using its name: - -#### Calling a custom Form macro: - - echo Form::my_field(); \ No newline at end of file diff --git a/laravel/documentation/views/home.md b/laravel/documentation/views/home.md deleted file mode 100644 index 97e9e19f..00000000 --- a/laravel/documentation/views/home.md +++ /dev/null @@ -1,264 +0,0 @@ -# Views & Responses - -## Contents - -- [The Basics](#the-basics) -- [Binding Data To Views](#binding-data-to-views) -- [Nesting Views](#nesting-views) -- [Named Views](#named-views) -- [View Composers](#view-composers) -- [Redirects](#redirects) -- [Redirecting With Flash Data](#redirecting-with-flash-data) -- [Downloads](#downloads) -- [Errors](#errors) - - -## The Basics - -Views contain the HTML that is sent to the person using your application. By separating your view from the business logic of your application, your code will be cleaner and easier to maintain. - -All views are stored within the **application/views** directory and use the PHP file extension. The **View** class provides a simple way to retrieve your views and return them to the client. Let's look at an example! - -#### Creating the view: - - - I'm stored in views/home/index.php! - - -#### Returning the view from a route: - - Route::get('/', function() - { - return View::make('home.index'); - }); - -#### Returning the view from a controller: - - public function action_index() - { - return View::make('home.index'); - }); - -#### Determining if a view exists: - - $exists = View::exists('home.index'); - -Sometimes you will need a little more control over the response sent to the browser. For example, you may need to set a custom header on the response, or change the HTTP status code. Here's how: - -#### Returning a custom response: - - Route::get('/', function() - { - $headers = array('foo' => 'bar'); - - return Response::make('Hello World!', 200, $headers); - }); - -#### Returning a custom response containing a view, with binding data: - - return Response::view('home', array('foo' => 'bar')); - -#### Returning a JSON response: - - return Response::json(array('name' => 'Batman')); - -#### Returning a JSONP response: - - return Response::jsonp('myCallback', array('name' => 'Batman')); - -#### Returning Eloquent models as JSON: - - return Response::eloquent(User::find(1)); - - -## Binding Data To Views - -Typically, a route or controller will request data from a model that the view needs to display. So, we need a way to pass the data to the view. There are several ways to accomplish this, so just pick the way that you like best! - -#### Binding data to a view: - - Route::get('/', function() - { - return View::make('home')->with('name', 'James'); - }); - -#### Accessing the bound data within a view: - - - Hello, . - - -#### Chaining the binding of data to a view: - - View::make('home') - ->with('name', 'James') - ->with('votes', 25); - -#### Passing an array of data to bind data: - - View::make('home', array('name' => 'James')); - -#### Using magic methods to bind data: - - $view->name = 'James'; - $view->email = 'example@example.com'; - -#### Using the ArrayAccess interface methods to bind data: - - $view['name'] = 'James'; - $view['email'] = 'example@example.com'; - - -## Nesting Views - -Often you will want to nest views within views. Nested views are sometimes called "partials", and help you keep views small and modular. - -#### Binding a nested view using the "nest" method: - - View::make('home')->nest('footer', 'partials.footer'); - -#### Passing data to a nested view: - - $view = View::make('home'); - - $view->nest('content', 'orders', array('orders' => $orders)); - -Sometimes you may wish to directly include a view from within another view. You can use the **render** helper function: - -#### Using the "render" helper to display a view: - -
    - -
    - -It is also very common to have a partial view that is responsible for display an instance of data in a list. For example, you may create a partial view responsible for displaying the details about a single order. Then, for example, you may loop through an array of orders, rendering the partial view for each order. This is made simpler using the **render_each** helper: - -#### Rendering a partial view for each item in an array: - -
    - - -The first argument is the name of the partial view, the second is the array of data, and the third is the variable name that should be used when each array item is passed to the partial view. - - -## Named Views - -Named views can help to make your code more expressive and organized. Using them is simple: - -#### Registering a named view: - - View::name('layouts.default', 'layout'); - -#### Getting an instance of the named view: - - return View::of('layout'); - -#### Binding data to a named view: - - return View::of('layout', array('orders' => $orders)); - - -## View Composers - -Each time a view is created, its "composer" event will be fired. You can listen for this event and use it to bind assets and common data to the view each time it is created. A common use-case for this functionality is a side-navigation partial that shows a list of random blog posts. You can nest your partial view by loading it in your layout view. Then, define a composer for that partial. The composer can then query the posts table and gather all of the necessary data to render your view. No more random logic strewn about! Composers are typically defined in **application/routes.php**. Here's an example: - -#### Register a view composer for the "home" view: - - View::composer('home', function($view) - { - $view->nest('footer', 'partials.footer'); - }); - -Now each time the "home" view is created, an instance of the View will be passed to the registered Closure, allowing you to prepare the view however you wish. - -#### Register a composer that handles multiple views: - - View::composer(array('home', 'profile'), function($view) - { - // - }); - -> **Note:** A view can have more than one composer. Go wild! - - -## Redirects - -It's important to note that both routes and controllers require responses to be returned with the 'return' directive. Instead of calling "Redirect::to()" where you'd like to redirect the user. You'd instead use "return Redirect::to()". This distinction is important as it's different than most other PHP frameworks and it could be easy to accidentally overlook the importance of this practice. - -#### Redirecting to another URI: - - return Redirect::to('user/profile'); - -#### Redirecting with a specific status: - - return Redirect::to('user/profile', 301); - -#### Redirecting to a secure URI: - - return Redirect::to_secure('user/profile'); - -#### Redirecting to the root of your application: - - return Redirect::home(); - -#### Redirecting back to the previous action: - - return Redirect::back(); - -#### Redirecting to a named route: - - return Redirect::to_route('profile'); - -#### Redirecting to a controller action: - - return Redirect::to_action('home@index'); - -Sometimes you may need to redirect to a named route, but also need to specify the values that should be used instead of the route's URI wildcards. It's easy to replace the wildcards with proper values: - -#### Redirecting to a named route with wildcard values: - - return Redirect::to_route('profile', array($username)); - -#### Redirecting to an action with wildcard values: - - return Redirect::to_action('user@profile', array($username)); - - -## Redirecting With Flash Data - -After a user creates an account or signs into your application, it is common to display a welcome or status message. But, how can you set the status message so it is available for the next request? Use the with() method to send flash data along with the redirect response. - - return Redirect::to('profile')->with('status', 'Welcome Back!'); - -You can access your message from the view with the Session get method: - - $status = Session::get('status'); - -*Further Reading:* - -- *[Sessions](/docs/session/config)* - - -## Downloads - -#### Sending a file download response: - - return Response::download('file/path.jpg'); - -#### Sending a file download and assigning a file name: - - return Response::download('file/path.jpg', 'photo.jpg'); - - -## Errors - -To generating proper error responses simply specify the response code that you wish to return. The corresponding view stored in **views/error** will automatically be returned. - -#### Generating a 404 error response: - - return Response::error('404'); - -#### Generating a 500 error response: - - return Response::error('500'); diff --git a/laravel/documentation/views/html.md b/laravel/documentation/views/html.md deleted file mode 100644 index 22b10d0b..00000000 --- a/laravel/documentation/views/html.md +++ /dev/null @@ -1,152 +0,0 @@ -# Building HTML - -## Content - -- [Entities](#entities) -- [Scripts And Style Sheets](#scripts-and-style-sheets) -- [Links](#links) -- [Links To Named Routes](#links-to-named-routes) -- [Links To Controller Actions](#links-to-controller-actions) -- [Mail-To Links](#mail-to-links) -- [Images](#images) -- [Lists](#lists) -- [Custom Macros](#custom-macros) - - -## Entities - -When displaying user input in your Views, it is important to convert all characters which have significance in HTML to their "entity" representation. - -For example, the < symbol should be converted to its entity representation. Converting HTML characters to their entity representation helps protect your application from cross-site scripting: - -#### Converting a string to its entity representation: - - echo HTML::entities(''); - -#### Using the "e" global helper: - - echo e(''); - - -## Scripts And Style Sheets - -#### Generating a reference to a JavaScript file: - - echo HTML::script('js/scrollTo.js'); - -#### Generating a reference to a CSS file: - - echo HTML::style('css/common.css'); - -#### Generating a reference to a CSS file using a given media type: - - echo HTML::style('css/common.css', array('media' => 'print')); - -*Further Reading:* - -- *[Managing Assets](/docs/views/assets)* - - -## Links - -#### Generating a link from a URI: - - echo HTML::link('user/profile', 'User Profile'); - -#### Generating a link that should use HTTPS: - - echo HTML::link_to_secure('user/profile', 'User Profile'); - -#### Generating a link and specifying extra HTML attributes: - - echo HTML::link('user/profile', 'User Profile', array('id' => 'profile_link')); - - -## Links To Named Routes - -#### Generating a link to a named route: - - echo HTML::link_to_route('profile'); - -#### Generating a link to a named route with wildcard values: - - $url = HTML::link_to_route('profile', 'User Profile', array($username)); - -*Further Reading:* - -- *[Named Routes](/docs/routing#named-routes)* - - -## Links To Controller Actions - -#### Generating a link to a controller action: - - echo HTML::link_to_action('home@index'); - -### Generating a link to a controller action with wildcard values: - - echo HTML::link_to_action('user@profile', 'User Profile', array($username)); - - -## Links To A Different Language - -#### Generating a link to the same page in another language: - - echo HTML::link_to_language('fr'); - -#### Generating a link to your home page another language - - echo HTML::link_to_language('fr', true); - - -## Mail-To Links - -The "mailto" method on the HTML class obfuscates the given e-mail address so it is not sniffed by bots. - -#### Creating a mail-to link: - - echo HTML::mailto('example@gmail.com', 'E-Mail Me!'); - -#### Creating a mail-to link using the e-mail address as the link text: - - echo HTML::mailto('example@gmail.com'); - - -## Images - -#### Generating an HTML image tag: - - echo HTML::image('img/smile.jpg', $alt_text); - -#### Generating an HTML image tag with extra HTML attributes: - - echo HTML::image('img/smile.jpg', $alt_text, array('id' => 'smile')); - - -## Lists - -#### Creating lists from an array of items: - - echo HTML::ol(array('Get Peanut Butter', 'Get Chocolate', 'Feast')); - - echo HTML::ul(array('Ubuntu', 'Snow Leopard', 'Windows')); - - echo HTML::dl(array('Ubuntu' => 'An operating system by Canonical', 'Windows' => 'An operating system by Microsoft')); - - -## Custom Macros - -It's easy to define your own custom HTML class helpers called "macros". Here's how it works. First, simply register the macro with a given name and a Closure: - -#### Registering a HTML macro: - - HTML::macro('my_element', function() - { - return '
    '; - }); - -Now you can call your macro using its name: - -#### Calling a custom HTML macro: - - echo HTML::my_element(); diff --git a/laravel/documentation/views/pagination.md b/laravel/documentation/views/pagination.md deleted file mode 100644 index 867bd85b..00000000 --- a/laravel/documentation/views/pagination.md +++ /dev/null @@ -1,110 +0,0 @@ -# Pagination - -## Contents - -- [The Basics](#the-basics) -- [Using The Query Builder](#using-the-query-builder) -- [Appending To Pagination Links](#appending-to-pagination-links) -- [Creating Paginators Manually](#creating-paginators-manually) -- [Pagination Styling](#pagination-styling) - - -## The Basics - -Laravel's paginator was designed to reduce the clutter of implementing pagination. - - -## Using The Query Builder - -Let's walk through a complete example of paginating using the [Fluent Query Builder](/docs/database/fluent): - -#### Pull the paginated results from the query: - - $orders = DB::table('orders')->paginate($per_page); - -You can also pass an optional array of table columns to select in the query: - - $orders = DB::table('orders')->paginate($per_page, array('id', 'name', 'created_at')); - -#### Display the results in a view: - - results as $order): ?> - id; ?> - - -#### Generate the pagination links: - - links(); ?> - -The links method will create an intelligent, sliding list of page links that looks something like this: - - Previous 1 2 … 24 25 26 27 28 29 30 … 78 79 Next - -The Paginator will automatically determine which page you're on and update the results and links accordingly. - -It's also possible to generate "next" and "previous" links: - -#### Generating simple "previous" and "next" links: - - previous().' '.$orders->next(); ?> - -*Further Reading:* - -- *[Fluent Query Builder](/docs/database/fluent)* - - -## Appending To Pagination Links - -You may need to add more items to the pagination links' query strings, such as the column your are sorting by. - -#### Appending to the query string of pagination links: - - appends(array('sort' => 'votes'))->links(); - -This will generate URLs that look something like this: - - http://example.com/something?page=2&sort=votes - - -## Creating Paginators Manually - -Sometimes you may need to create a Paginator instance manually, without using the query builder. Here's how: - -#### Creating a Paginator instance manually: - - $orders = Paginator::make($orders, $total, $per_page); - - -## Pagination Styling - -All pagination link elements can be style using CSS classes. Here is an example of the HTML elements generated by the links method: - - - -When you are on the first page of results, the "Previous" link will be disabled. Likewise, the "Next" link will be disabled when you are on the last page of results. The generated HTML will look like this: - -
  • Previous
  • diff --git a/laravel/documentation/views/templating.md b/laravel/documentation/views/templating.md deleted file mode 100644 index 0e04430a..00000000 --- a/laravel/documentation/views/templating.md +++ /dev/null @@ -1,210 +0,0 @@ -# Templating - -## Contents - -- [The Basics](#the-basics) -- [Sections](#sections) -- [Blade Template Engine](#blade-template-engine) -- [Blade Control Structures](#blade-control-structures) -- [Blade Layouts](#blade-layouts) - - -## The Basics - -Your application probably uses a common layout across most of its pages. Manually creating this layout within every controller action can be a pain. Specifying a controller layout will make your development much more enjoyable. Here's how to get started: - -#### Specify a "layout" property on your controller: - - class Base_Controller extends Controller { - - public $layout = 'layouts.common'; - - } - -#### Access the layout from the controllers' action: - - public function action_profile() - { - $this->layout->nest('content', 'user.profile'); - } - -> **Note:** When using layouts, actions do not need to return anything. - - -## Sections - -View sections provide a simple way to inject content into layouts from nested views. For example, perhaps you want to inject a nested view's needed JavaScript into the header of your layout. Let's dig in: - -#### Creating a section within a view: - - - - - -#### Rendering the contents of a section: - - - - - -#### Using Blade short-cuts to work with sections: - - @section('scripts') - - @endsection - - - @yield('scripts') - - - -## Blade Template Engine - -Blade makes writing your views pure bliss. To create a blade view, simply name your view file with a ".blade.php" extension. Blade allows you to use beautiful, unobtrusive syntax for writing PHP control structures and echoing data. Here's an example: - -#### Echoing a variable using Blade: - - Hello, {{ $name }}. - -#### Echoing function results using Blade: - - {{ Asset::styles() }} - -#### Render a view: - -You can use **@include** to render a view into another view. The rendered view will automatically inherit all of the data from the current view. - -

    Profile - @include('user.profile') - -Similarly, you can use **@render**, which behaves the same as **@include** except the rendered view will **not** inherit the data from the current view. - - @render('admin.list') - -#### Blade comments: - - {{-- This is a comment --}} - - {{-- - This is a - multi-line - comment. - --}} - -> **Note:** Unlike HTML comments, Blade comments are not visible in the HTML source. - - -## Blade Control Structures - -#### For Loop: - - @for ($i = 0; $i <= count($comments); $i++) - The comment body is {{ $comments[$i] }} - @endfor - -#### Foreach Loop: - - @foreach ($comments as $comment) - The comment body is {{ $comment->body }}. - @endforeach - -#### While Loop: - - @while ($something) - I am still looping! - @endwhile - -#### If Statement: - - @if ( $message == true ) - I'm displaying the message! - @endif - -#### If Else Statement: - - @if (count($comments) > 0) - I have comments! - @else - I have no comments! - @endif - -#### Else If Statement: - - @if ( $message == 'success' ) - It was a success! - @elseif ( $message == 'error' ) - An error occurred. - @else - Did it work? - @endif - -#### For Else Statement: - - @forelse ($posts as $post) - {{ $post->body }} - @empty - There are not posts in the array! - @endforelse - -#### Unless Statement: - - @unless(Auth::check()) - Login - @endunless - - // Equivalent to… - - - Login - - - -## Blade Layouts - -Not only does Blade provide clean, elegant syntax for common PHP control structures, it also gives you a beautiful method of using layouts for your views. For example, perhaps your application uses a "master" view to provide a common look and feel for your application. It may look something like this: - - - - -
    - @yield('content') -
    - - -Notice the "content" section being yielded. We need to fill this section with some text, so let's make another view that uses this layout: - - @layout('master') - - @section('content') - Welcome to the profile page! - @endsection - -Great! Now, we can simply return the "profile" view from our route: - - return View::make('profile'); - -The profile view will automatically use the "master" template thanks to Blade's **@layout** expression. - -> **Important:** The **@layout** call must always be on the very first line of the file, with no leading whitespaces or newline breaks. - -#### Appending with @parent - -Sometimes you may want to only append to a section of a layout rather than overwrite it. For example, consider the navigation list in our "master" layout. Let's assume we just want to append a new list item. Here's how to do it: - - @layout('master') - - @section('navigation') - @parent -
  • Nav Item 3
  • - @endsection - - @section('content') - Welcome to the profile page! - @endsection - -**@parent** will be replaced with the contents of the layout's *navigation* section, providing you with a beautiful and powerful method of performing layout extension and inheritance. diff --git a/laravel/error.php b/laravel/error.php deleted file mode 100644 index c4c1ac6b..00000000 --- a/laravel/error.php +++ /dev/null @@ -1,129 +0,0 @@ -getMessage(); - - // For Laravel view errors we want to show a prettier error: - $file = $exception->getFile(); - - if (str_contains($exception->getFile(), 'eval()') and str_contains($exception->getFile(), 'laravel'.DS.'view.php')) - { - $message = 'Error rendering view: ['.View::$last['name'].']'.PHP_EOL.PHP_EOL.$message; - - $file = View::$last['path']; - } - - // If detailed errors are enabled, we'll just format the exception into - // a simple error message and display it on the screen. We don't use a - // View in case the problem is in the View class. - - if (Config::get('error.detail')) - { - $response_body = "

    Unhandled Exception

    -

    Message:

    -
    ".$message."
    -

    Location:

    -
    ".$file." on line ".$exception->getLine()."
    "; - - if ($trace) - { - $response_body .= " -

    Stack Trace:

    -
    ".$exception->getTraceAsString()."
    "; - } - - $response = Response::make($response_body, 500); - } - - // If we're not using detailed error messages, we'll use the event - // system to get the response that should be sent to the browser. - // Using events gives the developer more freedom. - else - { - $response = Event::first('500'); - - $response = Response::prepare($response); - } - - $response->render(); - $response->send(); - $response->foundation->finish(); - - exit(1); - } - - /** - * Handle a native PHP error as an ErrorException. - * - * @param int $code - * @param string $error - * @param string $file - * @param int $line - * @return void - */ - public static function native($code, $error, $file, $line) - { - if (error_reporting() === 0) return; - - // For a PHP error, we'll create an ErrorException and then feed that - // exception to the exception method, which will create a simple view - // of the exception details for the developer. - $exception = new \ErrorException($error, $code, 0, $file, $line); - - if (in_array($code, Config::get('error.ignore'))) - { - return static::log($exception); - } - - static::exception($exception); - } - - /** - * Handle the PHP shutdown event. - * - * @return void - */ - public static function shutdown() - { - // If a fatal error occurred that we have not handled yet, we will - // create an ErrorException and feed it to the exception handler, - // as it will not yet have been handled. - $error = error_get_last(); - - if ( ! is_null($error)) - { - extract($error, EXTR_SKIP); - - static::exception(new \ErrorException($message, $type, 0, $file, $line), false); - } - } - - /** - * Log an exception. - * - * @param Exception $exception - * @return void - */ - public static function log($exception) - { - if (Config::get('error.log')) - { - call_user_func(Config::get('error.logger'), $exception); - } - } - -} diff --git a/laravel/event.php b/laravel/event.php deleted file mode 100644 index ccc3bf1c..00000000 --- a/laravel/event.php +++ /dev/null @@ -1,220 +0,0 @@ - - * // Register a callback for the "start" event - * Event::listen('start', function() {return 'Started!';}); - * - * // Register an object instance callback for the given event - * Event::listen('event', array($object, 'method')); - * - * - * @param string $event - * @param mixed $callback - * @return void - */ - public static function listen($event, $callback) - { - static::$events[$event][] = $callback; - } - - /** - * Override all callbacks for a given event with a new callback. - * - * @param string $event - * @param mixed $callback - * @return void - */ - public static function override($event, $callback) - { - static::clear($event); - - static::listen($event, $callback); - } - - /** - * Add an item to an event queue for processing. - * - * @param string $queue - * @param string $key - * @param mixed $data - * @return void - */ - public static function queue($queue, $key, $data = array()) - { - static::$queued[$queue][$key] = $data; - } - - /** - * Register a queue flusher callback. - * - * @param string $queue - * @param mixed $callback - * @return void - */ - public static function flusher($queue, $callback) - { - static::$flushers[$queue][] = $callback; - } - - /** - * Clear all event listeners for a given event. - * - * @param string $event - * @return void - */ - public static function clear($event) - { - unset(static::$events[$event]); - } - - /** - * Fire an event and return the first response. - * - * - * // Fire the "start" event - * $response = Event::first('start'); - * - * // Fire the "start" event passing an array of parameters - * $response = Event::first('start', array('Laravel', 'Framework')); - * - * - * @param string $event - * @param array $parameters - * @return mixed - */ - public static function first($event, $parameters = array()) - { - return head(static::fire($event, $parameters)); - } - - /** - * Fire an event and return the first response. - * - * Execution will be halted after the first valid response is found. - * - * @param string $event - * @param array $parameters - * @return mixed - */ - public static function until($event, $parameters = array()) - { - return static::fire($event, $parameters, true); - } - - /** - * Flush an event queue, firing the flusher for each payload. - * - * @param string $queue - * @return void - */ - public static function flush($queue) - { - foreach (static::$flushers[$queue] as $flusher) - { - // We will simply spin through each payload registered for the event and - // fire the flusher, passing each payloads as we go. This allows all - // the events on the queue to be processed by the flusher easily. - if ( ! isset(static::$queued[$queue])) continue; - - foreach (static::$queued[$queue] as $key => $payload) - { - array_unshift($payload, $key); - - call_user_func_array($flusher, $payload); - } - } - } - - /** - * Fire an event so that all listeners are called. - * - * - * // Fire the "start" event - * $responses = Event::fire('start'); - * - * // Fire the "start" event passing an array of parameters - * $responses = Event::fire('start', array('Laravel', 'Framework')); - * - * // Fire multiple events with the same parameters - * $responses = Event::fire(array('start', 'loading'), $parameters); - * - * - * @param string|array $events - * @param array $parameters - * @param bool $halt - * @return array - */ - public static function fire($events, $parameters = array(), $halt = false) - { - $responses = array(); - - $parameters = (array) $parameters; - - // If the event has listeners, we will simply iterate through them and call - // each listener, passing in the parameters. We will add the responses to - // an array of event responses and return the array. - foreach ((array) $events as $event) - { - if (static::listeners($event)) - { - foreach (static::$events[$event] as $callback) - { - $response = call_user_func_array($callback, $parameters); - - // If the event is set to halt, we will return the first response - // that is not null. This allows the developer to easily stack - // events but still get the first valid response. - if ($halt and ! is_null($response)) - { - return $response; - } - - // After the handler has been called, we'll add the response to - // an array of responses and return the array to the caller so - // all of the responses can be easily examined. - $responses[] = $response; - } - } - } - - return $halt ? null : $responses; - } - -} \ No newline at end of file diff --git a/laravel/file.php b/laravel/file.php deleted file mode 100644 index 5ac39cac..00000000 --- a/laravel/file.php +++ /dev/null @@ -1,355 +0,0 @@ - - * // Get the contents of a file - * $contents = File::get(path('app').'routes'.EXT); - * - * // Get the contents of a file or return a default value if it doesn't exist - * $contents = File::get(path('app').'routes'.EXT, 'Default Value'); - * - * - * @param string $path - * @param mixed $default - * @return string - */ - public static function get($path, $default = null) - { - return (file_exists($path)) ? file_get_contents($path) : value($default); - } - - /** - * Write to a file. - * - * @param string $path - * @param string $data - * @return int - */ - public static function put($path, $data) - { - return file_put_contents($path, $data, LOCK_EX); - } - - /** - * Append to a file. - * - * @param string $path - * @param string $data - * @return int - */ - public static function append($path, $data) - { - return file_put_contents($path, $data, LOCK_EX | FILE_APPEND); - } - - /** - * Delete a file. - * - * @param string $path - * @return bool - */ - public static function delete($path) - { - if (static::exists($path)) return @unlink($path); - } - - /** - * Move a file to a new location. - * - * @param string $path - * @param string $target - * @return void - */ - public static function move($path, $target) - { - return rename($path, $target); - } - - /** - * Copy a file to a new location. - * - * @param string $path - * @param string $target - * @return void - */ - public static function copy($path, $target) - { - return copy($path, $target); - } - - /** - * Extract the file extension from a file path. - * - * @param string $path - * @return string - */ - public static function extension($path) - { - return pathinfo($path, PATHINFO_EXTENSION); - } - - /** - * Get the file type of a given file. - * - * @param string $path - * @return string - */ - public static function type($path) - { - return filetype($path); - } - - /** - * Get the file size of a given file. - * - * @param string $path - * @return int - */ - public static function size($path) - { - return filesize($path); - } - - /** - * Get the file's last modification time. - * - * @param string $path - * @return int - */ - public static function modified($path) - { - return filemtime($path); - } - - /** - * Get a file MIME type by extension. - * - * - * // Determine the MIME type for the .tar extension - * $mime = File::mime('tar'); - * - * // Return a default value if the MIME can't be determined - * $mime = File::mime('ext', 'application/octet-stream'); - * - * - * @param string $extension - * @param string $default - * @return string - */ - public static function mime($extension, $default = 'application/octet-stream') - { - $mimes = Config::get('mimes'); - - if ( ! array_key_exists($extension, $mimes)) return $default; - - return (is_array($mimes[$extension])) ? $mimes[$extension][0] : $mimes[$extension]; - } - - /** - * Determine if a file is of a given type. - * - * The Fileinfo PHP extension is used to determine the file's MIME type. - * - * - * // Determine if a file is a JPG image - * $jpg = File::is('jpg', 'path/to/file.jpg'); - * - * // Determine if a file is one of a given list of types - * $image = File::is(array('jpg', 'png', 'gif'), 'path/to/file'); - * - * - * @param array|string $extensions - * @param string $path - * @return bool - */ - public static function is($extensions, $path) - { - $mimes = Config::get('mimes'); - - $mime = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $path); - - // The MIME configuration file contains an array of file extensions and - // their associated MIME types. We will loop through each extension the - // developer wants to check and look for the MIME type. - foreach ((array) $extensions as $extension) - { - if (isset($mimes[$extension]) and in_array($mime, (array) $mimes[$extension])) - { - return true; - } - } - - return false; - } - - /** - * Create a new directory. - * - * @param string $path - * @param int $chmod - * @return void - */ - public static function mkdir($path, $chmod = 0777) - { - return ( ! is_dir($path)) ? mkdir($path, $chmod, true) : true; - } - - /** - * Move a directory from one location to another. - * - * @param string $source - * @param string $destination - * @param int $options - * @return void - */ - public static function mvdir($source, $destination, $options = fIterator::SKIP_DOTS) - { - return static::cpdir($source, $destination, true, $options); - } - - /** - * Recursively copy directory contents to another directory. - * - * @param string $source - * @param string $destination - * @param bool $delete - * @param int $options - * @return void - */ - public static function cpdir($source, $destination, $delete = false, $options = fIterator::SKIP_DOTS) - { - if ( ! is_dir($source)) return false; - - // First we need to create the destination directory if it doesn't - // already exists. This directory hosts all of the assets we copy - // from the installed bundle's source directory. - if ( ! is_dir($destination)) - { - mkdir($destination, 0777, true); - } - - $items = new fIterator($source, $options); - - foreach ($items as $item) - { - $location = $destination.DS.$item->getBasename(); - - // If the file system item is a directory, we will recurse the - // function, passing in the item directory. To get the proper - // destination path, we'll add the basename of the source to - // to the destination directory. - if ($item->isDir()) - { - $path = $item->getRealPath(); - - if (! static::cpdir($path, $location, $delete, $options)) return false; - - if ($delete) @rmdir($item->getRealPath()); - } - // If the file system item is an actual file, we can copy the - // file from the bundle asset directory to the public asset - // directory. The "copy" method will overwrite any existing - // files with the same name. - else - { - if(! copy($item->getRealPath(), $location)) return false; - - if ($delete) @unlink($item->getRealPath()); - } - } - - unset($items); - if ($delete) @rmdir($source); - - return true; - } - - /** - * Recursively delete a directory. - * - * @param string $directory - * @param bool $preserve - * @return void - */ - public static function rmdir($directory, $preserve = false) - { - if ( ! is_dir($directory)) return; - - $items = new fIterator($directory); - - foreach ($items as $item) - { - // If the item is a directory, we can just recurse into the - // function and delete that sub-directory, otherwise we'll - // just delete the file and keep going! - if ($item->isDir()) - { - static::rmdir($item->getRealPath()); - } - else - { - @unlink($item->getRealPath()); - } - } - - unset($items); - if ( ! $preserve) @rmdir($directory); - } - - /** - * Empty the specified directory of all files and folders. - * - * @param string $directory - * @return void - */ - public static function cleandir($directory) - { - return static::rmdir($directory, true); - } - - /** - * Get the most recently modified file in a directory. - * - * @param string $directory - * @param int $options - * @return SplFileInfo - */ - public static function latest($directory, $options = fIterator::SKIP_DOTS) - { - $latest = null; - - $time = 0; - - $items = new fIterator($directory, $options); - - // To get the latest created file, we'll simply loop through the - // directory, setting the latest file if we encounter a file - // with a UNIX timestamp greater than the latest one. - foreach ($items as $item) - { - if ($item->getMTime() > $time) - { - $latest = $item; - $time = $item->getMTime(); - } - } - - return $latest; - } - -} \ No newline at end of file diff --git a/laravel/fluent.php b/laravel/fluent.php deleted file mode 100644 index 2fed023f..00000000 --- a/laravel/fluent.php +++ /dev/null @@ -1,96 +0,0 @@ - - * Create a new fluent container with attributes - * $fluent = new Fluent(array('name' => 'Taylor')); - * - * - * @param array $attributes - * @return void - */ - public function __construct($attributes = array()) - { - foreach ($attributes as $key => $value) - { - $this->$key = $value; - } - } - - /** - * Get an attribute from the fluent container. - * - * @param string $attribute - * @param mixed $default - * @return mixed - */ - public function get($attribute, $default = null) - { - return array_get($this->attributes, $attribute, $default); - } - - /** - * Handle dynamic calls to the container to set attributes. - * - * - * // Fluently set the value of a few attributes - * $fluent->name('Taylor')->age(25); - * - * // Set the value of an attribute to true (boolean) - * $fluent->nullable()->name('Taylor'); - * - */ - public function __call($method, $parameters) - { - $this->$method = (count($parameters) > 0) ? $parameters[0] : true; - - return $this; - } - - /** - * Dynamically retrieve the value of an attribute. - */ - public function __get($key) - { - if (array_key_exists($key, $this->attributes)) - { - return $this->attributes[$key]; - } - } - - /** - * Dynamically set the value of an attribute. - */ - public function __set($key, $value) - { - $this->attributes[$key] = $value; - } - - /** - * Dynamically check if an attribute is set. - */ - public function __isset($key) - { - return isset($this->attributes[$key]); - } - - /** - * Dynamically unset an attribute. - */ - public function __unset($key) - { - unset($this->attributes[$key]); - } - -} \ No newline at end of file diff --git a/laravel/form.php b/laravel/form.php deleted file mode 100644 index 5a450b52..00000000 --- a/laravel/form.php +++ /dev/null @@ -1,618 +0,0 @@ - - * // Open a "POST" form to the current request URI - * echo Form::open(); - * - * // Open a "POST" form to a given URI - * echo Form::open('user/profile'); - * - * // Open a "PUT" form to a given URI - * echo Form::open('user/profile', 'put'); - * - * // Open a form that has HTML attributes - * echo Form::open('user/profile', 'post', array('class' => 'profile')); - * - * - * @param string $action - * @param string $method - * @param array $attributes - * @param bool $https - * @return string - */ - public static function open($action = null, $method = 'POST', $attributes = array(), $https = null) - { - $method = strtoupper($method); - - $attributes['method'] = static::method($method); - - $attributes['action'] = static::action($action, $https); - - // If a character encoding has not been specified in the attributes, we will - // use the default encoding as specified in the application configuration - // file for the "accept-charset" attribute. - if ( ! array_key_exists('accept-charset', $attributes)) - { - $attributes['accept-charset'] = Config::get('application.encoding'); - } - - $append = ''; - - // Since PUT and DELETE methods are not actually supported by HTML forms, - // we'll create a hidden input element that contains the request method - // and set the actual request method variable to POST. - if ($method == 'PUT' or $method == 'DELETE') - { - $append = static::hidden(Request::spoofer, $method); - } - - return ''.$append; - } - - /** - * Determine the appropriate request method to use for a form. - * - * @param string $method - * @return string - */ - protected static function method($method) - { - return ($method !== 'GET') ? 'POST' : $method; - } - - /** - * Determine the appropriate action parameter to use for a form. - * - * If no action is specified, the current request URI will be used. - * - * @param string $action - * @param bool $https - * @return string - */ - protected static function action($action, $https) - { - $uri = (is_null($action)) ? URI::current() : $action; - - return HTML::entities(URL::to($uri, $https)); - } - - /** - * Open a HTML form with a HTTPS action URI. - * - * @param string $action - * @param string $method - * @param array $attributes - * @return string - */ - public static function open_secure($action = null, $method = 'POST', $attributes = array()) - { - return static::open($action, $method, $attributes, true); - } - - /** - * Open a HTML form that accepts file uploads. - * - * @param string $action - * @param string $method - * @param array $attributes - * @param bool $https - * @return string - */ - public static function open_for_files($action = null, $method = 'POST', $attributes = array(), $https = null) - { - $attributes['enctype'] = 'multipart/form-data'; - - return static::open($action, $method, $attributes, $https); - } - - /** - * Open a HTML form that accepts file uploads with a HTTPS action URI. - * - * @param string $action - * @param string $method - * @param array $attributes - * @return string - */ - public static function open_secure_for_files($action = null, $method = 'POST', $attributes = array()) - { - return static::open_for_files($action, $method, $attributes, true); - } - - /** - * Close a HTML form. - * - * @return string - */ - public static function close() - { - return ''; - } - - /** - * Generate a hidden field containing the current CSRF token. - * - * @return string - */ - public static function token() - { - return static::input('hidden', Session::csrf_token, Session::token()); - } - - /** - * Create a HTML label element. - * - * - * // Create a label for the "email" input element - * echo Form::label('email', 'E-Mail Address'); - * - * - * @param string $name - * @param string $value - * @param array $attributes - * @return string - */ - public static function label($name, $value, $attributes = array()) - { - static::$labels[] = $name; - - $attributes = HTML::attributes($attributes); - - $value = HTML::entities($value); - - return ''; - } - - /** - * Create a HTML input element. - * - * - * // Create a "text" input element named "email" - * echo Form::input('text', 'email'); - * - * // Create an input element with a specified default value - * echo Form::input('text', 'email', 'example@gmail.com'); - * - * - * @param string $type - * @param string $name - * @param mixed $value - * @param array $attributes - * @return string - */ - public static function input($type, $name, $value = null, $attributes = array()) - { - $name = (isset($attributes['name'])) ? $attributes['name'] : $name; - - $id = static::id($name, $attributes); - - $attributes = array_merge($attributes, compact('type', 'name', 'value', 'id')); - - return ''; - } - - /** - * Create a HTML text input element. - * - * @param string $name - * @param string $value - * @param array $attributes - * @return string - */ - public static function text($name, $value = null, $attributes = array()) - { - return static::input('text', $name, $value, $attributes); - } - - /** - * Create a HTML password input element. - * - * @param string $name - * @param array $attributes - * @return string - */ - public static function password($name, $attributes = array()) - { - return static::input('password', $name, null, $attributes); - } - - /** - * Create a HTML hidden input element. - * - * @param string $name - * @param string $value - * @param array $attributes - * @return string - */ - public static function hidden($name, $value = null, $attributes = array()) - { - return static::input('hidden', $name, $value, $attributes); - } - - /** - * Create a HTML search input element. - * - * @param string $name - * @param string $value - * @param array $attributes - * @return string - */ - public static function search($name, $value = null, $attributes = array()) - { - return static::input('search', $name, $value, $attributes); - } - - /** - * Create a HTML email input element. - * - * @param string $name - * @param string $value - * @param array $attributes - * @return string - */ - public static function email($name, $value = null, $attributes = array()) - { - return static::input('email', $name, $value, $attributes); - } - - /** - * Create a HTML telephone input element. - * - * @param string $name - * @param string $value - * @param array $attributes - * @return string - */ - public static function telephone($name, $value = null, $attributes = array()) - { - return static::input('tel', $name, $value, $attributes); - } - - /** - * Create a HTML URL input element. - * - * @param string $name - * @param string $value - * @param array $attributes - * @return string - */ - public static function url($name, $value = null, $attributes = array()) - { - return static::input('url', $name, $value, $attributes); - } - - /** - * Create a HTML number input element. - * - * @param string $name - * @param string $value - * @param array $attributes - * @return string - */ - public static function number($name, $value = null, $attributes = array()) - { - return static::input('number', $name, $value, $attributes); - } - - /** - * Create a HTML date input element. - * - * @param string $name - * @param string $value - * @param array $attributes - * @return string - */ - public static function date($name, $value = null, $attributes = array()) - { - return static::input('date', $name, $value, $attributes); - } - - /** - * Create a HTML file input element. - * - * @param string $name - * @param array $attributes - * @return string - */ - public static function file($name, $attributes = array()) - { - return static::input('file', $name, null, $attributes); - } - - /** - * Create a HTML textarea element. - * - * @param string $name - * @param string $value - * @param array $attributes - * @return string - */ - public static function textarea($name, $value = '', $attributes = array()) - { - $attributes['name'] = $name; - - $attributes['id'] = static::id($name, $attributes); - - if ( ! isset($attributes['rows'])) $attributes['rows'] = 10; - - if ( ! isset($attributes['cols'])) $attributes['cols'] = 50; - - return ''.HTML::entities($value).''; - } - - /** - * Create a HTML select element. - * - * - * // Create a HTML select element filled with options - * echo Form::select('sizes', array('S' => 'Small', 'L' => 'Large')); - * - * // Create a select element with a default selected value - * echo Form::select('sizes', array('S' => 'Small', 'L' => 'Large'), 'L'); - * - * - * @param string $name - * @param array $options - * @param string $selected - * @param array $attributes - * @return string - */ - public static function select($name, $options = array(), $selected = null, $attributes = array()) - { - $attributes['id'] = static::id($name, $attributes); - - $attributes['name'] = $name; - - $html = array(); - - foreach ($options as $value => $display) - { - if (is_array($display)) - { - $html[] = static::optgroup($display, $value, $selected); - } - else - { - $html[] = static::option($value, $display, $selected); - } - } - - return ''.implode('', $html).''; - } - - /** - * Create a HTML select element optgroup. - * - * @param array $options - * @param string $label - * @param string $selected - * @return string - */ - protected static function optgroup($options, $label, $selected) - { - $html = array(); - - foreach ($options as $value => $display) - { - $html[] = static::option($value, $display, $selected); - } - - return ''.implode('', $html).''; - } - - /** - * Create a HTML select element option. - * - * @param string $value - * @param string $display - * @param string $selected - * @return string - */ - protected static function option($value, $display, $selected) - { - if (is_array($selected)) - { - $selected = (in_array($value, $selected)) ? 'selected' : null; - } - else - { - $selected = ((string) $value == (string) $selected) ? 'selected' : null; - } - - $attributes = array('value' => HTML::entities($value), 'selected' => $selected); - - return ''.HTML::entities($display).''; - } - - /** - * Create a HTML checkbox input element. - * - * - * // Create a checkbox element - * echo Form::checkbox('terms', 'yes'); - * - * // Create a checkbox that is selected by default - * echo Form::checkbox('terms', 'yes', true); - * - * - * @param string $name - * @param string $value - * @param bool $checked - * @param array $attributes - * @return string - */ - public static function checkbox($name, $value = 1, $checked = false, $attributes = array()) - { - return static::checkable('checkbox', $name, $value, $checked, $attributes); - } - - /** - * Create a HTML radio button input element. - * - * - * // Create a radio button element - * echo Form::radio('drinks', 'Milk'); - * - * // Create a radio button that is selected by default - * echo Form::radio('drinks', 'Milk', true); - * - * - * @param string $name - * @param string $value - * @param bool $checked - * @param array $attributes - * @return string - */ - public static function radio($name, $value = null, $checked = false, $attributes = array()) - { - if (is_null($value)) $value = $name; - - return static::checkable('radio', $name, $value, $checked, $attributes); - } - - /** - * Create a checkable input element. - * - * @param string $type - * @param string $name - * @param string $value - * @param bool $checked - * @param array $attributes - * @return string - */ - protected static function checkable($type, $name, $value, $checked, $attributes) - { - if ($checked) $attributes['checked'] = 'checked'; - - $attributes['id'] = static::id($name, $attributes); - - return static::input($type, $name, $value, $attributes); - } - - /** - * Create a HTML submit input element. - * - * @param string $value - * @param array $attributes - * @return string - */ - public static function submit($value = null, $attributes = array()) - { - return static::input('submit', null, $value, $attributes); - } - - /** - * Create a HTML reset input element. - * - * @param string $value - * @param array $attributes - * @return string - */ - public static function reset($value = null, $attributes = array()) - { - return static::input('reset', null, $value, $attributes); - } - - /** - * Create a HTML image input element. - * - * - * // Create an image input element - * echo Form::image('img/submit.png'); - * - * - * @param string $url - * @param string $name - * @param array $attributes - * @return string - */ - public static function image($url, $name = null, $attributes = array()) - { - $attributes['src'] = URL::to_asset($url); - - return static::input('image', $name, null, $attributes); - } - - /** - * Create a HTML button element. - * - * @param string $value - * @param array $attributes - * @return string - */ - public static function button($value = null, $attributes = array()) - { - return ''.HTML::entities($value).''; - } - - /** - * Determine the ID attribute for a form element. - * - * @param string $name - * @param array $attributes - * @return mixed - */ - protected static function id($name, $attributes) - { - // If an ID has been explicitly specified in the attributes, we will - // use that ID. Otherwise, we will look for an ID in the array of - // label names so labels and their elements have the same ID. - if (array_key_exists('id', $attributes)) - { - return $attributes['id']; - } - - if (in_array($name, static::$labels)) - { - return $name; - } - } - - /** - * Dynamically handle calls to custom macros. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public static function __callStatic($method, $parameters) - { - if (isset(static::$macros[$method])) - { - return call_user_func_array(static::$macros[$method], $parameters); - } - - throw new \Exception("Method [$method] does not exist."); - } - -} diff --git a/laravel/hash.php b/laravel/hash.php deleted file mode 100644 index 155174fe..00000000 --- a/laravel/hash.php +++ /dev/null @@ -1,53 +0,0 @@ - - * // Create a Bcrypt hash of a value - * $hash = Hash::make('secret'); - * - * // Use a specified number of iterations when creating the hash - * $hash = Hash::make('secret', 12); - * - * - * @param string $value - * @param int $rounds - * @return string - */ - public static function make($value, $rounds = 8) - { - $work = str_pad($rounds, 2, '0', STR_PAD_LEFT); - - // Bcrypt expects the salt to be 22 base64 encoded characters including - // dots and slashes. We will get rid of the plus signs included in the - // base64 data and replace them with dots. - if (function_exists('openssl_random_pseudo_bytes')) - { - $salt = openssl_random_pseudo_bytes(16); - } - else - { - $salt = Str::random(40); - } - - $salt = substr(strtr(base64_encode($salt), '+', '.'), 0 , 22); - - return crypt($value, '$2a$'.$work.'$'.$salt); - } - - /** - * Determine if an unhashed value matches a Bcrypt hash. - * - * @param string $value - * @param string $hash - * @return bool - */ - public static function check($value, $hash) - { - return crypt($value, $hash) === $hash; - } - -} \ No newline at end of file diff --git a/laravel/helpers.php b/laravel/helpers.php deleted file mode 100644 index 513e3baa..00000000 --- a/laravel/helpers.php +++ /dev/null @@ -1,598 +0,0 @@ -"; - var_dump($value); - echo ""; - die; -} - -/** - * Get an item from an array using "dot" notation. - * - * - * // Get the $array['user']['name'] value from the array - * $name = array_get($array, 'user.name'); - * - * // Return a default from if the specified item doesn't exist - * $name = array_get($array, 'user.name', 'Taylor'); - * - * - * @param array $array - * @param string $key - * @param mixed $default - * @return mixed - */ -function array_get($array, $key, $default = null) -{ - if (is_null($key)) return $array; - - // To retrieve the array item using dot syntax, we'll iterate through - // each segment in the key and look for that value. If it exists, we - // will return it, otherwise we will set the depth of the array and - // look for the next segment. - foreach (explode('.', $key) as $segment) - { - if ( ! is_array($array) or ! array_key_exists($segment, $array)) - { - return value($default); - } - - $array = $array[$segment]; - } - - return $array; -} - -/** - * Set an array item to a given value using "dot" notation. - * - * If no key is given to the method, the entire array will be replaced. - * - * - * // Set the $array['user']['name'] value on the array - * array_set($array, 'user.name', 'Taylor'); - * - * // Set the $array['user']['name']['first'] value on the array - * array_set($array, 'user.name.first', 'Michael'); - * - * - * @param array $array - * @param string $key - * @param mixed $value - * @return void - */ -function array_set(&$array, $key, $value) -{ - if (is_null($key)) return $array = $value; - - $keys = explode('.', $key); - - // This loop allows us to dig down into the array to a dynamic depth by - // setting the array value for each level that we dig into. Once there - // is one key left, we can fall out of the loop and set the value as - // we should be at the proper depth. - while (count($keys) > 1) - { - $key = array_shift($keys); - - // If the key doesn't exist at this depth, we will just create an - // empty array to hold the next value, allowing us to create the - // arrays to hold the final value. - if ( ! isset($array[$key]) or ! is_array($array[$key])) - { - $array[$key] = array(); - } - - $array =& $array[$key]; - } - - $array[array_shift($keys)] = $value; -} - -/** - * Remove an array item from a given array using "dot" notation. - * - * - * // Remove the $array['user']['name'] item from the array - * array_forget($array, 'user.name'); - * - * // Remove the $array['user']['name']['first'] item from the array - * array_forget($array, 'user.name.first'); - * - * - * @param array $array - * @param string $key - * @return void - */ -function array_forget(&$array, $key) -{ - $keys = explode('.', $key); - - // This loop functions very similarly to the loop in the "set" method. - // We will iterate over the keys, setting the array value to the new - // depth at each iteration. Once there is only one key left, we will - // be at the proper depth in the array. - while (count($keys) > 1) - { - $key = array_shift($keys); - - // Since this method is supposed to remove a value from the array, - // if a value higher up in the chain doesn't exist, there is no - // need to keep digging into the array, since it is impossible - // for the final value to even exist. - if ( ! isset($array[$key]) or ! is_array($array[$key])) - { - return; - } - - $array =& $array[$key]; - } - - unset($array[array_shift($keys)]); -} - -/** - * Return the first element in an array which passes a given truth test. - * - * - * // Return the first array element that equals "Taylor" - * $value = array_first($array, function($k, $v) {return $v == 'Taylor';}); - * - * // Return a default value if no matching element is found - * $value = array_first($array, function($k, $v) {return $v == 'Taylor'}, 'Default'); - * - * - * @param array $array - * @param Closure $callback - * @param mixed $default - * @return mixed - */ -function array_first($array, $callback, $default = null) -{ - foreach ($array as $key => $value) - { - if (call_user_func($callback, $key, $value)) return $value; - } - - return value($default); -} - -/** - * Recursively remove slashes from array keys and values. - * - * @param array $array - * @return array - */ -function array_strip_slashes($array) -{ - $result = array(); - - foreach($array as $key => $value) - { - $key = stripslashes($key); - - // If the value is an array, we will just recurse back into the - // function to keep stripping the slashes out of the array, - // otherwise we will set the stripped value. - if (is_array($value)) - { - $result[$key] = array_strip_slashes($value); - } - else - { - $result[$key] = stripslashes($value); - } - } - - return $result; -} - -/** - * Divide an array into two arrays. One with keys and the other with values. - * - * @param array $array - * @return array - */ -function array_divide($array) -{ - return array(array_keys($array), array_values($array)); -} - -/** - * Pluck an array of values from an array. - * - * @param array $array - * @param string $key - * @return array - */ -function array_pluck($array, $key) -{ - return array_map(function($v) use ($key) - { - return is_object($v) ? $v->$key : $v[$key]; - - }, $array); -} - -/** - * Get a subset of the items from the given array. - * - * @param array $array - * @param array $keys - * @return array - */ -function array_only($array, $keys) -{ - return array_intersect_key( $array, array_flip((array) $keys) ); -} - -/** - * Get all of the given array except for a specified array of items. - * - * @param array $array - * @param array $keys - * @return array - */ -function array_except($array, $keys) -{ - return array_diff_key( $array, array_flip((array) $keys) ); -} - -/** - * Transform Eloquent models to a JSON object. - * - * @param Eloquent|array $models - * @return object - */ -function eloquent_to_json($models) -{ - if ($models instanceof Laravel\Database\Eloquent\Model) - { - return json_encode($models->to_array()); - } - - return json_encode(array_map(function($m) { return $m->to_array(); }, $models)); -} - -/** - * Determine if "Magic Quotes" are enabled on the server. - * - * @return bool - */ -function magic_quotes() -{ - return function_exists('get_magic_quotes_gpc') and get_magic_quotes_gpc(); -} - -/** - * Return the first element of an array. - * - * This is simply a convenient wrapper around the "reset" method. - * - * @param array $array - * @return mixed - */ -function head($array) -{ - return reset($array); -} - -/** - * Generate an application URL. - * - * - * // Create a URL to a location within the application - * $url = url('user/profile'); - * - * // Create a HTTPS URL to a location within the application - * $url = url('user/profile', true); - * - * - * @param string $url - * @param bool $https - * @return string - */ -function url($url = '', $https = null) -{ - return Laravel\URL::to($url, $https); -} - -/** - * Generate an application URL to an asset. - * - * @param string $url - * @param bool $https - * @return string - */ -function asset($url, $https = null) -{ - return Laravel\URL::to_asset($url, $https); -} - -/** - * Generate a URL to a controller action. - * - * - * // Generate a URL to the "index" method of the "user" controller - * $url = action('user@index'); - * - * // Generate a URL to http://example.com/user/profile/taylor - * $url = action('user@profile', array('taylor')); - * - * - * @param string $action - * @param array $parameters - * @return string - */ -function action($action, $parameters = array()) -{ - return Laravel\URL::to_action($action, $parameters); -} - -/** - * Generate a URL from a route name. - * - * - * // Create a URL to the "profile" named route - * $url = route('profile'); - * - * // Create a URL to the "profile" named route with wildcard parameters - * $url = route('profile', array($username)); - * - * - * @param string $name - * @param array $parameters - * @return string - */ -function route($name, $parameters = array()) -{ - return Laravel\URL::to_route($name, $parameters); -} - -/** - * Determine if a given string begins with a given value. - * - * @param string $haystack - * @param string $needle - * @return bool - */ -function starts_with($haystack, $needle) -{ - return strpos($haystack, $needle) === 0; -} - -/** - * Determine if a given string ends with a given value. - * - * @param string $haystack - * @param string $needle - * @return bool - */ -function ends_with($haystack, $needle) -{ - return $needle == substr($haystack, strlen($haystack) - strlen($needle)); -} - -/** - * Determine if a given string contains a given sub-string. - * - * @param string $haystack - * @param string|array $needle - * @return bool - */ -function str_contains($haystack, $needle) -{ - foreach ((array) $needle as $n) - { - if (strpos($haystack, $n) !== false) return true; - } - - return false; -} - -/** - * Cap a string with a single instance of the given string. - * - * @param string $value - * @param string $cap - * @return string - */ -function str_finish($value, $cap) -{ - return rtrim($value, $cap).$cap; -} - -/** - * Determine if the given object has a toString method. - * - * @param object $value - * @return bool - */ -function str_object($value) -{ - return is_object($value) and method_exists($value, '__toString'); -} - -/** - * Get the root namespace of a given class. - * - * @param string $class - * @param string $separator - * @return string - */ -function root_namespace($class, $separator = '\\') -{ - if (str_contains($class, $separator)) - { - return head(explode($separator, $class)); - } -} - -/** - * Get the "class basename" of a class or object. - * - * The basename is considered to be the name of the class minus all namespaces. - * - * @param object|string $class - * @return string - */ -function class_basename($class) -{ - if (is_object($class)) $class = get_class($class); - - return basename(str_replace('\\', '/', $class)); -} - -/** - * Return the value of the given item. - * - * If the given item is a Closure the result of the Closure will be returned. - * - * @param mixed $value - * @return mixed - */ -function value($value) -{ - return (is_callable($value) and ! is_string($value)) ? call_user_func($value) : $value; -} - -/** - * Short-cut for constructor method chaining. - * - * @param mixed $object - * @return mixed - */ -function with($object) -{ - return $object; -} - -/** - * Determine if the current version of PHP is at least the supplied version. - * - * @param string $version - * @return bool - */ -function has_php($version) -{ - return version_compare(PHP_VERSION, $version) >= 0; -} - -/** - * Get a view instance. - * - * @param string $view - * @param array $data - * @return View - */ -function view($view, $data = array()) -{ - if (is_null($view)) return ''; - - return Laravel\View::make($view, $data); -} - -/** - * Render the given view. - * - * @param string $view - * @param array $data - * @return string - */ -function render($view, $data = array()) -{ - if (is_null($view)) return ''; - - return Laravel\View::make($view, $data)->render(); -} - -/** - * Get the rendered contents of a partial from a loop. - * - * @param string $partial - * @param array $data - * @param string $iterator - * @param string $empty - * @return string - */ -function render_each($partial, array $data, $iterator, $empty = 'raw|') -{ - return Laravel\View::render_each($partial, $data, $iterator, $empty); -} - -/** - * Get the string contents of a section. - * - * @param string $section - * @return string - */ -function yield($section) -{ - return Laravel\Section::yield($section); -} - -/** - * Get a CLI option from the argv $_SERVER variable. - * - * @param string $option - * @param mixed $default - * @return string - */ -function get_cli_option($option, $default = null) -{ - foreach (Laravel\Request::foundation()->server->get('argv') as $argument) - { - if (starts_with($argument, "--{$option}=")) - { - return substr($argument, strlen($option) + 3); - } - } - - return value($default); -} - -/** - * Calculate the human-readable file size (with proper units). - * - * @param int $size - * @return string - */ -function get_file_size($size) -{ - $units = array('Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB'); - return @round($size / pow(1024, ($i = floor(log($size, 1024)))), 2).' '.$units[$i]; -} \ No newline at end of file diff --git a/laravel/html.php b/laravel/html.php deleted file mode 100644 index 8bbf6d6d..00000000 --- a/laravel/html.php +++ /dev/null @@ -1,481 +0,0 @@ - - * // Generate a link to a JavaScript file - * echo HTML::script('js/jquery.js'); - * - * // Generate a link to a JavaScript file and add some attributes - * echo HTML::script('js/jquery.js', array('defer')); - * - * - * @param string $url - * @param array $attributes - * @return string - */ - public static function script($url, $attributes = array()) - { - $url = URL::to_asset($url); - - return ''.PHP_EOL; - } - - /** - * Generate a link to a CSS file. - * - * If no media type is selected, "all" will be used. - * - * - * // Generate a link to a CSS file - * echo HTML::style('css/common.css'); - * - * // Generate a link to a CSS file and add some attributes - * echo HTML::style('css/common.css', array('media' => 'print')); - * - * - * @param string $url - * @param array $attributes - * @return string - */ - public static function style($url, $attributes = array()) - { - $defaults = array('media' => 'all', 'type' => 'text/css', 'rel' => 'stylesheet'); - - $attributes = $attributes + $defaults; - - $url = URL::to_asset($url); - - return ''.PHP_EOL; - } - - /** - * Generate a HTML span. - * - * @param string $value - * @param array $attributes - * @return string - */ - public static function span($value, $attributes = array()) - { - return ''.static::entities($value).''; - } - - /** - * Generate a HTML link. - * - * - * // Generate a link to a location within the application - * echo HTML::link('user/profile', 'User Profile'); - * - * // Generate a link to a location outside of the application - * echo HTML::link('http://google.com', 'Google'); - * - * - * @param string $url - * @param string $title - * @param array $attributes - * @param bool $https - * @return string - */ - public static function link($url, $title = null, $attributes = array(), $https = null) - { - $url = URL::to($url, $https); - - if (is_null($title)) $title = $url; - - return ''.static::entities($title).''; - } - - /** - * Generate a HTTPS HTML link. - * - * @param string $url - * @param string $title - * @param array $attributes - * @return string - */ - public static function link_to_secure($url, $title = null, $attributes = array()) - { - return static::link($url, $title, $attributes, true); - } - - /** - * Generate an HTML link to an asset. - * - * The application index page will not be added to asset links. - * - * @param string $url - * @param string $title - * @param array $attributes - * @param bool $https - * @return string - */ - public static function link_to_asset($url, $title = null, $attributes = array(), $https = null) - { - $url = URL::to_asset($url, $https); - - if (is_null($title)) $title = $url; - - return ''.static::entities($title).''; - } - - /** - * Generate an HTTPS HTML link to an asset. - * - * @param string $url - * @param string $title - * @param array $attributes - * @return string - */ - public static function link_to_secure_asset($url, $title = null, $attributes = array()) - { - return static::link_to_asset($url, $title, $attributes, true); - } - - /** - * Generate an HTML link to a route. - * - * An array of parameters may be specified to fill in URI segment wildcards. - * - * - * // Generate a link to the "profile" named route - * echo HTML::link_to_route('profile', 'Profile'); - * - * // Generate a link to the "profile" route and add some parameters - * echo HTML::link_to_route('profile', 'Profile', array('taylor')); - * - * - * @param string $name - * @param string $title - * @param array $parameters - * @param array $attributes - * @return string - */ - public static function link_to_route($name, $title = null, $parameters = array(), $attributes = array()) - { - return static::link(URL::to_route($name, $parameters), $title, $attributes); - } - - /** - * Generate an HTML link to a controller action. - * - * An array of parameters may be specified to fill in URI segment wildcards. - * - * - * // Generate a link to the "home@index" action - * echo HTML::link_to_action('home@index', 'Home'); - * - * // Generate a link to the "user@profile" route and add some parameters - * echo HTML::link_to_action('user@profile', 'Profile', array('taylor')); - * - * - * @param string $action - * @param string $title - * @param array $parameters - * @param array $attributes - * @return string - */ - public static function link_to_action($action, $title = null, $parameters = array(), $attributes = array()) - { - return static::link(URL::to_action($action, $parameters), $title, $attributes); - } - - /** - * Generate an HTML link to a different language - * - * @param string $language - * @param string $title - * @param array $attributes - * @return string - */ - public static function link_to_language($language, $title = null, $attributes = array()) - { - return static::link(URL::to_language($language), $title, $attributes); - } - - /** - * Generate an HTML mailto link. - * - * The E-Mail address will be obfuscated to protect it from spam bots. - * - * @param string $email - * @param string $title - * @param array $attributes - * @return string - */ - public static function mailto($email, $title = null, $attributes = array()) - { - $email = static::email($email); - - if (is_null($title)) $title = $email; - - $email = 'mailto:'.$email; - - return ''.static::entities($title).''; - } - - /** - * Obfuscate an e-mail address to prevent spam-bots from sniffing it. - * - * @param string $email - * @return string - */ - public static function email($email) - { - return str_replace('@', '@', static::obfuscate($email)); - } - - /** - * Generate an HTML image element. - * - * @param string $url - * @param string $alt - * @param array $attributes - * @return string - */ - public static function image($url, $alt = '', $attributes = array()) - { - $attributes['alt'] = $alt; - - return ''; - } - - /** - * Generate an ordered list of items. - * - * @param array $list - * @param array $attributes - * @return string - */ - public static function ol($list, $attributes = array()) - { - return static::listing('ol', $list, $attributes); - } - - /** - * Generate an un-ordered list of items. - * - * @param array $list - * @param array $attributes - * @return string - */ - public static function ul($list, $attributes = array()) - { - return static::listing('ul', $list, $attributes); - } - - /** - * Generate an ordered or un-ordered list. - * - * @param string $type - * @param array $list - * @param array $attributes - * @return string - */ - private static function listing($type, $list, $attributes = array()) - { - $html = ''; - - if (count($list) == 0) return $html; - - foreach ($list as $key => $value) - { - // If the value is an array, we will recurse the function so that we can - // produce a nested list within the list being built. Of course, nested - // lists may exist within nested lists, etc. - if (is_array($value)) - { - if (is_int($key)) - { - $html .= static::listing($type, $value); - } - else - { - $html .= '
  • '.$key.static::listing($type, $value).'
  • '; - } - } - else - { - $html .= '
  • '.static::entities($value).'
  • '; - } - } - - return '<'.$type.static::attributes($attributes).'>'.$html.''; - } - - /** - * Generate a definition list. - * - * @param array $list - * @param array $attributes - * @return string - */ - public static function dl($list, $attributes = array()) - { - $html = ''; - - if (count($list) == 0) return $html; - - foreach ($list as $term => $description) - { - $html .= '
    '.static::entities($term).'
    '; - $html .= '
    '.static::entities($description).'
    '; - } - - return ''.$html.''; - } - - /** - * Build a list of HTML attributes from an array. - * - * @param array $attributes - * @return string - */ - public static function attributes($attributes) - { - $html = array(); - - foreach ((array) $attributes as $key => $value) - { - // For numeric keys, we will assume that the key and the value are the - // same, as this will convert HTML attributes such as "required" that - // may be specified as required="required", etc. - if (is_numeric($key)) $key = $value; - - if ( ! is_null($value)) - { - $html[] = $key.'="'.static::entities($value).'"'; - } - } - - return (count($html) > 0) ? ' '.implode(' ', $html) : ''; - } - - /** - * Obfuscate a string to prevent spam-bots from sniffing it. - * - * @param string $value - * @return string - */ - protected static function obfuscate($value) - { - $safe = ''; - - foreach (str_split($value) as $letter) - { - // To properly obfuscate the value, we will randomly convert each - // letter to its entity or hexadecimal representation, keeping a - // bot from sniffing the randomly obfuscated letters. - switch (rand(1, 3)) - { - case 1: - $safe .= '&#'.ord($letter).';'; - break; - - case 2: - $safe .= '&#x'.dechex(ord($letter)).';'; - break; - - case 3: - $safe .= $letter; - } - } - - return $safe; - } - - /** - * Get the appliction.encoding without needing to request it from Config::get() each time. - * - * @return string - */ - protected static function encoding() - { - return static::$encoding ?: static::$encoding = Config::get('application.encoding'); - } - - /** - * Dynamically handle calls to custom macros. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public static function __callStatic($method, $parameters) - { - if (isset(static::$macros[$method])) - { - return call_user_func_array(static::$macros[$method], $parameters); - } - - throw new \Exception("Method [$method] does not exist."); - } - -} diff --git a/laravel/input.php b/laravel/input.php deleted file mode 100644 index d9de36cb..00000000 --- a/laravel/input.php +++ /dev/null @@ -1,300 +0,0 @@ - - * // Get the "email" item from the input array - * $email = Input::get('email'); - * - * // Return a default value if the specified item doesn't exist - * $email = Input::get('name', 'Taylor'); - * - * - * @param string $key - * @param mixed $default - * @return mixed - */ - public static function get($key = null, $default = null) - { - $input = Request::foundation()->request->all(); - - if (is_null($key)) - { - return array_merge($input, static::query()); - } - - $value = array_get($input, $key); - - if (is_null($value)) - { - return array_get(static::query(), $key, $default); - } - - return $value; - } - - /** - * Get an item from the query string. - * - * - * // Get the "email" item from the query string - * $email = Input::query('email'); - * - * // Return a default value if the specified item doesn't exist - * $email = Input::query('name', 'Taylor'); - * - * - * @param string $key - * @param mixed $default - * @return mixed - */ - public static function query($key = null, $default = null) - { - return array_get(Request::foundation()->query->all(), $key, $default); - } - - /** - * Get the JSON payload for the request. - * - * @param bool $as_array - * @return object - */ - public static function json($as_array = false) - { - if ( ! is_null(static::$json)) return static::$json; - - return static::$json = json_decode(Request::foundation()->getContent(), $as_array); - } - - /** - * Get a subset of the items from the input data. - * - * - * // Get only the email from the input data - * $value = Input::only('email'); - * - * // Get only the username and email from the input data - * $input = Input::only(array('username', 'email')); - * - * - * @param array $keys - * @return array - */ - public static function only($keys) - { - return array_only(static::get(), $keys); - } - - /** - * Get all of the input data except for a specified array of items. - * - * - * // Get all of the input data except for username - * $input = Input::except('username'); - * - * // Get all of the input data except for username and email - * $input = Input::except(array('username', 'email')); - * - * - * @param array $keys - * @return array - */ - public static function except($keys) - { - return array_except(static::get(), $keys); - } - - /** - * Determine if the old input data contains an item. - * - * @param string $key - * @return bool - */ - public static function had($key) - { - return trim((string) static::old($key)) !== ''; - } - - /** - * Get input data from the previous request. - * - * - * // Get the "email" item from the old input - * $email = Input::old('email'); - * - * // Return a default value if the specified item doesn't exist - * $email = Input::old('name', 'Taylor'); - * - * - * @param string $key - * @param mixed $default - * @return string - */ - public static function old($key = null, $default = null) - { - return array_get(Session::get(Input::old_input, array()), $key, $default); - } - - /** - * Get an item from the uploaded file data. - * - * - * // Get the array of information for the "picture" upload - * $picture = Input::file('picture'); - * - * - * @param string $key - * @param mixed $default - * @return UploadedFile - */ - public static function file($key = null, $default = null) - { - return array_get($_FILES, $key, $default); - } - - /** - * Determine if the uploaded data contains a file. - * - * @param string $key - * @return bool - */ - public static function has_file($key) - { - return strlen(static::file("{$key}.tmp_name", "")) > 0; - } - - /** - * Move an uploaded file to permanent storage. - * - * This method is simply a convenient wrapper around move_uploaded_file. - * - * - * // Move the "picture" file to a new permanent location on disk - * Input::upload('picture', 'path/to/photos', 'picture.jpg'); - * - * - * @param string $key - * @param string $directory - * @param string $name - * @return Symfony\Component\HttpFoundation\File\File - */ - public static function upload($key, $directory, $name = null) - { - if (is_null(static::file($key))) return false; - - return Request::foundation()->files->get($key)->move($directory, $name); - } - - /** - * Flash the input for the current request to the session. - * - * - * // Flash all of the input to the session - * Input::flash(); - * - * // Flash only a few input items to the session - * Input::flash('only', array('name', 'email')); - * - * // Flash all but a few input items to the session - * Input::flash('except', array('password', 'social_number')); - * - * - * @param string $filter - * @param array $keys - * @return void - */ - public static function flash($filter = null, $keys = array()) - { - $flash = ( ! is_null($filter)) ? static::$filter($keys) : static::get(); - - Session::flash(Input::old_input, $flash); - } - - /** - * Flush all of the old input from the session. - * - * @return void - */ - public static function flush() - { - Session::flash(Input::old_input, array()); - } - - /** - * Merge new input into the current request's input array. - * - * @param array $input - * @return void - */ - public static function merge(array $input) - { - Request::foundation()->request->add($input); - } - - /** - * Replace the input for the current request. - * - * @param array $input - * @return void - */ - public static function replace(array $input) - { - Request::foundation()->request->replace($input); - } - - /** - * Clear the input for the current request. - * @return void - */ - public static function clear() - { - Request::foundation()->request->replace(array()); - } - -} \ No newline at end of file diff --git a/laravel/ioc.php b/laravel/ioc.php deleted file mode 100644 index 4347cbcb..00000000 --- a/laravel/ioc.php +++ /dev/null @@ -1,208 +0,0 @@ - - * // Register an instance as a singleton in the container - * IoC::instance('mailer', new Mailer); - * - * - * @param string $name - * @param mixed $instance - * @return void - */ - public static function instance($name, $instance) - { - static::$singletons[$name] = $instance; - } - - /** - * Resolve a given type to an instance. - * - * - * // Get an instance of the "mailer" object registered in the container - * $mailer = IoC::resolve('mailer'); - * - * // Get an instance of the "mailer" object and pass parameters to the resolver - * $mailer = IoC::resolve('mailer', array('test')); - * - * - * @param string $type - * @param array $parameters - * @return mixed - */ - public static function resolve($type, $parameters = array()) - { - // If an instance of the type is currently being managed as a singleton, we will - // just return the existing instance instead of instantiating a fresh instance - // so the developer can keep re-using the exact same object instance from us. - if (isset(static::$singletons[$type])) - { - return static::$singletons[$type]; - } - - // If we don't have a registered resolver or concrete for the type, we'll just - // assume the type is the concrete name and will attempt to resolve it as is - // since the container should be able to resolve concretes automatically. - if ( ! isset(static::$registry[$type])) - { - $concrete = $type; - } - else - { - $concrete = array_get(static::$registry[$type], 'resolver', $type); - } - - // We're ready to instantiate an instance of the concrete type registered for - // the binding. This will instantiate the type, as well as resolve any of - // its nested dependencies recursively until they are each resolved. - if ($concrete == $type or $concrete instanceof Closure) - { - $object = static::build($concrete, $parameters); - } - else - { - $object = static::resolve($concrete); - } - - // If the requested type is registered as a singleton, we want to cache off - // the instance in memory so we can return it later without creating an - // entirely new instances of the object on each subsequent request. - if (isset(static::$registry[$type]['singleton']) && static::$registry[$type]['singleton'] === true) - { - static::$singletons[$type] = $object; - } - - Event::fire('laravel.resolving', array($type, $object)); - - return $object; - } - - /** - * Instantiate an instance of the given type. - * - * @param string $type - * @param array $parameters - * @return mixed - */ - protected static function build($type, $parameters = array()) - { - // If the concrete type is actually a Closure, we will just execute it and - // hand back the results of the function, which allows functions to be - // used as resolvers for more fine-tuned resolution of the objects. - if ($type instanceof Closure) - { - return call_user_func_array($type, $parameters); - } - - $reflector = new \ReflectionClass($type); - - // If the type is not instantiable, the developer is attempting to resolve - // an abstract type such as an Interface of an Abstract Class and there is - // no binding registered for the abstraction so we need to bail out. - if ( ! $reflector->isInstantiable()) - { - throw new \Exception("Resolution target [$type] is not instantiable."); - } - - $constructor = $reflector->getConstructor(); - - // If there is no constructor, that means there are no dependencies and - // we can just resolve an instance of the object right away without - // resolving any other types or dependencies from the container. - if (is_null($constructor)) - { - return new $type; - } - - $dependencies = static::dependencies($constructor->getParameters()); - - return $reflector->newInstanceArgs($dependencies); - } - - /** - * Resolve all of the dependencies from the ReflectionParameters. - * - * @param array $parameters - * @return array - */ - protected static function dependencies($parameters) - { - $dependencies = array(); - - foreach ($parameters as $parameter) - { - $dependency = $parameter->getClass(); - - // If the class is null, it means the dependency is a string or some other - // primitive type, which we can not resolve since it is not a class and - // we'll just bomb out with an error since we have nowhere to go. - if (is_null($dependency)) - { - throw new \Exception("Unresolvable dependency resolving [$parameter]."); - } - - $dependencies[] = static::resolve($dependency->name); - } - - return (array) $dependencies; - } - -} \ No newline at end of file diff --git a/laravel/lang.php b/laravel/lang.php deleted file mode 100644 index fd3bf177..00000000 --- a/laravel/lang.php +++ /dev/null @@ -1,252 +0,0 @@ -key = $key; - $this->language = $language; - $this->replacements = (array) $replacements; - } - - /** - * Create a new language line instance. - * - * - * // Create a new language line instance for a given line - * $line = Lang::line('validation.required'); - * - * // Create a new language line for a line belonging to a bundle - * $line = Lang::line('admin::messages.welcome'); - * - * // Specify some replacements for the language line - * $line = Lang::line('validation.required', array('attribute' => 'email')); - * - * - * @param string $key - * @param array $replacements - * @param string $language - * @return Lang - */ - public static function line($key, $replacements = array(), $language = null) - { - if (is_null($language)) $language = Config::get('application.language'); - - return new static($key, $replacements, $language); - } - - /** - * Determine if a language line exists. - * - * @param string $key - * @param string $language - * @return bool - */ - public static function has($key, $language = null) - { - return static::line($key, array(), $language)->get() !== $key; - } - - /** - * Get the language line as a string. - * - * - * // Get a language line - * $line = Lang::line('validation.required')->get(); - * - * // Get a language line in a specified language - * $line = Lang::line('validation.required')->get('sp'); - * - * // Return a default value if the line doesn't exist - * $line = Lang::line('validation.required')->get(null, 'Default'); - * - * - * @param string $language - * @param string $default - * @return string - */ - public function get($language = null, $default = null) - { - // If no default value is specified by the developer, we'll just return the - // key of the language line. This should indicate which language line we - // were attempting to render and is better than giving nothing back. - if (is_null($default)) $default = $this->key; - - if (is_null($language)) $language = $this->language; - - list($bundle, $file, $line) = $this->parse($this->key); - - // If the file does not exist, we'll just return the default value that was - // given to the method. The default value is also returned even when the - // file exists and that file does not actually contain any lines. - if ( ! static::load($bundle, $language, $file)) - { - return value($default); - } - - $lines = static::$lines[$bundle][$language][$file]; - - $line = array_get($lines, $line, $default); - - // If the line is not a string, it probably means the developer asked for - // the entire language file and the value of the requested value will be - // an array containing all of the lines in the file. - if (is_string($line)) - { - foreach ($this->replacements as $key => $value) - { - $line = str_replace(':'.$key, $value, $line); - } - } - - return $line; - } - - /** - * Parse a language key into its bundle, file, and line segments. - * - * Language lines follow a {bundle}::{file}.{line} naming convention. - * - * @param string $key - * @return array - */ - protected function parse($key) - { - $bundle = Bundle::name($key); - - $segments = explode('.', Bundle::element($key)); - - // If there are not at least two segments in the array, it means that - // the developer is requesting the entire language line array to be - // returned. If that is the case, we'll make the item "null". - if (count($segments) >= 2) - { - $line = implode('.', array_slice($segments, 1)); - - return array($bundle, $segments[0], $line); - } - else - { - return array($bundle, $segments[0], null); - } - } - - /** - * Load all of the language lines from a language file. - * - * @param string $bundle - * @param string $language - * @param string $file - * @return bool - */ - public static function load($bundle, $language, $file) - { - if (isset(static::$lines[$bundle][$language][$file])) - { - return true; - } - - // We use a "loader" event to delegate the loading of the language - // array, which allows the develop to organize the language line - // arrays for their application however they wish. - $lines = Event::first(static::loader, func_get_args()); - - static::$lines[$bundle][$language][$file] = $lines; - - return count($lines) > 0; - } - - /** - * Load a language array from a language file. - * - * @param string $bundle - * @param string $language - * @param string $file - * @return array - */ - public static function file($bundle, $language, $file) - { - $lines = array(); - - // Language files can belongs to the application or to any bundle - // that is installed for the application. So, we'll need to use - // the bundle's path when looking for the file. - $path = static::path($bundle, $language, $file); - - if (file_exists($path)) - { - $lines = require $path; - } - - return $lines; - } - - /** - * Get the path to a bundle's language file. - * - * @param string $bundle - * @param string $language - * @param string $file - * @return string - */ - protected static function path($bundle, $language, $file) - { - return Bundle::path($bundle)."language/{$language}/{$file}".EXT; - } - - /** - * Get the string content of the language line. - * - * @return string - */ - public function __toString() - { - return (string) $this->get(); - } - -} diff --git a/laravel/laravel.php b/laravel/laravel.php deleted file mode 100644 index 0b669ae1..00000000 --- a/laravel/laravel.php +++ /dev/null @@ -1,237 +0,0 @@ - $config) -{ - if ($config['auto']) Bundle::start($bundle); -} - -/* -|-------------------------------------------------------------------------- -| Register The Catch-All Route -|-------------------------------------------------------------------------- -| -| This route will catch all requests that do not hit another route in -| the application, and will raise the 404 error event so the error -| can be handled by the developer in their 404 event listener. -| -*/ - -Router::register('*', '(:all)', function() -{ - return Event::first('404'); -}); - -/* -|-------------------------------------------------------------------------- -| Gather The URI And Locales -|-------------------------------------------------------------------------- -| -| When routing, we'll need to grab the URI and the supported locales for -| the route so we can properly set the language and route the request -| to the proper end-point in the application. -| -*/ - -$uri = URI::current(); - -$languages = Config::get('application.languages', array()); - -$languages[] = Config::get('application.language'); - -/* -|-------------------------------------------------------------------------- -| Set The Locale Based On The Route -|-------------------------------------------------------------------------- -| -| If the URI starts with one of the supported languages, we will set -| the default lagnauge to match that URI segment and shorten the -| URI we'll pass to the router to not include the lang segment. -| -*/ - -foreach ($languages as $language) -{ - if (preg_match("#^{$language}(?:$|/)#i", $uri)) - { - Config::set('application.language', $language); - - $uri = trim(substr($uri, strlen($language)), '/'); break; - } -} - -if ($uri == '') $uri = '/'; - -URI::$uri = $uri; - -/* -|-------------------------------------------------------------------------- -| Route The Incoming Request -|-------------------------------------------------------------------------- -| -| Phew! We can finally route the request to the appropriate route and -| execute the route to get the response. This will give an instance -| of the Response object that we can send back to the browser -| -*/ - -Request::$route = Router::route(Request::method(), $uri); - -$response = Request::$route->call(); - -/* -|-------------------------------------------------------------------------- -| "Render" The Response -|-------------------------------------------------------------------------- -| -| The render method evaluates the content of the response and converts it -| to a string. This evaluates any views and sub-responses within the -| content and sets the raw string result as the new response. -| -*/ - -$response->render(); - -/* -|-------------------------------------------------------------------------- -| Persist The Session To Storage -|-------------------------------------------------------------------------- -| -| If a session driver has been configured, we will save the session to -| storage so it is available for the next request. This will also set -| the session cookie in the cookie jar to be sent to the user. -| -*/ - -if (Config::get('session.driver') !== '') -{ - Session::save(); -} - -/* -|-------------------------------------------------------------------------- -| Send The Response To The Browser -|-------------------------------------------------------------------------- -| -| We'll send the response back to the browser here. This method will also -| send all of the response headers to the browser as well as the string -| content of the Response. This should make the view available to the -| browser and show something pretty to the user. -| -*/ - -$response->send(); - -/* -|-------------------------------------------------------------------------- -| And We're Done! -|-------------------------------------------------------------------------- -| -| Raise the "done" event so extra output can be attached to the response. -| This allows the adding of debug toolbars, etc. to the view, or may be -| used to do some kind of logging by the application. -| -*/ - -Event::fire('laravel.done', array($response)); - -/* -|-------------------------------------------------------------------------- -| Finish the request for PHP-FastCGI -|-------------------------------------------------------------------------- -| -| Stopping the PHP process for PHP-FastCGI users to speed up some -| PHP queries. Acceleration is possible when there are actions in the -| process of script execution that do not affect server response. -| For example, saving the session in memcached can occur after the page -| has been formed and passed to a web server. -*/ - -$response->foundation->finish(); diff --git a/laravel/log.php b/laravel/log.php deleted file mode 100644 index 88477a69..00000000 --- a/laravel/log.php +++ /dev/null @@ -1,99 +0,0 @@ -getMessage().' in '.$e->getFile().' on line '.$e->getLine(); - } - - /** - * Write a message to the log file. - * - * - * // Write an "error" message to the log file - * Log::write('error', 'Something went horribly wrong!'); - * - * // Write an "error" message using the class' magic method - * Log::error('Something went horribly wrong!'); - * - * // Log an arrays data - * Log::write('info', array('name' => 'Sawny', 'passwd' => '1234', array(1337, 21, 0)), true); - * //Result: Array ( [name] => Sawny [passwd] => 1234 [0] => Array ( [0] => 1337 [1] => 21 [2] => 0 ) ) - * //If we had omit the third parameter the result had been: Array - * - * - * @param string $type - * @param string $message - * @return void - */ - public static function write($type, $message, $pretty_print = false) - { - $message = ($pretty_print) ? print_r($message, true) : $message; - - // If there is a listener for the log event, we'll delegate the logging - // to the event and not write to the log files. This allows for quick - // swapping of log implementations for debugging. - if (Event::listeners('laravel.log')) - { - Event::fire('laravel.log', array($type, $message)); - } - - $message = static::format($type, $message); - - File::append(path('storage').'logs/'.date('Y-m-d').'.log', $message); - } - - /** - * Format a log message for logging. - * - * @param string $type - * @param string $message - * @return string - */ - protected static function format($type, $message) - { - return date('Y-m-d H:i:s').' '.Str::upper($type)." - {$message}".PHP_EOL; - } - - /** - * Dynamically write a log message. - * - * - * // Write an "error" message to the log file - * Log::error('This is an error!'); - * - * // Write a "warning" message to the log file - * Log::warning('This is a warning!'); - * - * // Log an arrays data - * Log::info(array('name' => 'Sawny', 'passwd' => '1234', array(1337, 21, 0)), true); - * //Result: Array ( [name] => Sawny [passwd] => 1234 [0] => Array ( [0] => 1337 [1] => 21 [2] => 0 ) ) - * //If we had omit the second parameter the result had been: Array - * - */ - public static function __callStatic($method, $parameters) - { - $parameters[1] = (empty($parameters[1])) ? false : $parameters[1]; - - static::write($method, $parameters[0], $parameters[1]); - } - -} \ No newline at end of file diff --git a/laravel/memcached.php b/laravel/memcached.php deleted file mode 100644 index d66710bb..00000000 --- a/laravel/memcached.php +++ /dev/null @@ -1,74 +0,0 @@ - - * // Get the Memcache connection and get an item from the cache - * $name = Memcached::connection()->get('name'); - * - * // Get the Memcache connection and place an item in the cache - * Memcached::connection()->set('name', 'Taylor'); - * - * - * @return Memcached - */ - public static function connection() - { - if (is_null(static::$connection)) - { - static::$connection = static::connect(Config::get('cache.memcached')); - } - - return static::$connection; - } - - /** - * Create a new Memcached connection instance. - * - * @param array $servers - * @return Memcached - */ - protected static function connect($servers) - { - $memcache = new \Memcached; - - foreach ($servers as $server) - { - $memcache->addServer($server['host'], $server['port'], $server['weight']); - } - - if ($memcache->getVersion() === false) - { - throw new \Exception('Could not establish memcached connection.'); - } - - return $memcache; - } - - /** - * Dynamically pass all other method calls to the Memcache instance. - * - * - * // Get an item from the Memcache instance - * $name = Memcached::get('name'); - * - * // Store data on the Memcache server - * Memcached::set('name', 'Taylor'); - * - */ - public static function __callStatic($method, $parameters) - { - return call_user_func_array(array(static::connection(), $method), $parameters); - } - -} \ No newline at end of file diff --git a/laravel/messages.php b/laravel/messages.php deleted file mode 100644 index bf5d61c3..00000000 --- a/laravel/messages.php +++ /dev/null @@ -1,194 +0,0 @@ -messages = (array) $messages; - } - - /** - * Add a message to the collector. - * - * - * // Add a message for the e-mail attribute - * $messages->add('email', 'The e-mail address is invalid.'); - * - * - * @param string $key - * @param string $message - * @return void - */ - public function add($key, $message) - { - if ($this->unique($key, $message)) $this->messages[$key][] = $message; - } - - /** - * Determine if a key and message combination already exists. - * - * @param string $key - * @param string $message - * @return bool - */ - protected function unique($key, $message) - { - return ! isset($this->messages[$key]) or ! in_array($message, $this->messages[$key]); - } - - /** - * Determine if messages exist for a given key. - * - * - * // Is there a message for the e-mail attribute - * return $messages->has('email'); - * - * // Is there a message for the any attribute - * echo $messages->has(); - * - * - * @param string $key - * @return bool - */ - public function has($key = null) - { - return $this->first($key) !== ''; - } - - /** - * Set the default message format for output. - * - * - * // Apply a new default format. - * $messages->format('email', '

    this is my :message

    '); - *
    - * - * @param string $format - */ - public function format($format = ':message') - { - $this->format = $format; - } - - /** - * Get the first message from the container for a given key. - * - * - * // Echo the first message out of all messages. - * echo $messages->first(); - * - * // Echo the first message for the e-mail attribute - * echo $messages->first('email'); - * - * // Format the first message for the e-mail attribute - * echo $messages->first('email', '

    :message

    '); - *
    - * - * @param string $key - * @param string $format - * @return string - */ - public function first($key = null, $format = null) - { - $format = ($format === null) ? $this->format : $format; - - $messages = is_null($key) ? $this->all($format) : $this->get($key, $format); - - return (count($messages) > 0) ? $messages[0] : ''; - } - - /** - * Get all of the messages from the container for a given key. - * - * - * // Echo all of the messages for the e-mail attribute - * echo $messages->get('email'); - * - * // Format all of the messages for the e-mail attribute - * echo $messages->get('email', '

    :message

    '); - *
    - * - * @param string $key - * @param string $format - * @return array - */ - public function get($key, $format = null) - { - $format = ($format === null) ? $this->format : $format; - - if (array_key_exists($key, $this->messages)) - { - return $this->transform($this->messages[$key], $format); - } - - return array(); - } - - /** - * Get all of the messages for every key in the container. - * - * - * // Get all of the messages in the collector - * $all = $messages->all(); - * - * // Format all of the messages in the collector - * $all = $messages->all('

    :message

    '); - *
    - * - * @param string $format - * @return array - */ - public function all($format = null) - { - $format = ($format === null) ? $this->format : $format; - - $all = array(); - - foreach ($this->messages as $messages) - { - $all = array_merge($all, $this->transform($messages, $format)); - } - - return $all; - } - - /** - * Format an array of messages. - * - * @param array $messages - * @param string $format - * @return array - */ - protected function transform($messages, $format) - { - $messages = (array) $messages; - - foreach ($messages as $key => &$message) - { - $message = str_replace(':message', $message, $format); - } - - return $messages; - } - -} \ No newline at end of file diff --git a/laravel/paginator.php b/laravel/paginator.php deleted file mode 100644 index e9b95e35..00000000 --- a/laravel/paginator.php +++ /dev/null @@ -1,423 +0,0 @@ -...'; - - /** - * Create a new Paginator instance. - * - * @param array $results - * @param int $page - * @param int $total - * @param int $per_page - * @param int $last - * @return void - */ - protected function __construct($results, $page, $total, $per_page, $last) - { - $this->page = $page; - $this->last = $last; - $this->total = $total; - $this->results = $results; - $this->per_page = $per_page; - } - - /** - * Create a new Paginator instance. - * - * @param array $results - * @param int $total - * @param int $per_page - * @return Paginator - */ - public static function make($results, $total, $per_page) - { - $page = static::page($total, $per_page); - - $last = ceil($total / $per_page); - - return new static($results, $page, $total, $per_page, $last); - } - - /** - * Get the current page from the request query string. - * - * @param int $total - * @param int $per_page - * @return int - */ - public static function page($total, $per_page) - { - $page = Input::get('page', 1); - - // The page will be validated and adjusted if it is less than one or greater - // than the last page. For example, if the current page is not an integer or - // less than one, one will be returned. If the current page is greater than - // the last page, the last page will be returned. - if (is_numeric($page) and $page > $last = ceil($total / $per_page)) - { - return ($last > 0) ? $last : 1; - } - - return (static::valid($page)) ? $page : 1; - } - - /** - * Determine if a given page number is a valid page. - * - * A valid page must be greater than or equal to one and a valid integer. - * - * @param int $page - * @return bool - */ - protected static function valid($page) - { - return $page >= 1 and filter_var($page, FILTER_VALIDATE_INT) !== false; - } - - /** - * Create the HTML pagination links. - * - * Typically, an intelligent, "sliding" window of links will be rendered based - * on the total number of pages, the current page, and the number of adjacent - * pages that should rendered. This creates a beautiful paginator similar to - * that of Google's. - * - * Example: 1 2 ... 23 24 25 [26] 27 28 29 ... 51 52 - * - * If you wish to render only certain elements of the pagination control, - * explore some of the other public methods available on the instance. - * - * - * // Render the pagination links - * echo $paginator->links(); - * - * // Render the pagination links using a given window size - * echo $paginator->links(5); - * - * - * @param int $adjacent - * @return string - */ - public function links($adjacent = 3) - { - if ($this->last <= 1) return ''; - - // The hard-coded seven is to account for all of the constant elements in a - // sliding range, such as the current page, the two ellipses, and the two - // beginning and ending pages. - // - // If there are not enough pages to make the creation of a slider possible - // based on the adjacent pages, we will simply display all of the pages. - // Otherwise, we will create a "truncating" sliding window. - if ($this->last < 7 + ($adjacent * 2)) - { - $links = $this->range(1, $this->last); - } - else - { - $links = $this->slider($adjacent); - } - - $content = '
      ' . $this->previous() . $links . $this->next() . '
    '; - - return ''; - } - - /** - * Build sliding list of HTML numeric page links. - * - * This method is very similar to the "links" method, only it does not - * render the "first" and "last" pagination links, but only the pages. - * - * - * // Render the pagination slider - * echo $paginator->slider(); - * - * // Render the pagination slider using a given window size - * echo $paginator->slider(5); - * - * - * @param int $adjacent - * @return string - */ - public function slider($adjacent = 3) - { - $window = $adjacent * 2; - - // If the current page is so close to the beginning that we do not have - // room to create a full sliding window, we will only show the first - // several pages, followed by the ending of the slider. - // - // Likewise, if the page is very close to the end, we will create the - // beginning of the slider, but just show the last several pages at - // the end of the slider. Otherwise, we'll build the range. - // - // Example: 1 [2] 3 4 5 6 ... 23 24 - if ($this->page <= $window) - { - return $this->range(1, $window + 2).' '.$this->ending(); - } - // Example: 1 2 ... 32 33 34 35 [36] 37 - elseif ($this->page >= $this->last - $window) - { - return $this->beginning().' '.$this->range($this->last - $window - 2, $this->last); - } - - // Example: 1 2 ... 23 24 25 [26] 27 28 29 ... 51 52 - $content = $this->range($this->page - $adjacent, $this->page + $adjacent); - - return $this->beginning().' '.$content.' '.$this->ending(); - } - - /** - * Generate the "previous" HTML link. - * - * - * // Create the "previous" pagination element - * echo $paginator->previous(); - * - * // Create the "previous" pagination element with custom text - * echo $paginator->previous('Go Back'); - * - * - * @param string $text - * @return string - */ - public function previous($text = null) - { - $disabled = function($page) { return $page <= 1; }; - - return $this->element(__FUNCTION__, $this->page - 1, $text, $disabled); - } - - /** - * Generate the "next" HTML link. - * - * - * // Create the "next" pagination element - * echo $paginator->next(); - * - * // Create the "next" pagination element with custom text - * echo $paginator->next('Skip Forwards'); - * - * - * @param string $text - * @return string - */ - public function next($text = null) - { - $disabled = function($page, $last) { return $page >= $last; }; - - return $this->element(__FUNCTION__, $this->page + 1, $text, $disabled); - } - - /** - * Create a chronological pagination element, such as a "previous" or "next" link. - * - * @param string $element - * @param int $page - * @param string $text - * @param Closure $disabled - * @return string - */ - protected function element($element, $page, $text, $disabled) - { - $class = "{$element}_page"; - - if (is_null($text)) - { - $text = Lang::line("pagination.{$element}")->get($this->language); - } - - // Each consumer of this method provides a "disabled" Closure which can - // be used to determine if the element should be a span element or an - // actual link. For example, if the current page is the first page, - // the "first" element should be a span instead of a link. - if ($disabled($this->page, $this->last)) - { - return '"{$class} disabled")).'>'.$text.''; - } - else - { - return $this->link($page, $text, $class); - } - } - - /** - * Build the first two page links for a sliding page range. - * - * @return string - */ - protected function beginning() - { - return $this->range(1, 2).' '.$this->dots; - } - - /** - * Build the last two page links for a sliding page range. - * - * @return string - */ - protected function ending() - { - return $this->dots.' '.$this->range($this->last - 1, $this->last); - } - - /** - * Build a range of numeric pagination links. - * - * For the current page, an HTML span element will be generated instead of a link. - * - * @param int $start - * @param int $end - * @return string - */ - protected function range($start, $end) - { - $pages = array(); - - // To generate the range of page links, we will iterate through each page - // and, if the current page matches the page, we will generate a span, - // otherwise we will generate a link for the page. The span elements - // will be assigned the "current" CSS class for convenient styling. - for ($page = $start; $page <= $end; $page++) - { - if ($this->page == $page) - { - $pages[] = '
  • '.$page.'
  • '; - } - else - { - $pages[] = $this->link($page, $page, null); - } - } - - return implode(' ', $pages); - } - - /** - * Create a HTML page link. - * - * @param int $page - * @param string $text - * @param string $class - * @return string - */ - protected function link($page, $text, $class) - { - $query = '?page='.$page.$this->appendage($this->appends); - - return ' $class)).'>'. HTML::link(URI::current().$query, $text, array(), Request::secure()).''; - } - - /** - * Create the "appendage" to be attached to every pagination link. - * - * @param array $appends - * @return string - */ - protected function appendage($appends) - { - // The developer may assign an array of values that will be converted to a - // query string and attached to every pagination link. This allows simple - // implementation of sorting or other things the developer may need. - if ( ! is_null($this->appendage)) return $this->appendage; - - if (count($appends) <= 0) - { - return $this->appendage = ''; - } - - return $this->appendage = '&'.http_build_query($appends); - } - - /** - * Set the items that should be appended to the link query strings. - * - * @param array $values - * @return Paginator - */ - public function appends($values) - { - $this->appends = $values; - return $this; - } - - /** - * Set the language that should be used when creating the pagination links. - * - * @param string $language - * @return Paginator - */ - public function speaks($language) - { - $this->language = $language; - return $this; - } - -} \ No newline at end of file diff --git a/laravel/pluralizer.php b/laravel/pluralizer.php deleted file mode 100644 index 90f12b19..00000000 --- a/laravel/pluralizer.php +++ /dev/null @@ -1,131 +0,0 @@ -config = $config; - } - - /** - * Get the singular form of the given word. - * - * @param string $value - * @return string - */ - public function singular($value) - { - // First we'll check the cache of inflected values. We cache each word that - // is inflected so we don't have to spin through the regular expressions - // each time we need to inflect a given value for the developer. - if (isset($this->singular[$value])) - { - return $this->singular[$value]; - } - - // English words may be automatically inflected using regular expressions. - // If the word is English, we'll just pass off the word to the automatic - // inflection method and return the result, which is cached. - $irregular = $this->config['irregular']; - - $result = $this->auto($value, $this->config['singular'], $irregular); - - return $this->singular[$value] = $result ?: $value; - } - - /** - * Get the plural form of the given word. - * - * @param string $value - * @param int $count - * @return string - */ - public function plural($value, $count = 2) - { - if ($count == 1) return $value; - - // First we'll check the cache of inflected values. We cache each word that - // is inflected so we don't have to spin through the regular expressions - // each time we need to inflect a given value for the developer. - if (isset($this->plural[$value])) - { - return $this->plural[$value]; - } - - // English words may be automatically inflected using regular expressions. - // If the word is English, we'll just pass off the word to the automatic - // inflection method and return the result, which is cached. - $irregular = array_flip($this->config['irregular']); - - $result = $this->auto($value, $this->config['plural'], $irregular); - - return $this->plural[$value] = $result; - } - - /** - * Perform auto inflection on an English word. - * - * @param string $value - * @param array $source - * @param array $irregular - * @return string - */ - protected function auto($value, $source, $irregular) - { - // If the word hasn't been cached, we'll check the list of words that - // that are "uncountable". This should be a quick look up since we - // can just hit the array directly for the value. - if (in_array(Str::lower($value), $this->config['uncountable'])) - { - return $value; - } - - // Next, we will check the "irregular" patterns, which contain words - // like "children" and "teeth" which can not be inflected using the - // typically used regular expression matching approach. - foreach ($irregular as $irregular => $pattern) - { - if (preg_match($pattern = '/'.$pattern.'$/i', $value)) - { - return preg_replace($pattern, $irregular, $value); - } - } - - // Finally we'll spin through the array of regular expressions and - // and look for matches for the word. If we find a match we will - // cache and return the inflected value for quick look up. - foreach ($source as $pattern => $inflected) - { - if (preg_match($pattern, $value)) - { - return preg_replace($pattern, $inflected, $value); - } - } - } - -} \ No newline at end of file diff --git a/laravel/profiling/profiler.css b/laravel/profiling/profiler.css deleted file mode 100755 index d8aad39f..00000000 --- a/laravel/profiling/profiler.css +++ /dev/null @@ -1,231 +0,0 @@ -.anbu * { - color: black; - border: 0 !important; -} - -.anbu -{ - font-family:Helvetica, "Helvetica Neue", Arial, sans-serif !important; - font-size:14px !important; - background-color:#222 !important; - position:fixed !important; - bottom:0 !important; - right:0 !important; - width:100%; - z-index: 9999 !important; - color: #000; -} - -.anbu-tabs -{ - margin:0 !important; - padding:0 !important; - overflow:hidden !important; - background-image: url(data:image/png;base64,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); - background-repeat:no-repeat; - background-position:5px -8px; -} - -.anbu-tab { - cursor: pointer; -} - -.anbu-hidden .anbu-tabs -{ - background-image:none; -} - -#anbu-open-tabs li:first-child -{ - margin-left:6em; -} - -.anbu-tabs li -{ - display:inline; - line-height:1em !important; -} - -.anbu-tabs a, .anbu-tabs a:visited -{ - color:#aaa !important; - text-transform:uppercase !important; - font-weight:bold !important; - display:inline-block; - text-decoration:none !important; - font-size:0.8em !important; - padding: 0.8em 2em 0.7em 2em !important; - -webkit-transition-property:color, background-color; - -webkit-transition-duration: 0.7s, 0.2s; - -webkit-transition-timing-function: ease-in, ease-in; - -moz-transition-property:color, background-color; - -moz-transition-duration: 0.7s, 0.2s; - -moz-transition-timing-function: ease-in, ease-in; - -ms-transition-property:color, background-color; - -ms-transition-duration: 0.7s, 0.2s; - -ms-transition-timing-function: ease-in, ease-in; - -o-transition-property:color, background-color; - -o-transition-duration: 0.7s, 0.2s; - -o-transition-timing-function: ease-in, ease-in; - transition-property:color, background-color; - transition-duration: 0.7s, 0.2s; - transition-timing-function: ease-in, ease-in; -} - -#anbu-closed-tabs a, #anbu-closed-tabs a:visited -{ - padding: 0.85em 1.2em 0.85em 1.2em !important; -} - -.anbu-tabs a:hover -{ - background-color:#333 !important; - color:#fff !important; -} - -.anbu-tabs a.anbu-active-tab -{ - color:#fff !important; - background-color:#333 !important; -} - -.anbu a:focus -{ - outline:none !important; -} - -.anbu-tabs a:active -{ - background-color:#111 !important; -} - -.anbu-tabs li.anbu-tab-right -{ - float:right !important; -} - -.anbu-tabs li.anbu-tab-right a, .anbu-tabs li.anbu-tab-right a:visited -{ - padding: 0.86em 2em 0.7em 2em !important; -} - -#anbu-closed-tabs -{ - display:none; -} - - -.anbu-window -{ - display:none; -} - -.anbu-content-area -{ - background-color: #fff !important; - background-image: -webkit-gradient(linear, left top, left bottom, from(#eeeeee), to(#ffffff)); - background-image: -webkit-linear-gradient(top, #eeeeee, #ffffff); - background-image: -moz-linear-gradient(top, #eeeeee, #ffffff); - background-image: -ms-linear-gradient(top, #eeeeee, #ffffff); - background-image: -o-linear-gradient(top, #eeeeee, #ffffff); - background-image: linear-gradient(to bottom, #eeeeee, #ffffff); - height:14em; - margin-top:6px !important; - overflow-x:hidden !important; - overflow-y:auto !important; -} - -.anbu-table table -{ - margin:0 !important; - padding:0 !important; - font-size:0.9em !important; - border:0 !important; - border-collapse:collapse !important; - width:100% !important; - background-color:#fff !important; -} - -.anbu-table pre -{ - margin:0 !important; -} - -.anbu-table tr -{ - border-bottom:1px solid #ccc !important; -} - -.anbu-table tr:first-child -{ - border:0 !important; -} - -.anbu-table th -{ - background-color:#555 !important; - color:#fff !important; - text-transform:uppercase !important; -} - -.anbu-table th, .anbu-table td -{ - text-align:left !important; - padding:0.4em 1em !important; - margin:0 !important; -} - -.anbu-table td -{ - vertical-align:top !important; -} - -.anbu-table-first -{ - background-color:#eee !important; - border-right:1px solid #ccc !important; - width:10% !important; -} - -span.anbu-count -{ - text-transform: none !important; - margin-left:0.5em !important; - background-color:#555 !important; - display:inline-block !important; - padding:0.1em 0.5em 0.2em 0.5em !important; - color:#eee !important; - text-shadow:0 0 4px #000 !important; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -moz-background-clip: padding; -webkit-background-clip: padding-box; background-clip: padding-box; - -} - -.anbu-empty -{ - display:block !important; - padding:1em !important; - text-align:center !important; - font-style:italic !important; - color:#ccc !important; - margin:1em !important; - text-shadow:0 1px 0px #fff !important; -} - -.anbu pre -{ - overflow-x: auto; - white-space: pre-wrap; - white-space: -moz-pre-wrap !important; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - word-wrap: break-word; -} - -/* hide panel-open elements, will become visible through anbu.start() */ - -#anbu-close, #anbu-zoom, .anbu-tab-pane { - visibility: hidden; -} diff --git a/laravel/profiling/profiler.js b/laravel/profiling/profiler.js deleted file mode 100755 index eab7a7b1..00000000 --- a/laravel/profiling/profiler.js +++ /dev/null @@ -1,197 +0,0 @@ -var anbu = { - // Sandbox a jQuery instance for the profiler. - jq: jQuery.noConflict(true) -}; - -anbu.jq.extend(anbu, { - - // BOUND ELEMENTS - // ------------------------------------------------------------- - // Binding these elements early, stops jQuery from "querying" - // the DOM every time they are used. - - el: { - main: anbu.jq('.anbu'), - close: anbu.jq('#anbu-close'), - zoom: anbu.jq('#anbu-zoom'), - hide: anbu.jq('#anbu-hide'), - show: anbu.jq('#anbu-show'), - tab_pane: anbu.jq('.anbu-tab-pane'), - hidden_tab_pane: anbu.jq('.anbu-tab-pane:visible'), - tab: anbu.jq('.anbu-tab'), - tabs: anbu.jq('.anbu-tabs'), - tab_links: anbu.jq('.anbu-tabs a'), - window: anbu.jq('.anbu-window'), - closed_tabs: anbu.jq('#anbu-closed-tabs'), - open_tabs: anbu.jq('#anbu-open-tabs'), - content_area: anbu.jq('.anbu-content-area') - }, - - // CLASS ATTRIBUTES - // ------------------------------------------------------------- - // Useful variable for Anbu. - - // is anbu in full screen mode - is_zoomed: false, - - // initial height of content area - small_height: anbu.jq('.anbu-content-area').height(), - - // the name of the active tab css - active_tab: 'anbu-active-tab', - - // the data attribute of the tab link - tab_data: 'data-anbu-tab', - - // size of anbu when compact - mini_button_width: '2.6em', - - // is the top window open? - window_open: false, - - // current active pane - active_pane: '', - - // START() - // ------------------------------------------------------------- - // Sets up all the binds for Anbu! - - start: function() { - - // hide initial elements - anbu.el.close.css('visibility', 'visible').hide(); - anbu.el.zoom.css('visibility', 'visible').hide(); - anbu.el.tab_pane.css('visibility', 'visible').hide(); - - // bind all click events - anbu.el.close.click(function(event) { - anbu.close_window(); - event.preventDefault(); - }); - anbu.el.hide.click(function(event) { - anbu.hide(); - event.preventDefault(); - }); - anbu.el.show.click(function(event) { - anbu.show(); - event.preventDefault(); - }); - anbu.el.zoom.click(function(event) { - anbu.zoom(); - event.preventDefault(); - }); - anbu.el.tab.click(function(event) { - anbu.clicked_tab(anbu.jq(this)); - event.preventDefault(); - }); - - }, - - // CLICKED_TAB() - // ------------------------------------------------------------- - // A tab has been clicked, decide what to do. - - clicked_tab: function(tab) { - - // if the tab is closed - if (anbu.window_open && anbu.active_pane == tab.attr(anbu.tab_data)) { - anbu.close_window(); - } else { - anbu.open_window(tab); - } - - }, - - // OPEN_WINDOW() - // ------------------------------------------------------------- - // Animate open the top window to the appropriate tab. - - open_window: function(tab) { - - // can't directly assign this line, but it works - anbu.jq('.anbu-tab-pane:visible').fadeOut(200); - anbu.jq('.' + tab.attr(anbu.tab_data)).delay(220).fadeIn(300); - anbu.el.tab_links.removeClass(anbu.active_tab); - tab.addClass(anbu.active_tab); - anbu.el.window.slideDown(300); - anbu.el.close.fadeIn(300); - anbu.el.zoom.fadeIn(300); - anbu.active_pane = tab.attr(anbu.tab_data); - anbu.window_open = true; - - }, - - // CLOSE_WINDOW() - // ------------------------------------------------------------- - // Animate closed the top window hiding all tabs. - - close_window: function() { - - anbu.el.tab_pane.fadeOut(100); - anbu.el.window.slideUp(300); - anbu.el.close.fadeOut(300); - anbu.el.zoom.fadeOut(300); - anbu.el.tab_links.removeClass(anbu.active_tab); - anbu.active_pane = ''; - anbu.window_open = false; - - }, - - // SHOW() - // ------------------------------------------------------------- - // Show the Anbu toolbar when it has been compacted. - - show: function() { - - anbu.el.closed_tabs.fadeOut(600, function () { - anbu.el.main.removeClass('anbu-hidden'); - anbu.el.open_tabs.fadeIn(200); - }); - anbu.el.main.animate({width: '100%'}, 700); - - }, - - // HIDE() - // ------------------------------------------------------------- - // Hide the anbu toolbar, show a tiny re-open button. - - hide: function() { - - anbu.close_window(); - - setTimeout(function() { - anbu.el.window.slideUp(400, function () { - anbu.close_window(); - anbu.el.main.addClass('anbu-hidden'); - anbu.el.open_tabs.fadeOut(200, function () { - anbu.el.closed_tabs.fadeIn(200); - }); - anbu.el.main.animate({width: anbu.mini_button_width}, 700); - }); - }, 100); - - }, - - // TOGGLEZOOM() - // ------------------------------------------------------------- - // Toggle the zoomed mode of the top window. - - zoom: function() { - var height; - if (anbu.is_zoomed) { - height = anbu.small_height; - anbu.is_zoomed = false; - } else { - // the 6px is padding on the top of the window - height = (anbu.jq(window).height() - anbu.el.tabs.height() - 6) + 'px'; - anbu.is_zoomed = true; - } - - anbu.el.content_area.animate({height: height}, 700); - - } - -}); - -// launch anbu on jquery dom ready -anbu.jq(anbu.start); \ No newline at end of file diff --git a/laravel/profiling/profiler.php b/laravel/profiling/profiler.php deleted file mode 100644 index fe4397e5..00000000 --- a/laravel/profiling/profiler.php +++ /dev/null @@ -1,186 +0,0 @@ - array(), 'logs' => array(), 'timers' => array()); - - /** - * Get the rendered contents of the Profiler. - * - * @param Response $response - * @return string - */ - public static function render($response) - { - // We only want to send the profiler toolbar if the request is not an AJAX - // request, as sending it on AJAX requests could mess up JSON driven API - // type applications, so we will not send anything in those scenarios. - if ( ! Request::ajax() and Config::get('application.profiler') ) - { - static::$data['memory'] = get_file_size(memory_get_usage(true)); - static::$data['memory_peak'] = get_file_size(memory_get_peak_usage(true)); - static::$data['time'] = number_format((microtime(true) - LARAVEL_START) * 1000, 2); - foreach ( static::$data['timers'] as &$timer) - { - $timer['running_time'] = number_format((microtime(true) - $timer['start'] ) * 1000, 2); - } - - return render('path: '.__DIR__.'/template'.BLADE_EXT, static::$data); - } - } - - /** - * Allow a callback to be timed. - * - * @param closure $func - * @param string $name - * @return void - */ - public static function time( $func, $name = 'default_func_timer' ) - { - // First measure the runtime of the func - $start = microtime(true); - $func(); - $end = microtime(true); - - // Check to see if a timer by that name exists - if (isset(static::$data['timers'][$name])) - { - $name = $name.uniqid(); - } - - // Push the time into the timers array for display - static::$data['timers'][$name]['start'] = $start; - static::$data['timers'][$name]['end'] = $end; - static::$data['timers'][$name]['time'] = number_format(($end - $start) * 1000, 2); - } - - /** - * Start, or add a tick to a timer. - * - * @param string $name - * @return void - */ - public static function tick($name = 'default_timer', $callback = null) - { - $name = trim($name); - if (empty($name)) $name = 'default_timer'; - - // Is this a brand new tick? - if (isset(static::$data['timers'][$name])) - { - $current_timer = static::$data['timers'][$name]; - $ticks = count($current_timer['ticks']); - - // Initialize the new time for the tick - $new_tick = array(); - $mt = microtime(true); - $new_tick['raw_time'] = $mt - $current_timer['start']; - $new_tick['time'] = number_format(($mt - $current_timer['start']) * 1000, 2); - - // Use either the start time or the last tick for the diff - if ($ticks > 0) - { - $last_tick = $current_timer['ticks'][$ticks- 1]['raw_time']; - $new_tick['diff'] = number_format(($new_tick['raw_time'] - $last_tick) * 1000, 2); - } - else - { - $new_tick['diff'] = $new_tick['time']; - } - - // Add the new tick to the stack of them - static::$data['timers'][$name]['ticks'][] = $new_tick; - } - else - { - // Initialize a start time on the first tick - static::$data['timers'][$name]['start'] = microtime(true); - static::$data['timers'][$name]['ticks'] = array(); - } - - // Run the callback for this tick if it's specified - if ( ! is_null($callback) and is_callable($callback)) - { - // After we've ticked, call the callback function - call_user_func_array($callback, array( - static::$data['timers'][$name] - )); - } - } - - /** - * Add a log entry to the log entries array. - * - * @param string $type - * @param string $message - * @return void - */ - public static function log($type, $message) - { - static::$data['logs'][] = array($type, $message); - } - - /** - * Add a performed SQL query to the Profiler. - * - * @param string $sql - * @param array $bindings - * @param float $time - * @return void - */ - public static function query($sql, $bindings, $time) - { - foreach ($bindings as $binding) - { - $binding = Database::escape($binding); - - $sql = preg_replace('/\?/', $binding, $sql, 1); - $sql = htmlspecialchars($sql); - } - - static::$data['queries'][] = array($sql, $time); - } - - /** - * Attach the Profiler's event listeners. - * - * @return void - */ - public static function attach() - { - // First we'll attach to the query and log events. These allow us to catch - // all of the SQL queries and log messages that come through Laravel, - // and we will pass them onto the Profiler for simple storage. - Event::listen('laravel.log', function($type, $message) - { - Profiler::log($type, $message); - }); - - Event::listen('laravel.query', function($sql, $bindings, $time) - { - Profiler::query($sql, $bindings, $time); - }); - - // We'll attach the profiler to the "done" event so that we can easily - // attach the profiler output to the end of the output sent to the - // browser. This will display the profiler's nice toolbar. - Event::listen('laravel.done', function($response) - { - echo Profiler::render($response); - }); - } - -} diff --git a/laravel/profiling/template.blade.php b/laravel/profiling/template.blade.php deleted file mode 100755 index c03b50f1..00000000 --- a/laravel/profiling/template.blade.php +++ /dev/null @@ -1,124 +0,0 @@ - - -
    -
    -
    -
    - @if (count($logs) > 0) -
    - - - - - @foreach ($logs as $log) - - - - @endforeach - -
    TypeMessage
    - {{ $log[0] }} - - {{ $log[1] }} -
    - @else - There are no log entries. - @endif -
    - -
    - @if (count($queries) > 0) - - - - - - @foreach ($queries as $query) - - - - - @endforeach -
    TimeQuery
    - {{ $query[1] }}ms - -
    {{ $query[0] }}
    -
    - @else - There have been no SQL queries executed. - @endif -
    - -
    - @if (count($timers) > 0) - - - - - - - @foreach ($timers as $name => $timer) - - - - - - - @if (isset($timer['ticks'])) - @foreach( $timer['ticks'] as $tick) - - - - - - @endforeach - @else - - - - - - @endif - - @endforeach -
    NameRunning Time (ms)Difference
    - {{ $name }} -
    {{ $timer['running_time'] }}ms (time from start to render)
     
    -
    Tick
    -
    -
    {{ $tick['time'] }}ms
    -
    -
    + {{ $tick['diff'] }}ms
    -
    Running Time
    {{ $timer['time'] }}ms
     
    - @else - There have been no checkpoints set. - @endif -
    -
    -
    - - - - -
    - - - - diff --git a/laravel/redirect.php b/laravel/redirect.php deleted file mode 100644 index 874cb172..00000000 --- a/laravel/redirect.php +++ /dev/null @@ -1,187 +0,0 @@ - - * // Create a redirect response to a location within the application - * return Redirect::to('user/profile'); - * - * // Create a redirect response with a 301 status code - * return Redirect::to('user/profile', 301); - *
    - * - * @param string $url - * @param int $status - * @param bool $https - * @return Redirect - */ - public static function to($url, $status = 302, $https = null) - { - return static::make('', $status)->header('Location', URL::to($url, $https)); - } - - /** - * Create a redirect response to a HTTPS URL. - * - * @param string $url - * @param int $status - * @return Redirect - */ - public static function to_secure($url, $status = 302) - { - return static::to($url, $status, true); - } - - /** - * Create a redirect response to a controller action. - * - * @param string $action - * @param array $parameters - * @param int $status - * @return Redirect - */ - public static function to_action($action, $parameters = array(), $status = 302) - { - return static::to(URL::to_action($action, $parameters), $status); - } - - /** - * Create a redirect response to a named route. - * - * - * // Create a redirect response to the "login" named route - * return Redirect::to_route('login'); - * - * // Create a redirect response to the "profile" named route with parameters - * return Redirect::to_route('profile', array($username)); - * - * - * @param string $route - * @param array $parameters - * @param int $status - * @return Redirect - */ - public static function to_route($route, $parameters = array(), $status = 302) - { - return static::to(URL::to_route($route, $parameters), $status); - } - - /** - * Add an item to the session flash data. - * - * This is useful for "passing" status messages or other data to the next request. - * - * - * // Create a redirect response and flash to the session - * return Redirect::to('profile')->with('message', 'Welcome Back!'); - * - * - * @param string $key - * @param mixed $value - * @return Redirect - */ - public function with($key, $value) - { - if (Config::get('session.driver') == '') - { - throw new \Exception('A session driver must be set before setting flash data.'); - } - - Session::flash($key, $value); - - return $this; - } - - /** - * Flash the old input to the session and return the Redirect instance. - * - * Once the input has been flashed, it can be retrieved via the Input::old method. - * - * - * // Redirect and flash all of the input data to the session - * return Redirect::to('login')->with_input(); - * - * // Redirect and flash only a few of the input items - * return Redirect::to('login')->with_input('only', array('email', 'username')); - * - * // Redirect and flash all but a few of the input items - * return Redirect::to('login')->with_input('except', array('password', 'ssn')); - * - * - * @param string $filter - * @param array $items - * @return Redirect - */ - public function with_input($filter = null, $items = array()) - { - Input::flash($filter, $items); - - return $this; - } - - /** - * Flash a Validator's errors to the session data. - * - * This method allows you to conveniently pass validation errors back to views. - * - * - * // Redirect and flash validator errors the session - * return Redirect::to('register')->with_errors($validator); - * - * - * @param Validator|Messages $container - * @return Redirect - */ - public function with_errors($container) - { - $errors = ($container instanceof Validator) ? $container->errors : $container; - - return $this->with('errors', $errors); - } - - /** - * Send the headers and content of the response to the browser. - * - * @return void - */ - public function send() - { - // Dump all output buffering, this ensures - // that symphony will send our redirect headers - // properly if we've outputted any content from - // within Laravel. - while (ob_get_level() > 0) - { - ob_end_clean(); - } - - return parent::send(); - } - -} \ No newline at end of file diff --git a/laravel/redis.php b/laravel/redis.php deleted file mode 100644 index 02267d32..00000000 --- a/laravel/redis.php +++ /dev/null @@ -1,294 +0,0 @@ -host = $host; - $this->port = $port; - $this->database = $database; - } - - /** - * Get a Redis database connection instance. - * - * The given name should correspond to a Redis database in the configuration file. - * - * - * // Get the default Redis database instance - * $redis = Redis::db(); - * - * // Get a specified Redis database instance - * $reids = Redis::db('redis_2'); - * - * - * @param string $name - * @return Redis - */ - public static function db($name = 'default') - { - if ( ! isset(static::$databases[$name])) - { - if (is_null($config = Config::get("database.redis.{$name}"))) - { - throw new \Exception("Redis database [$name] is not defined."); - } - - extract($config); - - static::$databases[$name] = new static($host, $port, $database); - } - - return static::$databases[$name]; - } - - /** - * Execute a command against the Redis database. - * - * - * // Execute the GET command for the "name" key - * $name = Redis::db()->run('get', array('name')); - * - * // Execute the LRANGE command for the "list" key - * $list = Redis::db()->run('lrange', array(0, 5)); - * - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function run($method, $parameters) - { - fwrite($this->connect(), $this->command($method, (array) $parameters)); - - $response = trim(fgets($this->connection, 512)); - - return $this->parse($response); - } - - /** - * Parse and return the response from the Redis database. - * - * @param string $response - * @return mixed - */ - protected function parse($response) - { - switch (substr($response, 0, 1)) - { - case '-': - throw new \Exception('Redis error: '.substr(trim($response), 4)); - - case '+': - case ':': - return $this->inline($response); - - case '$': - return $this->bulk($response); - - case '*': - return $this->multibulk($response); - - default: - throw new \Exception("Unknown Redis response: ".substr($response, 0, 1)); - } - } - - /** - * Establish the connection to the Redis database. - * - * @return resource - */ - protected function connect() - { - if ( ! is_null($this->connection)) return $this->connection; - - $this->connection = @fsockopen($this->host, $this->port, $error, $message); - - if ($this->connection === false) - { - throw new \Exception("Error making Redis connection: {$error} - {$message}"); - } - - $this->select($this->database); - - return $this->connection; - } - - /** - * Build the Redis command based from a given method and parameters. - * - * Redis protocol states that a command should conform to the following format: - * - * * CR LF - * $ CR LF - * CR LF - * ... - * $ CR LF - * CR LF - * - * More information regarding the Redis protocol: http://redis.io/topics/protocol - * - * @param string $method - * @param array $parameters - * @return string - */ - protected function command($method, $parameters) - { - $command = '*'.(count($parameters) + 1).CRLF; - - $command .= '$'.strlen($method).CRLF; - - $command .= strtoupper($method).CRLF; - - foreach ($parameters as $parameter) - { - $command .= '$'.strlen($parameter).CRLF.$parameter.CRLF; - } - - return $command; - } - - /** - * Parse and handle an inline response from the Redis database. - * - * @param string $response - * @return string - */ - protected function inline($response) - { - return substr(trim($response), 1); - } - - /** - * Parse and handle a bulk response from the Redis database. - * - * @param string $head - * @return string - */ - protected function bulk($head) - { - if ($head == '$-1') return; - - list($read, $response, $size) = array(0, '', substr($head, 1)); - - if ($size > 0) - { - do - { - // Calculate and read the appropriate bytes off of the Redis response. - // We'll read off the response in 1024 byte chunks until the entire - // response has been read from the database. - $block = (($remaining = $size - $read) < 1024) ? $remaining : 1024; - - $response .= fread($this->connection, $block); - - $read += $block; - - } while ($read < $size); - } - - // The response ends with a trailing CRLF. So, we need to read that off - // of the end of the file stream to get it out of the way of the next - // command that is issued to the database. - fread($this->connection, 2); - - return $response; - } - - /** - * Parse and handle a multi-bulk reply from the Redis database. - * - * @param string $head - * @return array - */ - protected function multibulk($head) - { - if (($count = substr($head, 1)) == '-1') return; - - $response = array(); - - // Iterate through each bulk response in the multi-bulk and parse it out - // using the "parse" method since a multi-bulk response is just a list - // of plain old Redis database responses. - for ($i = 0; $i < $count; $i++) - { - $response[] = $this->parse(trim(fgets($this->connection, 512))); - } - - return $response; - } - - /** - * Dynamically make calls to the Redis database. - */ - public function __call($method, $parameters) - { - return $this->run($method, $parameters); - } - - /** - * Dynamically pass static method calls to the Redis instance. - */ - public static function __callStatic($method, $parameters) - { - return static::db()->run($method, $parameters); - } - - /** - * Close the connection to the Redis database. - * - * @return void - */ - public function __destruct() - { - if ($this->connection) - { - fclose($this->connection); - } - } - -} diff --git a/laravel/request.php b/laravel/request.php deleted file mode 100644 index 0193776e..00000000 --- a/laravel/request.php +++ /dev/null @@ -1,290 +0,0 @@ -getMethod(); - - return ($method == 'HEAD') ? 'GET' : $method; - } - - /** - * Get a header from the request. - * - * - * // Get a header from the request - * $referer = Request::header('referer'); - * - * - * @param string $key - * @param mixed $default - * @return mixed - */ - public static function header($key, $default = null) - { - return array_get(static::foundation()->headers->all(), $key, $default); - } - - /** - * Get all of the HTTP request headers. - * - * @return array - */ - public static function headers() - { - return static::foundation()->headers->all(); - } - - /** - * Get an item from the $_SERVER array. - * - * @param string $key - * @param mixed $default - * @return string - */ - public static function server($key = null, $default = null) - { - return array_get(static::foundation()->server->all(), strtoupper($key), $default); - } - - /** - * Determine if the request method is being spoofed by a hidden Form element. - * - * @return bool - */ - public static function spoofed() - { - return ! is_null(static::foundation()->get(Request::spoofer)); - } - - /** - * Get the requestor's IP address. - * - * @param mixed $default - * @return string - */ - public static function ip($default = '0.0.0.0') - { - $client_ip = static::foundation()->getClientIp(); - return $client_ip === NULL ? $default : $client_ip; - } - - /** - * Get the list of acceptable content types for the request. - * - * @return array - */ - public static function accept() - { - return static::foundation()->getAcceptableContentTypes(); - } - - /** - * Determine if the request accepts a given content type. - * - * @param string $type - * @return bool - */ - public static function accepts($type) - { - return in_array($type, static::accept()); - } - - /** - * Get the languages accepted by the client's browser. - * - * @return array - */ - public static function languages() - { - return static::foundation()->getLanguages(); - } - - /** - * Determine if the current request is using HTTPS. - * - * @return bool - */ - public static function secure() - { - return static::foundation()->isSecure() and Config::get('application.ssl'); - } - - /** - * Determine if the request has been forged. - * - * The session CSRF token will be compared to the CSRF token in the request input. - * - * @return bool - */ - public static function forged() - { - return Input::get(Session::csrf_token) !== Session::token(); - } - - /** - * Determine if the current request is an AJAX request. - * - * @return bool - */ - public static function ajax() - { - return static::foundation()->isXmlHttpRequest(); - } - - /** - * Get the HTTP referrer for the request. - * - * @return string - */ - public static function referrer() - { - return static::foundation()->headers->get('referer'); - } - - /** - * Get the timestamp of the time when the request was started. - * - * @return int - */ - public static function time() - { - return (int) LARAVEL_START; - } - - /** - * Determine if the current request is via the command line. - * - * @return bool - */ - public static function cli() - { - return defined('STDIN') || (substr(PHP_SAPI, 0, 3) == 'cgi' && getenv('TERM')); - } - - /** - * Get the Laravel environment for the current request. - * - * @return string|null - */ - public static function env() - { - return static::foundation()->server->get('LARAVEL_ENV'); - } - - /** - * Set the Laravel environment for the current request. - * - * @param string $env - * @return void - */ - public static function set_env($env) - { - static::foundation()->server->set('LARAVEL_ENV', $env); - } - - /** - * Determine the current request environment. - * - * @param string $env - * @return bool - */ - public static function is_env($env) - { - return static::env() === $env; - } - - /** - * Detect the current environment from an environment configuration. - * - * @param array $environments - * @param string $uri - * @return string|null - */ - public static function detect_env(array $environments, $uri) - { - foreach ($environments as $environment => $patterns) - { - // Essentially we just want to loop through each environment pattern - // and determine if the current URI matches the pattern and if so - // we will simply return the environment for that URI pattern. - foreach ($patterns as $pattern) - { - if (Str::is($pattern, $uri) or $pattern == gethostname()) - { - return $environment; - } - } - } - } - - /** - * Get the main route handling the request. - * - * @return Route - */ - public static function route() - { - return static::$route; - } - - /** - * Get the Symfony HttpFoundation Request instance. - * - * @return HttpFoundation\Request - */ - public static function foundation() - { - return static::$foundation; - } - - /** - * Pass any other methods to the Symfony request. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public static function __callStatic($method, $parameters) - { - return call_user_func_array(array(static::foundation(), $method), $parameters); - } - -} \ No newline at end of file diff --git a/laravel/response.php b/laravel/response.php deleted file mode 100644 index f3508358..00000000 --- a/laravel/response.php +++ /dev/null @@ -1,369 +0,0 @@ -content = $content; - - $this->foundation = new FoundationResponse('', $status, $headers); - } - - /** - * Create a new response instance. - * - * - * // Create a response instance with string content - * return Response::make(json_encode($user)); - * - * // Create a response instance with a given status - * return Response::make('Not Found', 404); - * - * // Create a response with some custom headers - * return Response::make(json_encode($user), 200, array('header' => 'value')); - * - * - * @param mixed $content - * @param int $status - * @param array $headers - * @return Response - */ - public static function make($content, $status = 200, $headers = array()) - { - return new static($content, $status, $headers); - } - - /** - * Create a new response instance containing a view. - * - * - * // Create a response instance with a view - * return Response::view('home.index'); - * - * // Create a response instance with a view and data - * return Response::view('home.index', array('name' => 'Taylor')); - * - * - * @param string $view - * @param array $data - * @return Response - */ - public static function view($view, $data = array()) - { - return new static(View::make($view, $data)); - } - - /** - * Create a new JSON response. - * - * - * // Create a response instance with JSON - * return Response::json($data, 200, array('header' => 'value')); - * - * - * @param mixed $data - * @param int $status - * @param array $headers - * @param int $json_options - * @return Response - */ - public static function json($data, $status = 200, $headers = array(), $json_options = 0) - { - $headers['Content-Type'] = 'application/json; charset=utf-8'; - - return new static(json_encode($data, $json_options), $status, $headers); - } - - - /** - * Create a new JSONP response. - * - * - * // Create a response instance with JSONP - * return Response::jsonp('myFunctionCall', $data, 200, array('header' => 'value')); - * - * - * @param mixed $data - * @param int $status - * @param array $headers - * @return Response - */ - public static function jsonp($callback, $data, $status = 200, $headers = array()) - { - $headers['Content-Type'] = 'application/javascript; charset=utf-8'; - - return new static($callback.'('.json_encode($data).');', $status, $headers); - } - - /** - * Create a new response of JSON'd Eloquent models. - * - * - * // Create a new response instance with Eloquent models - * return Response::eloquent($data, 200, array('header' => 'value')); - * - * - * @param Eloquent|array $data - * @param int $status - * @param array $headers - * @return Response - */ - public static function eloquent($data, $status = 200, $headers = array()) - { - $headers['Content-Type'] = 'application/json; charset=utf-8'; - - return new static(eloquent_to_json($data), $status, $headers); - } - - /** - * Create a new error response instance. - * - * The response status code will be set using the specified code. - * - * The specified error should match a view in your views/error directory. - * - * - * // Create a 404 response - * return Response::error('404'); - * - * // Create a 404 response with data - * return Response::error('404', array('message' => 'Not Found')); - * - * - * @param int $code - * @param array $data - * @return Response - */ - public static function error($code, $data = array()) - { - return new static(View::make('error.'.$code, $data), $code); - } - - /** - * Create a new download response instance. - * - * - * // Create a download response to a given file - * return Response::download('path/to/file.jpg'); - * - * // Create a download response with a given file name - * return Response::download('path/to/file.jpg', 'your_file.jpg'); - * - * - * @param string $path - * @param string $name - * @param array $headers - * @return Response - */ - public static function download($path, $name = null, $headers = array()) - { - if (is_null($name)) $name = basename($path); - - // We'll set some sensible default headers, but merge the array given to - // us so that the developer has the chance to override any of these - // default headers with header values of their own liking. - $headers = array_merge(array( - 'Content-Description' => 'File Transfer', - 'Content-Type' => File::mime(File::extension($path)), - 'Content-Transfer-Encoding' => 'binary', - 'Expires' => 0, - 'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0', - 'Pragma' => 'public', - 'Content-Length' => File::size($path), - ), $headers); - - // Once we create the response, we need to set the content disposition - // header on the response based on the file's name. We'll pass this - // off to the HttpFoundation and let it create the header text. - $response = new static(File::get($path), 200, $headers); - - $d = $response->disposition($name); - - return $response->header('Content-Disposition', $d); - } - - /** - * Create the proper Content-Disposition header. - * - * @param string $file - * @return string - */ - public function disposition($file) - { - $type = ResponseHeaderBag::DISPOSITION_ATTACHMENT; - - return $this->foundation->headers->makeDisposition($type, $file); - } - - /** - * Prepare a response from the given value. - * - * @param mixed $response - * @return Response - */ - public static function prepare($response) - { - // We will need to force the response to be a string before closing - // the session since the developer may be utilizing the session - // within the view, and we can't age it until rendering. - if ( ! $response instanceof Response) - { - $response = new static($response); - } - - return $response; - } - - /** - * Send the headers and content of the response to the browser. - * - * @return void - */ - public function send() - { - $this->cookies(); - - $this->foundation->prepare(Request::foundation()); - - $this->foundation->send(); - } - - /** - * Convert the content of the Response to a string and return it. - * - * @return string - */ - public function render() - { - // If the content is a stringable object, we'll go ahead and call - // the toString method so that we can get the string content of - // the content object. Otherwise we'll just cast to string. - if (str_object($this->content)) - { - $this->content = $this->content->__toString(); - } - else - { - $this->content = (string) $this->content; - } - - // Once we obtain the string content, we can set the content on - // the HttpFoundation's Response instance in preparation for - // sending it back to client browser when all is finished. - $this->foundation->setContent($this->content); - - return $this->content; - } - - /** - * Send all of the response headers to the browser. - * - * @return void - */ - public function send_headers() - { - $this->foundation->prepare(Request::foundation()); - - $this->foundation->sendHeaders(); - } - - /** - * Set the cookies on the HttpFoundation Response. - * - * @return void - */ - protected function cookies() - { - $ref = new \ReflectionClass('Symfony\Component\HttpFoundation\Cookie'); - - // All of the cookies for the response are actually stored on the - // Cookie class until we're ready to send the response back to - // the browser. This allows our cookies to be set easily. - foreach (Cookie::$jar as $name => $cookie) - { - $config = array_values($cookie); - - $this->headers()->setCookie($ref->newInstanceArgs($config)); - } - } - - /** - * Add a header to the array of response headers. - * - * @param string $name - * @param string $value - * @return Response - */ - public function header($name, $value) - { - $this->foundation->headers->set($name, $value); - - return $this; - } - - /** - * Get the HttpFoundation Response headers. - * - * @return ResponseParameterBag - */ - public function headers() - { - return $this->foundation->headers; - } - - /** - * Get / set the response status code. - * - * @param int $status - * @return mixed - */ - public function status($status = null) - { - if (is_null($status)) - { - return $this->foundation->getStatusCode(); - } - else - { - $this->foundation->setStatusCode($status); - - return $this; - } - } - - /** - * Render the response when cast to string - * - * @return string - */ - public function __toString() - { - return $this->render(); - } - -} diff --git a/laravel/routing/controller.php b/laravel/routing/controller.php deleted file mode 100644 index e81d6b5f..00000000 --- a/laravel/routing/controller.php +++ /dev/null @@ -1,442 +0,0 @@ -layout)) - { - $this->layout = $this->layout(); - } - } - - /** - * Detect all of the controllers for a given bundle. - * - * @param string $bundle - * @param string $directory - * @return array - */ - public static function detect($bundle = DEFAULT_BUNDLE, $directory = null) - { - if (is_null($directory)) - { - $directory = Bundle::path($bundle).'controllers'; - } - - // First we'll get the root path to the directory housing all of - // the bundle's controllers. This will be used later to figure - // out the identifiers needed for the found controllers. - $root = Bundle::path($bundle).'controllers'.DS; - - $controllers = array(); - - $items = new fIterator($directory, fIterator::SKIP_DOTS); - - foreach ($items as $item) - { - // If the item is a directory, we will recurse back into the function - // to detect all of the nested controllers and we will keep adding - // them into the array of controllers for the bundle. - if ($item->isDir()) - { - $nested = static::detect($bundle, $item->getRealPath()); - - $controllers = array_merge($controllers, $nested); - } - - // If the item is a file, we'll assume it is a controller and we - // will build the identifier string for the controller that we - // can pass into the route's controller method. - else - { - $controller = str_replace(array($root, EXT), '', $item->getRealPath()); - - $controller = str_replace(DS, '.', $controller); - - $controllers[] = Bundle::identifier($bundle, $controller); - } - } - - return $controllers; - } - - /** - * Call an action method on a controller. - * - * - * // Call the "show" method on the "user" controller - * $response = Controller::call('user@show'); - * - * // Call the "user/admin" controller and pass parameters - * $response = Controller::call('user.admin@profile', array($username)); - * - * - * @param string $destination - * @param array $parameters - * @return Response - */ - public static function call($destination, $parameters = array()) - { - static::references($destination, $parameters); - - list($bundle, $destination) = Bundle::parse($destination); - - // We will always start the bundle, just in case the developer is pointing - // a route to another bundle. This allows us to lazy load the bundle and - // improve speed since the bundle is not loaded on every request. - Bundle::start($bundle); - - list($name, $method) = explode('@', $destination); - - $controller = static::resolve($bundle, $name); - - // For convenience we will set the current controller and action on the - // Request's route instance so they can be easily accessed from the - // application. This is sometimes useful for dynamic situations. - if ( ! is_null($route = Request::route())) - { - $route->controller = $name; - - $route->controller_action = $method; - } - - // If the controller could not be resolved, we're out of options and - // will return the 404 error response. If we found the controller, - // we can execute the requested method on the instance. - if (is_null($controller)) - { - return Event::first('404'); - } - - return $controller->execute($method, $parameters); - } - - /** - * Replace all back-references on the given destination. - * - * @param string $destination - * @param array $parameters - * @return array - */ - protected static function references(&$destination, &$parameters) - { - // Controller delegates may use back-references to the action parameters, - // which allows the developer to setup more flexible routes to various - // controllers with much less code than would be usual. - foreach ($parameters as $key => $value) - { - if ( ! is_string($value)) continue; - - $search = '(:'.($key + 1).')'; - - $destination = str_replace($search, $value, $destination, $count); - - if ($count > 0) unset($parameters[$key]); - } - - return array($destination, $parameters); - } - - /** - * Resolve a bundle and controller name to a controller instance. - * - * @param string $bundle - * @param string $controller - * @return Controller - */ - public static function resolve($bundle, $controller) - { - if ( ! static::load($bundle, $controller)) return; - - $identifier = Bundle::identifier($bundle, $controller); - - // If the controller is registered in the IoC container, we will resolve - // it out of the container. Using constructor injection on controllers - // via the container allows more flexible applications. - $resolver = 'controller: '.$identifier; - - if (IoC::registered($resolver)) - { - return IoC::resolve($resolver); - } - - $controller = static::format($bundle, $controller); - - // If we couldn't resolve the controller out of the IoC container we'll - // format the controller name into its proper class name and load it - // by convention out of the bundle's controller directory. - if (Event::listeners(static::factory)) - { - return Event::first(static::factory, $controller); - } - else - { - return new $controller; - } - } - - /** - * Load the file for a given controller. - * - * @param string $bundle - * @param string $controller - * @return bool - */ - protected static function load($bundle, $controller) - { - $controller = strtolower(str_replace('.', '/', $controller)); - - if (file_exists($path = Bundle::path($bundle).'controllers/'.$controller.EXT)) - { - require_once $path; - - return true; - } - - return false; - } - - /** - * Format a bundle and controller identifier into the controller's class name. - * - * @param string $bundle - * @param string $controller - * @return string - */ - protected static function format($bundle, $controller) - { - return Bundle::class_prefix($bundle).Str::classify($controller).'_Controller'; - } - - /** - * Execute a controller method with the given parameters. - * - * @param string $method - * @param array $parameters - * @return Response - */ - public function execute($method, $parameters = array()) - { - $filters = $this->filters('before', $method); - - // Again, as was the case with route closures, if the controller "before" - // filters return a response, it will be considered the response to the - // request and the controller method will not be used. - $response = Filter::run($filters, array(), true); - - if (is_null($response)) - { - $this->before(); - - $response = $this->response($method, $parameters); - } - - $response = Response::prepare($response); - - // The "after" function on the controller is simply a convenient hook - // so the developer can work on the response before it's returned to - // the browser. This is useful for templating, etc. - $this->after($response); - - Filter::run($this->filters('after', $method), array($response)); - - return $response; - } - - /** - * Execute a controller action and return the response. - * - * Unlike the "execute" method, no filters will be run and the response - * from the controller action will not be changed in any way before it - * is returned to the consumer. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function response($method, $parameters = array()) - { - // The developer may mark the controller as being "RESTful" which - // indicates that the controller actions are prefixed with the - // HTTP verb they respond to rather than the word "action". - if ($this->restful) - { - $action = strtolower(Request::method()).'_'.$method; - } - else - { - $action = "action_{$method}"; - } - - $response = call_user_func_array(array($this, $action), $parameters); - - // If the controller has specified a layout view the response - // returned by the controller method will be bound to that - // view and the layout will be considered the response. - if (is_null($response) and ! is_null($this->layout)) - { - $response = $this->layout; - } - - return $response; - } - - /** - * Register filters on the controller's methods. - * - * - * // Set a "foo" after filter on the controller - * $this->filter('before', 'foo'); - * - * // Set several filters on an explicit group of methods - * $this->filter('after', 'foo|bar')->only(array('user', 'profile')); - * - * - * @param string $event - * @param string|array $filters - * @param mixed $parameters - * @return Filter_Collection - */ - protected function filter($event, $filters, $parameters = null) - { - $this->filters[$event][] = new Filter_Collection($filters, $parameters); - - return $this->filters[$event][count($this->filters[$event]) - 1]; - } - - /** - * Get an array of filter names defined for the destination. - * - * @param string $event - * @param string $method - * @return array - */ - protected function filters($event, $method) - { - if ( ! isset($this->filters[$event])) return array(); - - $filters = array(); - - foreach ($this->filters[$event] as $collection) - { - if ($collection->applies($method)) - { - $filters[] = $collection; - } - } - - return $filters; - } - - /** - * Create the layout that is assigned to the controller. - * - * @return View - */ - public function layout() - { - if (starts_with($this->layout, 'name: ')) - { - return View::of(substr($this->layout, 6)); - } - - return View::make($this->layout); - } - - /** - * This function is called before the action is executed. - * - * @return void - */ - public function before() {} - - /** - * This function is called after the action is executed. - * - * @param Response $response - * @return void - */ - public function after($response) {} - - /** - * Magic Method to handle calls to undefined controller functions. - */ - public function __call($method, $parameters) - { - return Response::error('404'); - } - - /** - * Dynamically resolve items from the application IoC container. - * - * - * // Retrieve an object registered in the container - * $mailer = $this->mailer; - * - * // Equivalent call using the IoC container instance - * $mailer = IoC::resolve('mailer'); - * - */ - public function __get($key) - { - if (IoC::registered($key)) - { - return IoC::resolve($key); - } - } - -} \ No newline at end of file diff --git a/laravel/routing/filter.php b/laravel/routing/filter.php deleted file mode 100644 index 80beec93..00000000 --- a/laravel/routing/filter.php +++ /dev/null @@ -1,329 +0,0 @@ - - * // Register a closure as a filter - * Filter::register('before', function() {}); - * - * // Register a class callback as a filter - * Filter::register('before', array('Class', 'method')); - * - * - * @param string $name - * @param mixed $callback - * @return void - */ - public static function register($name, $callback) - { - if (isset(static::$aliases[$name])) $name = static::$aliases[$name]; - - // If the filter starts with "pattern: ", the filter is being setup to match on - // all requests that match a given pattern. This is nice for defining filters - // that handle all URIs beginning with "admin" for example. - if (starts_with($name, 'pattern: ')) - { - foreach (explode(', ', substr($name, 9)) as $pattern) - { - static::$patterns[$pattern] = $callback; - } - } - else - { - static::$filters[$name] = $callback; - } - } - - /** - * Alias a filter so it can be used by another name. - * - * This is convenient for shortening filters that are registered by bundles. - * - * @param string $filter - * @param string $alias - * @return void - */ - public static function alias($filter, $alias) - { - static::$aliases[$alias] = $filter; - } - - /** - * Parse a filter definition into an array of filters. - * - * @param string|array $filters - * @return array - */ - public static function parse($filters) - { - return (is_string($filters)) ? explode('|', $filters) : (array) $filters; - } - - /** - * Call a filter or set of filters. - * - * @param array $collections - * @param array $pass - * @param bool $override - * @return mixed - */ - public static function run($collections, $pass = array(), $override = false) - { - foreach ($collections as $collection) - { - foreach ($collection->filters as $filter) - { - list($filter, $parameters) = $collection->get($filter); - - // We will also go ahead and start the bundle for the developer. This allows - // the developer to specify bundle filters on routes without starting the - // bundle manually, and performance is improved by lazy-loading. - Bundle::start(Bundle::name($filter)); - - if ( ! isset(static::$filters[$filter])) continue; - - $callback = static::$filters[$filter]; - - // Parameters may be passed into filters by specifying the list of parameters - // as an array, or by registering a Closure which will return the array of - // parameters. If parameters are present, we will merge them with the - // parameters that were given to the method. - $response = call_user_func_array($callback, array_merge($pass, $parameters)); - - // "Before" filters may override the request cycle. For example, an auth - // filter may redirect a user to a login view if they are not logged in. - // Because of this, we will return the first filter response if - // overriding is enabled for the filter collections - if ( ! is_null($response) and $override) - { - return $response; - } - } - } - } - -} - -class Filter_Collection { - - /** - * The filters contained by the collection. - * - * @var string|array - */ - public $filters = array(); - - /** - * The parameters specified for the filter. - * - * @var mixed - */ - public $parameters; - - /** - * The included controller methods. - * - * @var array - */ - public $only = array(); - - /** - * The excluded controller methods. - * - * @var array - */ - public $except = array(); - - /** - * The HTTP methods for which the filter applies. - * - * @var array - */ - public $methods = array(); - - /** - * Create a new filter collection instance. - * - * @param string|array $filters - * @param mixed $parameters - * @return void - */ - public function __construct($filters, $parameters = null) - { - $this->parameters = $parameters; - $this->filters = Filter::parse($filters); - } - - /** - * Parse the filter string, returning the filter name and parameters. - * - * @param string $filter - * @return array - */ - public function get($filter) - { - // If the parameters were specified by passing an array into the collection, - // then we will simply return those parameters. Combining passed parameters - // with parameters specified directly in the filter attachment is not - // currently supported by the framework. - if ( ! is_null($this->parameters)) - { - return array($filter, $this->parameters()); - } - - // If no parameters were specified when the collection was created, we will - // check the filter string itself to see if the parameters were injected - // into the string as raw values, such as "role:admin". - if (($colon = strpos(Bundle::element($filter), ':')) !== false) - { - $parameters = explode(',', substr(Bundle::element($filter), $colon + 1)); - - // If the filter belongs to a bundle, we need to re-calculate the position - // of the parameter colon, since we originally calculated it without the - // bundle identifier because the identifier uses colons as well. - if (($bundle = Bundle::name($filter)) !== DEFAULT_BUNDLE) - { - $colon = strlen($bundle.'::') + $colon; - } - - return array(substr($filter, 0, $colon), $parameters); - } - - // If no parameters were specified when the collection was created or - // in the filter string, we will just return the filter name as is - // and give back an empty array of parameters. - return array($filter, array()); - } - - /** - * Evaluate the collection's parameters and return a parameters array. - * - * @return array - */ - protected function parameters() - { - if ($this->parameters instanceof Closure) - { - $this->parameters = call_user_func($this->parameters); - } - - return $this->parameters; - } - - /** - * Determine if this collection's filters apply to a given method. - * - * @param string $method - * @return bool - */ - public function applies($method) - { - if (count($this->only) > 0 and ! in_array($method, $this->only)) - { - return false; - } - - if (count($this->except) > 0 and in_array($method, $this->except)) - { - return false; - } - - $request = strtolower(Request::method()); - - if (count($this->methods) > 0 and ! in_array($request, $this->methods)) - { - return false; - } - - return true; - } - - /** - * Set the excluded controller methods. - * - * - * // Specify a filter for all methods except "index" - * $this->filter('before', 'auth')->except('index'); - * - * // Specify a filter for all methods except "index" and "home" - * $this->filter('before', 'auth')->except(array('index', 'home')); - * - * - * @param array $methods - * @return Filter_Collection - */ - public function except($methods) - { - $this->except = (array) $methods; - return $this; - } - - /** - * Set the included controller methods. - * - * - * // Specify a filter for only the "index" method - * $this->filter('before', 'auth')->only('index'); - * - * // Specify a filter for only the "index" and "home" methods - * $this->filter('before', 'auth')->only(array('index', 'home')); - * - * - * @param array $methods - * @return Filter_Collection - */ - public function only($methods) - { - $this->only = (array) $methods; - return $this; - } - - /** - * Set the HTTP methods for which the filter applies. - * - * - * // Specify that a filter only applies on POST requests - * $this->filter('before', 'csrf')->on('post'); - * - * // Specify that a filter applies for multiple HTTP request methods - * $this->filter('before', 'csrf')->on(array('post', 'put')); - * - * - * @param array $methods - * @return Filter_Collection - */ - public function on($methods) - { - $this->methods = array_map('strtolower', (array) $methods); - return $this; - } - -} \ No newline at end of file diff --git a/laravel/routing/route.php b/laravel/routing/route.php deleted file mode 100644 index 1ce17f1a..00000000 --- a/laravel/routing/route.php +++ /dev/null @@ -1,418 +0,0 @@ -uri = $uri; - $this->method = $method; - $this->action = $action; - - // Determine the bundle in which the route was registered. We will know - // the bundle by using the bundle::handles method, which will return - // the bundle assigned to that URI. - $this->bundle = Bundle::handles($uri); - - // We'll set the parameters based on the number of parameters passed - // compared to the parameters that were needed. If more parameters - // are needed, we'll merge in the defaults. - $this->parameters($action, $parameters); - } - - /** - * Set the parameters array to the correct value. - * - * @param array $action - * @param array $parameters - * @return void - */ - protected function parameters($action, $parameters) - { - $defaults = (array) array_get($action, 'defaults'); - - // If there are less parameters than wildcards, we will figure out how - // many parameters we need to inject from the array of defaults and - // merge them into the main array for the route. - if (count($defaults) > count($parameters)) - { - $defaults = array_slice($defaults, count($parameters)); - - $parameters = array_merge($parameters, $defaults); - } - - $this->parameters = $parameters; - } - - /** - * Call a given route and return the route's response. - * - * @return Response - */ - public function call() - { - // The route is responsible for running the global filters, and any - // filters defined on the route itself, since all incoming requests - // come through a route (either defined or ad-hoc). - $response = Filter::run($this->filters('before'), array(), true); - - if (is_null($response)) - { - $response = $this->response(); - } - - // We always return a Response instance from the route calls, so - // we'll use the prepare method on the Response class to make - // sure we have a valid Response instance. - $response = Response::prepare($response); - - Filter::run($this->filters('after'), array(&$response)); - - return $response; - } - - /** - * Execute the route action and return the response. - * - * Unlike the "call" method, none of the attached filters will be run. - * - * @return mixed - */ - public function response() - { - // If the action is a string, it is pointing the route to a controller - // action, and we can just call the action and return its response. - // We'll just pass the action off to the Controller class. - $delegate = $this->delegate(); - - if ( ! is_null($delegate)) - { - return Controller::call($delegate, $this->parameters); - } - - // If the route does not have a delegate, then it must be a Closure - // instance or have a Closure in its action array, so we will try - // to locate the Closure and call it directly. - $handler = $this->handler(); - - if ( ! is_null($handler)) - { - return call_user_func_array($handler, $this->parameters); - } - } - - /** - * Get the filters that are attached to the route for a given event. - * - * @param string $event - * @return array - */ - protected function filters($event) - { - $global = Bundle::prefix($this->bundle).$event; - - $filters = array_unique(array($event, $global)); - - // Next we will check to see if there are any filters attached to - // the route for the given event. If there are, we'll merge them - // in with the global filters for the event. - if (isset($this->action[$event])) - { - $assigned = Filter::parse($this->action[$event]); - - $filters = array_merge($filters, $assigned); - } - - // Next we will attach any pattern type filters to the array of - // filters as these are matched to the route by the route's - // URI and not explicitly attached to routes. - if ($event == 'before') - { - $filters = array_merge($filters, $this->patterns()); - } - - return array(new Filter_Collection($filters)); - } - - /** - * Get the pattern filters for the route. - * - * @return array - */ - protected function patterns() - { - $filters = array(); - - // We will simply iterate through the registered patterns and - // check the URI pattern against the URI for the route and - // if they match we'll attach the filter. - foreach (Filter::$patterns as $pattern => $filter) - { - if (Str::is($pattern, $this->uri)) - { - // If the filter provided is an array then we need to register - // the filter before we can assign it to the route. - if (is_array($filter)) - { - list($filter, $callback) = array_values($filter); - - Filter::register($filter, $callback); - } - - $filters[] = $filter; - } - } - - return (array) $filters; - } - - /** - * Get the controller action delegate assigned to the route. - * - * If no delegate is assigned, null will be returned by the method. - * - * @return string - */ - protected function delegate() - { - return array_get($this->action, 'uses'); - } - - /** - * Get the anonymous function assigned to handle the route. - * - * @return Closure - */ - protected function handler() - { - return array_first($this->action, function($key, $value) - { - return $value instanceof Closure; - }); - } - - /** - * Determine if the route has a given name. - * - * - * // Determine if the route is the "login" route - * $login = Request::route()->is('login'); - * - * - * @param string $name - * @return bool - */ - public function is($name) - { - return array_get($this->action, 'as') === $name; - } - - /** - * Register a controller with the router. - * - * @param string|array $controllers - * @param string|array $defaults - * @return void - */ - public static function controller($controllers, $defaults = 'index') - { - Router::controller($controllers, $defaults); - } - - /** - * Register a secure controller with the router. - * - * @param string|array $controllers - * @param string|array $defaults - * @return void - */ - public static function secure_controller($controllers, $defaults = 'index') - { - Router::controller($controllers, $defaults, true); - } - - /** - * Register a GET route with the router. - * - * @param string|array $route - * @param mixed $action - * @return void - */ - public static function get($route, $action) - { - Router::register('GET', $route, $action); - } - - /** - * Register a POST route with the router. - * - * @param string|array $route - * @param mixed $action - * @return void - */ - public static function post($route, $action) - { - Router::register('POST', $route, $action); - } - - /** - * Register a PUT route with the router. - * - * @param string|array $route - * @param mixed $action - * @return void - */ - public static function put($route, $action) - { - Router::register('PUT', $route, $action); - } - - /** - * Register a DELETE route with the router. - * - * @param string|array $route - * @param mixed $action - * @return void - */ - public static function delete($route, $action) - { - Router::register('DELETE', $route, $action); - } - - /** - * Register a route that handles any request method. - * - * @param string|array $route - * @param mixed $action - * @return void - */ - public static function any($route, $action) - { - Router::register('*', $route, $action); - } - - /** - * Register a group of routes that share attributes. - * - * @param array $attributes - * @param Closure $callback - * @return void - */ - public static function group($attributes, Closure $callback) - { - Router::group($attributes, $callback); - } - - /** - * Register many request URIs to a single action. - * - * @param array $routes - * @param mixed $action - * @return void - */ - public static function share($routes, $action) - { - Router::share($routes, $action); - } - - /** - * Register a HTTPS route with the router. - * - * @param string $method - * @param string|array $route - * @param mixed $action - * @return void - */ - public static function secure($method, $route, $action) - { - Router::secure($method, $route, $action); - } - - /** - * Register a route filter. - * - * @param string $name - * @param mixed $callback - * @return void - */ - public static function filter($name, $callback) - { - Filter::register($name, $callback); - } - - /** - * Calls the specified route and returns its response. - * - * @param string $method - * @param string $uri - * @return Response - */ - public static function forward($method, $uri) - { - return Router::route(strtoupper($method), $uri)->call(); - } - -} diff --git a/laravel/routing/router.php b/laravel/routing/router.php deleted file mode 100644 index b2578169..00000000 --- a/laravel/routing/router.php +++ /dev/null @@ -1,597 +0,0 @@ - array(), - 'POST' => array(), - 'PUT' => array(), - 'DELETE' => array(), - 'PATCH' => array(), - 'HEAD' => array(), - ); - - /** - * All of the "fallback" routes that have been registered. - * - * @var array - */ - public static $fallback = array( - 'GET' => array(), - 'POST' => array(), - 'PUT' => array(), - 'DELETE' => array(), - 'PATCH' => array(), - 'HEAD' => array(), - ); - - /** - * The current attributes being shared by routes. - */ - public static $group; - - /** - * The "handles" clause for the bundle currently being routed. - * - * @var string - */ - public static $bundle; - - /** - * The number of URI segments allowed as method arguments. - * - * @var int - */ - public static $segments = 5; - - /** - * The wildcard patterns supported by the router. - * - * @var array - */ - public static $patterns = array( - '(:num)' => '([0-9]+)', - '(:any)' => '([a-zA-Z0-9\.\-_%=]+)', - '(:segment)' => '([^/]+)', - '(:all)' => '(.*)', - ); - - /** - * The optional wildcard patterns supported by the router. - * - * @var array - */ - public static $optional = array( - '/(:num?)' => '(?:/([0-9]+)', - '/(:any?)' => '(?:/([a-zA-Z0-9\.\-_%=]+)', - '/(:segment?)' => '(?:/([^/]+)', - '/(:all?)' => '(?:/(.*)', - ); - - /** - * An array of HTTP request methods. - * - * @var array - */ - public static $methods = array('GET', 'POST', 'PUT', 'DELETE', 'HEAD'); - - /** - * Register a HTTPS route with the router. - * - * @param string $method - * @param string|array $route - * @param mixed $action - * @return void - */ - public static function secure($method, $route, $action) - { - $action = static::action($action); - - $action['https'] = true; - - static::register($method, $route, $action); - } - - /** - * Register many request URIs to a single action. - * - * - * // Register a group of URIs for an action - * Router::share(array(array('GET', '/'), array('POST', '/')), 'home@index'); - * - * - * @param array $routes - * @param mixed $action - * @return void - */ - public static function share($routes, $action) - { - foreach ($routes as $route) - { - static::register($route[0], $route[1], $action); - } - } - - /** - * Register a group of routes that share attributes. - * - * @param array $attributes - * @param Closure $callback - * @return void - */ - public static function group($attributes, Closure $callback) - { - // Route groups allow the developer to specify attributes for a group - // of routes. To register them, we'll set a static property on the - // router so that the register method will see them. - static::$group = $attributes; - - call_user_func($callback); - - // Once the routes have been registered, we want to set the group to - // null so the attributes will not be given to any of the routes - // that are added after the group is declared. - static::$group = null; - } - - /** - * Register a route with the router. - * - * - * // Register a route with the router - * Router::register('GET', '/', function() {return 'Home!';}); - * - * // Register a route that handles multiple URIs with the router - * Router::register(array('GET', '/', 'GET /home'), function() {return 'Home!';}); - * - * - * @param string $method - * @param string|array $route - * @param mixed $action - * @return void - */ - public static function register($method, $route, $action) - { - if (ctype_digit($route)) $route = "({$route})"; - - if (is_string($route)) $route = explode(', ', $route); - - // If the developer is registering multiple request methods to handle - // the URI, we'll spin through each method and register the route - // for each of them along with each URI and action. - if (is_array($method)) - { - foreach ($method as $http) - { - static::register($http, $route, $action); - } - - return; - } - - foreach ((array) $route as $uri) - { - // If the URI begins with a splat, we'll call the universal method, which - // will register a route for each of the request methods supported by - // the router. This is just a notational short-cut. - if ($method == '*') - { - foreach (static::$methods as $method) - { - static::register($method, $route, $action); - } - - continue; - } - - $uri = ltrim(str_replace('(:bundle)', static::$bundle, $uri), '/'); - - if($uri == '') - { - $uri = '/'; - } - - // If the URI begins with a wildcard, we want to add this route to the - // array of "fallback" routes. Fallback routes are always processed - // last when parsing routes since they are very generic and could - // overload bundle routes that are registered. - if ($uri[0] == '(') - { - $routes =& static::$fallback; - } - else - { - $routes =& static::$routes; - } - - // If the action is an array, we can simply add it to the array of - // routes keyed by the URI. Otherwise, we will need to call into - // the action method to get a valid action array. - if (is_array($action)) - { - $routes[$method][$uri] = $action; - } - else - { - $routes[$method][$uri] = static::action($action); - } - - // If a group is being registered, we'll merge all of the group - // options into the action, giving preference to the action - // for options that are specified in both. - if ( ! is_null(static::$group)) - { - $routes[$method][$uri] += static::$group; - } - - // If the HTTPS option is not set on the action, we'll use the - // value given to the method. The secure method passes in the - // HTTPS value in as a parameter short-cut. - if ( ! isset($routes[$method][$uri]['https'])) - { - $routes[$method][$uri]['https'] = false; - } - } - } - - /** - * Convert a route action to a valid action array. - * - * @param mixed $action - * @return array - */ - protected static function action($action) - { - // If the action is a string, it is a pointer to a controller, so we - // need to add it to the action array as a "uses" clause, which will - // indicate to the route to call the controller. - if (is_string($action)) - { - $action = array('uses' => $action); - } - // If the action is a Closure, we will manually put it in an array - // to work around a bug in PHP 5.3.2 which causes Closures cast - // as arrays to become null. We'll remove this. - elseif ($action instanceof Closure) - { - $action = array($action); - } - - return (array) $action; - } - - /** - * Register a secure controller with the router. - * - * @param string|array $controllers - * @param string|array $defaults - * @return void - */ - public static function secure_controller($controllers, $defaults = 'index') - { - static::controller($controllers, $defaults, true); - } - - /** - * Register a controller with the router. - * - * @param string|array $controllers - * @param string|array $defaults - * @param bool $https - * @return void - */ - public static function controller($controllers, $defaults = 'index', $https = null) - { - foreach ((array) $controllers as $identifier) - { - list($bundle, $controller) = Bundle::parse($identifier); - - // First we need to replace the dots with slashes in the controller name - // so that it is in directory format. The dots allow the developer to use - // a cleaner syntax when specifying the controller. We will also grab the - // root URI for the controller's bundle. - $controller = str_replace('.', '/', $controller); - - $root = Bundle::option($bundle, 'handles'); - - // If the controller is a "home" controller, we'll need to also build an - // index method route for the controller. We'll remove "home" from the - // route root and setup a route to point to the index method. - if (ends_with($controller, 'home')) - { - static::root($identifier, $controller, $root); - } - - // The number of method arguments allowed for a controller is set by a - // "segments" constant on this class which allows for the developer to - // increase or decrease the limit on method arguments. - $wildcards = static::repeat('(:any?)', static::$segments); - - // Once we have the path and root URI we can build a simple route for - // the controller that should handle a conventional controller route - // setup of controller/method/segment/segment, etc. - $pattern = trim("{$root}/{$controller}/{$wildcards}", '/'); - - // Finally we can build the "uses" clause and the attributes for the - // controller route and register it with the router with a wildcard - // method so it is available on every request method. - $uses = "{$identifier}@(:1)"; - - $attributes = compact('uses', 'defaults', 'https'); - - static::register('*', $pattern, $attributes); - } - } - - /** - * Register a route for the root of a controller. - * - * @param string $identifier - * @param string $controller - * @param string $root - * @return void - */ - protected static function root($identifier, $controller, $root) - { - // First we need to strip "home" off of the controller name to create the - // URI needed to match the controller's folder, which should match the - // root URI we want to point to the index method. - if ($controller !== 'home') - { - $home = dirname($controller); - } - else - { - $home = ''; - } - - // After we trim the "home" off of the controller name we'll build the - // pattern needed to map to the controller and then register a route - // to point the pattern to the controller's index method. - $pattern = trim($root.'/'.$home, '/') ?: '/'; - - $attributes = array('uses' => "{$identifier}@index"); - - static::register('*', $pattern, $attributes); - } - - /** - * Find a route by the route's assigned name. - * - * @param string $name - * @return array - */ - public static function find($name) - { - if (isset(static::$names[$name])) return static::$names[$name]; - - // If no route names have been found at all, we will assume no reverse - // routing has been done, and we will load the routes file for all of - // the bundles that are installed for the application. - if (count(static::$names) == 0) - { - foreach (Bundle::names() as $bundle) - { - Bundle::routes($bundle); - } - } - - // To find a named route, we will iterate through every route defined - // for the application. We will cache the routes by name so we can - // load them very quickly the next time. - foreach (static::routes() as $method => $routes) - { - foreach ($routes as $key => $value) - { - if (isset($value['as']) and $value['as'] === $name) - { - return static::$names[$name] = array($key => $value); - } - } - } - } - - /** - * Find the route that uses the given action. - * - * @param string $action - * @return array - */ - public static function uses($action) - { - // If the action has already been reverse routed before, we'll just - // grab the previously found route to save time. They are cached - // in a static array on the class. - if (isset(static::$uses[$action])) - { - return static::$uses[$action]; - } - - Bundle::routes(Bundle::name($action)); - - // To find the route, we'll simply spin through the routes looking - // for a route with a "uses" key matching the action, and if we - // find one, we cache and return it. - foreach (static::routes() as $method => $routes) - { - foreach ($routes as $key => $value) - { - if (isset($value['uses']) and $value['uses'] === $action) - { - return static::$uses[$action] = array($key => $value); - } - } - } - } - - /** - * Search the routes for the route matching a method and URI. - * - * @param string $method - * @param string $uri - * @return Route - */ - public static function route($method, $uri) - { - Bundle::start($bundle = Bundle::handles($uri)); - - $routes = (array) static::method($method); - - // Of course literal route matches are the quickest to find, so we will - // check for those first. If the destination key exists in the routes - // array we can just return that route now. - if (array_key_exists($uri, $routes)) - { - $action = $routes[$uri]; - - return new Route($method, $uri, $action); - } - - // If we can't find a literal match we'll iterate through all of the - // registered routes to find a matching route based on the route's - // regular expressions and wildcards. - if ( ! is_null($route = static::match($method, $uri))) - { - return $route; - } - } - - /** - * Iterate through every route to find a matching route. - * - * @param string $method - * @param string $uri - * @return Route - */ - protected static function match($method, $uri) - { - foreach (static::method($method) as $route => $action) - { - // We only need to check routes with regular expression since all others - // would have been able to be matched by the search for literal matches - // we just did before we started searching. - if (str_contains($route, '(')) - { - $pattern = '#^'.static::wildcards($route).'$#u'; - - // If we get a match we'll return the route and slice off the first - // parameter match, as preg_match sets the first array item to the - // full-text match of the pattern. - if (preg_match($pattern, $uri, $parameters)) - { - return new Route($method, $route, $action, array_slice($parameters, 1)); - } - } - } - } - - /** - * Translate route URI wildcards into regular expressions. - * - * @param string $key - * @return string - */ - protected static function wildcards($key) - { - list($search, $replace) = array_divide(static::$optional); - - // For optional parameters, first translate the wildcards to their - // regex equivalent, sans the ")?" ending. We'll add the endings - // back on when we know the replacement count. - $key = str_replace($search, $replace, $key, $count); - - if ($count > 0) - { - $key .= str_repeat(')?', $count); - } - - return strtr($key, static::$patterns); - } - - /** - * Get all of the registered routes, with fallbacks at the end. - * - * @return array - */ - public static function routes() - { - $routes = static::$routes; - - foreach (static::$methods as $method) - { - // It's possible that the routes array may not contain any routes for the - // method, so we'll seed each request method with an empty array if it - // doesn't already contain any routes. - if ( ! isset($routes[$method])) $routes[$method] = array(); - - $fallback = array_get(static::$fallback, $method, array()); - - // When building the array of routes, we'll merge in all of the fallback - // routes for each request method individually. This allows us to avoid - // collisions when merging the arrays together. - $routes[$method] = array_merge($routes[$method], $fallback); - } - - return $routes; - } - - /** - * Grab all of the routes for a given request method. - * - * @param string $method - * @return array - */ - public static function method($method) - { - $routes = array_get(static::$routes, $method, array()); - - return array_merge($routes, array_get(static::$fallback, $method, array())); - } - - /** - * Get all of the wildcard patterns - * - * @return array - */ - public static function patterns() - { - return array_merge(static::$patterns, static::$optional); - } - - /** - * Get a string repeating a URI pattern any number of times. - * - * @param string $pattern - * @param int $times - * @return string - */ - protected static function repeat($pattern, $times) - { - return implode('/', array_fill(0, $times, $pattern)); - } - -} \ No newline at end of file diff --git a/laravel/section.php b/laravel/section.php deleted file mode 100644 index 9638880c..00000000 --- a/laravel/section.php +++ /dev/null @@ -1,136 +0,0 @@ - - * // Start injecting into the "header" section - * Section::start('header'); - * - * // Inject a raw string into the "header" section without buffering - * Section::start('header', 'Laravel'); - * - * - * @param string $section - * @param string|Closure $content - * @return void - */ - public static function start($section, $content = '') - { - if ($content === '') - { - ob_start() and static::$last[] = $section; - } - else - { - static::extend($section, $content); - } - } - - /** - * Inject inline content into a section. - * - * This is helpful for injecting simple strings such as page titles. - * - * - * // Inject inline content into the "header" section - * Section::inject('header', 'Laravel'); - * - * - * @param string $section - * @param string $content - * @return void - */ - public static function inject($section, $content) - { - static::start($section, $content); - } - - /** - * Stop injecting content into a section and return its contents. - * - * @return string - */ - public static function yield_section() - { - return static::yield(static::stop()); - } - - /** - * Stop injecting content into a section. - * - * @return string - */ - public static function stop() - { - static::extend($last = array_pop(static::$last), ob_get_clean()); - - return $last; - } - - /** - * Extend the content in a given section. - * - * @param string $section - * @param string $content - * @return void - */ - protected static function extend($section, $content) - { - if (isset(static::$sections[$section])) - { - static::$sections[$section] = str_replace('@parent', $content, static::$sections[$section]); - } - else - { - static::$sections[$section] = $content; - } - } - - /** - * Append content to a given section. - * - * @param string $section - * @param string $content - * @return void - */ - public static function append($section, $content) - { - if (isset(static::$sections[$section])) - { - static::$sections[$section] .= $content; - } - else - { - static::$sections[$section] = $content; - } - } - - /** - * Get the string contents of a section. - * - * @param string $section - * @return string - */ - public static function yield($section) - { - return (isset(static::$sections[$section])) ? static::$sections[$section] : ''; - } - -} \ No newline at end of file diff --git a/laravel/session.php b/laravel/session.php deleted file mode 100644 index 877b5a45..00000000 --- a/laravel/session.php +++ /dev/null @@ -1,153 +0,0 @@ -load(Cookie::get(Config::get('session.cookie'))); - } - - /** - * Create the session payload instance for the request. - * - * @param string $driver - * @return void - */ - public static function start($driver) - { - static::$instance = new Session\Payload(static::factory($driver)); - } - - /** - * Create a new session driver instance. - * - * @param string $driver - * @return Session\Drivers\Driver - */ - public static function factory($driver) - { - if (isset(static::$registrar[$driver])) - { - $resolver = static::$registrar[$driver]; - - return $resolver(); - } - - switch ($driver) - { - case 'apc': - return new Session\Drivers\APC(Cache::driver('apc')); - - case 'cookie': - return new Session\Drivers\Cookie; - - case 'database': - return new Session\Drivers\Database(Database::connection()); - - case 'file': - return new Session\Drivers\File(path('storage').'sessions'.DS); - - case 'memcached': - return new Session\Drivers\Memcached(Cache::driver('memcached')); - - case 'memory': - return new Session\Drivers\Memory; - - case 'redis': - return new Session\Drivers\Redis(Cache::driver('redis')); - - default: - throw new \Exception("Session driver [$driver] is not supported."); - } - } - - /** - * Retrieve the active session payload instance for the request. - * - * - * // Retrieve the session instance and get an item - * Session::instance()->get('name'); - * - * // Retrieve the session instance and place an item in the session - * Session::instance()->put('name', 'Taylor'); - * - * - * @return Session\Payload - */ - public static function instance() - { - if (static::started()) return static::$instance; - - throw new \Exception("A driver must be set before using the session."); - } - - /** - * Determine if session handling has been started for the request. - * - * @return bool - */ - public static function started() - { - return ! is_null(static::$instance); - } - - /** - * Register a third-party cache driver. - * - * @param string $driver - * @param Closure $resolver - * @return void - */ - public static function extend($driver, Closure $resolver) - { - static::$registrar[$driver] = $resolver; - } - - /** - * Magic Method for calling the methods on the session singleton instance. - * - * - * // Retrieve a value from the session - * $value = Session::get('name'); - * - * // Write a value to the session storage - * $value = Session::put('name', 'Taylor'); - * - * // Equivalent statement using the "instance" method - * $value = Session::instance()->put('name', 'Taylor'); - * - */ - public static function __callStatic($method, $parameters) - { - return call_user_func_array(array(static::instance(), $method), $parameters); - } - -} \ No newline at end of file diff --git a/laravel/session/drivers/apc.php b/laravel/session/drivers/apc.php deleted file mode 100644 index d3148366..00000000 --- a/laravel/session/drivers/apc.php +++ /dev/null @@ -1,60 +0,0 @@ -apc = $apc; - } - - /** - * Load a session from storage by a given ID. - * - * If no session is found for the ID, null will be returned. - * - * @param string $id - * @return array - */ - public function load($id) - { - return $this->apc->get($id); - } - - /** - * Save a given session to storage. - * - * @param array $session - * @param array $config - * @param bool $exists - * @return void - */ - public function save($session, $config, $exists) - { - $this->apc->put($session['id'], $session, $config['lifetime']); - } - - /** - * Delete a session from storage by a given ID. - * - * @param string $id - * @return void - */ - public function delete($id) - { - $this->apc->forget($id); - } - -} \ No newline at end of file diff --git a/laravel/session/drivers/cookie.php b/laravel/session/drivers/cookie.php deleted file mode 100644 index 63a60eec..00000000 --- a/laravel/session/drivers/cookie.php +++ /dev/null @@ -1,56 +0,0 @@ -connection = $connection; - } - - /** - * Load a session from storage by a given ID. - * - * If no session is found for the ID, null will be returned. - * - * @param string $id - * @return array - */ - public function load($id) - { - $session = $this->table()->find($id); - - if ( ! is_null($session)) - { - return array( - 'id' => $session->id, - 'last_activity' => $session->last_activity, - 'data' => unserialize($session->data) - ); - } - } - - /** - * Save a given session to storage. - * - * @param array $session - * @param array $config - * @param bool $exists - * @return void - */ - public function save($session, $config, $exists) - { - if ($exists) - { - $this->table()->where('id', '=', $session['id'])->update(array( - 'last_activity' => $session['last_activity'], - 'data' => serialize($session['data']), - )); - } - else - { - $this->table()->insert(array( - 'id' => $session['id'], - 'last_activity' => $session['last_activity'], - 'data' => serialize($session['data']) - )); - } - } - - /** - * Delete a session from storage by a given ID. - * - * @param string $id - * @return void - */ - public function delete($id) - { - $this->table()->delete($id); - } - - /** - * Delete all expired sessions from persistent storage. - * - * @param int $expiration - * @return void - */ - public function sweep($expiration) - { - $this->table()->where('last_activity', '<', $expiration)->delete(); - } - - /** - * Get a session database query. - * - * @return Query - */ - private function table() - { - return $this->connection->table(Config::get('session.table')); - } - -} \ No newline at end of file diff --git a/laravel/session/drivers/driver.php b/laravel/session/drivers/driver.php deleted file mode 100644 index e5cef1ee..00000000 --- a/laravel/session/drivers/driver.php +++ /dev/null @@ -1,78 +0,0 @@ - $this->id(), 'data' => array( - ':new:' => array(), - ':old:' => array(), - )); - } - - /** - * Get a new session ID that isn't assigned to any current session. - * - * @return string - */ - public function id() - { - $session = array(); - - // If the driver is an instance of the Cookie driver, we are able to - // just return any string since the Cookie driver has no real idea - // of a server side persisted session with an ID. - if ($this instanceof Cookie) - { - return Str::random(40); - } - - // We'll continue generating random IDs until we find an ID that is - // not currently assigned to a session. This is almost definitely - // going to happen on the first iteration. - do { - - $session = $this->load($id = Str::random(40)); - - } while ( ! is_null($session)); - - return $id; - } - -} \ No newline at end of file diff --git a/laravel/session/drivers/file.php b/laravel/session/drivers/file.php deleted file mode 100644 index 744f3737..00000000 --- a/laravel/session/drivers/file.php +++ /dev/null @@ -1,87 +0,0 @@ -path = $path; - } - - /** - * Load a session from storage by a given ID. - * - * If no session is found for the ID, null will be returned. - * - * @param string $id - * @return array - */ - public function load($id) - { - if (file_exists($path = $this->path.$id)) - { - return unserialize(file_get_contents($path)); - } - } - - /** - * Save a given session to storage. - * - * @param array $session - * @param array $config - * @param bool $exists - * @return void - */ - public function save($session, $config, $exists) - { - file_put_contents($this->path.$session['id'], serialize($session), LOCK_EX); - } - - /** - * Delete a session from storage by a given ID. - * - * @param string $id - * @return void - */ - public function delete($id) - { - if (file_exists($this->path.$id)) - { - @unlink($this->path.$id); - } - } - - /** - * Delete all expired sessions from persistent storage. - * - * @param int $expiration - * @return void - */ - public function sweep($expiration) - { - $files = glob($this->path.'*'); - - if ($files === false) return; - - foreach ($files as $file) - { - if (filetype($file) == 'file' and filemtime($file) < $expiration) - { - @unlink($file); - } - } - } - -} \ No newline at end of file diff --git a/laravel/session/drivers/memcached.php b/laravel/session/drivers/memcached.php deleted file mode 100644 index 7eaa283a..00000000 --- a/laravel/session/drivers/memcached.php +++ /dev/null @@ -1,60 +0,0 @@ -memcached = $memcached; - } - - /** - * Load a session from storage by a given ID. - * - * If no session is found for the ID, null will be returned. - * - * @param string $id - * @return array - */ - public function load($id) - { - return $this->memcached->get($id); - } - - /** - * Save a given session to storage. - * - * @param array $session - * @param array $config - * @param bool $exists - * @return void - */ - public function save($session, $config, $exists) - { - $this->memcached->put($session['id'], $session, $config['lifetime']); - } - - /** - * Delete a session from storage by a given ID. - * - * @param string $id - * @return void - */ - public function delete($id) - { - $this->memcached->forget($id); - } - -} \ No newline at end of file diff --git a/laravel/session/drivers/memory.php b/laravel/session/drivers/memory.php deleted file mode 100644 index a1d7dbf0..00000000 --- a/laravel/session/drivers/memory.php +++ /dev/null @@ -1,49 +0,0 @@ -session; - } - - /** - * Save a given session to storage. - * - * @param array $session - * @param array $config - * @param bool $exists - * @return void - */ - public function save($session, $config, $exists) - { - // - } - - /** - * Delete a session from storage by a given ID. - * - * @param string $id - * @return void - */ - public function delete($id) - { - // - } - -} \ No newline at end of file diff --git a/laravel/session/drivers/redis.php b/laravel/session/drivers/redis.php deleted file mode 100644 index f3b8f851..00000000 --- a/laravel/session/drivers/redis.php +++ /dev/null @@ -1,60 +0,0 @@ -redis = $redis; - } - - /** - * Load a session from storage by a given ID. - * - * If no session is found for the ID, null will be returned. - * - * @param string $id - * @return array - */ - public function load($id) - { - return $this->redis->get($id); - } - - /** - * Save a given session to storage. - * - * @param array $session - * @param array $config - * @param bool $exists - * @return void - */ - public function save($session, $config, $exists) - { - $this->redis->put($session['id'], $session, $config['lifetime']); - } - - /** - * Delete a session from storage by a given ID. - * - * @param string $id - * @return void - */ - public function delete($id) - { - $this->redis->forget($id); - } - -} \ No newline at end of file diff --git a/laravel/session/drivers/sweeper.php b/laravel/session/drivers/sweeper.php deleted file mode 100644 index 45ecd17b..00000000 --- a/laravel/session/drivers/sweeper.php +++ /dev/null @@ -1,13 +0,0 @@ -driver = $driver; - } - - /** - * Load the session for the current request. - * - * @param string $id - * @return void - */ - public function load($id) - { - if ( ! is_null($id)) $this->session = $this->driver->load($id); - - // If the session doesn't exist or is invalid we will create a new session - // array and mark the session as being non-existent. Some drivers, such as - // the database driver, need to know whether it exists. - if (is_null($this->session) or static::expired($this->session)) - { - $this->exists = false; - - $this->session = $this->driver->fresh(); - } - - // A CSRF token is stored in every session. The token is used by the Form - // class and the "csrf" filter to protect the application from cross-site - // request forgery attacks. The token is simply a random string. - if ( ! $this->has(Session::csrf_token)) - { - $this->put(Session::csrf_token, Str::random(40)); - } - } - - /** - * Determine if the session payload instance is valid. - * - * The session is considered valid if it exists and has not expired. - * - * @param array $session - * @return bool - */ - protected static function expired($session) - { - $lifetime = Config::get('session.lifetime'); - - return (time() - $session['last_activity']) > ($lifetime * 60); - } - - /** - * Determine if the session or flash data contains an item. - * - * @param string $key - * @return bool - */ - public function has($key) - { - return ( ! is_null($this->get($key))); - } - - /** - * Get an item from the session. - * - * The session flash data will also be checked for the requested item. - * - * - * // Get an item from the session - * $name = Session::get('name'); - * - * // Return a default value if the item doesn't exist - * $name = Session::get('name', 'Taylor'); - * - * - * @param string $key - * @param mixed $default - * @return mixed - */ - public function get($key, $default = null) - { - $session = $this->session['data']; - - // We check for the item in the general session data first, and if it - // does not exist in that data, we will attempt to find it in the new - // and old flash data, or finally return the default value. - if ( ! is_null($value = array_get($session, $key))) - { - return $value; - } - elseif ( ! is_null($value = array_get($session[':new:'], $key))) - { - return $value; - } - elseif ( ! is_null($value = array_get($session[':old:'], $key))) - { - return $value; - } - - return value($default); - } - - /** - * Write an item to the session. - * - * - * // Write an item to the session payload - * Session::put('name', 'Taylor'); - * - * - * @param string $key - * @param mixed $value - * @return void - */ - public function put($key, $value) - { - array_set($this->session['data'], $key, $value); - } - - /** - * Write an item to the session flash data. - * - * Flash data only exists for the current and next request to the application. - * - * - * // Write an item to the session payload's flash data - * Session::flash('name', 'Taylor'); - * - * - * @param string $key - * @param mixed $value - * @return void - */ - public function flash($key, $value) - { - array_set($this->session['data'][':new:'], $key, $value); - } - - /** - * Keep all of the session flash data from expiring after the request. - * - * @return void - */ - public function reflash() - { - $old = $this->session['data'][':old:']; - - $this->session['data'][':new:'] = array_merge($this->session['data'][':new:'], $old); - } - - /** - * Keep a session flash item from expiring at the end of the request. - * - * - * // Keep the "name" item from expiring from the flash data - * Session::keep('name'); - * - * // Keep the "name" and "email" items from expiring from the flash data - * Session::keep(array('name', 'email')); - * - * - * @param string|array $keys - * @return void - */ - public function keep($keys) - { - foreach ((array) $keys as $key) - { - $this->flash($key, $this->get($key)); - } - } - - /** - * Remove an item from the session data. - * - * @param string $key - * @return void - */ - public function forget($key) - { - array_forget($this->session['data'], $key); - } - - /** - * Remove all of the items from the session. - * - * The CSRF token will not be removed from the session. - * - * @return void - */ - public function flush() - { - $token = $this->token(); - - $session = array(Session::csrf_token => $token, ':new:' => array(), ':old:' => array()); - - $this->session['data'] = $session; - } - - /** - * Assign a new, random ID to the session. - * - * @return void - */ - public function regenerate() - { - $this->session['id'] = $this->driver->id(); - - $this->exists = false; - } - - /** - * Get the CSRF token that is stored in the session data. - * - * @return string - */ - public function token() - { - return $this->get(Session::csrf_token); - } - - /** - * Get the last activity for the session. - * - * @return int - */ - public function activity() - { - return $this->session['last_activity']; - } - - /** - * Store the session payload in storage. - * - * This method will be called automatically at the end of the request. - * - * @return void - */ - public function save() - { - $this->session['last_activity'] = time(); - - // Session flash data is only available during the request in which it - // was flashed and the following request. We will age the data so that - // it expires at the end of the user's next request. - $this->age(); - - $config = Config::get('session'); - - // The responsibility of actually storing the session information in - // persistent storage is delegated to the driver instance being used - // by the session payload. - // - // This allows us to keep the payload very generic, while moving the - // platform or storage mechanism code into the specialized drivers, - // keeping our code very dry and organized. - $this->driver->save($this->session, $config, $this->exists); - - // Next we'll write out the session cookie. This cookie contains the - // ID of the session, and will be used to determine the owner of the - // session on the user's subsequent requests to the application. - $this->cookie($config); - - // Some session drivers implement the Sweeper interface meaning that - // they must clean up expired sessions manually. Here we'll calculate - // if we need to run garbage collection. - $sweepage = $config['sweepage']; - - if (mt_rand(1, $sweepage[1]) <= $sweepage[0]) - { - $this->sweep(); - } - } - - /** - * Clean up expired sessions. - * - * If the session driver is a sweeper, it must clean up expired sessions - * from time to time. This method triggers garbage collection. - * - * @return void - */ - public function sweep() - { - if ($this->driver instanceof Sweeper) - { - $this->driver->sweep(time() - (Config::get('session.lifetime') * 60)); - } - } - - /** - * Age the session flash data. - * - * @return void - */ - protected function age() - { - $this->session['data'][':old:'] = $this->session['data'][':new:']; - - $this->session['data'][':new:'] = array(); - } - - /** - * Send the session ID cookie to the browser. - * - * @param array $config - * @return void - */ - protected function cookie($config) - { - extract($config, EXTR_SKIP); - - $minutes = ( ! $expire_on_close) ? $lifetime : 0; - - Cookie::put($cookie, $this->session['id'], $minutes, $path, $domain, $secure); - } - -} \ No newline at end of file diff --git a/laravel/str.php b/laravel/str.php deleted file mode 100644 index b359cb17..00000000 --- a/laravel/str.php +++ /dev/null @@ -1,380 +0,0 @@ - - * // Get the length of a string - * $length = Str::length('Taylor Otwell'); - * - * // Get the length of a multi-byte string - * $length = Str::length('Τάχιστη') - * - * - * @param string $value - * @return int - */ - public static function length($value) - { - return (MB_STRING) ? mb_strlen($value, static::encoding()) : strlen($value); - } - - /** - * Convert a string to lowercase. - * - * - * // Convert a string to lowercase - * $lower = Str::lower('Taylor Otwell'); - * - * // Convert a multi-byte string to lowercase - * $lower = Str::lower('Τάχιστη'); - * - * - * @param string $value - * @return string - */ - public static function lower($value) - { - return (MB_STRING) ? mb_strtolower($value, static::encoding()) : strtolower($value); - } - - /** - * Convert a string to uppercase. - * - * - * // Convert a string to uppercase - * $upper = Str::upper('Taylor Otwell'); - * - * // Convert a multi-byte string to uppercase - * $upper = Str::upper('Τάχιστη'); - * - * - * @param string $value - * @return string - */ - public static function upper($value) - { - return (MB_STRING) ? mb_strtoupper($value, static::encoding()) : strtoupper($value); - } - - /** - * Convert a string to title case (ucwords equivalent). - * - * - * // Convert a string to title case - * $title = Str::title('taylor otwell'); - * - * // Convert a multi-byte string to title case - * $title = Str::title('νωθρού κυνός'); - * - * - * @param string $value - * @return string - */ - public static function title($value) - { - if (MB_STRING) - { - return mb_convert_case($value, MB_CASE_TITLE, static::encoding()); - } - - return ucwords(strtolower($value)); - } - - /** - * Limit the number of characters in a string. - * - * - * // Returns "Tay..." - * echo Str::limit('Taylor Otwell', 3); - * - * // Limit the number of characters and append a custom ending - * echo Str::limit('Taylor Otwell', 3, '---'); - * - * - * @param string $value - * @param int $limit - * @param string $end - * @return string - */ - public static function limit($value, $limit = 100, $end = '...') - { - if (static::length($value) <= $limit) return $value; - - if (MB_STRING) - { - return mb_substr($value, 0, $limit, static::encoding()).$end; - } - - return substr($value, 0, $limit).$end; - } - - /** - * Limit the number of chracters in a string including custom ending - * - * - * // Returns "Taylor..." - * echo Str::limit_exact('Taylor Otwell', 9); - * - * // Limit the number of characters and append a custom ending - * echo Str::limit_exact('Taylor Otwell', 9, '---'); - * - * - * @param string $value - * @param int $limit - * @param string $end - * @return string - */ - public static function limit_exact($value, $limit = 100, $end = '...') - { - if (static::length($value) <= $limit) return $value; - - $limit -= static::length($end); - - return static::limit($value, $limit, $end); - } - - /** - * Limit the number of words in a string. - * - * - * // Returns "This is a..." - * echo Str::words('This is a sentence.', 3); - * - * // Limit the number of words and append a custom ending - * echo Str::words('This is a sentence.', 3, '---'); - * - * - * @param string $value - * @param int $words - * @param string $end - * @return string - */ - public static function words($value, $words = 100, $end = '...') - { - if (trim($value) == '') return ''; - - preg_match('/^\s*+(?:\S++\s*+){1,'.$words.'}/u', $value, $matches); - - if (static::length($value) == static::length($matches[0])) - { - $end = ''; - } - - return rtrim($matches[0]).$end; - } - - /** - * Get the singular form of the given word. - * - * @param string $value - * @return string - */ - public static function singular($value) - { - return static::pluralizer()->singular($value); - } - - /** - * Get the plural form of the given word. - * - * - * // Returns the plural form of "child" - * $plural = Str::plural('child', 10); - * - * // Returns the singular form of "octocat" since count is one - * $plural = Str::plural('octocat', 1); - * - * - * @param string $value - * @param int $count - * @return string - */ - public static function plural($value, $count = 2) - { - return static::pluralizer()->plural($value, $count); - } - - /** - * Get the pluralizer instance. - * - * @return Pluralizer - */ - protected static function pluralizer() - { - $config = Config::get('strings'); - - return static::$pluralizer ?: static::$pluralizer = new Pluralizer($config); - } - - /** - * Generate a URL friendly "slug" from a given string. - * - * - * // Returns "this-is-my-blog-post" - * $slug = Str::slug('This is my blog post!'); - * - * // Returns "this_is_my_blog_post" - * $slug = Str::slug('This is my blog post!', '_'); - * - * - * @param string $title - * @param string $separator - * @return string - */ - public static function slug($title, $separator = '-') - { - $title = static::ascii($title); - - // Remove all characters that are not the separator, letters, numbers, or whitespace. - $title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', static::lower($title)); - - // Replace all separator characters and whitespace by a single separator - $title = preg_replace('!['.preg_quote($separator).'\s]+!u', $separator, $title); - - return trim($title, $separator); - } - - /** - * Convert a string to 7-bit ASCII. - * - * This is helpful for converting UTF-8 strings for usage in URLs, etc. - * - * @param string $value - * @return string - */ - public static function ascii($value) - { - $foreign = Config::get('strings.ascii'); - - $value = preg_replace(array_keys($foreign), array_values($foreign), $value); - - return preg_replace('/[^\x09\x0A\x0D\x20-\x7E]/', '', $value); - } - - /** - * Convert a string to an underscored, camel-cased class name. - * - * This method is primarily used to format task and controller names. - * - * - * // Returns "Task_Name" - * $class = Str::classify('task_name'); - * - * // Returns "Taylor_Otwell" - * $class = Str::classify('taylor otwell') - * - * - * @param string $value - * @return string - */ - public static function classify($value) - { - $search = array('_', '-', '.', '/'); - - return str_replace(' ', '_', static::title(str_replace($search, ' ', $value))); - } - - /** - * Return the "URI" style segments in a given string. - * - * @param string $value - * @return array - */ - public static function segments($value) - { - return array_diff(explode('/', trim($value, '/')), array('')); - } - - /** - * Generate a random alpha or alpha-numeric string. - * - * - * // Generate a 40 character random alpha-numeric string - * echo Str::random(40); - * - * // Generate a 16 character random alphabetic string - * echo Str::random(16, 'alpha'); - * - * - * @param int $length - * @param string $type - * @return string - */ - public static function random($length, $type = 'alnum') - { - return substr(str_shuffle(str_repeat(static::pool($type), 5)), 0, $length); - } - - /** - * Determine if a given string matches a given pattern. - * - * @param string $pattern - * @param string $value - * @return bool - */ - public static function is($pattern, $value) - { - // Asterisks are translated into zero-or-more regular expression wildcards - // to make it convenient to check if the URI starts with a given pattern - // such as "library/*". This is only done when not root. - if ($pattern !== '/') - { - $pattern = str_replace('*', '(.*)', $pattern).'\z'; - } - else - { - $pattern = '^/$'; - } - - return preg_match('#'.$pattern.'#', $value); - } - - /** - * Get the character pool for a given type of random string. - * - * @param string $type - * @return string - */ - protected static function pool($type) - { - switch ($type) - { - case 'alpha': - return 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - - case 'alnum': - return '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - - default: - throw new \Exception("Invalid random string type [$type]."); - } - } - -} \ No newline at end of file diff --git a/laravel/tests/application/bundles.php b/laravel/tests/application/bundles.php deleted file mode 100644 index 1013f0cf..00000000 --- a/laravel/tests/application/bundles.php +++ /dev/null @@ -1,36 +0,0 @@ - array( -| 'location' => 'admin', -| 'handles' => 'admin', -| ), -| -| Note that the "location" is relative to the "bundles" directory. -| Now the bundle will be recognized by Laravel and will be able -| to respond to requests beginning with "admin"! -| -| Have a bundle that lives in the root of the bundle directory -| and doesn't respond to any requests? Just add the bundle -| name to the array and we'll take care of the rest. -| -*/ - -return array('dashboard' => array('handles' => 'dashboard'), 'dummy'); \ No newline at end of file diff --git a/laravel/tests/application/config/application.php b/laravel/tests/application/config/application.php deleted file mode 100644 index 596baa24..00000000 --- a/laravel/tests/application/config/application.php +++ /dev/null @@ -1,158 +0,0 @@ - '', - - /* - |-------------------------------------------------------------------------- - | Application Index - |-------------------------------------------------------------------------- - | - | If you are including the "index.php" in your URLs, you can ignore this. - | - | However, if you are using mod_rewrite to get cleaner URLs, just set - | this option to an empty string and we'll take care of the rest. - | - */ - - 'index' => 'index.php', - - /* - |-------------------------------------------------------------------------- - | Application Key - |-------------------------------------------------------------------------- - | - | This key is used by the encryption and cookie classes to generate secure - | encrypted strings and hashes. It is extremely important that this key - | remain secret and should not be shared with anyone. Make it about 32 - | characters of random gibberish. - | - */ - - 'key' => '', - - /* - |-------------------------------------------------------------------------- - | Application Character Encoding - |-------------------------------------------------------------------------- - | - | The default character encoding used by your application. This encoding - | will be used by the Str, Text, Form, and any other classes that need - | to know what type of encoding to use for your awesome application. - | - */ - - 'encoding' => 'UTF-8', - - /* - |-------------------------------------------------------------------------- - | Application Language - |-------------------------------------------------------------------------- - | - | The default language of your application. This language will be used by - | Lang library as the default language when doing string localization. - | - */ - - 'language' => 'en', - - /* - |-------------------------------------------------------------------------- - | SSL Link Generation - |-------------------------------------------------------------------------- - | - | Many sites use SSL to protect their users data. However, you may not - | always be able to use SSL on your development machine, meaning all HTTPS - | will be broken during development. - | - | For this reason, you may wish to disable the generation of HTTPS links - | throughout your application. This option does just that. All attempts to - | generate HTTPS links will generate regular HTTP links instead. - | - */ - - 'ssl' => true, - - /* - |-------------------------------------------------------------------------- - | Application Timezone - |-------------------------------------------------------------------------- - | - | The default timezone of your application. This timezone will be used when - | Laravel needs a date, such as when writing to a log file or travelling - | to a distant star at warp speed. - | - */ - - 'timezone' => 'UTC', - - /* - |-------------------------------------------------------------------------- - | Class Aliases - |-------------------------------------------------------------------------- - | - | Here, you can specify any class aliases that you would like registered - | when Laravel loads. Aliases are lazy-loaded, so add as many as you want. - | - | Aliases make it more convenient to use namespaced classes. Instead of - | referring to the class using its full namespace, you may simply use - | the alias defined here. - | - | We have already aliased common Laravel classes to make your life easier. - | - */ - - 'aliases' => array( - 'Auth' => 'Laravel\\Auth', - 'Asset' => 'Laravel\\Asset', - 'Autoloader' => 'Laravel\\Autoloader', - 'Blade' => 'Laravel\\Blade', - 'Bundle' => 'Laravel\\Bundle', - 'Cache' => 'Laravel\\Cache', - 'Config' => 'Laravel\\Config', - 'Controller' => 'Laravel\\Routing\\Controller', - 'Cookie' => 'Laravel\\Cookie', - 'Crypter' => 'Laravel\\Crypter', - 'DB' => 'Laravel\\Database', - 'Event' => 'Laravel\\Event', - 'File' => 'Laravel\\File', - 'Filter' => 'Laravel\\Routing\\Filter', - 'Form' => 'Laravel\\Form', - 'Hash' => 'Laravel\\Hash', - 'HTML' => 'Laravel\\HTML', - 'Input' => 'Laravel\\Input', - 'IoC' => 'Laravel\\IoC', - 'Lang' => 'Laravel\\Lang', - 'Log' => 'Laravel\\Log', - 'Memcached' => 'Laravel\\Memcached', - 'Paginator' => 'Laravel\\Paginator', - 'URL' => 'Laravel\\URL', - 'Redirect' => 'Laravel\\Redirect', - 'Redis' => 'Laravel\\Redis', - 'Request' => 'Laravel\\Request', - 'Response' => 'Laravel\\Response', - 'Route' => 'Laravel\\Routing\\Route', - 'Router' => 'Laravel\\Routing\\Router', - 'Schema' => 'Laravel\\Database\\Schema', - 'Section' => 'Laravel\\Section', - 'Session' => 'Laravel\\Session', - 'Str' => 'Laravel\\Str', - 'Task' => 'Laravel\\CLI\\Tasks\\Task', - 'URI' => 'Laravel\\URI', - 'Validator' => 'Laravel\\Validator', - 'View' => 'Laravel\\View', - ), - -); diff --git a/laravel/tests/application/config/auth.php b/laravel/tests/application/config/auth.php deleted file mode 100644 index d715f063..00000000 --- a/laravel/tests/application/config/auth.php +++ /dev/null @@ -1,73 +0,0 @@ - 'fluent', - - /* - |-------------------------------------------------------------------------- - | Authentication Username - |-------------------------------------------------------------------------- - | - | Here you may specify the database column that should be considered the - | "username" for your users. Typically, this will either be "username" - | or "email". Of course, you're free to change the value to anything. - | - */ - - 'username' => 'username', - - /* - |-------------------------------------------------------------------------- - | Authentication Password - |-------------------------------------------------------------------------- - | - | Here you may specify the database column that should be considered the - | "password" for your users. Typically, this will be "password" but, - | again, you're free to change the value to anything you see fit. - | - */ - - 'password' => 'password', - - /* - |-------------------------------------------------------------------------- - | Authentication Model - |-------------------------------------------------------------------------- - | - | When using the "eloquent" authentication driver, you may specify the - | model that should be considered the "User" model. This model will - | be used to authenticate and load the users of your application. - | - */ - - 'model' => 'User', - - /* - |-------------------------------------------------------------------------- - | Authentication Table - |-------------------------------------------------------------------------- - | - | When using the "fluent" authentication driver, the database table used - | to load users may be specified here. This table will be used in by - | the fluent query builder to authenticate and load your users. - | - */ - - 'table' => 'users', - -); diff --git a/laravel/tests/application/config/cache.php b/laravel/tests/application/config/cache.php deleted file mode 100644 index 73fd4c9c..00000000 --- a/laravel/tests/application/config/cache.php +++ /dev/null @@ -1,71 +0,0 @@ - 'file', - - /* - |-------------------------------------------------------------------------- - | Cache Key - |-------------------------------------------------------------------------- - | - | This key will be prepended to item keys stored using Memcached and APC - | to prevent collisions with other applications on the server. Since the - | memory based stores could be shared by other applications, we need to - | be polite and use a prefix to uniquely identifier our items. - | - */ - - 'key' => 'laravel', - - /* - |-------------------------------------------------------------------------- - | Cache Database - |-------------------------------------------------------------------------- - | - | When using the database cache driver, this database table will be used - | to store the cached item. You may also add a "connection" option to - | the array to specify which database connection should be used. - | - */ - - 'database' => array('table' => 'laravel_cache'), - - /* - |-------------------------------------------------------------------------- - | Memcached Servers - |-------------------------------------------------------------------------- - | - | The Memcached servers used by your application. Memcached is a free and - | open source, high-performance, distributed memory caching system. It is - | generic in nature but intended for use in speeding up web applications - | by alleviating database load. - | - | For more information, check out: http://memcached.org - | - */ - - 'memcached' => array( - - array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100), - - ), - -); \ No newline at end of file diff --git a/laravel/tests/application/config/database.php b/laravel/tests/application/config/database.php deleted file mode 100644 index b7b9fd96..00000000 --- a/laravel/tests/application/config/database.php +++ /dev/null @@ -1,108 +0,0 @@ - 'sqlite', - - /* - |-------------------------------------------------------------------------- - | PDO Fetch Style - |-------------------------------------------------------------------------- - | - | By default, database results will be returned as instances of the PHP - | stdClass object; however, you may wish to retrieve records as arrays - | instead of objects. Here you can control the PDO fetch style of the - | database queries run by your application. - | - */ - - 'fetch' => PDO::FETCH_CLASS, - - /* - |-------------------------------------------------------------------------- - | Database Connections - |-------------------------------------------------------------------------- - | - | All of the database connections used by your application. Many of your - | applications will no doubt only use one connection; however, you have - | the freedom to specify as many connections as you can handle. - | - | All database work in Laravel is done through the PHP's PDO facilities, - | so make sure you have the PDO drivers for your particlar database of - | choice installed on your machine. - | - | Drivers: 'mysql', 'pgsql', 'sqlsrv', 'sqlite'. - | - */ - - 'connections' => array( - - 'sqlite' => array( - 'driver' => 'sqlite', - 'database' => 'application', - 'prefix' => '', - ), - - 'mysql' => array( - 'driver' => 'mysql', - 'host' => 'localhost', - 'database' => 'database', - 'username' => 'root', - 'password' => 'password', - 'charset' => 'utf8', - 'prefix' => '', - ), - - 'pgsql' => array( - 'driver' => 'pgsql', - 'host' => 'localhost', - 'database' => 'database', - 'username' => 'root', - 'password' => 'password', - 'charset' => 'utf8', - 'prefix' => '', - ), - - 'sqlsrv' => array( - 'driver' => 'sqlsrv', - 'host' => 'localhost', - 'database' => 'database', - 'username' => 'root', - 'password' => 'password', - 'prefix' => '', - ), - - ), - - /* - |-------------------------------------------------------------------------- - | Redis Databases - |-------------------------------------------------------------------------- - | - | Redis is an open source, fast, and advanced key-value store. However, it - | provides a richer set of commands than a typical key-value store such as - | APC or memcached. All the cool kids are using it. - | - | To get the scoop on Redis, check out: http://redis.io - | - */ - - 'redis' => array( - - 'default' => array('host' => '127.0.0.1', 'port' => 6379), - - ), - -); \ No newline at end of file diff --git a/laravel/tests/application/config/error.php b/laravel/tests/application/config/error.php deleted file mode 100644 index 87db9665..00000000 --- a/laravel/tests/application/config/error.php +++ /dev/null @@ -1,69 +0,0 @@ - array(E_NOTICE, E_USER_NOTICE, E_DEPRECATED, E_USER_DEPRECATED), - - /* - |-------------------------------------------------------------------------- - | Error Detail - |-------------------------------------------------------------------------- - | - | Detailed error messages contain information about the file in which an - | error occurs, as well as a PHP stack trace containing the call stack. - | You'll want them when you're trying to debug your application. - | - | If your application is in production, you'll want to turn off the error - | details for enhanced security and user experience since the exception - | stack trace could contain sensitive information. - | - */ - - 'detail' => true, - - /* - |-------------------------------------------------------------------------- - | Error Logging - |-------------------------------------------------------------------------- - | - | When error logging is enabled, the "logger" Closure defined below will - | be called for every error in your application. You are free to log the - | errors however you want. Enjoy the flexibility. - | - */ - - 'log' => false, - - /* - |-------------------------------------------------------------------------- - | Error Logger - |-------------------------------------------------------------------------- - | - | Because of the various ways of managing error logging, you get complete - | flexibility to manage error logging as you see fit. This function will - | be called anytime an error occurs within your application and error - | logging is enabled. - | - | You may log the error message however you like; however, a simple log - | solution has been setup for you which will log all error messages to - | text files within the application storage directory. - | - */ - - 'logger' => function($exception) - { - Log::exception($exception); - }, - -); \ No newline at end of file diff --git a/laravel/tests/application/config/local/database.php b/laravel/tests/application/config/local/database.php deleted file mode 100644 index bd94d7ba..00000000 --- a/laravel/tests/application/config/local/database.php +++ /dev/null @@ -1,7 +0,0 @@ - 'sqlite', - -); \ No newline at end of file diff --git a/laravel/tests/application/config/mimes.php b/laravel/tests/application/config/mimes.php deleted file mode 100644 index e2bd4fbb..00000000 --- a/laravel/tests/application/config/mimes.php +++ /dev/null @@ -1,97 +0,0 @@ - 'application/mac-binhex40', - 'cpt' => 'application/mac-compactpro', - 'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream'), - 'bin' => 'application/macbinary', - 'dms' => 'application/octet-stream', - 'lha' => 'application/octet-stream', - 'lzh' => 'application/octet-stream', - 'exe' => array('application/octet-stream', 'application/x-msdownload'), - 'class' => 'application/octet-stream', - 'psd' => 'application/x-photoshop', - 'so' => 'application/octet-stream', - 'sea' => 'application/octet-stream', - 'dll' => 'application/octet-stream', - 'oda' => 'application/oda', - 'pdf' => array('application/pdf', 'application/x-download'), - 'ai' => 'application/postscript', - 'eps' => 'application/postscript', - 'ps' => 'application/postscript', - 'smi' => 'application/smil', - 'smil' => 'application/smil', - 'mif' => 'application/vnd.mif', - 'xls' => array('application/excel', 'application/vnd.ms-excel', 'application/msexcel'), - 'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint'), - 'wbxml' => 'application/wbxml', - 'wmlc' => 'application/wmlc', - 'dcr' => 'application/x-director', - 'dir' => 'application/x-director', - 'dxr' => 'application/x-director', - 'dvi' => 'application/x-dvi', - 'gtar' => 'application/x-gtar', - 'gz' => 'application/x-gzip', - 'php' => array('application/x-httpd-php', 'text/x-php'), - 'php4' => 'application/x-httpd-php', - 'php3' => 'application/x-httpd-php', - 'phtml' => 'application/x-httpd-php', - 'phps' => 'application/x-httpd-php-source', - 'js' => 'application/x-javascript', - 'swf' => 'application/x-shockwave-flash', - 'sit' => 'application/x-stuffit', - 'tar' => 'application/x-tar', - 'tgz' => array('application/x-tar', 'application/x-gzip-compressed'), - 'xhtml' => 'application/xhtml+xml', - 'xht' => 'application/xhtml+xml', - 'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed'), - 'mid' => 'audio/midi', - 'midi' => 'audio/midi', - 'mpga' => 'audio/mpeg', - 'mp2' => 'audio/mpeg', - 'mp3' => array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'), - 'aif' => 'audio/x-aiff', - 'aiff' => 'audio/x-aiff', - 'aifc' => 'audio/x-aiff', - 'ram' => 'audio/x-pn-realaudio', - 'rm' => 'audio/x-pn-realaudio', - 'rpm' => 'audio/x-pn-realaudio-plugin', - 'ra' => 'audio/x-realaudio', - 'rv' => 'video/vnd.rn-realvideo', - 'wav' => 'audio/x-wav', - 'bmp' => 'image/bmp', - 'gif' => 'image/gif', - 'jpeg' => array('image/jpeg', 'image/pjpeg'), - 'jpg' => array('image/jpeg', 'image/pjpeg'), - 'jpe' => array('image/jpeg', 'image/pjpeg'), - 'png' => 'image/png', - 'tiff' => 'image/tiff', - 'tif' => 'image/tiff', - 'css' => 'text/css', - 'html' => 'text/html', - 'htm' => 'text/html', - 'shtml' => 'text/html', - 'txt' => 'text/plain', - 'text' => 'text/plain', - 'log' => array('text/plain', 'text/x-log'), - 'rtx' => 'text/richtext', - 'rtf' => 'text/rtf', - 'xml' => 'text/xml', - 'xsl' => 'text/xml', - 'mpeg' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mpe' => 'video/mpeg', - 'qt' => 'video/quicktime', - 'mov' => 'video/quicktime', - 'avi' => 'video/x-msvideo', - 'movie' => 'video/x-sgi-movie', - 'doc' => 'application/msword', - 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'word' => array('application/msword', 'application/octet-stream'), - 'xl' => 'application/excel', - 'eml' => 'message/rfc822', - 'json' => array('application/json', 'text/json'), - -); \ No newline at end of file diff --git a/laravel/tests/application/config/session.php b/laravel/tests/application/config/session.php deleted file mode 100644 index 3b6e6a69..00000000 --- a/laravel/tests/application/config/session.php +++ /dev/null @@ -1,117 +0,0 @@ - '', - - /* - |-------------------------------------------------------------------------- - | Session Database - |-------------------------------------------------------------------------- - | - | The database table on which the session should be stored. It probably - | goes without saying that this option only matters if you are using - | the super slick database session driver. - | - */ - - 'table' => 'sessions', - - /* - |-------------------------------------------------------------------------- - | Session Garbage Collection Probability - |-------------------------------------------------------------------------- - | - | Some session drivers require the manual clean-up of expired sessions. - | This option specifies the probability of session garbage collection - | occuring for any given request. - | - | For example, the default value states that garbage collection has a - | 2% chance of occuring for any given request to the application. - | Feel free to tune this to your application's size and speed. - | - */ - - 'sweepage' => array(2, 100), - - /* - |-------------------------------------------------------------------------- - | Session Lifetime - |-------------------------------------------------------------------------- - | - | The number of minutes a session can be idle before expiring. - | - */ - - 'lifetime' => 60, - - /* - |-------------------------------------------------------------------------- - | Session Expiration On Close - |-------------------------------------------------------------------------- - | - | Determines if the session should expire when the user's web browser closes. - | - */ - - 'expire_on_close' => false, - - /* - |-------------------------------------------------------------------------- - | Session Cookie Name - |-------------------------------------------------------------------------- - | - | The name that should be given to the session cookie. - | - */ - - 'cookie' => 'laravel_session', - - /* - |-------------------------------------------------------------------------- - | Session Cookie Path - |-------------------------------------------------------------------------- - | - | The path for which the session cookie is available. - | - */ - - 'path' => '/', - - /* - |-------------------------------------------------------------------------- - | Session Cookie Domain - |-------------------------------------------------------------------------- - | - | The domain for which the session cookie is available. - | - */ - - 'domain' => null, - - /* - |-------------------------------------------------------------------------- - | HTTPS Only Session Cookie - |-------------------------------------------------------------------------- - | - | Determines if the cookie should only be sent over HTTPS. - | - */ - - 'secure' => false, - -); \ No newline at end of file diff --git a/laravel/tests/application/config/strings.php b/laravel/tests/application/config/strings.php deleted file mode 100644 index bbbe230c..00000000 --- a/laravel/tests/application/config/strings.php +++ /dev/null @@ -1,190 +0,0 @@ - array( - '/(quiz)$/i' => "$1zes", - '/^(ox)$/i' => "$1en", - '/([m|l])ouse$/i' => "$1ice", - '/(matr|vert|ind)ix|ex$/i' => "$1ices", - '/(x|ch|ss|sh)$/i' => "$1es", - '/([^aeiouy]|qu)y$/i' => "$1ies", - '/(hive)$/i' => "$1s", - '/(?:([^f])fe|([lr])f)$/i' => "$1$2ves", - '/(shea|lea|loa|thie)f$/i' => "$1ves", - '/sis$/i' => "ses", - '/([ti])um$/i' => "$1a", - '/(tomat|potat|ech|her|vet)o$/i' => "$1oes", - '/(bu)s$/i' => "$1ses", - '/(alias)$/i' => "$1es", - '/(octop)us$/i' => "$1i", - '/(ax|test)is$/i' => "$1es", - '/(us)$/i' => "$1es", - '/s$/i' => "s", - '/$/' => "s" - ), - - 'singular' => array( - '/(quiz)zes$/i' => "$1", - '/(matr)ices$/i' => "$1ix", - '/(vert|ind)ices$/i' => "$1ex", - '/^(ox)en$/i' => "$1", - '/(alias)es$/i' => "$1", - '/(octop|vir)i$/i' => "$1us", - '/(cris|ax|test)es$/i' => "$1is", - '/(shoe)s$/i' => "$1", - '/(o)es$/i' => "$1", - '/(bus)es$/i' => "$1", - '/([m|l])ice$/i' => "$1ouse", - '/(x|ch|ss|sh)es$/i' => "$1", - '/(m)ovies$/i' => "$1ovie", - '/(s)eries$/i' => "$1eries", - '/([^aeiouy]|qu)ies$/i' => "$1y", - '/([lr])ves$/i' => "$1f", - '/(tive)s$/i' => "$1", - '/(hive)s$/i' => "$1", - '/(li|wi|kni)ves$/i' => "$1fe", - '/(shea|loa|lea|thie)ves$/i' => "$1f", - '/(^analy)ses$/i' => "$1sis", - '/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i' => "$1$2sis", - '/([ti])a$/i' => "$1um", - '/(n)ews$/i' => "$1ews", - '/(h|bl)ouses$/i' => "$1ouse", - '/(corpse)s$/i' => "$1", - '/(us)es$/i' => "$1", - '/(us|ss)$/i' => "$1", - '/s$/i' => "", - ), - - 'irregular' => array( - 'child' => 'children', - 'foot' => 'feet', - 'goose' => 'geese', - 'man' => 'men', - 'move' => 'moves', - 'person' => 'people', - 'sex' => 'sexes', - 'tooth' => 'teeth', - ), - - 'uncountable' => array( - 'audio', - 'equipment', - 'deer', - 'fish', - 'gold', - 'information', - 'money', - 'rice', - 'police', - 'series', - 'sheep', - 'species', - 'moose', - 'chassis', - 'traffic', - ), - - /* - |-------------------------------------------------------------------------- - | ASCII Characters - |-------------------------------------------------------------------------- - | - | This array contains foreign characters and their 7-bit ASCII equivalents. - | The array is used by the "ascii" method on the Str class to get strings - | ready for inclusion in a URL slug. - | - | Of course, the "ascii" method may also be used by you for whatever your - | application requires. Feel free to add any characters we missed, and be - | sure to let us know about them! - | - */ - - 'ascii' => array( - - '/æ|ǽ/' => 'ae', - '/œ/' => 'oe', - '/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|А/' => 'A', - '/à|á|â|ã|ä|å|ǻ|ā|ă|ą|ǎ|ª|а/' => 'a', - '/Б/' => 'B', - '/б/' => 'b', - '/Ç|Ć|Ĉ|Ċ|Č|Ц/' => 'C', - '/ç|ć|ĉ|ċ|č|ц/' => 'c', - '/Ð|Ď|Đ|Д/' => 'Dj', - '/ð|ď|đ|д/' => 'dj', - '/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Е|Ё|Э/' => 'E', - '/è|é|ê|ë|ē|ĕ|ė|ę|ě|е|ё|э/' => 'e', - '/Ф/' => 'F', - '/ƒ|ф/' => 'f', - '/Ĝ|Ğ|Ġ|Ģ|Г/' => 'G', - '/ĝ|ğ|ġ|ģ|г/' => 'g', - '/Ĥ|Ħ|Х/' => 'H', - '/ĥ|ħ|х/' => 'h', - '/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|И/' => 'I', - '/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|и/' => 'i', - '/Ĵ|Й/' => 'J', - '/ĵ|й/' => 'j', - '/Ķ|К/' => 'K', - '/ķ|к/' => 'k', - '/Ĺ|Ļ|Ľ|Ŀ|Ł|Л/' => 'L', - '/ĺ|ļ|ľ|ŀ|ł|л/' => 'l', - '/М/' => 'M', - '/м/' => 'm', - '/Ñ|Ń|Ņ|Ň|Н/' => 'N', - '/ñ|ń|ņ|ň|ʼn|н/' => 'n', - '/Ö|Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|О/' => 'O', - '/ö|ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|о/' => 'o', - '/П/' => 'P', - '/п/' => 'p', - '/Ŕ|Ŗ|Ř|Р/' => 'R', - '/ŕ|ŗ|ř|р/' => 'r', - '/Ś|Ŝ|Ş|Ș|Š|С/' => 'S', - '/ś|ŝ|ş|ș|š|ſ|с/' => 's', - '/Ţ|Ț|Ť|Ŧ|Т/' => 'T', - '/ţ|ț|ť|ŧ|т/' => 't', - '/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ü|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|У/' => 'U', - '/ù|ú|û|ũ|ū|ŭ|ů|ü|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|у/' => 'u', - '/В/' => 'V', - '/в/' => 'v', - '/Ý|Ÿ|Ŷ|Ы/' => 'Y', - '/ý|ÿ|ŷ|ы/' => 'y', - '/Ŵ/' => 'W', - '/ŵ/' => 'w', - '/Ź|Ż|Ž|З/' => 'Z', - '/ź|ż|ž|з/' => 'z', - '/Æ|Ǽ/' => 'AE', - '/ß/'=> 'ss', - '/IJ/' => 'IJ', - '/ij/' => 'ij', - '/Œ/' => 'OE', - '/Ч/' => 'Ch', - '/ч/' => 'ch', - '/Ю/' => 'Ju', - '/ю/' => 'ju', - '/Я/' => 'Ja', - '/я/' => 'ja', - '/Ш/' => 'Sh', - '/ш/' => 'sh', - '/Щ/' => 'Shch', - '/щ/' => 'shch', - '/Ж/' => 'Zh', - '/ж/' => 'zh', - - ), - -); diff --git a/laravel/tests/application/controllers/admin/panel.php b/laravel/tests/application/controllers/admin/panel.php deleted file mode 100644 index da3b49d7..00000000 --- a/laravel/tests/application/controllers/admin/panel.php +++ /dev/null @@ -1,10 +0,0 @@ -filter('before', 'test-all-before'); - $this->filter('after', 'test-all-after'); - $this->filter('before', 'test-profile-before')->only(array('profile')); - $this->filter('before', 'test-except')->except(array('index', 'profile')); - $this->filter('before', 'test-on-post')->on(array('post')); - $this->filter('before', 'test-on-get-put')->on(array('get', 'put')); - $this->filter('before', 'test-before-filter')->only('login'); - $this->filter('after', 'test-before-filter')->only('logout'); - $this->filter('before', 'test-param:1,2')->only('edit'); - $this->filter('before', 'test-multi-1|test-multi-2')->only('save'); - } - - public function action_index() - { - return __FUNCTION__; - } - - public function action_profile() - { - return __FUNCTION__; - } - - public function action_show() - { - return __FUNCTION__; - } - - public function action_edit() - { - return __FUNCTION__; - } - - public function action_save() - { - return __FUNCTION__; - } - - public function action_login() - { - return __FUNCTION__; - } - - public function action_logout() - { - return __FUNCTION__; - } - -} \ No newline at end of file diff --git a/laravel/tests/application/controllers/home.php b/laravel/tests/application/controllers/home.php deleted file mode 100644 index 3f442005..00000000 --- a/laravel/tests/application/controllers/home.php +++ /dev/null @@ -1,42 +0,0 @@ - "The :attribute must be accepted.", - "active_url" => "The :attribute is not a valid URL.", - "alpha" => "The :attribute may only contain letters.", - "alpha_dash" => "The :attribute may only contain letters, numbers, and dashes.", - "alpha_num" => "The :attribute may only contain letters and numbers.", - "between" => array( - "numeric" => "The :attribute must be between :min - :max.", - "file" => "The :attribute must be between :min - :max kilobytes.", - "string" => "The :attribute must be between :min - :max characters.", - ), - "confirmed" => "The :attribute confirmation does not match.", - "different" => "The :attribute and :other must be different.", - "email" => "The :attribute format is invalid.", - "exists" => "The selected :attribute is invalid.", - "image" => "The :attribute must be an image.", - "in" => "The selected :attribute is invalid.", - "integer" => "The :attribute must be an integer.", - "ip" => "The :attribute must be a valid IP address.", - "max" => array( - "numeric" => "The :attribute must be less than :max.", - "file" => "The :attribute must be less than :max kilobytes.", - "string" => "The :attribute must be less than :max characters.", - ), - "mimes" => "The :attribute must be a file of type: :values.", - "min" => array( - "numeric" => "The :attribute must be at least :min.", - "file" => "The :attribute must be at least :min kilobytes.", - "string" => "The :attribute must be at least :min characters.", - ), - "not_in" => "The selected :attribute is invalid.", - "numeric" => "The :attribute must be a number.", - "required" => "The :attribute field is required.", - "required_with" => "The :attribute field is required with :field", - "same" => "The :attribute and :other must match.", - "size" => array( - "numeric" => "The :attribute must be :size.", - "file" => "The :attribute must be :size kilobyte.", - "string" => "The :attribute must be :size characters.", - ), - "unique" => "The :attribute has already been taken.", - "url" => "The :attribute format is invalid.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute_rule" to name the lines. This helps keep your - | custom validation clean and tidy. - | - | So, say you want to use a custom validation message when validating that - | the "email" attribute is unique. Just add "email_unique" to this array - | with your custom message. The Validator will handle the rest! - | - */ - - 'custom' => array('custom_required' => 'This field is required!'), - - /* - |-------------------------------------------------------------------------- - | Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as "E-Mail Address" instead - | of "email". Your users will thank you. - | - | The Validator class will automatically search this array of lines it - | is attempting to replace the :attribute place-holder in messages. - | It's pretty slick. We think you'll like it. - | - */ - - 'attributes' => array('test_attribute' => 'attribute'), - -); diff --git a/laravel/tests/application/language/sp/validation.php b/laravel/tests/application/language/sp/validation.php deleted file mode 100644 index b9bcbe74..00000000 --- a/laravel/tests/application/language/sp/validation.php +++ /dev/null @@ -1,7 +0,0 @@ - 'El campo de atributo es necesario.', - -); \ No newline at end of file diff --git a/laravel/tests/application/models/.gitignore b/laravel/tests/application/models/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/laravel/tests/application/models/autoloader.php b/laravel/tests/application/models/autoloader.php deleted file mode 100644 index 0e9027dc..00000000 --- a/laravel/tests/application/models/autoloader.php +++ /dev/null @@ -1,3 +0,0 @@ -set_attribute('setter', 'setter: '.$setter); - } - - public function get_getter() - { - return 'getter: '.$this->get_attribute('getter'); - } - -} \ No newline at end of file diff --git a/laravel/tests/application/models/repositories/user.php b/laravel/tests/application/models/repositories/user.php deleted file mode 100644 index 093ec2b0..00000000 --- a/laravel/tests/application/models/repositories/user.php +++ /dev/null @@ -1,3 +0,0 @@ - 'home', function() -{ - return View::make('home.index'); -})); - -Route::controller(array( - 'auth', 'filter', 'home', 'restful', - 'template.basic', 'template.name', 'template.override', - 'admin.panel', -)); - -/* -|-------------------------------------------------------------------------- -| Route Filters -|-------------------------------------------------------------------------- -| -| Filters provide a convenient method for attaching functionality to your -| routes. The built-in "before" and "after" filters are called before and -| after every request to your application, and you may even create other -| filters that can be attached to individual routes. -| -| Let's walk through an example... -| -| First, define a filter: -| -| Filter::register('filter', function() -| { -| return 'Filtered!'; -| }); -| -| Next, attach the filter to a route: -| -| Router::register('GET /', array('before' => 'filter', function() -| { -| return 'Hello World!'; -| })); -| -*/ - -Filter::register('before', function() -{ - $_SERVER['before'] = true; -}); - -Filter::register('after', function() -{ - $_SERVER['after'] = true; -}); - -Filter::register('csrf', function() -{ - if (Request::forged()) return Response::error('500'); -}); - -Filter::register('auth', function() -{ - if (Auth::guest()) return Redirect::to('login'); -}); \ No newline at end of file diff --git a/laravel/tests/application/start.php b/laravel/tests/application/start.php deleted file mode 100644 index 085dd090..00000000 --- a/laravel/tests/application/start.php +++ /dev/null @@ -1,157 +0,0 @@ - path('app').'controllers/base.php', -)); - -/* -|-------------------------------------------------------------------------- -| Auto-Loader Directories -|-------------------------------------------------------------------------- -| -| The Laravel auto-loader can search directories for files using the PSR-0 -| naming convention. This convention basically organizes classes by using -| the class namespace to indicate the directory structure. -| -*/ - -Autoloader::directories(array( - path('app').'models', - path('app').'libraries', -)); - -/* -|-------------------------------------------------------------------------- -| Laravel View Loader -|-------------------------------------------------------------------------- -| -| The Laravel view loader is responsible for returning the full file path -| for the given bundle and view. Of course, a default implementation is -| provided to load views according to typical Laravel conventions but -| you may change this to customize how your views are organized. -| -*/ - -Event::listen(View::loader, function($bundle, $view) -{ - return View::file($bundle, $view, Bundle::path($bundle).'views'); -}); - -/* -|-------------------------------------------------------------------------- -| Laravel Language Loader -|-------------------------------------------------------------------------- -| -| The Laravel language loader is responsible for returning the array of -| language lines for a given bundle, language, and "file". A default -| implementation has been provided which uses the default language -| directories included with Laravel. -| -*/ - -Event::listen(Lang::loader, function($bundle, $language, $file) -{ - return Lang::file($bundle, $language, $file); -}); - -/* -|-------------------------------------------------------------------------- -| Enable The Blade View Engine -|-------------------------------------------------------------------------- -| -| The Blade view engine provides a clean, beautiful templating language -| for your application, including syntax for echoing data and all of -| the typical PHP control structures. We'll simply enable it here. -| -*/ - -Blade::sharpen(); - -/* -|-------------------------------------------------------------------------- -| Set The Default Timezone -|-------------------------------------------------------------------------- -| -| We need to set the default timezone for the application. This controls -| the timezone that will be used by any of the date methods and classes -| utilized by Laravel or your application. The timezone may be set in -| your application configuration file. -| -*/ - -date_default_timezone_set(Config::get('application.timezone')); - -/* -|-------------------------------------------------------------------------- -| Start / Load The User Session -|-------------------------------------------------------------------------- -| -| Sessions allow the web, which is stateless, to simulate state. In other -| words, sessions allow you to store information about the current user -| and state of your application. Here we'll just fire up the session -| if a session driver has been configured. -| -*/ - -if ( ! Request::cli() and Config::get('session.driver') !== '') -{ - Session::load(); -} \ No newline at end of file diff --git a/laravel/tests/application/tasks/.gitignore b/laravel/tests/application/tasks/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/laravel/tests/application/views/error/404.php b/laravel/tests/application/views/error/404.php deleted file mode 100644 index 9b9bf55b..00000000 --- a/laravel/tests/application/views/error/404.php +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - Error 404 - Not Found - - - - -
    - - -

    - -

    Server Error: 404 (Not Found)

    - -

    What does this mean?

    - -

    - We couldn't find the page you requested on our servers. We're really sorry - about that. It's our fault, not yours. We'll work hard to get this page - back online as soon as possible. -

    - -

    - Perhaps you would like to go to our ? -

    -
    - - \ No newline at end of file diff --git a/laravel/tests/application/views/error/500.php b/laravel/tests/application/views/error/500.php deleted file mode 100644 index 4dcd92ad..00000000 --- a/laravel/tests/application/views/error/500.php +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - Error 500 - Internal Server Error - - - - -
    - - -

    - -

    Server Error: 500 (Internal Server Error)

    - -

    What does this mean?

    - -

    - Something went wrong on our servers while we were processing your request. - We're really sorry about this, and will work hard to get this resolved as - soon as possible. -

    - -

    - Perhaps you would like to go to our ? -

    -
    - - \ No newline at end of file diff --git a/laravel/tests/application/views/home/index.php b/laravel/tests/application/views/home/index.php deleted file mode 100644 index 39497146..00000000 --- a/laravel/tests/application/views/home/index.php +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - Laravel - A Framework For Web Artisans - - - - -
    -

    Welcome To Laravel

    - -

    A Framework For Web Artisans

    - -

    - You have successfully installed the Laravel framework. Laravel is a simple framework - that helps web artisans create beautiful, creative applications using elegant, expressive - syntax. You'll love using it. -

    - -

    Learn the terrain.

    - -

    - You've landed yourself on our default home page. The route that - is generating this page lives at: -

    - -
    APP_PATH/routes.php
    - -

    And the view sitting before you can be found at:

    - -
    APP_PATH/views/home/index.php
    - -

    Create something beautiful.

    - -

    - Now that you're up and running, it's time to start creating! - Here are some links to help you get started: -

    - - - -
    - - \ No newline at end of file diff --git a/laravel/tests/application/views/tests/basic.php b/laravel/tests/application/views/tests/basic.php deleted file mode 100644 index c961dc2f..00000000 --- a/laravel/tests/application/views/tests/basic.php +++ /dev/null @@ -1 +0,0 @@ - is \ No newline at end of file diff --git a/laravel/tests/application/views/tests/nested.php b/laravel/tests/application/views/tests/nested.php deleted file mode 100644 index 9ce498e5..00000000 --- a/laravel/tests/application/views/tests/nested.php +++ /dev/null @@ -1 +0,0 @@ -Taylor \ No newline at end of file diff --git a/laravel/tests/bundles/.gitignore b/laravel/tests/bundles/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/laravel/tests/bundles/dashboard/config/meta.php b/laravel/tests/bundles/dashboard/config/meta.php deleted file mode 100644 index a82d1703..00000000 --- a/laravel/tests/bundles/dashboard/config/meta.php +++ /dev/null @@ -1,7 +0,0 @@ - 'dashboard', - -); \ No newline at end of file diff --git a/laravel/tests/bundles/dashboard/controllers/panel.php b/laravel/tests/bundles/dashboard/controllers/panel.php deleted file mode 100644 index b532296d..00000000 --- a/laravel/tests/bundles/dashboard/controllers/panel.php +++ /dev/null @@ -1,10 +0,0 @@ - 'dashboard', function() -{ - // -})); - -Route::controller('dashboard::panel'); \ No newline at end of file diff --git a/laravel/tests/bundles/dummy/routes.php b/laravel/tests/bundles/dummy/routes.php deleted file mode 100644 index 2117e2e0..00000000 --- a/laravel/tests/bundles/dummy/routes.php +++ /dev/null @@ -1,6 +0,0 @@ -assertTrue($container === Asset::container('foo')); - $this->assertInstanceOf('\\Laravel\\Asset_Container', $container); - } - - /** - * Test the Asset::container method for default container creation. - * - * @group laravel - */ - public function testDefaultContainerCreatedByDefault() - { - $this->assertEquals('default', Asset::container()->name); - } - - /** - * Test the Asset::__callStatic method. - * - * @group laravel - */ - public function testContainerMethodsCanBeDynamicallyCalled() - { - Asset::style('common', 'common.css'); - - $this->assertEquals('common.css', Asset::container()->assets['style']['common']['source']); - } - - /** - * Test the Asset_Container constructor. - * - * @group laravel - */ - public function testNameIsSetOnAssetContainerConstruction() - { - $container = $this->getContainer(); - - $this->assertEquals('foo', $container->name); - } - - /** - * Test the Asset_Container::add method. - * - * @group laravel - */ - public function testAddMethodProperlySniffsAssetType() - { - $container = $this->getContainer(); - - $container->add('jquery', 'jquery.js'); - $container->add('common', 'common.css'); - - $this->assertEquals('jquery.js', $container->assets['script']['jquery']['source']); - $this->assertEquals('common.css', $container->assets['style']['common']['source']); - } - - /** - * Test the Asset_Container::style method. - * - * @group laravel - */ - public function testStyleMethodProperlyRegistersAnAsset() - { - $container = $this->getContainer(); - - $container->style('common', 'common.css'); - - $this->assertEquals('common.css', $container->assets['style']['common']['source']); - } - - /** - * Test the Asset_Container::style method sets media attribute. - * - * @group laravel - */ - public function testStyleMethodProperlySetsMediaAttributeIfNotSet() - { - $container = $this->getContainer(); - - $container->style('common', 'common.css'); - - $this->assertEquals('all', $container->assets['style']['common']['attributes']['media']); - } - - /** - * Test the Asset_Container::style method sets media attribute. - * - * @group laravel - */ - public function testStyleMethodProperlyIgnoresMediaAttributeIfSet() - { - $container = $this->getContainer(); - - $container->style('common', 'common.css', array(), array('media' => 'print')); - - $this->assertEquals('print', $container->assets['style']['common']['attributes']['media']); - } - - /** - * Test the Asset_Container::script method. - * - * @group laravel - */ - public function testScriptMethodProperlyRegistersAnAsset() - { - $container = $this->getContainer(); - - $container->script('jquery', 'jquery.js'); - - $this->assertEquals('jquery.js', $container->assets['script']['jquery']['source']); - } - - /** - * Test the Asset_Container::add method properly sets dependencies. - * - * @group laravel - */ - public function testAddMethodProperlySetsDependencies() - { - $container = $this->getContainer(); - - $container->add('common', 'common.css', 'jquery'); - $container->add('jquery', 'jquery.js', array('jquery-ui')); - - $this->assertEquals(array('jquery'), $container->assets['style']['common']['dependencies']); - $this->assertEquals(array('jquery-ui'), $container->assets['script']['jquery']['dependencies']); - } - - /** - * Test the Asset_Container::add method properly sets attributes. - * - * @group laravel - */ - public function testAddMethodProperlySetsAttributes() - { - $container = $this->getContainer(); - - $container->add('common', 'common.css', array(), array('media' => 'print')); - $container->add('jquery', 'jquery.js', array(), array('defer')); - - $this->assertEquals(array('media' => 'print'), $container->assets['style']['common']['attributes']); - $this->assertEquals(array('defer'), $container->assets['script']['jquery']['attributes']); - } - - /** - * Test the Asset_Container::bundle method. - * - * @group laravel - */ - public function testBundleMethodCorrectlySetsTheAssetBundle() - { - $container = $this->getContainer(); - - $container->bundle('eloquent'); - - $this->assertEquals('eloquent', $container->bundle); - } - - /** - * Test the Asset_Container::path method. - * - * @group laravel - */ - public function testPathMethodReturnsCorrectPathForABundleAsset() - { - $container = $this->getContainer(); - - $container->bundle('eloquent'); - - $this->assertEquals('/bundles/eloquent/foo.jpg', $container->path('foo.jpg')); - } - - /** - * Test the Asset_Container::path method. - * - * @group laravel - */ - public function testPathMethodReturnsCorrectPathForAnApplicationAsset() - { - $container = $this->getContainer(); - - $this->assertEquals('/foo.jpg', $container->path('foo.jpg')); - } - - /** - * Test the Asset_Container::scripts method. - * - * @group laravel - */ - public function testScriptsCanBeRetrieved() - { - $container = $this->getContainer(); - - $container->script('dojo', 'dojo.js', array('jquery-ui')); - $container->script('jquery', 'jquery.js', array('jquery-ui', 'dojo')); - $container->script('jquery-ui', 'jquery-ui.js'); - - $scripts = $container->scripts(); - - $this->assertTrue(strpos($scripts, 'jquery.js') > 0); - $this->assertTrue(strpos($scripts, 'jquery.js') > strpos($scripts, 'jquery-ui.js')); - $this->assertTrue(strpos($scripts, 'dojo.js') > strpos($scripts, 'jquery-ui.js')); - } - - /** - * Test the Asset_Container::styles method. - * - * @group laravel - */ - public function testStylesCanBeRetrieved() - { - $container = $this->getContainer(); - - $container->style('dojo', 'dojo.css', array('jquery-ui'), array('media' => 'print')); - $container->style('jquery', 'jquery.css', array('jquery-ui', 'dojo')); - $container->style('jquery-ui', 'jquery-ui.css'); - - $styles = $container->styles(); - - $this->assertTrue(strpos($styles, 'jquery.css') > 0); - $this->assertTrue(strpos($styles, 'media="print"') > 0); - $this->assertTrue(strpos($styles, 'jquery.css') > strpos($styles, 'jquery-ui.css')); - $this->assertTrue(strpos($styles, 'dojo.css') > strpos($styles, 'jquery-ui.css')); - } - - /** - * Get an asset container instance. - * - * @param string $name - * @return Asset_Container - */ - private function getContainer($name = 'foo') - { - return new Laravel\Asset_Container($name); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/auth.test.php b/laravel/tests/cases/auth.test.php deleted file mode 100644 index cce20fc9..00000000 --- a/laravel/tests/cases/auth.test.php +++ /dev/null @@ -1,393 +0,0 @@ -user = null; - Session::$instance = null; - Config::set('database.default', 'sqlite'); - } - - /** - * Tear down the test environment. - */ - public function tearDown() - { - $_SERVER['auth.login.stub'] = null; - $_SERVER['test.user.login'] = null; - $_SERVER['test.user.logout'] = null; - - Cookie::$jar = array(); - Config::$items = array(); - Auth::driver()->user = null; - Session::$instance = null; - Config::set('database.default', 'mysql'); - } - - /** - * Set one of the $_SERVER variables. - * - * @param string $key - * @param string $value - */ - protected function setServerVar($key, $value) - { - $_SERVER[$key] = $value; - - $this->restartRequest(); - } - - /** - * Reinitialize the global request. - * - * @return void - */ - protected function restartRequest() - { - // FIXME: Ugly hack, but old contents from previous requests seem to - // trip up the Foundation class. - $_FILES = array(); - - Request::$foundation = RequestFoundation::createFromGlobals(); - } - - /** - * Test the Auth::user method. - * - * @group laravel - */ - public function testUserMethodReturnsCurrentUser() - { - Auth::driver()->user = 'Taylor'; - - $this->assertEquals('Taylor', Auth::user()); - } - - /** - * Test the Auth::check method. - * - * @group laravel - */ - public function testCheckMethodReturnsTrueWhenUserIsSet() - { - $auth = new AuthUserReturnsDummy; - - $this->assertTrue($auth->check()); - } - - /** - * Test the Auth::check method. - * - * @group laravel - */ - public function testCheckMethodReturnsFalseWhenNoUserIsSet() - { - $auth = new AuthUserReturnsNull; - - $this->assertFalse($auth->check()); - } - - /** - * Test the Auth::guest method. - * - * @group laravel - */ - public function testGuestReturnsTrueWhenNoUserIsSet() - { - $auth = new AuthUserReturnsNull; - - $this->assertTrue($auth->guest()); - } - - /** - * Test the Auth::guest method. - * - * @group laravel - */ - public function testGuestReturnsFalseWhenUserIsSet() - { - $auth = new AuthUserReturnsDummy; - - $this->assertFalse($auth->guest()); - } - - /** - * Test the Auth::user method. - * - * @group laravel - */ - public function testUserMethodReturnsNullWhenNoUserExistsAndNoRecallerExists() - { - Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); - - $this->assertNull(Auth::user()); - } - - /** - * Test the Auth::user method. - * - * @group laravel - */ - public function testUserReturnsUserByID() - { - Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); - - Auth::login(1); - - $this->assertEquals('Taylor Otwell', Auth::user()->name); - - Auth::logout(); - } - - /** - * Test the Auth::user method. - * - * @group laravel - */ - public function testNullReturnedWhenUserIDNotValidInteger() - { - Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); - - Auth::login('asdlkasd'); - - $this->assertNull(Auth::user()); - } - - /** - * Test the Auth::recall method. - * - * @group laravel - */ - public function testUserCanBeRecalledViaCookie() - { - Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); - - $cookie = Crypter::encrypt('1|'.Str::random(40)); - Cookie::forever('authloginstub_remember', $cookie); - - $auth = new AuthLoginStub; - - $this->assertEquals('Taylor Otwell', $auth->user()->name); - - $this->assertTrue($auth->user()->id === $_SERVER['auth.login.stub']['user']); - } - - /** - * Test the Auth::attempt method. - * - * @group laravel - */ - public function testAttemptMethodReturnsFalseWhenCredentialsAreInvalid() - { - $this->assertFalse(Auth::attempt(array('username' => 'foo', 'password' => 'foo'))); - $this->assertFalse(Auth::attempt(array('username' => 'foo', 'password' => null))); - $this->assertFalse(Auth::attempt(array('username' => null, 'password' => null))); - $this->assertFalse(Auth::attempt(array('username' => 'taylor', 'password' => 'password'))); - $this->assertFalse(Auth::attempt(array('username' => 'taylor', 'password' => 232))); - } - - /** - * Test the Auth::attempt method. - * - * @group laravel - */ - public function testAttemptReturnsTrueWhenCredentialsAreCorrect() - { - Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); - - $auth = new AuthLoginStub; - - $this->assertTrue($auth->attempt(array('username' => 'taylor', 'password' => 'password1'))); - $this->assertEquals('1', $_SERVER['auth.login.stub']['user']); - $this->assertFalse($_SERVER['auth.login.stub']['remember']); - - $auth_secure = new AuthLoginStub; - - $this->assertTrue($auth_secure->attempt(array('username' => 'taylor', 'password' => 'password1', 'remember' => true))); - $this->assertEquals('1', $_SERVER['auth.login.stub']['user']); - $this->assertTrue($_SERVER['auth.login.stub']['remember']); - - $auth_secure->logout(); - $auth->logout(); - } - - /** - * Test Auth::login method. - * - * @group laravel - */ - public function testLoginMethodStoresUserKeyInSession() - { - Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); - - $user = new StdClass; - $user->id = 10; - Auth::login($user); - // FIXME: Not sure whether hard-coding the key is a good idea. - $user = Session::$instance->session['data']['laravel_auth_drivers_fluent_login']; - $this->assertEquals(10, $user->id); - - - Auth::logout(); - - Auth::login(5); - $user = Session::$instance->session['data']['laravel_auth_drivers_fluent_login']; - $this->assertEquals(5, $user); - Auth::logout(5); - } - - /** - * Test the Auth::login method. - * - * @group laravel - */ - public function testLoginStoresRememberCookieWhenNeeded() - { - Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); - - $this->setServerVar('HTTPS', 'on'); - - // Set the session vars to make sure remember cookie uses them - Config::set('session.path', 'foo'); - Config::set('session.domain', 'bar'); - Config::set('session.secure', true); - - Auth::login(1, true); - - $this->assertTrue(isset(Cookie::$jar['laravel_auth_drivers_fluent_remember'])); - - $cookie = Cookie::get('laravel_auth_drivers_fluent_remember'); - $cookie = explode('|', Crypter::decrypt($cookie)); - $this->assertEquals(1, $cookie[0]); - $this->assertEquals('foo', Cookie::$jar['laravel_auth_drivers_fluent_remember']['path']); - $this->assertEquals('bar', Cookie::$jar['laravel_auth_drivers_fluent_remember']['domain']); - $this->assertTrue(Cookie::$jar['laravel_auth_drivers_fluent_remember']['secure']); - - Auth::logout(); - - $this->setServerVar('HTTPS', 'off'); - } - - /** - * Test the Auth::logout method. - * - * @group laravel - */ - public function testLogoutMethodLogsOutUser() - { - Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); - - $data = Session::$instance->session['data']['laravel_auth_drivers_fluent_login'] = 1; - - Auth::logout(); - - $this->assertNull(Auth::user()); - - $this->assertFalse(isset(Session::$instance->session['data']['laravel_auth_drivers_fluent_login'])); - $this->assertTrue(Cookie::$jar['laravel_auth_drivers_fluent_remember']['expiration'] < time()); - } - - /** - * Test `laravel.auth: login` and `laravel.auth: logout` is called properly - * - * @group laravel - */ - public function testAuthEventIsCalledProperly() - { - Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver')); - - Event::listen('laravel.auth: login', function () - { - $_SERVER['test.user.login'] = 'foo'; - }); - - Event::listen('laravel.auth: logout', function () - { - $_SERVER['test.user.logout'] = 'foo'; - }); - - $this->assertNull($_SERVER['test.user.login']); - $this->assertNull($_SERVER['test.user.logout']); - - Auth::login(1, true); - - $this->assertEquals('foo', $_SERVER['test.user.login']); - - Auth::logout(); - - $this->assertEquals('foo', $_SERVER['test.user.logout']); - } - -} - -class AuthUserReturnsNull extends Laravel\Auth\Drivers\Driver { - - public function user() { return null; } - - public function retrieve($id) { return null; } - - public function attempt($arguments = array()) { return null; } - -} - -class AuthUserReturnsDummy extends Laravel\Auth\Drivers\Driver { - - public function user() { return 'Taylor'; } - - public function retrieve($id) { return null; } - - public function attempt($arguments = array()) - { - return $this->login($arguments['username']); - } - -} - -class AuthLoginStub extends Laravel\Auth\Drivers\Fluent { - - public function login($user, $remember = false) - { - if (is_null($remember)) $remember = false; - - $_SERVER['auth.login.stub'] = compact('user', 'remember'); - - return parent::login($user, $remember); - } - - public function logout() - { - parent::logout(); - } - - public function retrieve($id) - { - $user = parent::retrieve($id); - - $_SERVER['auth.login.stub'] = array( - 'user' => $user->id, - 'remember' => false, - ); - - return $user; - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/autoloader.test.php b/laravel/tests/cases/autoloader.test.php deleted file mode 100644 index 80605447..00000000 --- a/laravel/tests/cases/autoloader.test.php +++ /dev/null @@ -1,102 +0,0 @@ - path('app').'models/foo.php', - )); - - $this->assertEquals(path('app').'models/foo.php', Autoloader::$mappings['Foo']); - } - - /** - * Test the Autoloader::alias method. - * - * @group laravel - */ - public function testAliasesCanBeRegistered() - { - Autoloader::alias('Foo\\Bar', 'Foo'); - - $this->assertEquals('Foo\\Bar', Autoloader::$aliases['Foo']); - } - - /** - * Test the Autoloader::directories method. - * - * @group laravel - */ - public function testPsrDirectoriesCanBeRegistered() - { - Autoloader::directories(array( - path('app').'foo'.DS.'bar', - path('app').'foo'.DS.'baz'.DS.DS, - )); - - $this->assertTrue(in_array(path('app').'foo'.DS.'bar'.DS, Autoloader::$directories)); - $this->assertTrue(in_array(path('app').'foo'.DS.'baz'.DS, Autoloader::$directories)); - } - - /** - * Test the Autoloader::namespaces method. - * - * @group laravel - */ - public function testNamespacesCanBeRegistered() - { - Autoloader::namespaces(array( - 'Autoloader_1' => path('bundle').'autoload'.DS.'models', - 'Autoloader_2' => path('bundle').'autoload'.DS.'libraries'.DS.DS, - )); - - $this->assertEquals(path('bundle').'autoload'.DS.'models'.DS, Autoloader::$namespaces['Autoloader_1\\']); - $this->assertEquals(path('bundle').'autoload'.DS.'libraries'.DS, Autoloader::$namespaces['Autoloader_2\\']); - } - - /** - * Test the loading of PSR-0 models and libraries. - * - * @group laravel - */ - public function testPsrLibrariesAndModelsCanBeLoaded() - { - $this->assertInstanceOf('User', new User); - $this->assertInstanceOf('Repositories\\User', new Repositories\User); - } - - /** - * Test the loading of hard-coded classes. - * - * @group laravel - */ - public function testHardcodedClassesCanBeLoaded() - { - Autoloader::map(array( - 'Autoloader_HardCoded' => path('app').'models'.DS.'autoloader.php', - )); - - $this->assertInstanceOf('Autoloader_HardCoded', new Autoloader_HardCoded); - } - - /** - * Test the loading of classes mapped by namespaces. - * - * @group laravel - */ - public function testClassesMappedByNamespaceCanBeLoaded() - { - Autoloader::namespaces(array( - 'Dashboard' => path('bundle').'dashboard'.DS.'models', - )); - - $this->assertInstanceOf('Dashboard\\Repository', new Dashboard\Repository); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/blade.test.php b/laravel/tests/cases/blade.test.php deleted file mode 100644 index a406cd23..00000000 --- a/laravel/tests/cases/blade.test.php +++ /dev/null @@ -1,124 +0,0 @@ -assertEquals('', Blade::compile_string($blade1)); - $this->assertEquals('', Blade::compile_string($blade2)); - $this->assertEquals('', Blade::compile_string($blade3)); - $this->assertEquals('', Blade::compile_string($blade4)); - } - - /** - * Test the compilation of comments statements. - * - * @group laravel - */ - public function testCommentsAreConvertedProperly() - { - $blade1 = "{{-- This is a comment --}}"; - $blade2 = "{{--\nThis is a\nmulti-line\ncomment.\n--}}"; - - $this->assertEquals("\n", Blade::compile_string($blade1)); - $this->assertEquals("\n", Blade::compile_string($blade2)); - } - - /** - * Test the compilation of control structures. - * - * @group laravel - */ - public function testControlStructuresAreCreatedCorrectly() - { - $blade1 = "@if (true)\nfoo\n@endif"; - $blade2 = "@if (count(".'$something'.") > 0)\nfoo\n@endif"; - $blade3 = "@if (true)\nfoo\n@elseif (false)\nbar\n@else\nfoobar\n@endif"; - $blade4 = "@if (true)\nfoo\n@elseif (false)\nbar\n@endif"; - $blade5 = "@if (true)\nfoo\n@else\nbar\n@endif"; - $blade6 = "@unless (count(".'$something'.") > 0)\nfoobar\n@endunless"; - $blade7 = "@for (Foo::all() as ".'$foo'.")\nfoo\n@endfor"; - $blade8 = "@foreach (Foo::all() as ".'$foo'.")\nfoo\n@endforeach"; - $blade9 = "@forelse (Foo::all() as ".'$foo'.")\nfoo\n@empty\nbar\n@endforelse"; - $blade10 = "@while (true)\nfoo\n@endwhile"; - $blade11 = "@while (Foo::bar())\nfoo\n@endwhile"; - - - $this->assertEquals("\nfoo\n", Blade::compile_string($blade1)); - $this->assertEquals(" 0): ?>\nfoo\n", Blade::compile_string($blade2)); - $this->assertEquals("\nfoo\n\nbar\n\nfoobar\n", Blade::compile_string($blade3)); - $this->assertEquals("\nfoo\n\nbar\n", Blade::compile_string($blade4)); - $this->assertEquals("\nfoo\n\nbar\n", Blade::compile_string($blade5)); - $this->assertEquals(" 0))): ?>\nfoobar\n", Blade::compile_string($blade6)); - $this->assertEquals("\nfoo\n", Blade::compile_string($blade7)); - $this->assertEquals("\nfoo\n", Blade::compile_string($blade8)); - $this->assertEquals(" 0): ?>\nfoo\n\nbar\n", Blade::compile_string($blade9)); - $this->assertEquals("\nfoo\n", Blade::compile_string($blade10)); - $this->assertEquals("\nfoo\n", Blade::compile_string($blade11)); - } - - /** - * Test the compilation of yield statements. - * - * @group laravel - */ - public function testYieldsAreCompiledCorrectly() - { - $blade = "@yield('something')"; - - $this->assertEquals("", Blade::compile_string($blade)); - } - - /** - * Test the compilation of section statements. - * - * @group laravel - */ - public function testSectionsAreCompiledCorrectly() - { - $blade = "@section('something')\nfoo\n@endsection"; - - $this->assertEquals("\nfoo\n", Blade::compile_string($blade)); - } - - /** - * Test the compilation of include statements. - * - * @group laravel - */ - public function testIncludesAreCompiledCorrectly() - { - $blade1 = "@include('user.profile')"; - $blade2 = "@include(Config::get('application.default_view', 'user.profile'))"; - - $this->assertEquals("with(get_defined_vars())->render(); ?>", Blade::compile_string($blade1)); - $this->assertEquals("with(get_defined_vars())->render(); ?>", Blade::compile_string($blade2)); - } - - /** - * Test the compilation of render statements. - * - * @group laravel - */ - public function testRendersAreCompiledCorrectly() - { - $blade1 = "@render('user.profile')"; - $blade2 = "@render(Config::get('application.default_view', 'user.profile'))"; - - $this->assertEquals("", Blade::compile_string($blade1)); - $this->assertEquals("", Blade::compile_string($blade2)); - - } -} \ No newline at end of file diff --git a/laravel/tests/cases/bundle.test.php b/laravel/tests/cases/bundle.test.php deleted file mode 100644 index 9826a50f..00000000 --- a/laravel/tests/cases/bundle.test.php +++ /dev/null @@ -1,251 +0,0 @@ - 'foo-baz')); - $this->assertEquals('foo-baz', Bundle::$bundles['foo-baz']['handles']); - $this->assertFalse(Bundle::$bundles['foo-baz']['auto']); - - Bundle::register('foo-bar', array()); - $this->assertFalse(Bundle::$bundles['foo-baz']['auto']); - $this->assertNull(Bundle::$bundles['foo-bar']['handles']); - - unset(Bundle::$bundles['foo-baz']); - unset(Bundle::$bundles['foo-bar']); - } - - /** - * Test the Bundle::start method. - * - * @group laravel - */ - public function testStartMethodStartsBundle() - { - $_SERVER['bundle.dummy.start'] = 0; - $_SERVER['bundle.dummy.routes'] = 0; - - $_SERVER['started.dummy'] = false; - - Event::listen('laravel.started: dummy', function() - { - $_SERVER['started.dummy'] = true; - }); - - Bundle::register('dummy'); - Bundle::start('dummy'); - - $this->assertTrue($_SERVER['started.dummy']); - $this->assertEquals(1, $_SERVER['bundle.dummy.start']); - $this->assertEquals(1, $_SERVER['bundle.dummy.routes']); - - Bundle::start('dummy'); - - $this->assertEquals(1, $_SERVER['bundle.dummy.start']); - $this->assertEquals(1, $_SERVER['bundle.dummy.routes']); - } - - /** - * Test Bundle::handles method. - * - * @group laravel - */ - public function testHandlesMethodReturnsBundleThatHandlesURI() - { - Bundle::register('foo', array('handles' => 'foo-bar')); - $this->assertEquals('foo', Bundle::handles('foo-bar/admin')); - unset(Bundle::$bundles['foo']); - } - - /** - * Test the Bundle::exist method. - * - * @group laravel - */ - public function testExistMethodIndicatesIfBundleExist() - { - $this->assertTrue(Bundle::exists('dashboard')); - $this->assertFalse(Bundle::exists('foo')); - } - - /** - * Test the Bundle::started method. - * - * @group laravel - */ - public function testStartedMethodIndicatesIfBundleIsStarted() - { - Bundle::register('dummy'); - Bundle::start('dummy'); - $this->assertTrue(Bundle::started('dummy')); - } - - /** - * Test the Bundle::prefix method. - * - * @group laravel - */ - public function testPrefixMethodReturnsCorrectPrefix() - { - $this->assertEquals('dummy::', Bundle::prefix('dummy')); - $this->assertEquals('', Bundle::prefix(DEFAULT_BUNDLE)); - } - - /** - * Test the Bundle::class_prefix method. - * - * @group laravel - */ - public function testClassPrefixMethodReturnsProperClassPrefixForBundle() - { - $this->assertEquals('Dummy_', Bundle::class_prefix('dummy')); - $this->assertEquals('', Bundle::class_prefix(DEFAULT_BUNDLE)); - } - - /** - * Test the Bundle::path method. - * - * @group laravel - */ - public function testPathMethodReturnsCorrectPath() - { - $this->assertEquals(path('app'), Bundle::path(null)); - $this->assertEquals(path('app'), Bundle::path(DEFAULT_BUNDLE)); - $this->assertEquals(path('bundle').'dashboard'.DS, Bundle::path('dashboard')); - } - - /** - * Test the Bundle::asset method. - * - * @group laravel - */ - public function testAssetPathReturnsPathToBundlesAssets() - { - $this->assertEquals('/bundles/dashboard/', Bundle::assets('dashboard')); - $this->assertEquals('/', Bundle::assets(DEFAULT_BUNDLE)); - - Config::set('application.url', ''); - } - - /** - * Test the Bundle::name method. - * - * @group laravel - */ - public function testBundleNameCanBeRetrievedFromIdentifier() - { - $this->assertEquals(DEFAULT_BUNDLE, Bundle::name('something')); - $this->assertEquals(DEFAULT_BUNDLE, Bundle::name('something.else')); - $this->assertEquals('bundle', Bundle::name('bundle::something.else')); - } - - /** - * Test the Bundle::element method. - * - * @group laravel - */ - public function testElementCanBeRetrievedFromIdentifier() - { - $this->assertEquals('something', Bundle::element('something')); - $this->assertEquals('something.else', Bundle::element('something.else')); - $this->assertEquals('something.else', Bundle::element('bundle::something.else')); - } - - /** - * Test the Bundle::identifier method. - * - * @group laravel - */ - public function testIdentifierCanBeConstructed() - { - $this->assertEquals('something.else', Bundle::identifier(DEFAULT_BUNDLE, 'something.else')); - $this->assertEquals('dashboard::something', Bundle::identifier('dashboard', 'something')); - $this->assertEquals('dashboard::something.else', Bundle::identifier('dashboard', 'something.else')); - } - - /** - * Test the Bundle::resolve method. - * - * @group laravel - */ - public function testBundleNamesCanBeResolved() - { - $this->assertEquals(DEFAULT_BUNDLE, Bundle::resolve('foo')); - $this->assertEquals('dashboard', Bundle::resolve('dashboard')); - } - - /** - * Test the Bundle::parse method. - * - * @group laravel - */ - public function testParseMethodReturnsElementAndIdentifier() - { - $this->assertEquals(array('application', 'something'), Bundle::parse('something')); - $this->assertEquals(array('application', 'something.else'), Bundle::parse('something.else')); - $this->assertEquals(array('dashboard', 'something'), Bundle::parse('dashboard::something')); - $this->assertEquals(array('dashboard', 'something.else'), Bundle::parse('dashboard::something.else')); - } - - /** - * Test the Bundle::get method. - * - * @group laravel - */ - public function testOptionMethodReturnsBundleOption() - { - $this->assertFalse(Bundle::option('dashboard', 'auto')); - $this->assertEquals('dashboard', Bundle::option('dashboard', 'location')); - } - - /** - * Test the Bundle::all method. - * - * @group laravel - */ - public function testAllMethodReturnsBundleArray() - { - Bundle::register('foo'); - $this->assertEquals(Bundle::$bundles, Bundle::all()); - unset(Bundle::$bundles['foo']); - } - - /** - * Test the Bundle::names method. - * - * @group laravel - */ - public function testNamesMethodReturnsBundleNames() - { - Bundle::register('foo'); - $this->assertEquals(array('dashboard', 'dummy', 'foo'), Bundle::names()); - unset(Bundle::$bundles['foo']); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/config.test.php b/laravel/tests/cases/config.test.php deleted file mode 100644 index 573b8cff..00000000 --- a/laravel/tests/cases/config.test.php +++ /dev/null @@ -1,79 +0,0 @@ -assertEquals('UTF-8', Config::get('application.encoding')); - $this->assertEquals('mysql', Config::get('database.connections.mysql.driver')); - $this->assertEquals('dashboard', Config::get('dashboard::meta.bundle')); - } - - /** - * Test the Config::has method. - * - * @group laravel - */ - public function testHasMethodIndicatesIfConfigItemExists() - { - $this->assertFalse(Config::has('application.foo')); - $this->assertTrue(Config::has('application.encoding')); - } - - /** - * Test the Config::set method. - * - * @group laravel - */ - public function testConfigItemsCanBeSet() - { - Config::set('application.encoding', 'foo'); - Config::set('dashboard::meta.bundle', 'bar'); - - $this->assertEquals('foo', Config::get('application.encoding')); - $this->assertEquals('bar', Config::get('dashboard::meta.bundle')); - } - - /** - * Test that environment configurations are loaded correctly. - * - * @group laravel - */ - public function testEnvironmentConfigsOverrideNormalConfigurations() - { - $_SERVER['LARAVEL_ENV'] = 'local'; - - $this->assertEquals('sqlite', Config::get('database.default')); - - unset($_SERVER['LARAVEL_ENV']); - } - - /** - * Test that items can be set after the entire file has already been loaded. - * - * @group laravel - */ - public function testItemsCanBeSetAfterEntireFileIsLoaded() - { - Config::get('application'); - Config::set('application.key', 'taylor'); - $application = Config::get('application'); - - $this->assertEquals('taylor', $application['key']); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/controller.test.php b/laravel/tests/cases/controller.test.php deleted file mode 100644 index 9eb192b9..00000000 --- a/laravel/tests/cases/controller.test.php +++ /dev/null @@ -1,267 +0,0 @@ -assertEquals('action_index', Controller::call('auth@index')->content); - $this->assertEquals('Admin_Panel_Index', Controller::call('admin.panel@index')->content); - $this->assertEquals('Taylor', Controller::call('auth@profile', array('Taylor'))->content); - $this->assertEquals('Dashboard_Panel_Index', Controller::call('dashboard::panel@index')->content); - } - - /** - * Test basic controller filters are called. - * - * @group laravel - */ - public function testAssignedBeforeFiltersAreRun() - { - $_SERVER['test-all-after'] = false; - $_SERVER['test-all-before'] = false; - - Controller::call('filter@index'); - - $this->assertTrue($_SERVER['test-all-after']); - $this->assertTrue($_SERVER['test-all-before']); - } - - /** - * Test that "only" filters only apply to their assigned methods. - * - * @group laravel - */ - public function testOnlyFiltersOnlyApplyToTheirAssignedMethods() - { - $_SERVER['test-profile-before'] = false; - - Controller::call('filter@index'); - - $this->assertFalse($_SERVER['test-profile-before']); - - Controller::call('filter@profile'); - - $this->assertTrue($_SERVER['test-profile-before']); - } - - /** - * Test that "except" filters only apply to the excluded methods. - * - * @group laravel - */ - public function testExceptFiltersOnlyApplyToTheExlucdedMethods() - { - $_SERVER['test-except'] = false; - - Controller::call('filter@index'); - Controller::call('filter@profile'); - - $this->assertFalse($_SERVER['test-except']); - - Controller::call('filter@show'); - - $this->assertTrue($_SERVER['test-except']); - } - - /** - * Test that filters can be constrained by the request method. - * - * @group laravel - */ - public function testFiltersCanBeConstrainedByRequestMethod() - { - $_SERVER['test-on-post'] = false; - - Request::$foundation->setMethod('GET'); - Controller::call('filter@index'); - - $this->assertFalse($_SERVER['test-on-post']); - - Request::$foundation->setMethod('POST'); - Controller::call('filter@index'); - - $this->assertTrue($_SERVER['test-on-post']); - - $_SERVER['test-on-get-put'] = false; - - Request::$foundation->setMethod('POST'); - Controller::call('filter@index'); - - $this->assertFalse($_SERVER['test-on-get-put']); - - Request::$foundation->setMethod('PUT'); - Controller::call('filter@index'); - - $this->assertTrue($_SERVER['test-on-get-put']); - } - - public function testGlobalBeforeFilterIsNotCalledByController() - { - $_SERVER['before'] = false; - $_SERVER['after'] = false; - - Controller::call('auth@index'); - - $this->assertFalse($_SERVER['before']); - $this->assertFalse($_SERVER['after']); - } - - /** - * Test that before filters can override the controller response. - * - * @group laravel - */ - public function testBeforeFiltersCanOverrideResponses() - { - $this->assertEquals('Filtered!', Controller::call('filter@login')->content); - } - - /** - * Test that after filters do not affect the response. - * - * @group laravel - */ - public function testAfterFiltersDoNotAffectControllerResponse() - { - $this->assertEquals('action_logout', Controller::call('filter@logout')->content); - } - - /** - * Test that filter parameters are passed to the filter. - * - * @group laravel - */ - public function testFilterParametersArePassedToTheFilter() - { - $this->assertEquals('12', Controller::call('filter@edit')->content); - } - - /** - * Test that multiple filters can be assigned to a single method. - * - * @group laravel - */ - public function testMultipleFiltersCanBeAssignedToAnAction() - { - $_SERVER['test-multi-1'] = false; - $_SERVER['test-multi-2'] = false; - - Controller::call('filter@save'); - - $this->assertTrue($_SERVER['test-multi-1']); - $this->assertTrue($_SERVER['test-multi-2']); - } - - /** - * Test Restful controllers respond by request method. - * - * @group laravel - */ - public function testRestfulControllersRespondWithRestfulMethods() - { - Request::$foundation->setMethod('GET'); - //$_SERVER['REQUEST_METHOD'] = 'GET'; - - $this->assertEquals('get_index', Controller::call('restful@index')->content); - - //$_SERVER['REQUEST_METHOD'] = 'PUT'; - Request::$foundation->setMethod('PUT'); - - $this->assertEquals(404, Controller::call('restful@index')->status()); - - //$_SERVER['REQUEST_METHOD'] = 'POST'; - Request::$foundation->setMethod('POST'); - - $this->assertEquals('post_index', Controller::call('restful@index')->content); - } - - /** - * Test that the template is returned by template controllers. - * - * @group laravel - */ - public function testTemplateControllersReturnTheTemplate() - { - $response = Controller::call('template.basic@index'); - - $home = file_get_contents(path('app').'views/home/index.php'); - - $this->assertEquals($home, $response->content); - } - - /** - * Test that controller templates can be named views. - * - * @group laravel - */ - public function testControllerTemplatesCanBeNamedViews() - { - View::name('home.index', 'home'); - - $response = Controller::call('template.named@index'); - - $home = file_get_contents(path('app').'views/home/index.php'); - - $this->assertEquals($home, $response->content); - - View::$names = array(); - } - - /** - * Test that the "layout" method is called on the controller. - * - * @group laravel - */ - public function testTheTemplateCanBeOverriden() - { - $this->assertEquals('Layout', Controller::call('template.override@index')->content); - } - - /** - * Test the Controller::resolve method. - * - * @group laravel - */ - public function testResolveMethodChecksTheIoCContainer() - { - IoC::register('controller: home', function() - { - require_once path('app').'controllers/home.php'; - - $controller = new Home_Controller; - - $controller->foo = 'bar'; - - return $controller; - }); - - $controller = Controller::resolve(DEFAULT_BUNDLE, 'home'); - - $this->assertEquals('bar', $controller->foo); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/cookie.test.php b/laravel/tests/cases/cookie.test.php deleted file mode 100644 index 37d63553..00000000 --- a/laravel/tests/cases/cookie.test.php +++ /dev/null @@ -1,134 +0,0 @@ -restartRequest(); - } - - /** - * Reinitialize the global request. - * - * @return void - */ - protected function restartRequest() - { - // FIXME: Ugly hack, but old contents from previous requests seem to - // trip up the Foundation class. - $_FILES = array(); - - Request::$foundation = RequestFoundation::createFromGlobals(); - } - - /** - * Test Cookie::has method. - * - * @group laravel - */ - public function testHasMethodIndicatesIfCookieInSet() - { - Cookie::$jar['foo'] = array('value' => Cookie::hash('bar').'+bar'); - $this->assertTrue(Cookie::has('foo')); - $this->assertFalse(Cookie::has('bar')); - - Cookie::put('baz', 'foo'); - $this->assertTrue(Cookie::has('baz')); - } - - /** - * Test the Cookie::get method. - * - * @group laravel - */ - public function testGetMethodCanReturnValueOfCookies() - { - Cookie::$jar['foo'] = array('value' => Cookie::hash('bar').'+bar'); - $this->assertEquals('bar', Cookie::get('foo')); - - Cookie::put('bar', 'baz'); - $this->assertEquals('baz', Cookie::get('bar')); - } - - /** - * Test Cookie::forever method. - * - * @group laravel - */ - public function testForeverShouldUseATonOfMinutes() - { - Cookie::forever('foo', 'bar'); - $this->assertEquals(Cookie::hash('bar').'+bar', Cookie::$jar['foo']['value']); - - // Shouldn't be able to test this cause while we indicate -2000 seconds - // cookie expiration store timestamp. - // $this->assertEquals(525600, Cookie::$jar['foo']['expiration']); - - $this->setServerVar('HTTPS', 'on'); - - Cookie::forever('bar', 'baz', 'path', 'domain', true); - $this->assertEquals('path', Cookie::$jar['bar']['path']); - $this->assertEquals('domain', Cookie::$jar['bar']['domain']); - $this->assertTrue(Cookie::$jar['bar']['secure']); - - $this->setServerVar('HTTPS', 'off'); - } - - /** - * Test the Cookie::forget method. - * - * @group laravel - */ - public function testForgetSetsCookieWithExpiration() - { - Cookie::forget('bar', 'path', 'domain'); - - // Shouldn't be able to test this cause while we indicate -2000 seconds - // cookie expiration store timestamp. - //$this->assertEquals(-2000, Cookie::$jar['bar']['expiration']); - - $this->assertEquals('path', Cookie::$jar['bar']['path']); - $this->assertEquals('domain', Cookie::$jar['bar']['domain']); - $this->assertFalse(Cookie::$jar['bar']['secure']); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/database.test.php b/laravel/tests/cases/database.test.php deleted file mode 100644 index 84b1faaf..00000000 --- a/laravel/tests/cases/database.test.php +++ /dev/null @@ -1,74 +0,0 @@ -assertTrue(isset(DB::$connections[Config::get('database.default')])); - - $connection = DatabaseConnectStub::connection('mysql'); - $this->assertTrue(isset(DB::$connections['mysql'])); - $this->assertEquals(DB::$connections['mysql']->pdo->laravel_config, Config::get('database.connections.mysql')); - } - - /** - * Test the DB::profile method. - * - * @group laravel - */ - public function testProfileMethodReturnsQueries() - { - Laravel\Database\Connection::$queries = array('Taylor'); - $this->assertEquals(array('Taylor'), DB::profile()); - Laravel\Database\Connection::$queries = array(); - } - - /** - * Test the __callStatic method. - * - * @group laravel - */ - public function testConnectionMethodsCanBeCalledStaticly() - { - $this->assertEquals('sqlite', DB::driver()); - } - -} - -class DatabaseConnectStub extends Laravel\Database { - - protected static function connect($config) { return new PDOStub($config); } - -} - -class PDOStub extends PDO { - - public $laravel_config; - - public function __construct($config) { $this->laravel_config = $config; } - - public function foo() { return 'foo'; } - -} \ No newline at end of file diff --git a/laravel/tests/cases/eloquent.test.php b/laravel/tests/cases/eloquent.test.php deleted file mode 100644 index ec08ed0f..00000000 --- a/laravel/tests/cases/eloquent.test.php +++ /dev/null @@ -1,291 +0,0 @@ - 'Taylor', 'age' => 25, 'setter' => 'foo'); - - $model = new Model($array); - - $this->assertEquals('Taylor', $model->name); - $this->assertEquals(25, $model->age); - $this->assertEquals('setter: foo', $model->setter); - } - - /** - * Test the Model::fill method. - * - * @group laravel - */ - public function testAttributesAreSetByFillMethod() - { - $array = array('name' => 'Taylor', 'age' => 25, 'setter' => 'foo'); - - $model = new Model(); - $model->fill($array); - - $this->assertEquals('Taylor', $model->name); - $this->assertEquals(25, $model->age); - $this->assertEquals('setter: foo', $model->setter); - } - - /** - * Test the Model::fill_raw method. - * - * @group laravel - */ - public function testAttributesAreSetByFillRawMethod() - { - $array = array('name' => 'Taylor', 'age' => 25, 'setter' => 'foo'); - - $model = new Model(); - $model->fill_raw($array); - - $this->assertEquals($array, $model->attributes); - } - - /** - * Test the Model::fill method with accessible. - * - * @group laravel - */ - public function testAttributesAreSetByFillMethodWithAccessible() - { - Model::$accessible = array('name', 'age'); - - $array = array('name' => 'Taylor', 'age' => 25, 'foo' => 'bar'); - - $model = new Model(); - $model->fill($array); - - $this->assertEquals('Taylor', $model->name); - $this->assertEquals(25, $model->age); - $this->assertNull($model->foo); - - Model::$accessible = null; - } - - /** - * Test the Model::fill method with empty accessible array. - * - * @group laravel - */ - public function testAttributesAreSetByFillMethodWithEmptyAccessible() - { - Model::$accessible = array(); - - $array = array('name' => 'Taylor', 'age' => 25, 'foo' => 'bar'); - - $model = new Model(); - $model->fill($array); - - $this->assertEquals(array(), $model->attributes); - $this->assertNull($model->name); - $this->assertNull($model->age); - $this->assertNull($model->foo); - - Model::$accessible = null; - } - - /** - * Test the Model::fill_raw method with accessible. - * - * @group laravel - */ - public function testAttributesAreSetByFillRawMethodWithAccessible() - { - Model::$accessible = array('name', 'age'); - - $array = array('name' => 'taylor', 'age' => 25, 'setter' => 'foo'); - - $model = new Model(); - $model->fill_raw($array); - - $this->assertEquals($array, $model->attributes); - - Model::$accessible = null; - } - - /** - * Test the Model::__set method. - * - * @group laravel - */ - public function testAttributeMagicSetterMethodChangesAttribute() - { - Model::$accessible = array('setter'); - - $array = array('setter' => 'foo', 'getter' => 'bar'); - - $model = new Model($array); - $model->setter = 'bar'; - $model->getter = 'foo'; - - $this->assertEquals('setter: bar', $model->get_attribute('setter')); - $this->assertEquals('foo', $model->get_attribute('getter')); - - Model::$accessible = null; - } - - /** - * Test the Model::__get method. - * - * @group laravel - */ - public function testAttributeMagicGetterMethodReturnsAttribute() - { - $array = array('setter' => 'foo', 'getter' => 'bar'); - - $model = new Model($array); - - $this->assertEquals('setter: foo', $model->setter); - $this->assertEquals('getter: bar', $model->getter); - } - - /** - * Test the Model::set_* method. - * - * @group laravel - */ - public function testAttributeSetterMethodChangesAttribute() - { - Model::$accessible = array('setter'); - - $array = array('setter' => 'foo', 'getter' => 'bar'); - - $model = new Model($array); - $model->set_setter('bar'); - $model->set_getter('foo'); - - $this->assertEquals('setter: bar', $model->get_attribute('setter')); - $this->assertEquals('foo', $model->get_attribute('getter')); - - Model::$accessible = null; - } - - /** - * Test the Model::get_* method. - * - * @group laravel - */ - public function testAttributeGetterMethodReturnsAttribute() - { - $array = array('setter' => 'foo', 'getter' => 'bar'); - - $model = new Model($array); - - $this->assertEquals('setter: foo', $model->get_setter()); - $this->assertEquals('getter: bar', $model->get_getter()); - } - - /** - * Test determination of dirty/changed attributes. - * - * @group laravel - */ - public function testDeterminationOfChangedAttributes() - { - $array = array('name' => 'Taylor', 'age' => 25, 'foo' => null); - - $model = new Model($array, true); - $model->name = 'Otwell'; - $model->new = null; - - $this->assertTrue($model->changed('name')); - $this->assertFalse($model->changed('age')); - $this->assertFalse($model->changed('foo')); - $this->assertFalse($model->changed('new')); - $this->assertTrue($model->dirty()); - $this->assertEquals(array('name' => 'Otwell', 'new' => null), $model->get_dirty()); - - $model->sync(); - - $this->assertFalse($model->changed('name')); - $this->assertFalse($model->changed('age')); - $this->assertFalse($model->changed('foo')); - $this->assertFalse($model->changed('new')); - $this->assertFalse($model->dirty()); - $this->assertEquals(array(), $model->get_dirty()); - } - - /** - * Test the Model::purge method. - * - * @group laravel - */ - public function testAttributePurge() - { - $array = array('name' => 'Taylor', 'age' => 25); - - $model = new Model($array); - $model->name = 'Otwell'; - $model->age = 26; - - $model->purge('name'); - - $this->assertFalse($model->changed('name')); - $this->assertNull($model->name); - $this->assertTrue($model->changed('age')); - $this->assertEquals(26, $model->age); - $this->assertEquals(array('age' => 26), $model->get_dirty()); - } - - /** - * Test the Model::table method. - * - * @group laravel - */ - public function testTableMethodReturnsCorrectName() - { - $model = new Model(); - $this->assertEquals('models', $model->table()); - - Model::$table = 'table'; - $this->assertEquals('table', $model->table()); - - Model::$table = null; - $this->assertEquals('models', $model->table()); - } - - /** - * Test the Model::to_array method. - * - * @group laravel - */ - public function testConvertingToArray() - { - Model::$hidden = array('password', 'hidden'); - - $array = array('name' => 'Taylor', 'age' => 25, 'password' => 'laravel', 'null' => null); - - $model = new Model($array); - - $first = new Model(array('first' => 'foo', 'password' => 'hidden')); - $second = new Model(array('second' => 'bar', 'password' => 'hidden')); - $third = new Model(array('third' => 'baz', 'password' => 'hidden')); - - $model->relationships['one'] = new Model(array('foo' => 'bar', 'password' => 'hidden')); - $model->relationships['many'] = array($first, $second, $third); - $model->relationships['hidden'] = new Model(array('should' => 'not_visible')); - $model->relationships['null'] = null; - - $this->assertEquals(array( - 'name' => 'Taylor', 'age' => 25, 'null' => null, - 'one' => array('foo' => 'bar'), - 'many' => array( - array('first' => 'foo'), - array('second' => 'bar'), - array('third' => 'baz'), - ), - 'null' => null, - ), $model->to_array()); - - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/event.test.php b/laravel/tests/cases/event.test.php deleted file mode 100644 index 52063833..00000000 --- a/laravel/tests/cases/event.test.php +++ /dev/null @@ -1,43 +0,0 @@ -assertEquals(1, $responses[0]); - $this->assertEquals(2, $responses[1]); - } - - /** - * Test parameters can be passed to event listeners. - * - * @group laravel - */ - public function testParametersCanBePassedToEvents() - { - Event::listen('test.event', function($var) { return $var; }); - - $responses = Event::fire('test.event', array('Taylor')); - - $this->assertEquals('Taylor', $responses[0]); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/fluent.test.php b/laravel/tests/cases/fluent.test.php deleted file mode 100644 index 87c0e0db..00000000 --- a/laravel/tests/cases/fluent.test.php +++ /dev/null @@ -1,50 +0,0 @@ - 'Taylor', 'age' => 25); - - $fluent = new Fluent($array); - - $this->assertEquals($array, $fluent->attributes); - } - - /** - * Test the Fluent::get method. - * - * @group laravel - */ - public function testGetMethodReturnsAttribute() - { - $fluent = new Fluent(array('name' => 'Taylor')); - - $this->assertEquals('Taylor', $fluent->get('name')); - $this->assertEquals('Default', $fluent->get('foo', 'Default')); - $this->assertEquals('Taylor', $fluent->name); - $this->assertNull($fluent->foo); - } - - public function testMagicMethodsCanBeUsedToSetAttributes() - { - $fluent = new Fluent; - - $fluent->name = 'Taylor'; - $fluent->developer(); - $fluent->age(25); - - $this->assertEquals('Taylor', $fluent->name); - $this->assertTrue($fluent->developer); - $this->assertEquals(25, $fluent->age); - $this->assertInstanceOf('Laravel\\Fluent', $fluent->programmer()); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/form.test.php b/laravel/tests/cases/form.test.php deleted file mode 100644 index 5f6f7fa3..00000000 --- a/laravel/tests/cases/form.test.php +++ /dev/null @@ -1,451 +0,0 @@ - 'UTF-16', 'class' => 'form')); - $form4 = Form::open('foobar', 'DELETE', array('class' => 'form')); - - $this->assertEquals('
    ', $form1); - $this->assertEquals('', $form2); - $this->assertEquals('', $form3); - $this->assertEquals('', $form4); - } - - /** - * Test the compilation of opening a secure form - * - * @group laravel - */ - public function testOpeningFormSecure() - { - $form1 = Form::open_secure('foobar', 'GET'); - $form2 = Form::open_secure('foobar', 'POST'); - $form3 = Form::open_secure('foobar', 'PUT', array('accept-charset' => 'UTF-16', 'class' => 'form')); - $form4 = Form::open_secure('foobar', 'DELETE', array('class' => 'form')); - - $this->assertEquals('', $form1); - $this->assertEquals('', $form2); - $this->assertEquals('', $form3); - $this->assertEquals('', $form4); - } - - /** - * Test the compilation of opening a form for files - * - * @group laravel - */ - public function testOpeningFormForFile() - { - $form1 = Form::open_for_files('foobar', 'GET'); - $form2 = Form::open_for_files('foobar', 'POST'); - $form3 = Form::open_for_files('foobar', 'PUT', array('accept-charset' => 'UTF-16', 'class' => 'form')); - $form4 = Form::open_for_files('foobar', 'DELETE', array('class' => 'form')); - - $this->assertEquals('', $form1); - $this->assertEquals('', $form2); - $this->assertEquals('', $form3); - $this->assertEquals('', $form4); - } - - /** - * Test the compilation of opening a secure form for files - * - * @group laravel - */ - public function testOpeningFormSecureForFile() - { - $form1 = Form::open_secure_for_files('foobar', 'GET'); - $form2 = Form::open_secure_for_files('foobar', 'POST'); - $form3 = Form::open_secure_for_files('foobar', 'PUT', array('accept-charset' => 'UTF-16', 'class' => 'form')); - $form4 = Form::open_secure_for_files('foobar', 'DELETE', array('class' => 'form')); - - $this->assertEquals('', $form1); - $this->assertEquals('', $form2); - $this->assertEquals('', $form3); - $this->assertEquals('', $form4); - } - - /** - * Test the compilation of closing a form - * - * @group laravel - */ - public function testClosingForm() - { - $this->assertEquals('
    ', Form::close()); - } - - /** - * Test the compilation of form label - * - * @group laravel - */ - public function testFormLabel() - { - $form1 = Form::label('foo', 'Foobar'); - $form2 = Form::label('foo', 'Foobar', array('class' => 'control-label')); - - $this->assertEquals('', $form1); - $this->assertEquals('', $form2); - } - - /** - * Test the compilation of form input - * - * @group laravel - */ - public function testFormInput() - { - $form1 = Form::input('text', 'foo'); - $form2 = Form::input('text', 'foo', 'foobar'); - $form3 = Form::input('date', 'foobar', null, array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals('', $form2); - $this->assertEquals('', $form3); - } - - /** - * Test the compilation of form text - * - * @group laravel - */ - public function testFormText() - { - $form1 = Form::input('text', 'foo'); - $form2 = Form::text('foo'); - $form3 = Form::text('foo', 'foobar'); - $form4 = Form::text('foo', null, array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals($form1, $form2); - $this->assertEquals('', $form3); - $this->assertEquals('', $form4); - } - - /** - * Test the compilation of form password - * - * @group laravel - */ - public function testFormPassword() - { - $form1 = Form::input('password', 'foo'); - $form2 = Form::password('foo'); - $form3 = Form::password('foo', array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals($form1, $form2); - $this->assertEquals('', $form3); - } - - /** - * Test the compilation of form hidden - * - * @group laravel - */ - public function testFormHidden() - { - $form1 = Form::input('hidden', 'foo'); - $form2 = Form::hidden('foo'); - $form3 = Form::hidden('foo', 'foobar'); - $form4 = Form::hidden('foo', null, array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals($form1, $form2); - $this->assertEquals('', $form3); - $this->assertEquals('', $form4); - } - - /** - * Test the compilation of form search - * - * @group laravel - */ - public function testFormSearch() - { - $form1 = Form::input('search', 'foo'); - $form2 = Form::search('foo'); - $form3 = Form::search('foo', 'foobar'); - $form4 = Form::search('foo', null, array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals($form1, $form2); - $this->assertEquals('', $form3); - $this->assertEquals('', $form4); - } - - /** - * Test the compilation of form email - * - * @group laravel - */ - public function testFormEmail() - { - $form1 = Form::input('email', 'foo'); - $form2 = Form::email('foo'); - $form3 = Form::email('foo', 'foobar'); - $form4 = Form::email('foo', null, array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals($form1, $form2); - $this->assertEquals('', $form3); - $this->assertEquals('', $form4); - } - - /** - * Test the compilation of form telephone - * - * @group laravel - */ - public function testFormTelephone() - { - $form1 = Form::input('tel', 'foo'); - $form2 = Form::telephone('foo'); - $form3 = Form::telephone('foo', 'foobar'); - $form4 = Form::telephone('foo', null, array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals($form1, $form2); - $this->assertEquals('', $form3); - $this->assertEquals('', $form4); - } - - /** - * Test the compilation of form url - * - * @group laravel - */ - public function testFormUrl() - { - $form1 = Form::input('url', 'foo'); - $form2 = Form::url('foo'); - $form3 = Form::url('foo', 'foobar'); - $form4 = Form::url('foo', null, array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals($form1, $form2); - $this->assertEquals('', $form3); - $this->assertEquals('', $form4); - } - - /** - * Test the compilation of form number - * - * @group laravel - */ - public function testFormNumber() - { - $form1 = Form::input('number', 'foo'); - $form2 = Form::number('foo'); - $form3 = Form::number('foo', 'foobar'); - $form4 = Form::number('foo', null, array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals($form1, $form2); - $this->assertEquals('', $form3); - $this->assertEquals('', $form4); - } - - /** - * Test the compilation of form date - * - * @group laravel - */ - public function testFormDate() - { - $form1 = Form::input('date', 'foo'); - $form2 = Form::date('foo'); - $form3 = Form::date('foo', 'foobar'); - $form4 = Form::date('foo', null, array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals($form1, $form2); - $this->assertEquals('', $form3); - $this->assertEquals('', $form4); - } - - /** - * Test the compilation of form file - * - * @group laravel - */ - public function testFormFile() - { - $form1 = Form::input('file', 'foo'); - $form2 = Form::file('foo'); - $form3 = Form::file('foo', array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals($form1, $form2); - $this->assertEquals('', $form3); - } - - /** - * Test the compilation of form textarea - * - * @group laravel - */ - public function testFormTextarea() - { - $form1 = Form::textarea('foo'); - $form2 = Form::textarea('foo', 'foobar'); - $form3 = Form::textarea('foo', null, array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals('', $form2); - $this->assertEquals('', $form3); - } - - /** - * Test the compilation of form select - * - * @group laravel - */ - public function testFormSelect() - { - $select1 = array( - 'foobar' => 'Foobar', - 'hello' => 'Hello World', - ); - - $select2 = array( - 'foo' => array( - 'foobar' => 'Foobar', - ), - 'hello' => 'Hello World', - ); - - $form1 = Form::select('foo'); - $form2 = Form::select('foo', $select1, 'foobar'); - $form3 = Form::select('foo', $select1, null, array('class' => 'span2')); - $form4 = Form::select('foo', $select2, 'foobar'); - - $this->assertEquals('', $form1); - $this->assertEquals('', $form2); - $this->assertEquals('', $form3); - $this->assertEquals('', $form4); - } - - /** - * Test the compilation of form checkbox - * - * @group laravel - */ - public function testFormCheckbox() - { - $form1 = Form::input('checkbox', 'foo'); - $form2 = Form::checkbox('foo'); - $form3 = Form::checkbox('foo', 'foobar', true); - $form4 = Form::checkbox('foo', 'foobar', false, array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals('', $form2); - $this->assertEquals('', $form3); - $this->assertEquals('', $form4); - } - - /** - * Test the compilation of form date - * - * @group laravel - */ - public function testFormRadio() - { - $form1 = Form::input('radio', 'foo'); - $form2 = Form::radio('foo'); - $form3 = Form::radio('foo', 'foobar', true); - $form4 = Form::radio('foo', 'foobar', false, array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals('', $form2); - $this->assertEquals('', $form3); - $this->assertEquals('', $form4); - } - - /** - * Test the compilation of form submit - * - * @group laravel - */ - public function testFormSubmit() - { - $form1 = Form::submit('foo'); - $form2 = Form::submit('foo', array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals('', $form2); - } - - /** - * Test the compilation of form reset - * - * @group laravel - */ - public function testFormReset() - { - $form1 = Form::reset('foo'); - $form2 = Form::reset('foo', array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals('', $form2); - } - - /** - * Test the compilation of form image - * - * @group laravel - */ - public function testFormImage() - { - $form1 = Form::image('foo/bar', 'foo'); - $form2 = Form::image('foo/bar', 'foo', array('class' => 'span2')); - $form3 = Form::image('http://google.com/foobar', 'foobar'); - - $this->assertEquals('', $form1); - $this->assertEquals('', $form2); - $this->assertEquals('', $form3); - - } - - /** - * Test the compilation of form button - * - * @group laravel - */ - public function testFormButton() - { - $form1 = Form::button('foo'); - $form2 = Form::button('foo', array('class' => 'span2')); - - $this->assertEquals('', $form1); - $this->assertEquals('', $form2); - } -} \ No newline at end of file diff --git a/laravel/tests/cases/hash.test.php b/laravel/tests/cases/hash.test.php deleted file mode 100644 index 4dca2713..00000000 --- a/laravel/tests/cases/hash.test.php +++ /dev/null @@ -1,37 +0,0 @@ -assertTrue(strlen(Hash::make('taylor')) == 60); - } - - /** - * Test the Hash::check method. - * - * @group laravel - */ - public function testHashCheckFailsWhenNotMatching() - { - $hash = Hash::make('taylor'); - - $this->assertFalse(Hash::check('foo', $hash)); - } - - /** - * Test the Hash::check method. - * - * @group laravel - */ - public function testHashCheckPassesWhenMatches() - { - $this->assertTrue(Hash::check('taylor', Hash::make('taylor'))); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/html.test.php b/laravel/tests/cases/html.test.php deleted file mode 100644 index 150fbd5a..00000000 --- a/laravel/tests/cases/html.test.php +++ /dev/null @@ -1,242 +0,0 @@ - 'text/javascript')); - - $this->assertEquals(''.PHP_EOL, $html1); - $this->assertEquals(''.PHP_EOL, $html2); - $this->assertEquals(''.PHP_EOL, $html3); - } - - /** - * Test generating a link to CSS files - * - * @group laravel - */ - public function testGeneratingStyle() - { - $html1 = HTML::style('foo.css'); - $html2 = HTML::style('http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js'); - $html3 = HTML::style('foo.css', array('media' => 'print')); - - $this->assertEquals(''.PHP_EOL, $html1); - $this->assertEquals(''.PHP_EOL, $html2); - $this->assertEquals(''.PHP_EOL, $html3); - } - - /** - * Test generating proper span - * - * @group laravel - */ - public function testGeneratingSpan() - { - $html1 = HTML::span('foo'); - $html2 = HTML::span('foo', array('class' => 'badge')); - - $this->assertEquals('foo', $html1); - $this->assertEquals('foo', $html2); - } - - /** - * Test generating proper link - * - * @group laravel - */ - public function testGeneratingLink() - { - $html1 = HTML::link('foo'); - $html2 = HTML::link('foo', 'Foobar'); - $html3 = HTML::link('foo', 'Foobar', array('class' => 'btn')); - $html4 = HTML::link('http://google.com', 'Google'); - - $this->assertEquals('http://localhost/index.php/foo', $html1); - $this->assertEquals('Foobar', $html2); - $this->assertEquals('Foobar', $html3); - $this->assertEquals('Google', $html4); - } - - /** - * Test generating proper link to secure - * - * @group laravel - */ - public function testGeneratingLinkToSecure() - { - $html1 = HTML::link_to_secure('foo'); - $html2 = HTML::link_to_secure('foo', 'Foobar'); - $html3 = HTML::link_to_secure('foo', 'Foobar', array('class' => 'btn')); - $html4 = HTML::link_to_secure('http://google.com', 'Google'); - - $this->assertEquals('https://localhost/index.php/foo', $html1); - $this->assertEquals('Foobar', $html2); - $this->assertEquals('Foobar', $html3); - $this->assertEquals('Google', $html4); - } - - /** - * Test generating proper link to asset - * - * @group laravel - */ - public function testGeneratingAssetLink() - { - $html1 = HTML::link_to_asset('foo.css'); - $html2 = HTML::link_to_asset('foo.css', 'Foobar'); - $html3 = HTML::link_to_asset('foo.css', 'Foobar', array('class' => 'btn')); - $html4 = HTML::link_to_asset('http://google.com/images.jpg', 'Google'); - - $this->assertEquals('http://localhost/foo.css', $html1); - $this->assertEquals('Foobar', $html2); - $this->assertEquals('Foobar', $html3); - $this->assertEquals('Google', $html4); - } - - /** - * Test generating proper link to secure asset - * - * @group laravel - */ - public function testGeneratingAssetLinkToSecure() - { - $html1 = HTML::link_to_secure_asset('foo.css'); - $html2 = HTML::link_to_secure_asset('foo.css', 'Foobar'); - $html3 = HTML::link_to_secure_asset('foo.css', 'Foobar', array('class' => 'btn')); - $html4 = HTML::link_to_secure_asset('http://google.com/images.jpg', 'Google'); - - $this->assertEquals('https://localhost/foo.css', $html1); - $this->assertEquals('Foobar', $html2); - $this->assertEquals('Foobar', $html3); - $this->assertEquals('Google', $html4); - } - - /** - * Test generating proper link to route - * - * @group laravel - */ - public function testGeneratingLinkToRoute() - { - Route::get('dashboard', array('as' => 'foo')); - - $html1 = HTML::link_to_route('foo'); - $html2 = HTML::link_to_route('foo', 'Foobar'); - $html3 = HTML::link_to_route('foo', 'Foobar', array(), array('class' => 'btn')); - - $this->assertEquals('http://localhost/index.php/dashboard', $html1); - $this->assertEquals('Foobar', $html2); - $this->assertEquals('Foobar', $html3); - } - - /** - * Test generating proper link to action - * - * @group laravel - */ - public function testGeneratingLinkToAction() - { - $html1 = HTML::link_to_action('foo@bar'); - $html2 = HTML::link_to_action('foo@bar', 'Foobar'); - $html3 = HTML::link_to_action('foo@bar', 'Foobar', array(), array('class' => 'btn')); - - $this->assertEquals('http://localhost/index.php/foo/bar', $html1); - $this->assertEquals('Foobar', $html2); - $this->assertEquals('Foobar', $html3); - } - - /** - * Test generating proper listing - * - * @group laravel - */ - public function testGeneratingListing() - { - $list = array( - 'foo', - 'foobar' => array( - 'hello', - 'hello world', - ), - ); - - $html1 = HTML::ul($list); - $html2 = HTML::ul($list, array('class' => 'nav')); - $html3 = HTML::ol($list); - $html4 = HTML::ol($list, array('class' => 'nav')); - - $this->assertEquals('
    • foo
    • foobar
      • hello
      • hello world
    ', $html1); - $this->assertEquals('', $html2); - $this->assertEquals('
    1. foo
    2. foobar
      1. hello
      2. hello world
    ', $html3); - $this->assertEquals('', $html4); - } - - /** - * Test generating proper listing - * - * @group laravel - */ - public function testGeneratingDefinition() - { - $definition = array( - 'foo' => 'foobar', - 'hello' => 'hello world', - ); - - $html1 = HTML::dl($definition); - $html2 = HTML::dl($definition, array('class' => 'nav')); - - $this->assertEquals('
    foo
    foobar
    hello
    hello world
    ', $html1); - $this->assertEquals('', $html2); - } - - /** - * Test generating proper image link - * - * @group laravel - */ - public function testGeneratingAssetLinkImage() - { - $html1 = HTML::image('foo.jpg'); - $html2 = HTML::image('foo.jpg', 'Foobar'); - $html3 = HTML::image('foo.jpg', 'Foobar', array('class' => 'btn')); - $html4 = HTML::image('http://google.com/images.jpg', 'Google'); - - $this->assertEquals('', $html1); - $this->assertEquals('Foobar', $html2); - $this->assertEquals('Foobar', $html3); - $this->assertEquals('Google', $html4); - } -} \ No newline at end of file diff --git a/laravel/tests/cases/input.test.php b/laravel/tests/cases/input.test.php deleted file mode 100644 index 5a1890f0..00000000 --- a/laravel/tests/cases/input.test.php +++ /dev/null @@ -1,174 +0,0 @@ -request->add(array('name' => 'Taylor')); - - $_FILES = array('age' => 25); - - $this->assertEquals(Input::all(), array('name' => 'Taylor', 'age' => 25)); - } - - /** - * Test the Input::has method. - * - * @group laravel - */ - public function testHasMethodIndicatesTheExistenceOfInput() - { - $this->assertFalse(Input::has('foo')); - - Request::foundation()->request->add(array('name' => 'Taylor')); - - $this->assertTrue(Input::has('name')); - } - - /** - * Test the Input::get method. - * - * @group laravel - */ - public function testGetMethodReturnsInputValue() - { - Request::foundation()->request->add(array('name' => 'Taylor')); - - $this->assertEquals('Taylor', Input::get('name')); - $this->assertEquals('Default', Input::get('foo', 'Default')); - } - - /** - * Test the Input::only method. - * - * @group laravel - */ - public function testOnlyMethodReturnsSubsetOfInput() - { - Request::foundation()->request->add(array('name' => 'Taylor', 'age' => 25)); - - $this->assertEquals(array('name' => 'Taylor'), Input::only(array('name'))); - } - - /** - * Test the Input::except method. - * - * @group laravel - */ - public function testExceptMethodReturnsSubsetOfInput() - { - Request::foundation()->request->add(array('name' => 'Taylor', 'age' => 25)); - - $this->assertEquals(array('age' => 25), Input::except(array('name'))); - } - - /** - * Test the Input::old method. - * - * @group laravel - */ - public function testOldInputCanBeRetrievedFromSession() - { - $this->setSession(); - - Session::$instance->session['data']['laravel_old_input'] = array('name' => 'Taylor'); - - $this->assertNull(Input::old('foo')); - $this->assertTrue(Input::had('name')); - $this->assertFalse(Input::had('foo')); - $this->assertEquals('Taylor', Input::old('name')); - } - - /** - * Test the Input::file method. - * - * @group laravel - */ - public function testFileMethodReturnsFromFileArray() - { - $_FILES['foo'] = array('name' => 'Taylor', 'size' => 100); - - $this->assertEquals('Taylor', Input::file('foo.name')); - $this->assertEquals(array('name' => 'Taylor', 'size' => 100), Input::file('foo')); - } - - /** - * Test the Input::flash method. - * - * @group laravel - */ - public function testFlashMethodFlashesInputToSession() - { - $this->setSession(); - - $input = array('name' => 'Taylor', 'age' => 25); - Request::foundation()->request->add($input); - - Input::flash(); - - $this->assertEquals($input, Session::$instance->session['data'][':new:']['laravel_old_input']); - - Input::flash('only', array('name')); - - $this->assertEquals(array('name' => 'Taylor'), Session::$instance->session['data'][':new:']['laravel_old_input']); - - Input::flash('except', array('name')); - - $this->assertEquals(array('age' => 25), Session::$instance->session['data'][':new:']['laravel_old_input']); - } - - /** - * Test the Input::flush method. - * - * @group laravel - */ - public function testFlushMethodClearsFlashedInput() - { - $this->setSession(); - - $input = array('name' => 'Taylor', 'age' => 30); - Request::foundation()->request->add($input); - - Input::flash(); - - $this->assertEquals($input, Session::$instance->session['data'][':new:']['laravel_old_input']); - - Input::flush(); - - $this->assertEquals(array(), Session::$instance->session['data'][':new:']['laravel_old_input']); - } - - /** - * Set the session payload instance. - */ - protected function setSession() - { - $driver = $this->getMock('Laravel\\Session\\Drivers\\Driver'); - - Session::$instance = new Laravel\Session\Payload($driver); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/ioc.test.php b/laravel/tests/cases/ioc.test.php deleted file mode 100644 index 56918337..00000000 --- a/laravel/tests/cases/ioc.test.php +++ /dev/null @@ -1,74 +0,0 @@ -assertEquals('Taylor', IoC::resolve('foo')); - } - - /** - * Test that singletons are created once. - * - * @group laravel - */ - public function testSingletonsAreCreatedOnce() - { - IoC::singleton('foo', function() - { - return new StdClass; - }); - - $object = IoC::resolve('foo'); - - $this->assertTrue($object === IoC::resolve('foo')); - } - - /** - * Test the IoC::instance method. - * - * @group laravel - */ - public function testInstancesAreReturnedBySingleton() - { - $object = new StdClass; - - IoC::instance('bar', $object); - - $this->assertTrue($object === IoC::resolve('bar')); - } - - /** - * Test the IoC::registered method. - */ - public function testRegisteredMethodIndicatesIfRegistered() - { - IoC::register('foo', function() {}); - - $this->assertTrue(IoC::registered('foo')); - $this->assertFalse(IoC::registered('baz')); - } - - /** - * Test the IoC::controller method. - * - * @group laravel - */ - public function testControllerMethodRegistersAController() - { - IoC::register('controller: ioc.test', function() {}); - - $this->assertTrue(IoC::registered('controller: ioc.test')); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/lang.test.php b/laravel/tests/cases/lang.test.php deleted file mode 100644 index 74640ccd..00000000 --- a/laravel/tests/cases/lang.test.php +++ /dev/null @@ -1,68 +0,0 @@ -assertEquals($validation['required'], Lang::line('validation.required')->get()); - $this->assertEquals('Taylor', Lang::line('validation.foo')->get(null, 'Taylor')); - } - - /** - * Test the Lang::line method. - * - * @group laravel - */ - public function testGetMethodCanGetLinesForAGivenLanguage() - { - $validation = require path('app').'language/sp/validation.php'; - - $this->assertEquals($validation['required'], Lang::line('validation.required')->get('sp')); - } - - /** - * Test the __toString method. - * - * @group laravel - */ - public function testLineCanBeCastAsString() - { - $validation = require path('app').'language/en/validation.php'; - - $this->assertEquals($validation['required'], (string) Lang::line('validation.required')); - } - - /** - * Test that string replacements are made on lines. - * - * @group laravel - */ - public function testReplacementsAreMadeOnLines() - { - $validation = require path('app').'language/en/validation.php'; - - $line = str_replace(':attribute', 'e-mail', $validation['required']); - - $this->assertEquals($line, Lang::line('validation.required', array('attribute' => 'e-mail'))->get()); - } - - /** - * Test the Lang::has method. - * - * @group laravel - */ - public function testHasMethodIndicatesIfLangaugeLineExists() - { - $this->assertTrue(Lang::has('validation')); - $this->assertTrue(Lang::has('validation.required')); - $this->assertFalse(Lang::has('validation.foo')); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/messages.test.php b/laravel/tests/cases/messages.test.php deleted file mode 100644 index f007ecb7..00000000 --- a/laravel/tests/cases/messages.test.php +++ /dev/null @@ -1,115 +0,0 @@ -messages = new Laravel\Messages; - } - - /** - * Test the Messages::add method. - * - * @group laravel - */ - public function testAddingMessagesDoesNotCreateDuplicateMessages() - { - $this->messages->add('email', 'test'); - $this->messages->add('email', 'test'); - $this->assertCount(1, $this->messages->messages); - } - - /** - * Test the Messages::add method. - * - * @group laravel - */ - public function testAddMethodPutsMessageInMessagesArray() - { - $this->messages->add('email', 'test'); - $this->assertArrayHasKey('email', $this->messages->messages); - $this->assertEquals('test', $this->messages->messages['email'][0]); - } - - /** - * Test the Messages::has method. - * - * @group laravel - */ - public function testHasMethodReturnsTrue() - { - $this->messages->add('email', 'test'); - $this->assertTrue($this->messages->has('email')); - } - - /** - * Test the Messages::has method. - * - * @group laravel - */ - public function testHasMethodReturnsFalse() - { - $this->assertFalse($this->messages->has('something')); - } - - /** - * Test the Messages::first method. - * - * @group laravel - */ - public function testFirstMethodReturnsSingleString() - { - $this->messages->add('email', 'test'); - $this->assertEquals('test', $this->messages->first('email')); - $this->assertEquals('', $this->messages->first('something')); - } - - /** - * Test the Messages::get method. - * - * @group laravel - */ - public function testGetMethodReturnsAllMessagesForAttribute() - { - $messages = array('email' => array('something', 'else')); - $this->messages->messages = $messages; - $this->assertEquals(array('something', 'else'), $this->messages->get('email')); - } - - /** - * Test the Messages::all method. - * - * @group laravel - */ - public function testAllMethodReturnsAllErrorMessages() - { - $messages = array('email' => array('something', 'else'), 'name' => array('foo')); - $this->messages->messages = $messages; - $this->assertEquals(array('something', 'else', 'foo'), $this->messages->all()); - } - - /** - * Test the Messages::get method. - * - * @group laravel - */ - public function testMessagesRespectFormat() - { - $this->messages->add('email', 'test'); - $this->assertEquals('

    test

    ', $this->messages->first('email', '

    :message

    ')); - $this->assertEquals(array('

    test

    '), $this->messages->get('email', '

    :message

    ')); - $this->assertEquals(array('

    test

    '), $this->messages->all('

    :message

    ')); - } - - -} \ No newline at end of file diff --git a/laravel/tests/cases/query.test.php b/laravel/tests/cases/query.test.php deleted file mode 100644 index 17279150..00000000 --- a/laravel/tests/cases/query.test.php +++ /dev/null @@ -1,48 +0,0 @@ -assertEquals('taylor@example.com', $this->query()->find(1)->email); - } - - /** - * Test the select method. - * - * @group laravel - */ - public function testSelectMethodLimitsColumns() - { - $result = $this->query()->select(array('email'))->first(); - - $this->assertTrue(isset($result->email)); - $this->assertFalse(isset($result->name)); - } - - /** - * Test the raw_where method. - * - * @group laravel - */ - public function testRawWhereCanBeUsed() - { - - } - - /** - * Get the query instance for the test case. - * - * @return Query - */ - protected function query() - { - return DB::table('query_test'); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/redirect.test.php b/laravel/tests/cases/redirect.test.php deleted file mode 100644 index cce63a81..00000000 --- a/laravel/tests/cases/redirect.test.php +++ /dev/null @@ -1,143 +0,0 @@ -assertEquals(302, $redirect->status()); - $this->assertEquals('http://localhost/user/profile', $redirect->headers()->get('location')); - - $redirect = Redirect::to('user/profile', 301, true); - - $this->assertEquals(301, $redirect->status()); - $this->assertEquals('https://localhost/user/profile', $redirect->headers()->get('location')); - - $redirect = Redirect::to_secure('user/profile', 301); - - $this->assertEquals(301, $redirect->status()); - $this->assertEquals('https://localhost/user/profile', $redirect->headers()->get('location')); - } - - /** - * Test the Redirect::to_route method. - * - * @group laravel - */ - public function testRedirectsCanBeGeneratedForNamedRoutes() - { - Route::get('redirect', array('as' => 'redirect')); - Route::get('redirect/(:any)/(:any)', array('as' => 'redirect-2')); - Route::get('secure/redirect', array('https' => true, 'as' => 'redirect-3')); - - $this->assertEquals(301, Redirect::to_route('redirect', array(), 301, true)->status()); - $this->assertEquals('http://localhost/redirect', Redirect::to_route('redirect')->headers()->get('location')); - $this->assertEquals('https://localhost/secure/redirect', Redirect::to_route('redirect-3', array(), 302)->headers()->get('location')); - $this->assertEquals('http://localhost/redirect/1/2', Redirect::to_route('redirect-2', array('1', '2'))->headers()->get('location')); - } - - /** - * Test the Redirect::with method. - * - * @group laravel - */ - public function testWithMethodFlashesItemToSession() - { - $this->setSession(); - - $redirect = Redirect::to('')->with('name', 'Taylor'); - - $this->assertEquals('Taylor', Session::$instance->session['data'][':new:']['name']); - } - - /** - * Test the Redirect::with_input function. - * - * @group laravel - */ - public function testWithInputMethodFlashesInputToTheSession() - { - $this->setSession(); - - $input = array('name' => 'Taylor', 'age' => 25); - Request::foundation()->request->add($input); - - $redirect = Redirect::to('')->with_input(); - - $this->assertEquals($input, Session::$instance->session['data'][':new:']['laravel_old_input']); - - $redirect = Redirect::to('')->with_input('only', array('name')); - - $this->assertEquals(array('name' => 'Taylor'), Session::$instance->session['data'][':new:']['laravel_old_input']); - - $redirect = Redirect::to('')->with_input('except', array('name')); - - $this->assertEquals(array('age' => 25), Session::$instance->session['data'][':new:']['laravel_old_input']); - } - - /** - * Test the Redirect::with_errors method. - * - * @group laravel - */ - public function testWithErrorsFlashesErrorsToTheSession() - { - $this->setSession(); - - Redirect::to('')->with_errors(array('name' => 'Taylor')); - - $this->assertEquals(array('name' => 'Taylor'), Session::$instance->session['data'][':new:']['errors']); - - $validator = Validator::make(array(), array()); - $validator->errors = array('name' => 'Taylor'); - - Redirect::to('')->with_errors($validator); - - $this->assertEquals(array('name' => 'Taylor'), Session::$instance->session['data'][':new:']['errors']); - } - - /** - * Set the session payload instance. - */ - protected function setSession() - { - $driver = $this->getMock('Laravel\\Session\\Drivers\\Driver'); - - Session::$instance = new Laravel\Session\Payload($driver); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/request.test.php b/laravel/tests/cases/request.test.php deleted file mode 100644 index 4641a532..00000000 --- a/laravel/tests/cases/request.test.php +++ /dev/null @@ -1,177 +0,0 @@ -restartRequest(); - } - - /** - * Set one of the $_POST variables. - * - * @param string $key - * @param string $value - */ - protected function setPostVar($key, $value) - { - $_POST[$key] = $value; - - $this->restartRequest(); - } - - /** - * Reinitialize the global request. - * - * @return void - */ - protected function restartRequest() - { - // FIXME: Ugly hack, but old contents from previous requests seem to - // trip up the Foundation class. - $_FILES = array(); - - Request::$foundation = RequestFoundation::createFromGlobals(); - } - - /** - * Test the Request::method method. - * - * @group laravel - */ - public function testMethodReturnsTheHTTPRequestMethod() - { - $this->setServerVar('REQUEST_METHOD', 'POST'); - - $this->assertEquals('POST', Request::method()); - - $this->setPostVar(Request::spoofer, 'PUT'); - - $this->assertEquals('PUT', Request::method()); - } - - /** - * Test the Request::server method. - * - * @group laravel - */ - public function testServerMethodReturnsFromServerArray() - { - $this->setServerVar('TEST', 'something'); - $this->setServerVar('USER', array('NAME' => 'taylor')); - - $this->assertEquals('something', Request::server('test')); - $this->assertEquals('taylor', Request::server('user.name')); - } - - /** - * Test the Request::ip method. - * - * @group laravel - */ - public function testIPMethodReturnsClientIPAddress() - { - $this->setServerVar('REMOTE_ADDR', 'something'); - $this->assertEquals('something', Request::ip()); - - $this->setServerVar('HTTP_CLIENT_IP', 'something'); - $this->assertEquals('something', Request::ip()); - - $this->setServerVar('HTTP_CLIENT_IP', 'something'); - $this->assertEquals('something', Request::ip()); - - $_SERVER = array(); - $this->restartRequest(); - $this->assertEquals('0.0.0.0', Request::ip()); - } - - /** - * Test the Request::secure method. - * - * @group laravel - */ - public function testSecureMethodsIndicatesIfHTTPS() - { - $this->setServerVar('HTTPS', 'on'); - - $this->assertTrue(Request::secure()); - - $this->setServerVar('HTTPS', 'off'); - - $this->assertFalse(Request::secure()); - } - - /** - * Test the Request::ajax method. - * - * @group laravel - */ - public function testAjaxMethodIndicatesWhenAjax() - { - $this->assertFalse(Request::ajax()); - - $this->setServerVar('HTTP_X_REQUESTED_WITH', 'XMLHttpRequest'); - - $this->assertTrue(Request::ajax()); - } - - /** - * Test the Request::forged method. - * - * @group laravel - */ - public function testForgedMethodIndicatesIfRequestWasForged() - { - Session::$instance = new SessionPayloadTokenStub; - - $input = array(Session::csrf_token => 'Foo'); - Request::foundation()->request->add($input); - - $this->assertTrue(Request::forged()); - - $input = array(Session::csrf_token => 'Taylor'); - Request::foundation()->request->add($input); - - $this->assertFalse(Request::forged()); - } - - /** - * Test the Request::route method. - * - * @group laravel - */ - public function testRouteMethodReturnsStaticRoute() - { - Request::$route = 'Taylor'; - - $this->assertEquals('Taylor', Request::route()); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/response.test.php b/laravel/tests/cases/response.test.php deleted file mode 100644 index 11e48e74..00000000 --- a/laravel/tests/cases/response.test.php +++ /dev/null @@ -1,89 +0,0 @@ - 'baz')); - - $this->assertEquals('foo', $response->content); - $this->assertEquals(201, $response->status()); - $this->assertArrayHasKey('bar', $response->headers()->all()); - $this->assertEquals('baz', $response->headers()->get('bar')); - } - - /** - * Test the Response::view method. - * - * @group laravel - */ - public function testViewMethodSetsContentToView() - { - $response = Response::view('home.index', array('name' => 'Taylor')); - - $this->assertEquals('home.index', $response->content->view); - $this->assertEquals('Taylor', $response->content->data['name']); - } - - /** - * Test the Response::error method. - * - * @group laravel - */ - public function testErrorMethodSetsContentToErrorView() - { - $response = Response::error('404', array('name' => 'Taylor')); - - $this->assertEquals(404, $response->status()); - $this->assertEquals('error.404', $response->content->view); - $this->assertEquals('Taylor', $response->content->data['name']); - } - - /** - * Test the Response::prepare method. - * - * @group laravel - */ - public function testPrepareMethodCreatesAResponseInstanceFromGivenValue() - { - $response = Response::prepare('Taylor'); - - $this->assertInstanceOf('Laravel\\Response', $response); - $this->assertEquals('Taylor', $response->content); - - $response = Response::prepare(new Response('Taylor')); - - $this->assertInstanceOf('Laravel\\Response', $response); - $this->assertEquals('Taylor', $response->content); - } - - /** - * Test the Response::header method. - * - * @group laravel - */ - public function testHeaderMethodSetsValueInHeaderArray() - { - $response = Response::make('')->header('foo', 'bar'); - - $this->assertEquals('bar', $response->headers()->get('foo')); - } - - /** - * Test the Response::status method. - * - * @group laravel - */ - public function testStatusMethodSetsStatusCode() - { - $response = Response::make('')->status(404); - - $this->assertEquals(404, $response->status()); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/route.test.php b/laravel/tests/cases/route.test.php deleted file mode 100644 index 48919135..00000000 --- a/laravel/tests/cases/route.test.php +++ /dev/null @@ -1,179 +0,0 @@ - 'profile')); - $this->assertTrue($route->is('profile')); - $this->assertFalse($route->is('something')); - } - - /** - * Test the basic execution of a route. - * - * @group laravel - */ - public function testBasicRoutesCanBeExecutedProperly() - { - $route = new Route('GET', '', array(function() { return 'Route!'; })); - - $this->assertEquals('Route!', $route->call()->content); - $this->assertInstanceOf('Laravel\\Response', $route->call()); - } - - /** - * Test that route parameters are passed into the handlers. - * - * @group laravel - */ - public function testRouteParametersArePassedIntoTheHandler() - { - $route = new Route('GET', '', array(function($var) { return $var; }), array('Taylor')); - - $this->assertEquals('Taylor', $route->call()->content); - $this->assertInstanceOf('Laravel\\Response', $route->call()); - } - - /** - * Test that calling a route calls the global before and after filters. - * - * @group laravel - */ - public function testCallingARouteCallsTheBeforeAndAfterFilters() - { - $route = new Route('GET', '', array(function() { return 'Hi!'; })); - - $_SERVER['before'] = false; - $_SERVER['after'] = false; - - $route->call(); - - $this->assertTrue($_SERVER['before']); - $this->assertTrue($_SERVER['after']); - } - - /** - * Test that before filters override the route response. - * - * @group laravel - */ - public function testBeforeFiltersOverrideTheRouteResponse() - { - Filter::register('test-before', function() - { - return 'Filtered!'; - }); - - $route = new Route('GET', '', array('before' => 'test-before', function() { - return 'Route!'; - })); - - $this->assertEquals('Filtered!', $route->call()->content); - } - - /** - * Test that after filters do not affect the route response. - * - * @group laravel - */ - public function testAfterFilterDoesNotAffectTheResponse() - { - $_SERVER['test-after'] = false; - - Filter::register('test-after', function() - { - $_SERVER['test-after'] = true; - return 'Filtered!'; - }); - - $route = new Route('GET', '', array('after' => 'test-after', function() - { - return 'Route!'; - })); - - $this->assertEquals('Route!', $route->call()->content); - $this->assertTrue($_SERVER['test-after']); - } - - /** - * Test that the route calls the appropriate controller method when delegating. - * - * @group laravel - */ - public function testControllerActionCalledWhenDelegating() - { - $_SERVER['REQUEST_METHOD'] = 'GET'; - - $route = new Route('GET', '', array('uses' => 'auth@index')); - - $this->assertEquals('action_index', $route->call()->content); - } - - /** - * Test that filter parameters are passed to the filter. - * - * @group laravel - */ - public function testFilterParametersArePassedToFilter() - { - Filter::register('test-params', function($var1, $var2) - { - return $var1.$var2; - }); - - $route = new Route('GET', '', array('before' => 'test-params:1,2')); - - $this->assertEquals('12', $route->call()->content); - } - - /** - * Test that multiple filters can be assigned to a route. - * - * @group laravel - */ - public function testMultipleFiltersCanBeAssignedToARoute() - { - $_SERVER['test-multi-1'] = false; - $_SERVER['test-multi-2'] = false; - - Filter::register('test-multi-1', function() { $_SERVER['test-multi-1'] = true; }); - Filter::register('test-multi-2', function() { $_SERVER['test-multi-2'] = true; }); - - $route = new Route('GET', '', array('before' => 'test-multi-1|test-multi-2')); - - $route->call(); - - $this->assertTrue($_SERVER['test-multi-1']); - $this->assertTrue($_SERVER['test-multi-2']); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/routing.test.php b/laravel/tests/cases/routing.test.php deleted file mode 100644 index 68a112a0..00000000 --- a/laravel/tests/cases/routing.test.php +++ /dev/null @@ -1,160 +0,0 @@ - 'home')); - Route::get('dashboard', array('as' => 'dashboard')); - - $home = Router::find('home'); - $dashboard = Router::find('dashboard'); - - $this->assertTrue(isset($home['/'])); - $this->assertTrue(isset($dashboard['dashboard'])); - } - - /** - * Test the basic routing mechanism. - * - * @group laravel - */ - public function testBasicRouteCanBeRouted() - { - Route::get('/', function() {}); - Route::get('home, main', function() {}); - - $this->assertEquals('/', Router::route('GET', '/')->uri); - $this->assertEquals('home', Router::route('GET', 'home')->uri); - $this->assertEquals('main', Router::route('GET', 'main')->uri); - } - - /** - * Test that the router can handle basic wildcards. - * - * @group laravel - */ - public function testWildcardRoutesCanBeRouted() - { - Route::get('user/(:num)', function() {}); - Route::get('profile/(:any)/(:num)', function() {}); - - $this->assertNull(Router::route('GET', 'user/1.5')); - $this->assertNull(Router::route('GET', 'user/taylor')); - $this->assertEquals(array(25), Router::route('GET', 'user/25')->parameters); - $this->assertEquals('user/(:num)', Router::route('GET', 'user/1')->uri); - - $this->assertNull(Router::route('GET', 'profile/1/otwell')); - $this->assertNull(Router::route('POST', 'profile/taylor/1')); - $this->assertNull(Router::route('GET', 'profile/taylor/otwell')); - $this->assertNull(Router::route('GET', 'profile/taylor/1/otwell')); - $this->assertEquals(array('taylor', 25), Router::route('GET', 'profile/taylor/25')->parameters); - $this->assertEquals('profile/(:any)/(:num)', Router::route('GET', 'profile/taylor/1')->uri); - } - - /** - * Test that optional wildcards can be routed. - * - * @group laravel - */ - public function testOptionalWildcardsCanBeRouted() - { - Route::get('user/(:num?)', function() {}); - Route::get('profile/(:any)/(:any?)', function() {}); - - $this->assertNull(Router::route('GET', 'user/taylor')); - $this->assertEquals('user/(:num?)', Router::route('GET', 'user')->uri); - $this->assertEquals(array(25), Router::route('GET', 'user/25')->parameters); - $this->assertEquals('user/(:num?)', Router::route('GET', 'user/1')->uri); - - $this->assertNull(Router::route('GET', 'profile/taylor/otwell/test')); - $this->assertEquals('profile/(:any)/(:any?)', Router::route('GET', 'profile/taylor')->uri); - $this->assertEquals('profile/(:any)/(:any?)', Router::route('GET', 'profile/taylor/25')->uri); - $this->assertEquals('profile/(:any)/(:any?)', Router::route('GET', 'profile/taylor/otwell')->uri); - $this->assertEquals(array('taylor', 'otwell'), Router::route('GET', 'profile/taylor/otwell')->parameters); - } - - /** - * Test that basic controller routing is working. - * - * @group laravel - */ - public function testBasicRouteToControllerIsRouted() - { - $this->assertEquals('auth@(:1)', Router::route('GET', 'auth')->action['uses']); - $this->assertEquals('home@(:1)', Router::route('GET', 'home/index')->action['uses']); - $this->assertEquals('home@(:1)', Router::route('GET', 'home/profile')->action['uses']); - $this->assertEquals('admin.panel@(:1)', Router::route('GET', 'admin/panel')->action['uses']); - $this->assertEquals('admin.panel@(:1)', Router::route('GET', 'admin/panel/show')->action['uses']); - } - - /** - * Test basic bundle route resolution. - * - * @group laravel - */ - public function testRoutesToBundlesCanBeResolved() - { - $this->assertNull(Router::route('GET', 'dashboard/foo')); - $this->assertEquals('dashboard', Router::route('GET', 'dashboard')->uri); - } - - /** - * Test bundle controller route resolution. - * - * @group laravel - */ - public function testBundleControllersCanBeResolved() - { - $this->assertEquals('dashboard::panel@(:1)', Router::route('GET', 'dashboard/panel')->action['uses']); - $this->assertEquals('dashboard::panel@(:1)', Router::route('GET', 'dashboard/panel/show')->action['uses']); - } - - /** - * Test foreign characters can be used in routes. - * - * @group laravel - */ - public function testForeignCharsInRoutes() - { - Route::get(urlencode('مدرس_رياضيات').'/(:any)', function() {}); - Route::get(urlencode('مدرس_رياضيات'), function() {}); - Route::get(urlencode('ÇœŪ'), function() {}); - Route::get(urlencode('私は料理が大好き'), function() {}); - - $this->assertEquals(array(urlencode('مدرس_رياضيات')), Router::route('GET', urlencode('مدرس_رياضيات').'/'.urlencode('مدرس_رياضيات'))->parameters); - $this->assertEquals(urlencode('مدرس_رياضيات'), Router::route('GET', urlencode('مدرس_رياضيات'))->uri); - $this->assertEquals(urlencode('ÇœŪ'), Router::route('GET', urlencode('ÇœŪ'))->uri); - $this->assertEquals(urlencode('私は料理が大好き'), Router::route('GET', urlencode('私は料理が大好き'))->uri); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/session.test.php b/laravel/tests/cases/session.test.php deleted file mode 100644 index b310870c..00000000 --- a/laravel/tests/cases/session.test.php +++ /dev/null @@ -1,443 +0,0 @@ -assertEquals('Foo', Session::test()); - } - - /** - * Test the Session::started method. - * - * @group laravel - */ - public function testStartedMethodIndicatesIfSessionIsStarted() - { - $this->assertFalse(Session::started()); - Session::$instance = 'foo'; - $this->assertTrue(Session::started()); - } - - /** - * Test the Payload::load method. - * - * @group laravel - */ - public function testLoadMethodCreatesNewSessionWithNullIDGiven() - { - $payload = $this->getPayload(); - $payload->load(null); - $this->verifyNewSession($payload); - } - - /** - * Test the Payload::load method. - * - * @group laravel - */ - public function testLoadMethodCreatesNewSessionWhenSessionIsExpired() - { - $payload = $this->getPayload(); - - $session = $this->getSession(); - $session['last_activity'] = time() - 10000; - - $payload->driver->expects($this->any()) - ->method('load') - ->will($this->returnValue($session)); - - $payload->load('foo'); - - $this->verifyNewSession($payload); - $this->assertTrue($payload->session['id'] !== $session['id']); - } - - /** - * Assert that a session is new. - * - * @param Payload $payload - * @return void - */ - protected function verifyNewSession($payload) - { - $this->assertFalse($payload->exists); - $this->assertTrue(isset($payload->session['id'])); - $this->assertEquals(array(), $payload->session['data'][':new:']); - $this->assertEquals(array(), $payload->session['data'][':old:']); - $this->assertTrue(isset($payload->session['data'][Session::csrf_token])); - } - - /** - * Test the Payload::load method. - * - * @group laravel - */ - public function testLoadMethodSetsValidSession() - { - $payload = $this->getPayload(); - - $session = $this->getSession(); - - $payload->driver->expects($this->any()) - ->method('load') - ->will($this->returnValue($session)); - - $payload->load('foo'); - - $this->assertEquals($session, $payload->session); - } - - /** - * Test the Payload::load method. - * - * @group laravel - */ - public function testLoadMethodSetsCSRFTokenIfDoesntExist() - { - $payload = $this->getPayload(); - - $session = $this->getSession(); - - unset($session['data']['csrf_token']); - - $payload->driver->expects($this->any()) - ->method('load') - ->will($this->returnValue($session)); - - $payload->load('foo'); - - $this->assertEquals('foo', $payload->session['id']); - $this->assertTrue(isset($payload->session['data']['csrf_token'])); - } - - /** - * Test the various data retrieval methods. - * - * @group laravel - */ - public function testSessionDataCanBeRetrievedProperly() - { - $payload = $this->getPayload(); - - $payload->session = $this->getSession(); - - $this->assertTrue($payload->has('name')); - $this->assertEquals('Taylor', $payload->get('name')); - $this->assertFalse($payload->has('foo')); - $this->assertEquals('Default', $payload->get('foo', 'Default')); - $this->assertTrue($payload->has('votes')); - $this->assertEquals(10, $payload->get('votes')); - $this->assertTrue($payload->has('state')); - $this->assertEquals('AR', $payload->get('state')); - } - - /** - * Test the various data manipulation methods. - * - * @group laravel - */ - public function testDataCanBeSetProperly() - { - $payload = $this->getPayload(); - - $payload->session = $this->getSession(); - - // Test the "put" and "flash" methods. - $payload->put('name', 'Weldon'); - $this->assertEquals('Weldon', $payload->session['data']['name']); - $payload->flash('language', 'php'); - $this->assertEquals('php', $payload->session['data'][':new:']['language']); - - // Test the "reflash" method. - $payload->session['data'][':new:'] = array('name' => 'Taylor'); - $payload->session['data'][':old:'] = array('age' => 25); - $payload->reflash(); - $this->assertEquals(array('name' => 'Taylor', 'age' => 25), $payload->session['data'][':new:']); - - // Test the "keep" method. - $payload->session['data'][':new:'] = array(); - $payload->keep(array('age')); - $this->assertEquals(25, $payload->session['data'][':new:']['age']); - } - - /** - * Test the Payload::forget method. - * - * @group laravel - */ - public function testSessionDataCanBeForgotten() - { - $payload = $this->getPayload(); - - $payload->session = $this->getSession(); - - $this->assertTrue(isset($payload->session['data']['name'])); - $payload->forget('name'); - $this->assertFalse(isset($payload->session['data']['name'])); - } - - /** - * Test the Payload::flush method. - * - * @group laravel - */ - public function testFlushMaintainsTokenButDeletesEverythingElse() - { - $payload = $this->getPayload(); - - $payload->session = $this->getSession(); - - $this->assertTrue(isset($payload->session['data']['name'])); - $payload->flush(); - $this->assertFalse(isset($payload->session['data']['name'])); - $this->assertEquals('bar', $payload->session['data']['csrf_token']); - $this->assertEquals(array(), $payload->session['data'][':new:']); - $this->assertEquals(array(), $payload->session['data'][':old:']); - } - - /** - * Test the Payload::regenerate method. - * - * @group laravel - */ - public function testRegenerateMethodSetsNewIDAndTurnsOffExistenceIndicator() - { - $payload = $this->getPayload(); - - $payload->sesion = $this->getSession(); - $payload->exists = true; - $payload->regenerate(); - - $this->assertFalse($payload->exists); - $this->assertTrue(strlen($payload->session['id']) == 40); - } - - /** - * Test the Payload::token method. - * - * @group laravel - */ - public function testTokenMethodReturnsCSRFToken() - { - $payload = $this->getPayload(); - $payload->session = $this->getSession(); - - $this->assertEquals('bar', $payload->token()); - } - - /** - * Test the Payload::save method. - * - * @group laravel - */ - public function testSaveMethodCorrectlyCallsDriver() - { - $payload = $this->getPayload(); - $session = $this->getSession(); - $payload->session = $session; - $payload->exists = true; - $config = Laravel\Config::get('session'); - - $expect = $session; - $expect['data'][':old:'] = $session['data'][':new:']; - $expect['data'][':new:'] = array(); - - $payload->driver->expects($this->once()) - ->method('save') - ->with($this->equalTo($expect), $this->equalTo($config), $this->equalTo(true)); - - $payload->save(); - - $this->assertEquals($session['data'][':new:'], $payload->session['data'][':old:']); - } - - /** - * Test the Payload::save method. - * - * @group laravel - */ - public function testSaveMethodSweepsIfSweeperAndOddsHitWithTimeGreaterThanThreshold() - { - Config::set('session.sweepage', array(100, 100)); - - $payload = $this->getPayload(); - $payload->driver = $this->getMock('Laravel\\Session\\Drivers\\File', array('save', 'sweep'), array(null)); - $payload->session = $this->getSession(); - - $expiration = time() - (Config::get('session.lifetime') * 60); - - // Here we set the time to the expected expiration minus 5 seconds, just to - // allow plenty of room for PHP execution. In the next test, we'll do the - // same thing except add 5 seconds to check that the time is between a - // given window. - $payload->driver->expects($this->once()) - ->method('sweep') - ->with($this->greaterThan($expiration - 5)); - - $payload->save(); - - Config::set('session.sweepage', array(2, 100)); - } - - /** - * Test the Payload::save method. - * - * @group laravel - */ - public function testSaveMethodSweepsIfSweeperAndOddsHitWithTimeLessThanThreshold() - { - Config::set('session.sweepage', array(100, 100)); - - $payload = $this->getPayload(); - $payload->driver = $this->getMock('Laravel\\Session\\Drivers\\File', array('save', 'sweep'), array(null)); - $payload->session = $this->getSession(); - - $expiration = time() - (Config::get('session.lifetime') * 60); - - $payload->driver->expects($this->once()) - ->method('sweep') - ->with($this->lessThan($expiration + 5)); - - $payload->save(); - - Config::set('session.sweepage', array(2, 100)); - } - - /** - * Test that the session sweeper is never called if not a sweeper. - * - * @group laravel - */ - public function testSweeperShouldntBeCalledIfDriverIsntSweeper() - { - Config::set('session.sweepage', array(100, 100)); - - $payload = $this->getPayload(); - $payload->driver = $this->getMock('Laravel\\Session\\Drivers\\APC', array('save', 'sweep'), array(), '', false); - $payload->session = $this->getSession(); - - $payload->driver->expects($this->never())->method('sweep'); - - $payload->save(); - - Config::set('session.sweepage', array(2, 100)); - } - - /** - * Test the Payload::save method. - * - * @group laravel - */ - public function testSaveMethodSetsCookieWithCorrectValues() - { - $payload = $this->getPayload(); - $payload->session = $this->getSession(); - $payload->save(); - - $this->assertTrue(isset(Cookie::$jar[Config::get('session.cookie')])); - - $cookie = Cookie::$jar[Config::get('session.cookie')]; - - $this->assertEquals(Cookie::hash('foo').'+foo', $cookie['value']); - // Shouldn't be able to test this cause session.lifetime store number of minutes - // while cookie expiration store timestamp when it going to expired. - // $this->assertEquals(Config::get('session.lifetime'), $cookie['expiration']); - $this->assertEquals(Config::get('session.domain'), $cookie['domain']); - $this->assertEquals(Config::get('session.path'), $cookie['path']); - $this->assertEquals(Config::get('session.secure'), $cookie['secure']); - } - - /** - * Test the Session::activity method. - * - * @group laravel - */ - public function testActivityMethodReturnsLastActivity() - { - $payload = $this->getPayload(); - $payload->session['last_activity'] = 10; - $this->assertEquals(10, $payload->activity()); - } - - /** - * Get a session payload instance. - * - * @return Payload - */ - protected function getPayload() - { - return new Payload($this->getMockDriver()); - } - - /** - * Get a mock driver instance. - * - * @return Driver - */ - protected function getMockDriver() - { - $mock = $this->getMock('Laravel\\Session\\Drivers\\Driver', array('id', 'load', 'save', 'delete')); - - $mock->expects($this->any())->method('id')->will($this->returnValue(Str::random(40))); - - return $mock; - } - - /** - * Get a dummy session. - * - * @return array - */ - protected function getSession() - { - return array( - 'id' => 'foo', - 'last_activity' => time(), - 'data' => array( - 'name' => 'Taylor', - 'age' => 25, - 'csrf_token' => 'bar', - ':new:' => array( - 'votes' => 10, - ), - ':old:' => array( - 'state' => 'AR', - ), - )); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/str.test.php b/laravel/tests/cases/str.test.php deleted file mode 100644 index 7c380600..00000000 --- a/laravel/tests/cases/str.test.php +++ /dev/null @@ -1,135 +0,0 @@ -assertEquals('UTF-8', Config::get('application.encoding')); - Config::set('application.encoding', 'foo'); - $this->assertEquals('foo', Config::get('application.encoding')); - Config::set('application.encoding', 'UTF-8'); - } - - /** - * Test the Str::length method. - * - * @group laravel - */ - public function testStringLengthIsCorrect() - { - $this->assertEquals(6, Str::length('Taylor')); - $this->assertEquals(5, Str::length('ラドクリフ')); - } - - /** - * Test the Str::lower method. - * - * @group laravel - */ - public function testStringCanBeConvertedToLowercase() - { - $this->assertEquals('taylor', Str::lower('TAYLOR')); - $this->assertEquals('άχιστη', Str::lower('ΆΧΙΣΤΗ')); - } - - /** - * Test the Str::upper method. - * - * @group laravel - */ - public function testStringCanBeConvertedToUppercase() - { - $this->assertEquals('TAYLOR', Str::upper('taylor')); - $this->assertEquals('ΆΧΙΣΤΗ', Str::upper('άχιστη')); - } - - /** - * Test the Str::title method. - * - * @group laravel - */ - public function testStringCanBeConvertedToTitleCase() - { - $this->assertEquals('Taylor', Str::title('taylor')); - $this->assertEquals('Άχιστη', Str::title('άχιστη')); - } - - /** - * Test the Str::limit method. - * - * @group laravel - */ - public function testStringCanBeLimitedByCharacters() - { - $this->assertEquals('Tay...', Str::limit('Taylor', 3)); - $this->assertEquals('Taylor', Str::limit('Taylor', 6)); - $this->assertEquals('Tay___', Str::limit('Taylor', 3, '___')); - } - - /** - * Test the Str::words method. - * - * @group laravel - */ - public function testStringCanBeLimitedByWords() - { - $this->assertEquals('Taylor...', Str::words('Taylor Otwell', 1)); - $this->assertEquals('Taylor___', Str::words('Taylor Otwell', 1, '___')); - $this->assertEquals('Taylor Otwell', Str::words('Taylor Otwell', 3)); - } - - /** - * Test the Str::plural and Str::singular methods. - * - * @group laravel - */ - public function testStringsCanBeSingularOrPlural() - { - $this->assertEquals('user', Str::singular('users')); - $this->assertEquals('users', Str::plural('user')); - $this->assertEquals('User', Str::singular('Users')); - $this->assertEquals('Users', Str::plural('User')); - $this->assertEquals('user', Str::plural('user', 1)); - $this->assertEquals('users', Str::plural('user', 2)); - $this->assertEquals('chassis', Str::plural('chassis', 2)); - $this->assertEquals('traffic', Str::plural('traffic', 2)); - } - - /** - * Test the Str::slug method. - * - * @group laravel - */ - public function testStringsCanBeSlugged() - { - $this->assertEquals('my-new-post', Str::slug('My nEw post!!!')); - $this->assertEquals('my_new_post', Str::slug('My nEw post!!!', '_')); - } - - /** - * Test the Str::classify method. - * - * @group laravel - */ - public function testStringsCanBeClassified() - { - $this->assertEquals('Something_Else', Str::classify('something.else')); - $this->assertEquals('Something_Else', Str::classify('something_else')); - } - - /** - * Test the Str::random method. - * - * @group laravel - */ - public function testRandomStringsCanBeGenerated() - { - $this->assertEquals(40, strlen(Str::random(40))); - } - -} diff --git a/laravel/tests/cases/uri.test.php b/laravel/tests/cases/uri.test.php deleted file mode 100644 index 8f2b85ff..00000000 --- a/laravel/tests/cases/uri.test.php +++ /dev/null @@ -1,75 +0,0 @@ -setRequestUri($uri); - - $this->assertEquals($expectation, URI::current()); - } - - /** - * Test the URI::segment method. - * - * @group laravel - */ - public function testSegmentMethodReturnsAURISegment() - { - $this->setRequestUri('/user/profile'); - - $this->assertEquals('user', URI::segment(1)); - $this->assertEquals('profile', URI::segment(2)); - } - - /** - * Data provider for the URI::current test. - */ - public function requestUriProvider() - { - return array( - array('/user', 'user'), - array('/user/', 'user'), - array('', '/'), - array('/', '/'), - array('//', '/'), - array('/user', 'user'), - array('/user/', 'user'), - array('/user/profile', 'user/profile'), - ); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/url.test.php b/laravel/tests/cases/url.test.php deleted file mode 100644 index 290a1db0..00000000 --- a/laravel/tests/cases/url.test.php +++ /dev/null @@ -1,151 +0,0 @@ -assertEquals('http://localhost/index.php/user/profile', URL::to('user/profile')); - $this->assertEquals('https://localhost/index.php/user/profile', URL::to('user/profile', true)); - - Config::set('application.index', ''); - - $this->assertEquals('http://localhost/user/profile', URL::to('user/profile')); - $this->assertEquals('https://localhost/user/profile', URL::to('user/profile', true)); - - Config::set('application.ssl', false); - - $this->assertEquals('http://localhost/user/profile', URL::to('user/profile', true)); - } - - /** - * Test the URL::to_action method. - * - * @group laravel - */ - public function testToActionMethodGeneratesURLToControllerAction() - { - Route::get('foo/bar/(:any?)', 'foo@baz'); - $this->assertEquals('http://localhost/index.php/x/y', URL::to_action('x@y')); - $this->assertEquals('http://localhost/index.php/x/y/Taylor', URL::to_action('x@y', array('Taylor'))); - $this->assertEquals('http://localhost/index.php/foo/bar', URL::to_action('foo@baz')); - $this->assertEquals('http://localhost/index.php/foo/bar/Taylor', URL::to_action('foo@baz', array('Taylor'))); - } - - /** - * Test the URL::to_asset method. - * - * @group laravel - */ - public function testToAssetGeneratesURLWithoutFrontControllerInURL() - { - $this->assertEquals('http://localhost/image.jpg', URL::to_asset('image.jpg')); - $this->assertEquals('https://localhost/image.jpg', URL::to_asset('image.jpg', true)); - - Config::set('application.index', ''); - - $this->assertEquals('http://localhost/image.jpg', URL::to_asset('image.jpg')); - $this->assertEquals('https://localhost/image.jpg', URL::to_asset('image.jpg', true)); - - Request::foundation()->server->add(array('HTTPS' => 'on')); - - $this->assertEquals('https://localhost/image.jpg', URL::to_asset('image.jpg')); - - Request::foundation()->server->add(array('HTTPS' => 'off')); - } - - /** - * Test the URL::to_route method. - * - * @group laravel - */ - public function testToRouteMethodGeneratesURLsToRoutes() - { - Route::get('url/test', array('as' => 'url-test')); - Route::get('url/test/(:any)/(:any?)', array('as' => 'url-test-2')); - Route::get('url/secure/(:any)/(:any?)', array('as' => 'url-test-3', 'https' => true)); - - $this->assertEquals('http://localhost/index.php/url/test', URL::to_route('url-test')); - $this->assertEquals('http://localhost/index.php/url/test/taylor', URL::to_route('url-test-2', array('taylor'))); - $this->assertEquals('https://localhost/index.php/url/secure/taylor', URL::to_route('url-test-3', array('taylor'))); - $this->assertEquals('http://localhost/index.php/url/test/taylor/otwell', URL::to_route('url-test-2', array('taylor', 'otwell'))); - } - - /** - * Test the URL::to_language method. - * - * @group laravel - */ - public function testToLanguageMethodGeneratesURLsToDifferentLanguage() - { - URI::$uri = 'foo/bar'; - Config::set('application.languages', array('sp', 'fr')); - Config::set('application.language', 'sp'); - - $this->assertEquals('http://localhost/index.php/fr/foo/bar', URL::to_language('fr')); - $this->assertEquals('http://localhost/index.php/fr/', URL::to_language('fr', true)); - - Config::set('application.index', ''); - $this->assertEquals('http://localhost/fr/foo/bar', URL::to_language('fr')); - - $this->assertEquals('http://localhost/sp/foo/bar', URL::to_language('en')); - } - - - /** - * Test language based URL generation. - * - * @group laravel - */ - public function testUrlsGeneratedWithLanguages() - { - Config::set('application.languages', array('sp', 'fr')); - Config::set('application.language', 'sp'); - $this->assertEquals('http://localhost/index.php/sp/foo', URL::to('foo')); - $this->assertEquals('http://localhost/foo.jpg', URL::to_asset('foo.jpg')); - - Config::set('application.index', ''); - $this->assertEquals('http://localhost/sp/foo', URL::to('foo')); - - Config::set('application.index', 'index.php'); - Config::set('application.language', 'en'); - $this->assertEquals('http://localhost/index.php/foo', URL::to('foo')); - Config::set('application.languages', array()); - } - -} \ No newline at end of file diff --git a/laravel/tests/cases/validator.test.php b/laravel/tests/cases/validator.test.php deleted file mode 100644 index 30700f54..00000000 --- a/laravel/tests/cases/validator.test.php +++ /dev/null @@ -1,711 +0,0 @@ - 'Taylor Otwell'); - $rules = array('name' => 'required'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['name'] = ''; - $this->assertFalse(Validator::make($input, $rules)->valid()); - - unset($input['name']); - $this->assertFalse(Validator::make($input, $rules)->valid()); - - $_FILES['name']['tmp_name'] = 'foo'; - $this->assertTrue(Validator::make($_FILES, $rules)->valid()); - - $_FILES['name']['tmp_name'] = ''; - $this->assertFalse(Validator::make($_FILES, $rules)->valid()); - } - - /** - * Test the confirmed validation rule. - * - * @group laravel - */ - public function testTheConfirmedRule() - { - $input = array('password' => 'foo', 'password_confirmation' => 'foo'); - $rules = array('password' => 'confirmed'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['password_confirmation'] = 'foo_bar'; - $this->assertFalse(Validator::make($input, $rules)->valid()); - - unset($input['password_confirmation']); - $this->assertFalse(Validator::make($input, $rules)->valid()); - } - - /** - * Test the different validation rule. - * - * @group laravel - */ - public function testTheDifferentRule() - { - $input = array('password' => 'foo', 'password_confirmation' => 'bar'); - $rules = array('password' => 'different:password_confirmation'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['password_confirmation'] = 'foo'; - $this->assertFalse(Validator::make($input, $rules)->valid()); - - unset($input['password_confirmation']); - $this->assertFalse(Validator::make($input, $rules)->valid()); - } - - /** - * Test the accepted validation rule. - * - * @group laravel - */ - public function testTheAcceptedRule() - { - $input = array('terms' => '1'); - $rules = array('terms' => 'accepted'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['terms'] = 'yes'; - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['terms'] = '2'; - $this->assertFalse(Validator::make($input, $rules)->valid()); - - // The accepted rule implies required, so should fail if field not present. - unset($input['terms']); - $this->assertFalse(Validator::make($input, $rules)->valid()); - } - - /** - * Test the numeric validation rule. - * - * @group laravel - */ - public function testTheNumericRule() - { - $input = array('amount' => '1.21'); - $rules = array('amount' => 'numeric'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['amount'] = '1'; - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['amount'] = 1.2; - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['amount'] = '1.2a'; - $this->assertFalse(Validator::make($input, $rules)->valid()); - } - - /** - * Test the integer validation rule. - * - * @group laravel - */ - public function testTheIntegerRule() - { - $input = array('amount' => '1'); - $rules = array('amount' => 'integer'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['amount'] = '0'; - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['amount'] = 1.2; - $this->assertFalse(Validator::make($input, $rules)->valid()); - - $input['amount'] = '1.2a'; - $this->assertFalse(Validator::make($input, $rules)->valid()); - } - - /** - * Test the size validation rule. - * - * @group laravel - */ - public function testTheSizeRule() - { - $input = array('amount' => '1.21'); - $rules = array('amount' => 'numeric|size:1.21'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $rules = array('amount' => 'numeric|size:1'); - $this->assertFalse(Validator::make($input, $rules)->valid()); - - // If no numeric rule is on the field, it is treated as a string - $input = array('amount' => '111'); - $rules = array('amount' => 'size:3'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $rules = array('amount' => 'size:4'); - $this->assertFalse(Validator::make($input, $rules)->valid()); - - // The size rules checks kilobytes on files - $_FILES['photo']['tmp_name'] = 'foo'; - $_FILES['photo']['size'] = 10240; - $rules = array('photo' => 'size:10'); - $this->assertTrue(Validator::make($_FILES, $rules)->valid()); - - $_FILES['photo']['size'] = 14000; - $this->assertFalse(Validator::make($_FILES, $rules)->valid()); - } - - /** - * Test the between validation rule. - * - * @group laravel - */ - public function testTheBetweenRule() - { - $input = array('amount' => '1.21'); - $rules = array('amount' => 'numeric|between:1,2'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $rules = array('amount' => 'numeric|between:2,3'); - $this->assertFalse(Validator::make($input, $rules)->valid()); - - // If no numeric rule is on the field, it is treated as a string - $input = array('amount' => '111'); - $rules = array('amount' => 'between:1,3'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $rules = array('amount' => 'between:100,111'); - $this->assertFalse(Validator::make($input, $rules)->valid()); - - // The size rules checks kilobytes on files - $_FILES['photo']['tmp_name'] = 'foo'; - $_FILES['photo']['size'] = 10240; - $rules = array('photo' => 'between:9,11'); - $this->assertTrue(Validator::make($_FILES, $rules)->valid()); - - $_FILES['photo']['size'] = 14000; - $this->assertFalse(Validator::make($_FILES, $rules)->valid()); - } - - /** - * Test the between validation rule. - * - * @group laravel - */ - public function testTheMinRule() - { - $input = array('amount' => '1.21'); - $rules = array('amount' => 'numeric|min:1'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $rules = array('amount' => 'numeric|min:2'); - $this->assertFalse(Validator::make($input, $rules)->valid()); - - // If no numeric rule is on the field, it is treated as a string - $input = array('amount' => '01'); - $rules = array('amount' => 'min:2'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $rules = array('amount' => 'min:3'); - $this->assertFalse(Validator::make($input, $rules)->valid()); - - // The size rules checks kilobytes on files - $_FILES['photo']['tmp_name'] = 'foo'; - $_FILES['photo']['size'] = 10240; - $rules = array('photo' => 'min:9'); - $this->assertTrue(Validator::make($_FILES, $rules)->valid()); - - $_FILES['photo']['size'] = 8000; - $this->assertFalse(Validator::make($_FILES, $rules)->valid()); - } - - /** - * Test the between validation rule. - * - * @group laravel - */ - public function testTheMaxRule() - { - $input = array('amount' => '1.21'); - $rules = array('amount' => 'numeric|max:2'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $rules = array('amount' => 'numeric|max:1'); - $this->assertFalse(Validator::make($input, $rules)->valid()); - - // If no numeric rule is on the field, it is treated as a string - $input = array('amount' => '01'); - $rules = array('amount' => 'max:3'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $rules = array('amount' => 'max:1'); - $this->assertFalse(Validator::make($input, $rules)->valid()); - - // The size rules checks kilobytes on files - $_FILES['photo']['tmp_name'] = 'foo'; - $_FILES['photo']['size'] = 10240; - $rules = array('photo' => 'max:11'); - $this->assertTrue(Validator::make($_FILES, $rules)->valid()); - - $_FILES['photo']['size'] = 140000; - $this->assertFalse(Validator::make($_FILES, $rules)->valid()); - } - - /** - * Test the in validation rule. - * - * @group laravel - */ - public function testTheInRule() - { - $input = array('size' => 'L'); - $rules = array('size' => 'in:S,M,L'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['size'] = 'XL'; - $this->assertFalse(Validator::make($input, $rules)->valid()); - } - - /** - * Test the not-in validation rule. - * - * @group laravel - */ - public function testTheNotInRule() - { - $input = array('size' => 'L'); - $rules = array('size' => 'not_in:S,M,L'); - $this->assertFalse(Validator::make($input, $rules)->valid()); - - $input['size'] = 'XL'; - $this->assertTrue(Validator::make($input, $rules)->valid()); - } - - /** - * Test the IP validation rule. - * - * @group laravel - */ - public function testTheIPRule() - { - $input = array('ip' => '192.168.1.1'); - $rules = array('ip' => 'ip'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['ip'] = '192.111'; - $this->assertFalse(Validator::make($input, $rules)->valid()); - } - - /** - * Test the e-mail validation rule. - * - * @group laravel - */ - public function testTheEmailRule() - { - $input = array('email' => 'example@gmail.com'); - $rules = array('email' => 'email'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['email'] = 'blas-asok'; - $this->assertFalse(Validator::make($input, $rules)->valid()); - } - - /** - * Test the URL validation rule. - * - * @group laravel - */ - public function testTheUrlRule() - { - $input = array('url' => 'http://www.google.com'); - $rules = array('url' => 'url'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['url'] = 'blas-asok'; - $this->assertFalse(Validator::make($input, $rules)->valid()); - } - - /** - * Test the active URL validation rule. - * - * @group laravel - */ - public function testTheActiveUrlRule() - { - $input = array('url' => 'http://google.com'); - $rules = array('url' => 'active_url'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['url'] = 'http://asdlk-aselkaiwels.com'; - $this->assertFalse(Validator::make($input, $rules)->valid()); - } - - /** - * Test the image validation rule. - * - * @group laravel - */ - public function testTheImageRule() - { - $_FILES['photo']['tmp_name'] = path('storage').'files/desert.jpg'; - $rules = array('photo' => 'image'); - $this->assertTrue(Validator::make($_FILES, $rules)->valid()); - - $_FILES['photo']['tmp_name'] = path('app').'routes.php'; - $this->assertFalse(Validator::make($_FILES, $rules)->valid()); - } - - /** - * Test the alpha validation rule. - * - * @group laravel - */ - public function testTheAlphaRule() - { - $input = array('name' => 'TaylorOtwell'); - $rules = array('name' => 'alpha'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['name'] = 'Taylor Otwell'; - $this->assertFalse(Validator::make($input, $rules)->valid()); - } - - /** - * Test the alpha_num validation rule. - * - * @group laravel - */ - public function testTheAlphaNumRule() - { - $input = array('name' => 'TaylorOtwell1'); - $rules = array('name' => 'alpha_num'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['name'] = 'Taylor Otwell'; - $this->assertFalse(Validator::make($input, $rules)->valid()); - } - - /** - * Test the alpha_num validation rule. - * - * @group laravel - */ - public function testTheAlphaDashRule() - { - $input = array('name' => 'Taylor-Otwell_1'); - $rules = array('name' => 'alpha_dash'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['name'] = 'Taylor Otwell'; - $this->assertFalse(Validator::make($input, $rules)->valid()); - } - - /** - * Test the mimes validation rule. - * - * @group laravel - */ - public function testTheMimesRule() - { - $_FILES['file']['tmp_name'] = path('app').'routes.php'; - $rules = array('file' => 'mimes:php,txt'); - $this->assertTrue(Validator::make($_FILES, $rules)->valid()); - - $rules = array('file' => 'mimes:jpg,bmp'); - $this->assertFalse(Validator::make($_FILES, $rules)->valid()); - - $_FILES['file']['tmp_name'] = path('storage').'files/desert.jpg'; - $rules['file'] = 'mimes:jpg,bmp'; - $this->assertTrue(Validator::make($_FILES, $rules)->valid()); - - $rules['file'] = 'mimes:txt,bmp'; - $this->assertFalse(Validator::make($_FILES, $rules)->valid()); - } - - /** - * Test the unique validation rule. - * - * @group laravel - */ - public function testUniqueRule() - { - $input = array('code' => 'ZZ'); - $rules = array('code' => 'unique:validation_unique'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input = array('code' => 'AR'); - $this->assertFalse(Validator::make($input, $rules)->valid()); - - $rules = array('code' => 'unique:validation_unique,code,AR,code'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - } - - /** - * Tests the exists validation rule. - * - * @group laravel - */ - public function testExistsRule() - { - $input = array('code' => 'TX'); - $rules = array('code' => 'exists:validation_unique'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['code'] = array('TX', 'NY'); - $rules = array('code' => 'exists:validation_unique,code'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['code'] = array('TX', 'XX'); - $this->assertFalse(Validator::make($input, $rules)->valid()); - - $input['code'] = 'XX'; - $this->assertFalse(Validator::make($input, $rules)->valid()); - } - - /** - * Tests the date_format validation rule. - * - * @group laravel - */ - public function testTheDateFormatRule() - { - $input = array('date' => '15-Feb-2009'); - $rules = array('date' => 'date_format:j-M-Y'); - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['date'] = '2009-02-15,15:16:17'; - $rules['date'] = 'date_format:"Y-m-d,H:i:s"'; - $this->assertTrue(Validator::make($input, $rules)->valid()); - - $input['date'] = '2009-02-15'; - $this->assertFalse(Validator::make($input, $rules)->valid()); - - $input['date'] = '15:16:17'; - $this->assertFalse(Validator::make($input, $rules)->valid()); - } - - /** - * Test that the validator sets the correct messages. - * - * @group laravel - */ - public function testCorrectMessagesAreSet() - { - $lang = require path('app').'language/en/validation.php'; - - $input = array('email' => 'example-foo'); - $rules = array('name' => 'required', 'email' => 'required|email'); - $v = Validator::make($input, $rules); - $v->valid(); - $messages = $v->errors; - $this->assertInstanceOf('Laravel\\Messages', $messages); - $this->assertEquals(str_replace(':attribute', 'name', $lang['required']), $messages->first('name')); - $this->assertEquals(str_replace(':attribute', 'email', $lang['email']), $messages->first('email')); - } - - /** - * Test that custom messages are recognized. - * - * @group laravel - */ - public function testCustomMessagesAreRecognize() - { - $messages = array('required' => 'Required!'); - $rules = array('name' => 'required'); - $v = Validator::make(array(), $rules, $messages); - $v->valid(); - $this->assertEquals('Required!', $v->errors->first('name')); - - $messages['email_required'] = 'Email Required!'; - $rules = array('name' => 'required', 'email' => 'required'); - $v = Validator::make(array(), $rules, $messages); - $v->valid(); - $this->assertEquals('Required!', $v->errors->first('name')); - $this->assertEquals('Email Required!', $v->errors->first('email')); - - $rules = array('custom' => 'required'); - $v = Validator::make(array(), $rules); - $v->valid(); - $this->assertEquals('This field is required!', $v->errors->first('custom')); - } - - /** - * Test that size replacements are made on messages. - * - * @group laravel - */ - public function testNumericSizeReplacementsAreMade() - { - $lang = require path('app').'language/en/validation.php'; - - $input = array('amount' => 100); - $rules = array('amount' => 'numeric|size:80'); - $v = Validator::make($input, $rules); - $v->valid(); - $this->assertEquals(str_replace(array(':attribute', ':size'), array('amount', '80'), $lang['size']['numeric']), $v->errors->first('amount')); - - $rules = array('amount' => 'numeric|between:70,80'); - $v = Validator::make($input, $rules); - $v->valid(); - $expect = str_replace(array(':attribute', ':min', ':max'), array('amount', '70', '80'), $lang['between']['numeric']); - $this->assertEquals($expect, $v->errors->first('amount')); - - $rules = array('amount' => 'numeric|min:120'); - $v = Validator::make($input, $rules); - $v->valid(); - $expect = str_replace(array(':attribute', ':min'), array('amount', '120'), $lang['min']['numeric']); - $this->assertEquals($expect, $v->errors->first('amount')); - - $rules = array('amount' => 'numeric|max:20'); - $v = Validator::make($input, $rules); - $v->valid(); - $expect = str_replace(array(':attribute', ':max'), array('amount', '20'), $lang['max']['numeric']); - $this->assertEquals($expect, $v->errors->first('amount')); - } - - /** - * Test that string size replacements are made on messages. - * - * @group laravel - */ - public function testStringSizeReplacementsAreMade() - { - $lang = require path('app').'language/en/validation.php'; - - $input = array('amount' => '100'); - $rules = array('amount' => 'size:80'); - $v = Validator::make($input, $rules); - $v->valid(); - $this->assertEquals(str_replace(array(':attribute', ':size'), array('amount', '80'), $lang['size']['string']), $v->errors->first('amount')); - - $rules = array('amount' => 'between:70,80'); - $v = Validator::make($input, $rules); - $v->valid(); - $expect = str_replace(array(':attribute', ':min', ':max'), array('amount', '70', '80'), $lang['between']['string']); - $this->assertEquals($expect, $v->errors->first('amount')); - - $rules = array('amount' => 'min:120'); - $v = Validator::make($input, $rules); - $v->valid(); - $expect = str_replace(array(':attribute', ':min'), array('amount', '120'), $lang['min']['string']); - $this->assertEquals($expect, $v->errors->first('amount')); - - $rules = array('amount' => 'max:2'); - $v = Validator::make($input, $rules); - $v->valid(); - $expect = str_replace(array(':attribute', ':max'), array('amount', '2'), $lang['max']['string']); - $this->assertEquals($expect, $v->errors->first('amount')); - } - - /** - * Test that string size replacements are made on messages. - * - * @group laravel - */ - public function testFileSizeReplacementsAreMade() - { - $lang = require path('app').'language/en/validation.php'; - - $_FILES['amount']['tmp_name'] = 'foo'; - $_FILES['amount']['size'] = 10000; - $rules = array('amount' => 'size:80'); - $v = Validator::make($_FILES, $rules); - $v->valid(); - $this->assertEquals(str_replace(array(':attribute', ':size'), array('amount', '80'), $lang['size']['file']), $v->errors->first('amount')); - - $rules = array('amount' => 'between:70,80'); - $v = Validator::make($_FILES, $rules); - $v->valid(); - $expect = str_replace(array(':attribute', ':min', ':max'), array('amount', '70', '80'), $lang['between']['file']); - $this->assertEquals($expect, $v->errors->first('amount')); - - $rules = array('amount' => 'min:120'); - $v = Validator::make($_FILES, $rules); - $v->valid(); - $expect = str_replace(array(':attribute', ':min'), array('amount', '120'), $lang['min']['file']); - $this->assertEquals($expect, $v->errors->first('amount')); - - $rules = array('amount' => 'max:2'); - $v = Validator::make($_FILES, $rules); - $v->valid(); - $expect = str_replace(array(':attribute', ':max'), array('amount', '2'), $lang['max']['file']); - $this->assertEquals($expect, $v->errors->first('amount')); - } - - /** - * Test that values get replaced in messages. - * - * @group laravel - */ - public function testValuesGetReplaced() - { - $lang = require path('app').'language/en/validation.php'; - - $_FILES['file']['tmp_name'] = path('storage').'files/desert.jpg'; - $rules = array('file' => 'mimes:php,txt'); - $v = Validator::make($_FILES, $rules); - $v->valid(); - - $expect = str_replace(array(':attribute', ':values'), array('file', 'php, txt'), $lang['mimes']); - $this->assertEquals($expect, $v->errors->first('file')); - } - - /** - * Test custom attribute names are replaced. - * - * @group laravel - */ - public function testCustomAttributesAreReplaced() - { - $lang = require path('app').'language/en/validation.php'; - - $rules = array('test_attribute' => 'required'); - $v = Validator::make(array(), $rules); - $v->valid(); - - $expect = str_replace(':attribute', 'attribute', $lang['required']); - $this->assertEquals($expect, $v->errors->first('test_attribute')); - } - - /** - * Test required_with attribute names are replaced. - * - * @group laravel - */ - public function testRequiredWithAttributesAreReplaced() - { - $lang = require path('app').'language/en/validation.php'; - - $data = array('first_name' => 'Taylor', 'last_name' => ''); - - $rules = array('first_name' => 'required', 'last_name' => 'required_with:first_name'); - - $v = Validator::make($data, $rules); - $v->valid(); - - $expect = str_replace(array(':attribute', ':field'), array('last name', 'first name'), $lang['required_with']); - $this->assertEquals($expect, $v->errors->first('last_name')); - } - -} diff --git a/laravel/tests/cases/view.test.php b/laravel/tests/cases/view.test.php deleted file mode 100644 index 9716724a..00000000 --- a/laravel/tests/cases/view.test.php +++ /dev/null @@ -1,255 +0,0 @@ -assertInstanceOf('Laravel\\View', View::make('home.index')); - } - - /** - * Test the View class constructor. - * - * @group laravel - */ - public function testViewNameIsSetByConstrutor() - { - $view = new View('home.index'); - - $this->assertEquals('home.index', $view->view); - } - - /** - * Test the View class constructor. - * - * @group laravel - */ - public function testViewIsCreatedWithCorrectPath() - { - $view = new View('home.index'); - - $this->assertEquals( - str_replace(DS, '/', path('app')).'views/home/index.php', - str_replace(DS, '/', $view->path) - ); - } - - /** - * Test the View class constructor for bundles. - * - * @group laravel - */ - public function testBundleViewIsCreatedWithCorrectPath() - { - $view = new View('home.index'); - - $this->assertEquals( - str_replace(DS, '/', Bundle::path(DEFAULT_BUNDLE)).'views/home/index.php', - str_replace(DS, '/', $view->path) - ); - } - - /** - * Test the View class constructor. - * - * @group laravel - */ - public function testDataIsSetOnViewByConstructor() - { - $view = new View('home.index', array('name' => 'Taylor')); - - $this->assertEquals('Taylor', $view->data['name']); - } - - /** - * Test the View::name method. - * - * @group laravel - */ - public function testNameMethodRegistersAViewName() - { - View::name('home.index', 'home'); - - $this->assertEquals('home.index', View::$names['home']); - } - - /** - * Test the View::shared method. - * - * @group laravel - */ - public function testSharedMethodAddsDataToSharedArray() - { - View::share('comment', 'Taylor'); - - $this->assertEquals('Taylor', View::$shared['comment']); - } - - /** - * Test the View::with method. - * - * @group laravel - */ - public function testViewDataCanBeSetUsingWithMethod() - { - $view = View::make('home.index')->with('comment', 'Taylor'); - - $this->assertEquals('Taylor', $view->data['comment']); - } - - /** - * Test the View class constructor. - * - * @group laravel - */ - public function testEmptyMessageContainerSetOnViewWhenNoErrorsInSession() - { - $view = new View('home.index'); - - $this->assertInstanceOf('Laravel\\Messages', $view->data['errors']); - } - - /** - * Test the View __set method. - * - * @group laravel - */ - public function testDataCanBeSetOnViewsThroughMagicMethods() - { - $view = new View('home.index'); - - $view->comment = 'Taylor'; - - $this->assertEquals('Taylor', $view->data['comment']); - } - - /** - * Test the View __get method. - * - * @group laravel - */ - public function testDataCanBeRetrievedFromViewsThroughMagicMethods() - { - $view = new View('home.index'); - - $view->comment = 'Taylor'; - - $this->assertEquals('Taylor', $view->comment); - } - - /** - * Test the View's ArrayAccess implementation. - * - * @group laravel - */ - public function testDataCanBeSetOnTheViewThroughArrayAccess() - { - $view = new View('home.index'); - - $view['comment'] = 'Taylor'; - - $this->assertEquals('Taylor', $view->data['comment']); - } - - /** - * Test the View's ArrayAccess implementation. - * - * @group laravel - */ - public function testDataCanBeRetrievedThroughArrayAccess() - { - $view = new View('home.index'); - - $view['comment'] = 'Taylor'; - - $this->assertEquals('Taylor', $view['comment']); - } - - /** - * Test the View::nest method. - * - * @group laravel - */ - public function testNestMethodSetsViewInstanceInData() - { - $view = View::make('home.index')->nest('partial', 'tests.basic'); - - $this->assertEquals('tests.basic', $view->data['partial']->view); - - $this->assertInstanceOf('Laravel\\View', $view->data['partial']); - } - - /** - * Test that the registered data is passed to the view correctly. - * - * @group laravel - */ - public function testDataIsPassedToViewCorrectly() - { - View::share('name', 'Taylor'); - - $view = View::make('tests.basic')->with('age', 25)->render(); - - $this->assertEquals('Taylor is 25', $view); - } - - /** - * Test that the View class renders nested views. - * - * @group laravel - */ - public function testNestedViewsAreRendered() - { - $view = View::make('tests.basic') - ->with('age', 25) - ->nest('name', 'tests.nested'); - - $this->assertEquals('Taylor is 25', $view->render()); - } - - /** - * Test that the View class renders nested responses. - * - * @group laravel - */ - public function testNestedResponsesAreRendered() - { - $view = View::make('tests.basic') - ->with('age', 25) - ->with('name', Response::view('tests.nested')); - - $this->assertEquals('Taylor is 25', $view->render()); - } - - /** - * Test the View class raises a composer event. - * - * @group laravel - */ - public function testComposerEventIsCalledWhenViewIsRendering() - { - View::composer('tests.basic', function($view) - { - $view->data = array('name' => 'Taylor', 'age' => 25); - }); - - $view = View::make('tests.basic')->render(); - - $this->assertEquals('Taylor is 25', $view); - } - -} \ No newline at end of file diff --git a/laravel/tests/phpunit.php b/laravel/tests/phpunit.php deleted file mode 100644 index 8e5ba204..00000000 --- a/laravel/tests/phpunit.php +++ /dev/null @@ -1,32 +0,0 @@ -YxN7y#g1I|%|2Bu*BWvPr2R0?J3!iXJNAPy;E64aOl2muQnLuw-o$+W|sV zwjlLa^w4YjWBLQQRx0YLr*i438!HF`>ZM3+g`Sai_I+n|X6Jp@cVE9YmkyHXR=3xV z2hnu!Z4idR`6vp4V1IFq71zsFE`so7@<#mH@UC!waPpVKdQYE@_EYSHAYiOJ~LWV$vP&DLABOSNWnwK+RqZ7xMu zYD-a6U1&9C>&4RfTD=uT^+qeIFU-wFC!)!u9jDo3bfen5aJkwn20C#&c|DJB7wOKf zQ&&gED#wq9OT+W^H?rb?=$HH32kopTZ=|EUPWr~=vF*2om&SsLC!^EtbUn#ddTHnOk+boU)8~%V zv#d4WnptQp4DQB@cdo9T&CawM?M8O)%zC3by>@@4wVo`s=N~mM-a5V7JlnfFmn_bw zt9Rlgi!R6g{?2v_;aG6!$>`BRyp?r(JDVq$28%Z@*00~VIJ0&Ai#w-p)|#`6jb>W? za_0Ugi#I-A+_?4VR=YEOwt1?zc{eE*ZhV@whC4)!!Gk2r_7!!P^5;SRJb&?y1eOyZ zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB=F2xxj()MA%N(lWe7zc5avU zl@Eo3cq{An!tvtdrTo_*e^GQA0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&Uc%KChl*$v~#%9vnS{@|*L3wXju7sQYq}MNv7j>8O?}GeU{$p{|2oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+z<(z&Q63FWei$abboG4lFmB(=l8;xr z?OKsXGjXqz^glRN8Vx?14%_K^lCAX8&h6J9oKIKp#7P!ij{E(c>B>jpXmI9eIEc5h TZtwMnTf>p4F?f(<*`dDx)*?n< diff --git a/laravel/tests/storage/files/desert.jpg b/laravel/tests/storage/files/desert.jpg deleted file mode 100644 index 0b88c91336ff8073f34d21ccd683a01f0e0995da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845941 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 X-jngnnduiasMn4hsxOk<+%GD zNDwn-yIqMIe>7gn$`Ap)>Iy-gMv7&KBTiNKsxc@$po(m!d{?Hw$Ya>Cq!W9y7Tu~i z=`yKAweKQDgfG12zE&#GT1dIvPRDZ2DSk0;m$Q0%3!1=Lj7%l4N~MkZ@?``5H~iJ+ zdh&`+fXE-N_|FJDImT!O|KSm|+bUCSTFh-RynR01+S$AL_?TA{<{9-1{xx&)tIyM8 zCmKMkr*-U2<_wQSMY3F?yfu`m6a8jMNlp#%Qu-+lTkYx&BF8@*l@D}pII9)-VdYnR zAT@d$+^Q6L@6LH*=TAOD?{aC597_S#?3oHcfCQZA<{9R7tt{qcYseIlz6NiR_NWVb`)7a3X1 zMv1_KNbC=woi*cgvgu3y0n7?q7cfyl#>g|-OHOCAa+`@3r9clq!)T+Omq!B*J|oFL z=nU(~DoZc6;5Eh`LYWc+ZX4ur8fsV_>OvmYW)lW^LN~iVQKyr?{Resxf0H>+eI$re zlPHp7W?QJdMeaG5biF?iA+YGAkp@=S=TFCeg<(Y?8@WegERW#iudkSZzlDJ-MzI{* z%HD2?e3At%LB-=;)@=}0z;{7e5}yu=w{T5t`tFeW4>!7({i#T(q5r~tp_F|0>0o?u zaq0GxD=BtATyJa$w)!CMqfU~)1XZ_!0>F$UAcCdvxm@DJofGP63Wt44wdCkoH6cod z_?#YOq!+;cr@WuQr%*C|@QJ2`&H&fvSker%`1TaOG-iiSA~{IJZ859eJ1_n<{O-fb ziJ_9yuPu47wnS1E zzE$3Ap!#~|3l0l{{9EPm2J_*Po}<^u$z|F)kU$*6nO}_tw!v0&_Cja@02e)$1lswz z%u6y}L)nVthSd0B`in5k1@Yfait;>N0*kRQ()-(ZHQ>?!{8K}X!Qg2EfEvMwZWCVI z5})TWVt_h^u4;LvYJ673^gK~OeVktonoI7_O+#MDspX{iT{s{EO_CyBN{M5B)eH8q zzkTYLnAu93<-MyYf2SEVa6@awGH_K_v@6yTq9a1O&g~}HE=a@Ed>JJRpI6eK5JVF~XleKB`g64-D$Jr+%yAblCSR`WE9 zEjZldWE#r^W0}Vt;Sorw1G5C+_Zu__q);uZvkBGQ8M6275Wte6yoYY(2@FZwJ{L0V zP9ju)Pw^SZ@JH^gi8w~VBmDTsZK*h`lTkhlxq6e3(=lCGq63I@8xIiC&^o8>r&JgW z&6$PN3hk764G9ypPQl@$_izUw-7PAur{P1`%oM=r4vjok&sm($IsLOMKnMZj1iGD&T7GBLAhqVTdOCu-3IBAbNIMCdR zczOl0WH;5=(l^=wHy>N+Q!3|2ijgryJlAWmF=<*Y$hV1Nw=$PsUb31YLqG0-GzWGA z-8|ayv-4O}tC%kH14r{N_{Ewa`(>?R>pIk#fJXPi3vxxVdrFxSwxcqW;|=1U9x(pY z5Ldp3xT7wiTKlhrX=3wSLfAOkf}1ydw7mn7dXzl9>9vjsPhu{hDo8o%6*Y~;Vyvpr z^bzV2IV685Q)v@xB0^Y7(jPV;M>1JQ?wOeutO1|zg{Y6tlCazcNF8TTnvgERLN^8v zUjd>JpdS2ONTZ~R`35f!<`ZX9UdS5-6te;!IO^_}A=KMO!!XUf z?b1!A)|+YzHUU}9xkDGx z5ZbRGt2sRo%&T`q2<;oQ_<)Atnl?4-=>{xGTYoBNP3>_8ke8Wq_EL6QqVnj?=PBQA zEgE8{9ie`CvsX>A^jnsTUN|?^X$tLxzt!XjKi&*ueqDY9`RtytrmJvL8Z3m`xk4E> za1cQV9wF5B!^44ce~FXLP?yA+f&tk5!V6J#v{SKQ(F+pCx?KJPVT}qf`?OMV+Mq$nX{J`9UM8Ld?m+haTO*Oj4nAzL=jO z!n}0fh>5;MYNhMXPyT+RcF!sU#~ zRZ^(PkK`BkRMWD!2fA8x1e3s85)fi=Ub`Z~UYnh{HEwZkBjAeLxx0bhzt8TfpaFDv zlT#pFG{TR(T;>$^p7->9e`C(2^GyOnQsL97OJOh2aIG;}3SZv1|C z!Cg|nMB0)8cjHbqoIE#xRH4w7p3AYi>ok=Q0&_BQQzfAFj9dM(yQ_o8OpSspErlLt zE2IM3L4|>fPGpbc-nX_@By7u8>BsiA9e(ubS68`Ts+mcDI1ZDy%kz#cj4(IZV@I5$ z`Hxo@2KIq$r0op4`Nqw_0-f|%I#WO2Wv{h* zCLe;E@C3KXmWG5IJ*qDdScg0A$5Un_6?FpBi)Wu)5)E3axMYS+n2x`(s3uT4x*rgA zGmH+J+u##e;^EF}&9q-nIMMEOBD_3nyF{RzGLQ zC-69VQ`P4d->qB9s9n0xf}#J)(y|S|h3Hl%G=@`dBwfF0(0MaQv#3E-^G%`CVHbPN z7l!)&d=gmLWz~s|xn%`Ah}=mQ0Se;eL&k^28+Qi5OVw}r@P?##853Cl6Xg~Q4G$2~ zc!Z{(v>`ygHr<}TuhL1wY z?cKmXohJmb4!l3hb_o1Gmz*4J1f0iqkSZvTDtTk{ehy}No4tQa$*6+S3IOCjKbS_T z4w0WY+IK<90x19z;`~E3pjaqYHmh)J?_GN*IZb?pknOH z!MV|c-;qkeU!_xPs>gLW&0QdM1iJCekcaQ2^F1{k9cn+- z<=cIl<|nrFkYmxiy^s^jt?@iE1pt8n{C*QCOv&QPgZHhB z<~nf={SNxLG8!u&EmMeTQikzf*~D|bjbzt5&ZKLO7smcI5mZJBjtvMv9hSF5G+LIX ziq53ovv)WZ7wC5JBAn_gH3`{&o1_Q&xjY11{LjUGnA*!d4i70!_#w&W4dnoMOB<2Z zGLGQNxV}~n5H(YUlRIjC4=(q?iMF?IeJVWE0p5YWBlIs1(V^nOzsni{xzktc*&3|7 z24wZ{v~P(HXKmo@Q~NRBehID1(8tBzxLT>e2|6L0`Z24tn^(;L!=QjZFq!V-rR$O* zepC5B5K~c0&JhbIo&M@b=-ysdh-!e^gOAi+JZk?S46kh#N>ClEeczhOkvEK zp3!_q*Vb)n__QFTn(-_{nG5#LkI!R_y40S?MaoH~l|k#_@k z@%Y^<{Y8ET>Dri(KOdL%J4M-J5ZqT|b?-98J#O3${*{$!I&{k1Xe%JmLapFGP>s^5 zSDa#ozCj)Oth<*=)=;}7<*4(TN%mxu2jG_mc3V}qU)81B9KR!Fqy4`Wp8&Iao81)U z>-&&b(celMR~BD3FJ#8|y0Www{8pE1wU7hhHYqy20YhFDrc87s$GPso_6QJj+Wi}D-Sx2t8smRNvzOC1VR5vIWpGM0Vlv zfgJqt63otu2^~N}Q?qo7=BZ;(D9prXTOGGAno=X@%)77&F}!`scE%ko;-vk)EqfN* z@=~Gtk|#+g6Suv+vGa4P0wRHt%_$URMVw~+r&J}w+BeCnYu&L74twAS{Yi$ z9?L?pgyp-1=8pEmN7N{MTYHzE%p0?^hMbO8fs0A@^8JpAn9-f~*HO$f21dc=nrR2& z?!tsCYQ^6N!oxr@h}CiTK#nSQ#Fu*1`+bwBQDWfTxnT9h1UT{r1aFERRFYX#ZqZGl zLfVbG<@>S6wpa5BGmAM$I8v`}`*XQUhUamc)2hET0wO1Fv1{0?i%x~eJLS?heci`1 zVahr_XDq>goYh?2UWwkpC=m^M1-pm!9d4gd2P3t_^w3w1EdglL!6pcwe=5-is&>(x z&IKPq%wl>xK78<2zJ=KN|5M}l6R|N?ijVB7?KnIVOSC8jG&hYb=D*jS1mn22NSo{O zQV#3v!snnTvT0K=lRxwllFOou-PlLYYiViB&94A?Rz$(-uQ{G3s+FDHuRA&3W>urn zHzE{VXjLO<&q@&#G$n5(J|XXJD6O+0BP|yn%&_2EEP17K6^0`3vP!1XzaoLQoWH-z zkB#kcRP&8wNFA`#(pkYKfrps>ip7$g0Tm0 zlL$eKOfIWeARJ?JQe|YfWYlcJ+j>Tpl5*kOJn1$L$1myzSM_>4mjw?a2~iZ1^h5aY8wpNVVh%(DU(&|~wmP$| zGOCg=ERlyNEGYnjF(iZo=w^(VN>TR=2ZZ(BJbRY5eh@e9q1X`-c_AcuUn_xedN2lD zYA~wF5_-Zz`*;2D>yz`CcoO(71qUKM{{X2OXmnHpd1YcmiY--zUzF$=d4uiFq}y2{ zui}EyA5}&a?#Lp;4X)xoG z(_mMqD)z_RWb%+%-!nW7p%rksE_0m(*x}ZozTljfshy`e`E#1+OIsxx8PnF7NaYMB zzn9OulHE0Kzw?ZurOhveNy7`197BX!c>!sYRcCWY84iv`&UIIb_F4uMlUPbXzKx9- zFAVeef{SgjLLt7KCXnveYU|-P_esQ((?V)o!BoqofqhdtLo-~RgZ^PF1oxgN2Yoob zy<&IpKJvRQ@x3yA+}KS5VW_ETnOJ{7d>VW4!n*<^lyc0W&K%9vDRA6g83di_^@v^a zmP$>=Y7HfXKR?>9n>Pz-(C3znG%SsdIybH|bsQF*bI-EBrw>;=VH22Ne$r-m5?=-! zLS0tZSy#Z%gF1;#okA~^dQJ% zC6k4Uga>yygor^oJQ+Mia2rW+uL+8s$x(Y$VXW;i<0Sg^3bZ9J5!CuA-sn?OG?hMj z(#`-8=clhNr&<9`+J}e7w$Ku3G8DKkQf6>e#xYj;({u*T;>x9L@eFNVz^^?}*rBqX z@rk0EYE#>@AzrE<^0iqd++9vbMH%F7F80fMj~W=TZd)v-r|F5r%Du`jezhGXKYy6~ zJ6>y68~ojs^#OrxC)BV>jpG%;wPx~xLFv}f4K6jsknI6*sNRHf{sRPUoZbAh`Orfco}8N8b02>a}SAHTiAaa zf=ro2zb&hO72+NnkZZLsCIQEjX41^eK?1bAf!q?be`B~HAtL#HU3CWbJXCm4>~k#a z#O1vIKri=_oM;h~X$1$iXP)KqHd!RCjsHOE1msEK2*bP!b`SN={awrqMzovp;Z|x7 zy`?T1thciyDlY}vzfLZ>E?FpY=fYoYM0*}mJ5GS+BuyHql(3hT4}9&yv3&QJR@@wE zCaY=0wc-QpQTM<)r{$ZCnK_}Y>S0h6T0*T|@ZJ)kQ#&m|OJ4HNm;gB&koww+$sPgd zsDX87X0q%kl8+x24PHup5vh#}b^g?e)t+-Fn}mdr?mJxUzbcOJ`(xN9y;fNgur}=; z+J_nm2_qnFHQj7`4+6^D#Y{M;Z|2kEx@Wvh&rKHwKlxko5Arj{a-o{$#p8dOK1YNH zLetc09J%s6o1`kz6+a5r2&P-DRY329n<`+>8az3ij17!F*h&SNMH5FH7P3^;y}UdN zD>c)DMgNj1yZ#?2nmRL3gBvL2dQ1I&o}P2>VL?OU09C=;y#K*E5MYoOwrKBJrSS3Z z6@WVncSqN?-5wN|(7ddxyg{_^jV*LOhH71OnX#62k5eBX zopqA>52O(IuI{KcK3z2xeiMSg@mtMwf^J)pAHH|?Vg~>CDje|aC?3;!igdeo1o$K7 zJ6U%wWF1B1D(M(yr6grm*5DSx-+dnKPU4AApl>(gx6~IY(ORhp+4gphUKGoE}cc z3ks4Gk|2$~3iXa)3FyNmVCTo@0jV65gXBiJA0o5v`TnZlT54*>5HaqN)ibmY)S<<_M5>_46_JoX)ve@jWZ-#bW~Zazo>#@lOvL4#7C za_IXohPg?gIAZ#=zQ$U?y+aVZB+F1{*4J9>*p97?d_G@JV?TOxp ztr#4Fy{3dK%kC|dJ`)>K?=I2{pHA_SnoHO8#T-3I>WkU%=odr#k5qY&4n}s4`u7O4 ztD$N#ws&JTGOc*2AH3U9XA2gM1)U$#vIFHpD38uBR>|7A`%&0=g>_rQA*eKY)Yn|{B(~W zLGNrvXddMIx1{%n#UDxe)yjjyZSFe1c}r0ETMiZq{_)o zqV6ik={dYPL}F}vsnRrxvo}-!%$9Bi0v(uCQ-NC#`b%PtZ>;4-Zvgq~kP3xCd{gWX zI~UPh&%D6k>~FuY;i-vl1(R$?Z^XY0#m(v$+IYl^igoYLymiYvzN#3zw?S}1?h*Lw zW~W{ru_TtAH)whs*#R&Z75<1$+Y3H5p|*=#AviwN8>;P0Pu+Kcpk5ZRbkWO<`fW`*O*lBK@*^ID8IR67UP6PB0jNR0$D(2JclI4!S z!@l?uawGODws{)ekf7m0w)d5x{?7;5UeozNUQNNag4?NYZYo>-ZJBPqW}}xdJ&gin zvsTR6BT^N5p|R+QOwl?r{J7SHFqwA?$lHupf{MX#YaL??ZBHa|tbX5KMVkUk<4N0? zgMxbrt6ZA`i-BSVfKAGo1t0~8YpP;mYLqH5Ax12GKP#N0UZEv0+yS!7dJB!@exj0`Kk^GN}PaKIct`tV(|%<*&ejVTcMuH>{PBi^kge|H8OeqBNI ztLT8KFpl=D_;{kJZ7N;B71W;?)iyJDj(yQd$Glm{{K*Tc6nbZVr#z8)czfEOU(}9y zmHhr-n|X80Rj=yA(FWU0=u5#Cx_TQiv520)Z!6>72=$nTe8cwS*gtie%*yL@G5zZ! z8DIT2K5Z$1I@M@%T(%F{v@{4RhvqKz3GSWg36HSE1NCk(Ep@JWl#_?w_v0W#w@|lc-t2t zF1eadpStGM20sdGiC(fXnM>L37cq8}pLMshT5zDmVGy3}&;)uk9bN@MCDV(os0jI* zU^<~%Yv$4&Ct@{tS7czM$t-8l{wC*~a(Ml{YZ;$Ky4}#od-h1hlFWlr zR_9w>2q-r>?Z`)1__Q8}{rh>^1lc64EL6Rt=!W1wmY@w3zAug(s?)rmsWgsIO8H4U zw{1>-bFEl0?kJN3V@zUf)Vl8T3;O>FITmF# zxf}4W&M!2QGs;LQu}T4Y2WG98LB6S1ar3u4oe)|AhbTKqpSm&-9={)RC^Oj>xwD*8 zErD3%NPD^TB{#xOjg7XNPp!wL&QU0I+i-HiP3EAN#0#xHDWBrvSbg_R^9nct_0PAO zovtJj!27VTC+J|T>x@aGNNwKxBCieGS0&w~8?b!yb|apk6@Y-qd?KcH2e+0Yl`;6; zrE}!;IQeQ@Sa9a*J?BKG`cfqI%bM|dn-3VlL1>6ggTX-NQJ*Chs0IG~d>UPr%A|l2 zy9l?ETi*jo22~Mb1$WLrV69rfbA+0T7$H;v@Zz#|T#(&Yy#~8s4QxzZXABV%B}tue zG$Abv-xL-FL)3sNnoWsB@NU544obT zZ)*|)f=qKTO5JK8V-Lf|7NNm9XG5pz`*(;TrYuX1u3*ukH~Wlz4bod?gsgC_TR#=_`0Gs z|H`lcY$~FcyWyoSMtHXv9z#avHgu64e#&CGnr=VqH9s6L`X#S_+x2FL&GbXUxfuPbUjN)mUlW+Wu zPoF+^w1DTcw&M+JT$9@7Gfz|({E}O7#71ZEUn^})*21=ZP>8Ido#n`jHh1~0#23MC zvmW*s%>Mg?!=XV)-KaZ^u(_dG1}Z2qRZ=-u)E5%Vh?7oq8h@pzt^_vO5ONbW$mFK5 zwl~;?k5l^-jv`d3Nu;o9tI_cK45`PjgU|gY&7>+6-Bd~O-8;97Z^fZo%9k&hYY->T zq_8m1{e+~6n=3YvbL2eApQG`~Mca#pZG~!sA#jCQ&X10OxiCVT5!xl6;Mi)fu7~dv z^MP&3??cv=B@A z%{vjZvAxAs6ZjZC-YXo7kb{;buPq2Am5;_ijJN_q0e+fR!rksOp5*2YYn7~UDavjS z8~Doqbwl_CWBuRM)k?ey8|Cd_mpq2A;M;YX*+beKA;+&)D^+rm)W9qJYS3UENkVt2 z-M&5IS6j02>ffCVo#sV+Nfs!`ADGIl8i6rJ`0DND+tQcM6DM4wmW5tgaEHxCQiRL9_^e36b0r&L=(3y#BFC9!$=I#b$3NuNd3ZQ(dvJJG}4wW?X z7O$Si{wS!B#QlQ7T$EiK>X+y654QckOqEL5*F97ST$B{jisVRV3Ai1hxd1ZWE$)ze zQ>`KH*nW*{3Wp}EG(cL%msDSDc;F@GDGx4$tlt;1dksQzgi$ec_$ zVY!siukSM@r_KodG){ zfhM`x{(7zFIZeVx1|@F?0Rh6EsJH8eY($>7K?u0NZJvB}RgRBctJzuKX^5n*&DaMD_~}$Z0L#7(Y{E}5M&&d)TAhq$CV-kzIKqqMzQgx$mu6=E<*40h5`Yi(=uu+R5i2G@_QLh2 zBSt7#Tsg8cF5u~T`^^ncg3GrC_zI!SOf;`cl&Rf#(mzJQ^fE%&U0(hW)w?{|%70}1 z#M^zQwEm*I+%8Oz`RQz9RzbjY3Lzk6d`&)!i1$zaEzogxP?YI#yZP5fp!D;)$ ztms;w%ABA9jowxmF_!^49wbowMfvC^;13z76nZun%^DERylN+|nDq`L!G|2RKcUHtrmGuILZs!}qn@e81f|1~JWb*E2|Imfp|EG1 zw3I@#(+;(2SR}x@rWw!l=#{sw)QN%i+TGG-D7Vl}hsEy=UFb#!x+>>VZIJbQQ3z~R z{uv5qb(cT&B7{R|0m&RbUc{84Ii;j)Twffssgi#~%!D%#E2=qkHMBsa( zqi(?t7c4i!hUcE^>(g{X5gH}5Ekw2QN`u6-XY~*IK|M;C*Om4-T&~?{6{$ra2!tTB zdt`CY$Vugpv@|MT^&th#}8a9f?DZ|a@s<@w4=(fDGfiD%HRV8en zYPUtM^I!XjxL-wwBJBoaqGr?}KM9d~68!sM)J1)?GupZCfEaBLQn`I4nKYk{Db$zB zf!w7jW3;9&8~ywyXpT>7Yjo6m{wJ9w<)mmkl6&WPA};RXVV{CV+FSX%d5G{DU<)6* zM);S|R!V=9sOAQdenIsNh(fmcDLS|`X_xkf_4T`_LdpOErb_8zZhEHi+{u#9^rX78(A9Y-15{jPP8^l)7CfY5Sp->Z%3$X9<_}Qpk>_ ztCebM`=T@?W-Thp>HBC+uO4HovE>j!-MFVFDVW@5YI|N5l#hwIK6Tk$eK39xj5EVO zGS{*@SZ|ND*shnEciQOu>yl+tujT+fa4-HaOP<^Qp!4#a3RC?w?2rHT#XeJ|w0x^H z-}FVXRx#Y-w>lfjS7nE7Lemx2S*n|2Ia<0L4u`tD7lznIJ(6_D9ffK2j@;LB&JBE0 ztaafLLeR{T5jL{Z4d%a>6beBE$afnCp3`f{e zS3VE*B4qy+9r&JevvIDi0We^?1#B;2YQsCFET zWQFN8Rk*~pdIr5--QgjFmnYH&3zbm__W(P`GlxT2QXS6u8#AJ2)IeV^s zFr#hYNCn<8#CiqfieAol8iY;X_+lW-`gD_#0*ak}3b`G?7hPpECi4%HA0ZSnu0|fU zdTg0`7vW;=iSU4m?es^c?eN7GL8kpmOX41PtVI$Jf8hKO?p=Tu0}oarqd(3iIocR6 zTn7aP-I15C7`V?}pv89C=HPV_MB3XSEm6r8hece38TR&&AuXj+n-|?t>)-B4P_@0z ze`Xhy{0){wVpS|Dj0n+H)g3F+2EL?tD;O$gY=XyIiisledK|%^8?<{OvBc~j7NU?< z@sbzChk%{R;>n1#U|lg?e)#3T#OCx?LT_)48g}(d6zK|Y`;n#Y0HV_RrhxzE-gL@0 zdZLRR7_-J?LLnPTSYzWF19hpdo}uc)+Py5OYIo;+m6q-1#IsEGZFM$8o_B-t#d#Pg zCm2xA>f6cO|21d5H2B`?5>JrM3GXNL&!1N@pe^Hih zix|{coq+p2xB^&!(3ewBRo2!XVC}Dh5xTU0(N)PGipeQcmG;@;%qmP@8C`aNf5wLV zO3xIsOl6I{K0K8diZnu-8rcRff#88axEA3NV7l3$pOT@*F-waF5m@qzKGuQOM$>(I zs!Imi8Sg8j?AMk+zHa~o_3Fee-VK!^VuzRWq0Uin(p?MGYkXZ|;>oneSf+iZPF?U~-~nT(?)rJF*OfD*r{ zHcW+dbNlx8Q*F=rG-xqXBCX%Xh(xf4eP4G6m(+02^!+Gc603yRo6EKOdDNT0`bKMP zl%1XH8TDhpo?8Q_bWgS z+K}ffYSS$gzdKNi_9f$6xrTz`I8LD+0`^ZLG58qqdlx(h@_H>PL4pNoSaQB%`jMEV zU+=PS0bI{QEeniNE+2?ap#G<);7)9So&ga4_f3r?cUc(&|AFj!Cz3m&2Ol65Mpjuo z0fmrZ`*oJBQ>y?)+9ZvE;seJ-M_SDl9|>IU&`EPyRG;>2O#K*ofl&(%QmHs?6fW z&-d}-ICmFie|zgb)kcCuAccSR?toiH%y=$Z>tJYb-dFO!5K}mZ!p~)+KLW{Q-L=SV zOxxM9YK1_dfZr-qvFY}{aFEvy!5`R!u9c}iE}BlUx2^F!AT~DXJrNK>O=y`}K)AF< zyAUdmEK$lhwGe*e~BC@M(X%|_HRctVcJG8 zAFvh!5gUtof%mRtjc(gt75rx}0h?=C25!qcz56R>_1hjG?maX!Mp7~~uoD+`#XXE) zZ|wySjp$&fW6*wmzz~74EpBKnjI|dNymJ_mFPvjj7L)B~%nX7k<^x%@Oap;=uZoV${ zF3!=EIAz@+HZ4rdYD)aybF|cAP%GsQkAlRB#y-`+0;~6^ucmKP52}?98ARP} zQoYw8a>wOdMs)jEv}$67k=v{Qh!J1##diF6ym(*~D{G87Cyq_Copnf=Punft51ecp zc|2;@s3QO@%9wTO8D?aB+hu-rs}kQN`4K4cCk}f%zkrKe&mTL5V1LsNhyjpz+o4KF$Jg$iO~V7BDBtc@{wrC)_L;2y&dR8Etx)F z9={q`w2;}WZDb>Kg-@`^kW&=M!SSOfN*W{l?n>1?tY2gCoX(jEC$;WnI@*vfgGX<~ zO`EG{N?(>l<}DwX6b#Ea!TwOO*vKb1g-ZX9vVe&y^GlNi)JOS1iA3G76052OHM|*E z-m%0?7ylM))CJ#9jT}u;r@?g$zK%Tu^m`R_z{fq%hOdx~MZ%5=;$K^Fyrbo~)z2Bao}a!wb1%+0VSVDJ*0)k9wfyuHL2#@Y8p7-t#R>*12i=1r?i} z&7##V8rr>dKK{2hAIILqh)HDuDeHZ+=k$b_ZQc#Ep7uF(uR(HMrq%8=s+k-Yzkj9~ zM6@{)jPrK`7O>U6C&sv{sV^JE9$yCX&fxsv2SLUc6WE2$8R)j#64QCx?ZP&Y#*tbv z;~ws`Z3)u4aJ0iP-k}Ba03C>+7JiUG{qd86V28)Y?hPF9=xV*$2R16Ek+5vTP4q^G zKTUzXckpQP#U&fX4}|$1vk#BnD38sg=&E+wpM0{80!Uc7DhijZL?Tr8nVLM3=nDKW z>5n<7JRCiz%Crt$0#wJZkhi4wNgbvsAcmlb2h{{A@m=fB8Fd|@(NQ!ZRI$7Ai;tnp zJl!g+7Xkz=%DBv4KU}D5gVh;*^&`pf0wIr+WYg6By@AALcIeLoV;SWmKC@Onf+VwC!NNeTQ%FoIo%z&{c#YAH=|$+%o>$_Yw*haLFz<}O}b zjY(5&ho>_3{98Kn;p5!V!V8GOxz-?kLG06W^?f6!L%l68D1P@8s>?i-g(~h!TW()Y z5ymlYG{AbbMs0mUKrH2PR4>A;i;`;kKb7Yt>uwVZ1V75+uwi7UXFlnHnQA<#`Yjyr z8(GI4&vB23to)OoAXS1^)?b92d%;vtuKk!Esiges5nerq^|DqpC24C-FtNG#pQ#n0 z;K3B`py@xZvheHTDo%w*G*JUcxof|UiYXNRPJ=760C7eFA9Y*RGBeU#J zDOCPRyWT_ z2i}EAZDb#ED8X%jZ96}&uH?4dA3uL-`UB!)=?$+u+t-B$ws}G^fq*iH;0xqg-)wen zOP^72P;gt_Y#(k&`1AW3+VJE=9a(_S(sDZcgchUdJ@Hc9>;i3!x8BG}aI^sFan_hU zX4$yKv!l+Ohx*7YU1#Easa9#eos;$IK{H@0P#7l29i?)+^mD0An}1Cwu&%|C109|uOz%ihm;+RZfvx2HuHVWshjG7 z{4pKL4ceqXu1l>i;Or>VJLmG9mbbYc8CpbXkBT9byZi`y%2yNJN)bR^ItVy?)MXAC z!L(TlHW~DSo}ER0^>!aAR#N!*j+$sSeNQ-&4k-)W1dgP>8daf1^o_!k4+N;eD7nO< z01i|?g>L(s^?I|L|L8>NyUZs?tVa73PMKgM=GCtkd=4q80XL zCmtkCL{5vbgNRt$uiu}Ui9i5sW)WVlv$;5NJsMcT`{Pxf*|BT?1Fe%H#>-AI2a%be zu6sJu3e!PZ{U_AN-o}AM0gJELy|}bY)iMf|wBB*smm_>zi~cdu3tikM!VOFc4+D z&=X_}v$u9Z_=Flw&%z0_2sB@}htMXESRH!c`9M%nsoJ@m$Vz`w4l~yw){)X-@gSl} z47Xeb=?K$2S%2HLNTi{RYA=+=umcW(CO012SlB3!vynp&|Gjem4)(D-?W5fp{QHS! zb@ip>>IOX%g>li710Rj`6eA`;}iqTkxokt*w>YFLHLP_|6$<_JELYdCqZj>IgK>+^c!0!<8fE$+9}N8){E0N<`NJ( zfY?rEEmfN-)6<;wS;HNa)aq<@MhrzH=z{;VGK^^C6auuz26BRarO_678_aCf@%s33 zQ&~V~OgptmWPLCx{*eVLX^8gM{BlobO>HEJV3CSjV{CLO8s4~Q#l;Ns- z9YM!g`J@bc)Q9rl@s@p2xXXZ>ID00;niL~x2L?C)1SV4e7~{S2RYM3;#(FeccRn@u z=}bPWX$2$?B=O$vE~dXQCYnjR%bdp}+|LXx=!lse)Zp8i3V7ScUqUw!hT~GqLzSS5 z+ySOO3udk6! zVi#BmclJ)02olnZf4u*YRk0N1rw*b&QwopjNPUZsoI8ej1s{Z=&uyPLw>7KBx}%8e z%><1dIO@*9V}6!YHza^`{{y9sLktIImoVOJtR8BfL{I*(g%KJM}^b8U?ckTM?J-!J_=2%ISv zptCX@VkXnT4l zKBM`45#sCbrc82&GYz_DUePYpM|Na_Am0}Wr19U7@rqM%$aM?pcUbs^zeX1If%7MU zdHCb52~0B=b03E6fLSeBT<_ci2~djZ9}3vWU~9?<9%s98`*Dq$z_-Ib^tU8q{7Z3Q z!I-8hEaV(`v*GaC+*#=)r&=BWr)Il=dL`-}S@={^mCVe8)xp}C5Y(Mwwz`oS4^;#F zSBYty6}S(Rv|dw@7KxrVwPS*Xc;sUv%Lm4Wfgkk-#A&WWTP$60VE*xq@EOHXnp?(C zD&N?9t1mD`UL!sZYlK9OscI7_rEq542snS_FE&~Hg!QR?Ev!9 zc=zOMWKqLGMw4J;6b2fdA5A&jSf;+N;IEuMZ((e=#cXK)cK>>xqiqc+3B+XEZ-Jl^ z2rDphYcJ5~DlX#1{9msLYnYKrFXWYC#Tx;mR_+@eTt{at<=C#EnMq8~T0B^Jmbi)0 z8WP89pD#E(^&be}q|GIn8K0`bdDuD(wN5{^M$Es<;qjTIDj?2)6krzR<%FrbaEb+L zji7q+(NiBxl7HXg8jqSTrw(@tN2CXwhlR0FCF_j;Bk5iIng0L(|IIKo=2)9%qbY@I z$m=zS*^pyG4y9gli1JFkYYs_{n>p6n93pwGA#zF%ols#zM#>bu=%r#t%qcX7#`JxD ze!oAU%Vk!1JRbM^?RLGcOD)}-ub5Ztc%U2&Te|rvTEAfhJ2(>|2?b1qcaPPgk--m7 zx$kQRE43K>q7?6u5h{;1ix(Iy80S1q1YI==XF=@$WPaVkEUP*#=wxL67*N!F4(7|m z)gCx#7ey@T*aIt81^HqwB|7sf2gKhW$R8aBHKzOxs>G(4I{@7IVh;`A#xKlaXFA8C zmMXN(<#4o<$=JEM8P4<;83X{k-Ht4`oV!GOeEl?v+4|4ZNi{m~*%W&L7+i*@jgNpK zdge~Dq)w3cS=0ZBq6;n1C5b9Ftq}=NxcSP z3wU-qJoolOGj3?jNbnbWA}5<*wI;S$_?Rv`sA7He@owr*uB;Q+E|E$$naX2xSlJQm zyN7~U3Yus3$}oVWYU$4$`}0)UNg8uNGW}54nXaI0;0?MYNo+RlG&=lMy#_O4b-h0^ zYPD^RO0CXZTp0nGt)(NWXIa&68tAGr5w4e zaCib*<)7%2^&TgYH(MO?b$A>h2R_9g2I}i5jqAb(xS~i`&ij&7NQfK{G>cA1w_XGa!X=M|R zu~tp@@LZxdg?RO9g?t=?ehlR9q;vA}Bc1}{q@9cBdpe-PNH=xza`r))c3wDm<(SV@ zD&V`Xled0y>V>U%KGLbuwbcJ)p<^cXVdOf@gx#J4`)k8}R}YLa<`yGuuXN0<`6Oq$ zHgROxq|96q1-IU-Ws&g@)aFXk1nyX3JRL-^jPBDRl_F*yvt%Ye{Bt|D7@#w1fN;)w z88t#(7SL(4|F|kder!JZq7dXWYy*nmGFs8jTPJ*}=y9Y4N0yc+Vo>-GUCdWHwrbuw zIbV$6!5>tQ2fp#ye;FrfTv!dsnHxG)>{)h7{XwSD>M^y6T|c<(@0_+uXP3LM z|6YCFyu1Q^Pg%uyJWCdjReJCAttu5{%Bh5=81cjviZJwOL-uB6@6n5Uaz=iGdPo7| ziSPmOT(gB<>iJtPy zU?q9&)}z4%G2kcG)=xC!FqKz-&ZItcCk-nQZMxs-d#8MKr0CcJj4bJpP@G<}yt_HWPuk0lVi1i5HS46L_{-g082<-HADh}YKy z$Orc#CY@#J=&>1`Rg6>`IkWE(PwqkN`@Po3$!`OR`#M7pfJ}Jxzru#3ai(Ac<3B!y z8DycB-V37O*&I)gTnernbw26~c$?t-Z%x$0h~1S~hsT#nf>}!f=YyZ`1ZA6zE#k%9 z5g*^|d3v6Q;yrLO$EsbGd7-1?7ltI-=1mD#k+Yt`#p&3?(~TeUn4i*P)FzdD#(xPY z2yr(w3kqraK~QJ=okm<#k5Ib!qthGPJEfl1k5h48Syb#5Z#r#Sk{?jdjE|UAljO*h zI{tUf>SceHMs9pi9E2fNw%a-_NcHeVz+RKD)$i$cx|?aC53<5k|DerS+P(FFS%Wt; zMS>t#;$%I?M<{}1`dpe0-2M6*#VsR=0084kP6<{sGmxTWS`cJ3!Cv+ zdO@%}9{z=_=N5GF2sDF@dYo`WpYys)(p~`_)Qy3ZnwD%hchnfTY_(3@^@ z;6mZHRu56Ck|QqI_n^?%Gy$~p@*%@~aEZM6^FC`zf^hmcS zoBa)+0F*O%SJ&gjv@{EtW-albz+0J!llwo7?wD|vpoAg`vx=Y>jdE8vKNQ)~z0=FD zN`dGh5ECma{q^lR7Cz3%HI+DvhmuzXVo$LoW?qNHec7*Xa z(gD(uSP~Qi-I84Q+7N_f<#gum$6cr31Ak@B6TQH|f(yJlgUrt;A6621dv{dIohi?m z%9bbfJL|^CUe|d#c!nw9il7t1jB`(zDqksFG50s7}(|o$36;9UOVSK+h)-t zErF}CuDyHLoqu_YERF!XI#O0Dl;`z+-tF7iZRkjTKXVE@AbdFFP71b+Q2SJM#3DWc zhvtt?CZ4A9zPOuEN0A~((wd*rA9QZD`DQf@f%p~d@n(L+N193a zbw=W*nh{D2w~!uS;0sK4*JR>SEU$%agQ}WsXAD zg@f6kx4*8-Zd0b$#I`&w{^#_S>;FrD!mTm?$<`N`u-3Xg&RGSqrR1E~3LSU+vyi9c z!)tLIIQnaUeAqx7nE79vdugT8;OC6fr=5dTSPFIAjL}ha@w0U?#{Od#Kz>3UD&;e@ zoOiuX;4Ise84SvPR^T_$DrBzG7RrYcq$3^cnP{r0~}WWp(3U<8xVqngzE@_RP;L}6#Bc%+)!O5p%A zYoHT9mev18Y_f8zL?fw zWc2G%XdRSUO{`~D#Hsn}3WoB}%c?oyjk>3NNs%Q?t;=g1Uj5uyWk^KLW7`6?atvI6 zFpkJc#iEa96I?jFAt6);Mt}LpzdHT?^Ak==f=2dJ~^H(Jy*i`__F8a8N{8)I|>eL~;DX9(veaSS=l~;+NtL4oNgd5S6 za;vX)TL|_Gpgr=)6^qqP=B&-P{MLZdPJmH;pugGbltH7s8!EPbS>-b?A*6BU8rAiD z#?fooz^brpArM$h9S;Vs$(UC!nE~{tYHkgmnJ)ZHuC+Du=Guubww}bmcDW3Fe2&Le*`vBU8+et&?OR`83hDsWZtZ zNTXO{<2fN4#dz?t`Qnidn~xi*`xCj@AYMcsJ){vxnXpV%oIa8}x{vs5g-|+*>C;AA zaN4+4kR&hH)GE5a{S8mvbD&bjaTlY}cO|E4Sya@GnbCO;By(y!)!(O2{1IdP zhTH=4yAjG9fS1ltcO17S%bFE6!BB%vo3x|0VhgMkXDKv;-M&P@m6~e;M{c)IaNv4l z4?;@1QZ$P{a&>UAlY6b&u!4=>SwoP$cR6gs7B9y4cAI_3f@_~o7sFA1^Oj7eu?SUE+%)(nKE@J{=`04FN4m~*2V4)XyMN^2wbr+62 zHcAy`h+p_GF`w|}yGaY|ufR9Pd_X=fGZ0_jt!leKkR*9QF{++|Sw+K*LHe;GKy zPf;N!rC~L8yrRYdozS-UEudwdY&I$?9xk2DjSbd5l6K8U9nXS&B6LoTy-Su!?wgxq zO=H?0oZf$tQSir|Ipm+lH|DAxI?fNBzsIZ}pwdPy=AK8^`NbVQYd$d^(fM~-!k@X| z0*(QuBR=UHhe6MO%SJGf`XAk%^4MBVh6M1!1P;E4kjANXRLXM>!)XNyIZfF;9Gh}U z$lB@~iWcvnxzZA^NbBUewxhz9MIYe|@v1Y5#juAs3^{iks&Wi<69VdX_J%|_`~b=k zAj@oPY)_5f3WPvF|==|$$y1I`2xWdz$3R#2Udjh3X-r@qW!>JL{G5W zneMXAbY;Of?z4kbk#{#@Gir>0yJnWhhwmwTkN9vgWuI1}ExIu0)bj@IL>^I%gRvjNHZz<1X;-WbgmsnqOEX)%(}*D$YFb>5tz?NHVAy!jY+JqvN& zP9v>P7?V);io-5X-`gti`AuUu zgB%GYyK%OQR@0@``WiH~LUxG{%z{f>P>^9=Uxt7Z<|06}Gj9v9Rvp2|r`v|Q* ziM+vKVCus!)7D(>Jij{ihD^VmYwhk-nYjpjC(NtvIZrKuTaS`AoW7=O7&`BMtDf)# zY(sS#mfdaz%XzT1Bk8=VN)HD1Tg~gg5uh?X0B*m4UjaV5N$AJ#tQ*0V=@v4yB?d9L zGq6kllzuEv{ngGD$O{r=XdT;TnQ;6ca&_l9ol83#Nh!sTl&3E4xkx@cz+&!$x#+5N zVcdYHL{uP15$jBU8RB)(hv#bgb?ZJ#^AHwb4=K zS;gQf@gl);AH6pxq#*WikuxPx6BfO>A>iKG1Hr-?*C;JCrrEQ>g&`!PeisJ7m&r*&X^hB z|7S*X!hHmU3cW5(cE8{A$(uRb>59_2QB=0N+!OqaGT|;n0tmtlUA67xxersdv4ad% zpMx%9+L_qkYP)gBcg;F$3R>?~&fM5w89;7R&2<^~Ds(WP?cAHM(Nv$U7oY0_l3IQ* zNTnE(RY%!{G2xI@WxrfU8@*xZD0XqhKnw`Tc2?-ZZ1$Ah)y*d+?RNf#QMAS{?5}WP0Z@kY80%o6R6J_xnF zg~A=z@f&1nbdLQ7!3>{&_3P=W?1`NW)eF=ek-LLA^v}hbmr-?^Wf`+LG3$vyxQT1H z)x$bqqnj_;pnhTVAPqB?sY)!ec9y0EtYKn*!rdQse<9ye>0!w3sE^NT9#qO{BcWCI z6SnZ1QjP#Zqlu)E5wm0@)qpdrj!sx*cit-_O! zmS`C0-EBhq-2@?YS2pkVM&%Qz2ni}WElWE8T7kPa1YJ^sdgG|6D!1okDAzx`bj6DL zC8WvSm?ki6`D&@r7n}lL$j$`iUeR@O{6FTC##~EW=oJNA<1fbyKZ- z$6~x}#uX(r=2waM;XlWX*hr=O?(%Fz^nhLtq@0>y6*9wN|C*PfM}N#MnZ6&PC*BF7 zReFrkZqDuVjhZx>{PkAdG(uE>pSh*>59+nWc(hTRQuyntrY+!K1=#6!=4_;ld0#1PE%3>Nx8|`7EuPRGA*2IJur~iQpmnD*TAT zZZ%MfdB}RGnYztAB+$;UzuH1i5(OTDP7=QH%Yh z$$fPf4-_H==PXAnl3<3HYBnn8@wy?rrfLH7SM+_7oCnNuDoLwUKZ28_=b-15eHoPt zIG$c4DiFwpX0gH9DXK?r4D*!Y_0u+SzOH%O`hcFdb^o>Rj_8vx`PZ49`E@ciLgR7a zAfexE4tNv|_KXjyRVtB&wElMKIMO)6lX>cRt@Ni;N@DjSi7S58|rLtGW3@pEg2{2>CqdQlOS+Wz(XxS&VH;%2s>R;DISIoCMd& z9))k|V}^2x994I-VJMagg*XrRd>`@En zcu%PfV}2=n;chAdQoIeKALr`rU9x?8&Me{^eg@-9wb=0*j8x=lTMO5 z1yK2L(eC{{Ts+K{BfGuGE17H5e8>7@{2FNAP4ZLQNhlRv!dmlkbWDVVGK$onhdZL~ zq@t?A!f5jaIrG?xgm9Cm>V21f4YBQ+6&_6>*>Sas> z@-h^J#r7WPe+s`raJ?MS$E?3ErGC(oc~SGzIvtL(Rs4CoQ1#S~6nMm}3j%Z1|Kou( z)umjlq1h$b>LuV2&i&M z`_?FYm~9DGUTr@w7c)%Qa^cFtSd!>;$H%rjHE(+!dW%$BKS|jy`2|}iJf(?-!}Twk z>kH!SUXwP-r?K#nQmng#~~4d<;grR^K#bR?%zOygcdr;7$Y~b zt?SP^*dFlDd>f}eq5}xz2#^2)Rg3@AhmHy|C>f`XAQ;x>YzDJ*v4$g6=(a>Zbg(Ax z^=Z%M(vMQ}p>5EcY#zFN98CRKjkTnvRB1j8C;L3!quNDjJKOEOw*9Oma#4&Fb~+xL;e^%cl2QX#T3w!JU#^F#XKB^=PYxfF!(U$DM8~2 zHM^rK_^e$^P)Y-=-+9GgK{iGVX%BKr9&EDzS96EG+uq%rVU?X`YjvjYOs&b_#YE`f zV96m1h}*T@SqQg7yOdfPCOPZyuS|DVy%|lpyy#@%VcLyfAx%uCXv{*gHdk|GkgqI! zXWGIq{V_MXCS2v6?SpP4ZiMPx@H_=lHOb4_b|MC_4}mL?AIZ6nIE6kCz#pq1y0fo) z7s!F_{hw^&uF7;S&{~S7Pf8I-~L)xQ&WGp7&8?D_xwC++* za1%Y};S;FbT8KZ0H`taKwYdq|CMXzxes082$OHx0L!Eb$MjYn}#2dV7{36`(W6o5X z+N>4|ce1W8rFQ}nV?%*q{G*Nbh31`bi^!bnfut6g`sKD6O)B()a)h&15z+`y0$3ikhe-J|zmqbapoK8Bhnj7yF$ihnc1e zOLUssOphBETSs=>fgNG#8Xa+~O>FC0`!OmSTadQKG<*(ARq&ympoYS}!P+V}?!Ym| zJ9!Czmdxebea8>VBu6tn80xVK=Y0e9ueP)*@FP|ME16!apObg)K_%9*D8$feKNmvu zY~8$pis??eH{;_Ic193ttW45e3ufi)BA0#0>W|l0Md}8z809+=yY_x7%V2B7O_5}; zuXIQ#j(|!|Ozr8=!ZMT^_w%zCRS51tbgekx)`>l@m;NrPwqA-rbb?xlZfc_#;Yf7R z>sWz(nx?fQGS&DLwhKMo6BL3(LMn?$ZLxow;a7bi!Zg_c3;i3arX`{2gjXo)_Su*c z68?t#oxM+wOr_rT8dp{5?L`n?gS)hyC0l93@ zTdnH*WQUW_f=qsNs$=$Mg6ZRb25;+de+;&g@WoAX9~q?6;Pv3c9TEF{Nsu;=AV-2t zORw~+UXI7k&OLve#(TnnwfvPydT0vC-~|~6EnOIf(wFfG-9GovkSw1pvudVM?vd&eq?JuNosj8xJ7VBsmyhmdr}@N8<%LS zkNFBrYNKzmq=nJ)){o|;@+!}NgS?#PB{`!dvo{AI{<_MwpaXZU@qQYFPvrZpipC`L zz47i_>YiLBVV5OtP%g{Z9m%jTg<^0i1B(rA9 zX={v(T}zaYGe6e>kiku$gQE4|;%5&F&nG<1SMrFNPb3qZHpIS11nF^lEQ(|OD}_F! zv3=D^h%8J9Ou;dO?Pt5rQww(KSC?4hJi>`P?P}jNc!Db1lRd}g=bqLIjFAHJrx&h_9@IOlTiuD*Yaj#pZ!m-A{?~Yjp%~~;S7v9lR@L-ag5HUtL~p? z{&g{`Vwv{Tz%ILlNX}<|F3H-me(jVgO&Yi5Z~0vfT%HZeNjn}pp??!m)2w&OxZ&UM zDw~z0A^n=LX2fy_ZKAS8>g4b#d^1+?!t-yyF07ZXZgLxU8hQE^IQQEVZ6l{+Q6(R|{i$YBi&Mwt=ii(z&rtMQ7Mi+%CXKrP# za4xHZbTUeS$Zm%7a|hJ&plp$s^2yg1`JYqeTJnzuQFoGU7q|7-bjMZ3+AEKwT#MqA ze@qDpS72h#`Yi=@(Xy>loVO2s=140ap6_EQ>YS!nKvD|7Uo}H|grZQtLN&x3eqEgU zDcz{chq4g&Gpjq-^X%_h~PcB)ZUVM5nrJdxdWqR>=Tr~7%|$us1tDw74crSz9aRN z{7pK0e38AEWZ|EGSpqN@uJD?i`w#eA$$B~MHCMu1k)0jpj~X6Jblph%vAT^CZpEoI zJS5LF)!qST88CdLeyyFzHToqif`4Hh_ZMibH&7KwAX%}iru5B|ckXp0XhSqG#enJX z8p%*G#+w3OT1MKGgxL7$fFl7*wZ3*rqorbHftH`zd0mwaqp^l=cNL$w>AFW+!hG`c z+lOEw#?>@?&o|g?cj$RBRyMTQePixcf##8paxjYGp_b8plg@dit~uRw89+0Z*#Hi% zY7mtVe`Xk^KM-_0wr$nuPQaLdwzF6gwq;3j7Nl3*OMiDmU;_U~@ZlfDH57^hk0@R? zXmY4!AcHGbpQC)_`aZK!PG|3HxdrJVpgPNWtbzr0_KSq5jtAB?no0*v*McJy30nZ8 zt_j<-Jr9IW%YSlHiSJNQ?eUJXct%eP8nURvu*Fmn8YODOyL3HKhh1Kl*IlYy6WIH& zo%_6lI-#)eh53^!iPruV#eIUh$MAUw*hALL3LGTtv89Umprp1|Rr86cj>68kvWFgr zVFqCJTI!q@rZfh{ssT9p&nYZ8Y=a)UzIt#BI}>Nk)L^UiCcKYJ z3b4VSHe%Ijt|2XcgZ{zTQrD;-ca@Yp#5pK67ubcduQAzlg~L_Fs$V)!lE|qmYl2*?I#Jt_e#P_FP?Qm z>Aim*x*N)9_WJt7Rglm)q2lOqW&1w)PR_{+i}2mX?=6;iWmS``7s&yDS`-jz%+aSQ zTqjssk3P&u$G2}PYlVMddD#uHG51>rG**>pJF4#mGd*+RU(<++u6fx2j_43jpufj+ z4V!cXG%xjMEe_(x&!zZnmm5JQ-a?Z-O+6NLcJ$m97RZ~&GQTrDjEy!b2WXRtR{5Ao zoTUa%o^msB!~9?M^rBzEC)8j%cYEY^tYg8{Q33_X z#3iP>b(94C3tD&Bp;W*yaeVJvh4;d1=GH!Rs*9pG4Zu>Y82`*(G(Urq&yOh!W&3$q z`T^RLu$Kk?8nclRIiqW0$DmW63RH}O5Jl6|X|2T(6g6hEv`wG7YGJW5Zzh&ng66t% z$#agmf7}6S2s%M~f;P@`bbzTd{5QzA*gc1xQbT?(V-gU1x&(?gR7r&Y+Afrc_4wA; ztG2Mj&wS9pxbz{!;4&!E)HFWZmLS=C=Rlb^(K=#J>F_=TG4mXbt|&g&(oMV)7hZ8^ zD(zil$1Mf>NoYdQ+PtF)3!LI{6h&{S`Y+HIx3A_#%nFiUN8~kdW?oh*^i({)?+!C^ z{I=)h!dwoEI<~38y zt^H~H+$aI`zkSU*MuCn1p-M(~2UW7JKRzyrfy`JslDjJkcOeB1b!YF;6HCTvX_7eL zMPCOs){MA^Q0tRDBZ#256TR9capE~wzc9DR{kG*{Ol!TyNpP>!G0|j13O_Di+B2Pc z9`#EQ3<0$%-hs3^Iul7a6GnFa^cjJxk23b79K1<>>s%1w8U514EQhmTc}WX8jHj(0_&0N9ykoSH_`arUyEyD_DuW0ulg`B9jNE- z`Tvkdz@-;#Aqa6(c{d(2FP}){t%>*6L{{;lDgBk=^YO7N3pqeeN{&E)2Cjzia zW9OC4rGxpqa=7oKw6Qe>>k1bT;7HQE%(~5ea!@$jSeNwRLHRIfxh1U8t^lOs;vTY6RmE2aOF5dRkRo zKyGX8$WChAO3rw2%D|9HIS`;b%SBi1SM0$foph5c2*j@+vJ}EY6P7BE6YMhN80}xG zWX7-aFBf~$$AOJs*QbX6K%K>7Y3g!@Q#%9qZQ3TQVlDb3TV!MAo}@vLn54a;mH6@BZjgXc{%k^@fNUoh?D;ZYUe3HQK_ULc7(T2-TI|HzhzzjXgRzhg3 zb0W#Gk6Qdd+D2Owr`23KK{=4)?f)C(0YmuYG_)8HoAial1Mq;nGd~3k)n|8ZU-UPA zu9oPs((Q+y!9~#zsYDV-2WG7sBwd<+zk4|iM0;<3HqiYQ8aqj`idlqj!;d{q-|fuG zy#!2;FMw;b7Hi4zXkO2CsXVmOUmLiS?#*zeub|wm4S6YQsi|?QCNu8jN~})IgV-hR zv$&d)TpWh}7xCgeT(pf&&12m4L*d7FezPr_THu~31%(j0J?0mkl0NHXxb6!Uq@B;l zPoMDD4_WrYnL78Oqy(H3P#r9IC#2|y@l+fxD2<>I{24_k6fz_whS@&au`=kGdfy^U znEF1_c4cMW6r`KC4IOSe`{*;pZt_0BG3KI`<`sGuW+LMOfvS2Dz+Ue!TiUMw*&*kL z+jNFJ4Mjl!a%G~GI66>+`q4w(mScL?Lg{U?0}Q;tkhWTSPP0{xn`+;LOr;>cd)aiD zMidyEY&s^pXPUAN(h=7TjrP}J2`h`V!^2&^5`ZKQFkeM*>m7;=O6$rxk z)*cvWD;g}~npF_s{@hzCq(EEdeR7J?=+vL$B_w6!8?FpX*V)pucmGEN_*>i5RVvWjUCxba+*| z)YZa#UH`l#XPESZhilnW#h{^ef z3U6s?$ojKSB~IMzMJlBpc}Rk#oj(B z8WC^H$r1d^s$(lXdku<=`%O|*>i z+mnG!?E;UOEj@$uzQHz7_ZgkEjUHK@kN6x9VU7*l z+j%b}7uz-djr;eOMw>f;&jQUSZ+>9Esx4#q-3YlLr!kt^uJe{UHLAlb?T%u4*t74} zu;%SkQ&5huycS3h2UBW8mNUKvaj;(C1L{wW`VSn(>?uGUsT7`x7#?&*bYqpkysEBVB@(07WR zt$LO0IzPnoC*WC6Ak}AOlN>exOjaxX2bov2^zvLj_+pY@sSqpMa6Jo>ofvOP2*jXt z?iU3&~pfWv%CPOMACEt_Y=`zxr_gDSZ81QRV5?V|mdJzLybNdBp zhAu{hfog8CUNQVkPp!svRYd?v*31>b<|MFa@>3n(@yO~5!rn+~MDDjbO(t5}O6rdo ztJ64O-V^j6uI-_DQb>V@GoP|zb4YRCG1AoPkl8HUsY>SJlCUfj+$G2_%y9{sRah96 zWsR?kiBp5ixjrgBoY&#nWqVYREzSekq-2wcsCA&Xi&&sb#M9OrL5R$u*2JTN!(^3h zLuZ}O=`O_YK;Jx1Zs?3JBi3b`x8h~%oeH%0vK1x8fhD5Y2w~<&bIh4#6fV!A-;deM znij7bh$PYMFSvex2}3o1B7vF@cK-|1%+-%&VV?a4wLgRbA}0w7^qTZA>5JoC&&>Wu zx=KpfHWQ{EUz)LvvnK$JwYth4BQ4U$3xs={zmgf)P`ht_u|2jqyVa2lM>23V9{ePj zh|r|Y207+y@w2*;g?9^`OP&3LBNJZ(dOJA=G1u4X$=9t^rbfU4d3qu7Z=3d8L&QIL?fQ`haSFyd=0mBbavPmvg_&uWN5mlxZXqF zcOUCOW!{}F zTl(d&)g5xxs*NfNU1OJ0oCkFpKJ&wfCv`IUb012*qVxRKK#qHDyTbf+_XS~%pX^%Z zA{J)j6XSsm$UevSj`wZ8sP8&bP=bL4Ui!4`<(fGn=_cT;AO#0MY354Oq7eC-K@r-2 zamby|>NDJgDha3BOP7t^p_eI^I+wbF2V`(n$RhX^!p5!1V^tS^>Y7O4Cqy(#yx8@V z7D`1f=a^2oN^+(3{+w|+iHy?~;cUd0T&JW|*3tu-py!*fBEdS%BInmwEIzql{s9)eJqt!8|A) zWi|3iA8SI%>HG3b@^Mj^7tP$2kXe(wFGED33Y50}r%_e6Av3|~eLp4nV_X0p@E1*=SD4uXUYgzLVi z_Gxw2{Fi&1t+{sdk=`cQXk0jqdDRvN!S1Yy>HwE*oXT0@^kMGQl)(42wtH+a7YVQn zDb0?nI8?vN9(2;!<&Ehzxck?(G5`lzGeke2AYT+Fq-`qi`T`Um8CKcwMI&}gsB%8; zPVB~(L4l?#o8H-8zhJRwl`bV%MWI>kLUmt@l}FobGDHA2eznD`OsQl^U)0ej)3C{1f7AJu z>UTd-jfpzszqSYlxWWO=O%=5_#7jYWhFZQ0N5tiJRqGij%CyD1nW=ceji#6$qq$~)bk}xBc1R%hf9Lr< zgAbTl44FHTmnXOR0pHqMF~(69`2)W}TI6y7H5befN{Rfr!7I)dL8ZQ+qA-e<^UD5` zWZ>vGp~PJ-MnOm~vq0W511>2^V`>tuAHW716F~1#v1e$OdH$Ok-(bS2eT&FP{s!He zB?J8NN|)*erJMro6@*V$W`F$4Y2J&ZVGhw_Ao^ZYll;+emyNtM+%+2hG|m};bZeR= zn6U3Sg8&w#)x&5*ku236?|;f-Gv7`cAzl!RXW}w)@X8U9NP)uK)1J4jjZ>=&BRQ)` zV1fJ_6rYZKtPF)&r!;`Fw2oc3kb>uJXbsqkuT&d0!mgCB#M*BZ>)fxv%R27~;&ORO zzd`O&)yQ3kQTS4Umj9DFMIEyV?rU3Ja9-Z%?0djpWr|Y5?q3a~nIGY7`e8mL1EQL+ z_If*=^pG8#I0~_nA#3L&XJ?Bv030SdZTI>u?Iw#@JD(2fg5;AQ?MQrBw&L4CfoQG% z0CuA@&KA>DCs$t8dEj2|G02824?ViEACFv&VzI_mzzh+0${?@Qg@WHDF;EWiwe$3*o7EGmoz3p9CbiuSIXuG&_ zG>y3HJqa=&=)1ra_r>sCY7f8RDV;NoOD84ebBnN)Qq>xvPEWT9vviJj${hcvGAXm9 zeu4Y1jLTlt>^47(`9w1@pLEu?)I#{oOvi&X^s_U)HbE= zMp@u9b}XPK>8y~UxELu-Jd@w44QRAhINJyAOx733K7rWr#(x;=UBbJb`iNiVo-tou+yxoZl3IneMGS{uMa7i7 zJ#`QYHQDb;hR!+#k2RG@Et6>S|DCv|mfaz5>QuT&hHgre`D@Xs6r6VQE@Rd1T|;qb zA@KPR520J!Yr8c_=(0}mhM;YnraU(M8x;8YLy8k@Us~S3?TSmheBicAn;r9n4vR*_ zquNRWM}OQukOi}(+Y@kr!nC>Fx(fw+qD9Y3*)!#N_>qi9NpCNIUUH3h2!9dkg$og; zJohi~GIc>G(R#*{nE-CbbL;}>4b~=q<1Y4lvVF?NVdhPi3wlQbKe@8hroFum6&@R` z;CX}ssSDi@oIIMNsks79j}oy|f%Ff6$$^PkW{3n(kFrtcYOp-L0Q<6PK`6%mD6W>W zTUCiykcsvbh`ej>WPfA6vHebHgU$V?Q*`REy1Q?mqPl#xg!DgqIko*>H$j+XnA$XZ zBP2Is^QGNi43);Fsh{Y;TA(4O7jIbA3xUjSZnegp1$-@s=JY%x1(F73u&*vP7oyis zPBb+uc1x~wsXBEC5#9A+pyB6w(DsKYRqXXwvV}s%RRHEvV*9DE|wHx3}NHR9fM!tpL_SdVvc=T2f)YW|FUDT zJL=8c_6$W#etpvVGuJG|gw08evw7r|f21>*Xi{T?QayR0-#Q*P-4inWBAHh=?5;n4 z^HHc#YQQTa5czZ?r5#9@6S~cY!>u2={SjiWxk0}5NwzJ-pt%>6Z9*TPu9U5n_s2cd zWCvdT74q@a-r@NjQ>;9oMRET(C?M6!drt%(mG)G#!%m??$V~tk65RyFRle&JizE7i z*Xc*&($#Zoni8}+gbNT%;7@{eofCW4@u&(_Eph_G+DGGaWKt{tatHzIdcbXtx}&rP zc)hNkH*{XohYOIHr$bdb?a2;56(TvnuJoJ%G%t^4~!#qazarfvs0<4 z$_gw=t=u zVPgA>q(V`8;%OC#`b4Hd?UaARl@CvTsk&x^ImliEv1GbVrbU3#%=cMFL`{TtwYI%u zQGoDYt5tG)NmX4=r@9yk_1Q)(z0P538Ejwu4cZ|)p7btSiz|{dOh~?<`uC?^SgLRk zx+>-x43`BUE>ZwzW%bJV} zYdZQw{XmxhWf(UU`WbF)Vi=hmSU;20{;JH&g|Ft9|2~$rC!+ZOr*_{ZppoxbCb_2$ zr`g~U2a5yi+!IwSvon=wt}G2_t>`+B^#5VwYSIGjNDIvRI%wxHPr1twoxt{dSTeZbX#OVv@pw300z4cs z?UnC&y2q^>xX;213UHXdjCO0SS$AJ*meWnTVT^cwcOw!{P{>zYRZnd8-VGL=ki;*g z*oM5!WTnJ!NF=an3rN`~RX$kTA4HO8`vtsssGq=BTt4_6qK+defJ*6JvRdd?&6uRiow>K(eq#OWj z9@3P+nl6DJwzk-BndSq6Vu%~TuZGog-;XNcfcOSrk6g?OJwFb}P%a++?y?*!Xs+{V zxv-ACI<$7B^OYPg0tgh-`?8Jlf}dv&WvNtUZIb_sD}T4`nZAT}EoZGk@fH}Mkd6N$ ztBdNFci!Q4#`)7TdILpePv0(GX`3=ri;HGwV09!u*npx)&c3!hlXEvbS5WPI#Uxz8 zo=3%G^{?#{?q9QhNaCW`Do)l5xT&+9gZ95(Uz{+}F~4{d$55@ud@cSiqZxy3;3Xtl z>N?gm_Dq;L7}?pCr~peDp7v1_Ch%iD0arkWp{$*p;2sd2rrp&4ND= z(mqIhv%N@F_WPG+e9U31_3#8aSV7W&M6=KGlRuAEn!{0lmRG-%SmOmgz=J}Nbc>Y- z1Y-Fvp5zRUl8XI~Be3e}31CXNZo&CKYA$d)tcrZ>jut%&@^I@{X}D1V{VxK5w{3?q zy$3yvj6CTFPUs#ytIuqLy0$DEe_rlch74~lS)yAeF+a{~!oEK!DglQ@dQ+jVQBK%e4n4WPMn zn01!Wb7NPuWztzoP3el*K4Uvp+&CS+gq$H6=wd_sDzRiuni%!*W(0mVzbyD| z*Bk2*4dDoTtQ|79Dl$L#cdTIW7wrTP2$feA>L*qRu(3t6H zXPiE5?Shbn4{sYMdbrfm{2PQvhkCTf-~0VaU*6Wz;a#RPzWxSH5vPZZDL2uGef0FI zap+ju&OftrXrs+KjiNDhvxSbDZYcStwp()*ul4zl{9dRsD-<)z_-Z;{P=~d&GSemt zr92wnWWaXKSZ)*E1eCP82d#tNYIUjD32>kb_s2;5+5>xMechP$vP z0RoH3yb?kBy_;-guy0n!Gh4Ii8LPyxpUH)D&sA&?5w<2;kbNCFq{>->Go;x9^J*Ad zw=cum*ziGmiy&E3dEy(bfxr`e)Gp3|@5-DM<4@{)x_DFR>drtR(Jf3&P^>peVLG^Y zWUP%BGveD5CdXkKw7C>q^5}jR zPlZ5n?#NEGUEyy+?Y)5+_oD-kN#+9T8vk3q%#ujrNB zy4Ecln|WBGb9bT{U=<8L<87=T{s8xBZ_BUvrJ9pDwqjua3^XQt7T6=wI6D`Kr_*jWc^EOX8RwrQ#oBB1X1$(Q}YAHk%=M8FCvR^ayl0SKdWJ&HF!usL+{a)(L)i zsqduh@XEW(xSIG7X$fQ)sZJSI_}~aIzPl+QT=3-(u19?VNe6hG2Q>FQ46mr%ae_0R ztV5aygkT^Pl^Fowx}hidhd)sj4xDhk5gZI1%?1)TEFnZcE^M&L&aZJbqT@;9D!4$F z@u;GtXpkD@D&XZru+ zn_-UGoV96;C^@R3`pz+PWGJ~sedUPK_5B(ua&2z#z2Kuuvv`4b>7>LybuK<4e+WXEjf($_;%V{uFLMmz{_p(x)L>x<4k#C%NN zCjT`LPbL7BG=fv}mfe{jSJFfNgsuV^_sxs0?Cr==yh!CZpC)MknkEiO1U;TY{sN5@ zPE?ugLzsj*KCd!nfU7}qc5RC(%U_g%#Df2i_PjJ%?*e(7ICjd^%hqG3=;&)8o@k}w zXxQfelbx_68`0*{L}OPym3|7uQ+)Uk^P~+q03Q>Pd(5fQLE4e(gto9&=cbA@tS4LU zj$b4`6%&+fDJG289UeYes+xYPjxe5a_qhUc8NkD5$QMMy4#(~2%`l~Ww*1eeUz-7o7K20o`Zc;AP+*lNDviveR3u$>ubU*b;ZvvyRBZWcHmUMyHlLrc?_B zhY!*ewSO~|!G(6W7^=$SE!@77qpf7{@_hZ)C&wDdzd1;e?&r`{*=*7bQ=U*4nSp76)YG{hZXL6;tMQ z5V+680fofrk#9HHF*<|WYu;AVcHNZop67dVehz{kX0mgv`gHnm(1qb#w?mg;D5{Lo z7H@Ax;mmmV#$fbVLO9e)Vy(Y>r4jVz)M311Xf5n(>K?N1aWB9MIa7QC-*HL7xn!Q8~Wtl59h1C)iBTi=KDv98GM2L_zKmY`6hmMh%Qt1tRc zKBZSdU+m(4IFuN$?Jm#N{Uo`uQz+`#{Jfrvhp+c-rxeX*4S6NR^#K5)*ha?sDj`d* zDr}Fui`=0Z|F`sz&w!r*Cc5_7^E|HC{$V=hr;8GDwrvQAV(5jsjSR`}KBIqYAIZYs zIVtfNZ**Itv1&$c48sl-%V+p;Uz;^5 zt`#mV(d#~!`_h|^7s8q!js$#UE8mbgdTaW%o=i3X9TF|aW*hHYu-^Qo%`lSHK&zp= zQf?~t6P`Q=%!BudyUgmc{uodY7wj-RR~p&3Pbi9*wOSq)Ak{22YGi;0EEJX!-d6(s zj)_Z>kq0e}Mh3mY{;@k#$*-hQ>BHBX$?sbMaIrfX-0PX&2jH3q{BcK;|F};qJ94jP z)yrtjWZcLK0_5oB03I=_Zvc!~YUN)IqZvGYe#W*`7ifKqv|1#RLxLH%PG>WzmZX6O za>AW5i#w>d@eTU+m?x-yiL}F-3L1j7JvQcLE$`Z4l)>HHH-4H$Gr9 z0`+rJ^K8=7?2+q2<|5&Tz^(CEZ1)4H{wgFRc<*)hnXuS25Kd)bVL|*t-#Y|-_2$|? z^O_aiQEKKJx=xUmAnItl8raDAHq6!RXrx^>{4ix(Bq8WY@ktigJ!W_ce`J z4~np#rKgzPI53q6p(IfZ6GYsN1!{VUi|oM8p6yOR=ysP!ny2+JxLbwgjjmQG$bGmK zM}^|jU~ty6T;Q%8kn5m_HJDc(H4n#u+FN88`%QP8zf)szn2;6 z7tFKhPqT$`vYD;5+Q+<*{%pW zS~I_v;!wqtd(?QpCYoFQovD{U!I4-`UtD4u?sXVBFQlp;dyftLhiMt!M;=J0KaEJw z7mUi=+IJmt$jSI=BwKLT*q_>>ywQ};&c`_GWS^-o8&s)Kax~`M76cIoPLvSWP6jc? zjMK0-bRXb|2NPXXYo4c6N2I)G95VT+eGpdb5Q4QVf7u4?n48!9&E5it*gvV(r*3Ma zv$QT%Y+ma!8j*pHZV3B}DQ`=U*nfKrv50c>uI9U)ehM2%N0{pSo z!*W!=Pi5o*MX|n8g=`uC7~7jK2yp`UyZ?IXXYG48QVA+E3+>XQ{{rojSU~INu2D6J zZ!e~cgUvd_#1bS>kY>aG4(N>T(jr0wFX&;fNQzh)5BSSUwjGWIiXwy)pjxhfw$@YZ zrn&C&rZ1L>bW$hT{@A>}+M8GwuDl>zc$S`3?t6Yp%@+H>Aq|n+YnMK{F%yZKJC(b2 z0vlahxJ}_Gi&IVrrZ)Hn!hXYKsJ$zS$J@8RCOz%$7g-priA3(9ssWs$YD)aYQ4g2$ ztR1QcEWCazgvt>16*7`ItnJWGC<+!*-?lrLvVC zg-;A1{2^_I>NYdddwVX$bP0SIjW{7GwG1{p2R1FF`%b2o*Bv{7RXQ~Kj_d4HFb4YV z>}!{G2_o#nrIjv)x%B}DKy%#ffK;3$3)>cx6K654HT#bNmI?educ~aQs$}b^U1^kA zSzIuG>&d9!DsJ|uI;fWFtU?af{CT$H70IrSZA6e9Y}~n_n^(3lB-^rk24So8k!(Kk z=6C5{KohT*{&nL1h!wY9GqQmDt#uOL?C%m~S(w@NJvzUPU-`+{mw_xmK73#~*WK@l z@86%lX%0e2H#tT?8uT4bex7D$Sx7#9-0Yw=YL7)t2ojzFJWa;Ju|c$z}~h zId;eAk`dpRI4?dGqp^GQ)ih*I;AqI-$6(MfIuB|Dz|TJ;Yvyl+4V|z=p1M?V>$ctw zqdCBOtNU4WuJ(_hm@d!@h1ITG*ZYwmx^G#k^yqA(`tV2r5qD{Cscp1cS$!CA#Mlqo zNZ&=?FR^EWz2dp=Z>d1h9i`Y*za2VaE?=qvFdp9t9u!x$LD0{YacAH9NGZ;u+clWg zCIL7wn6%uZ@b?4$fYr&e9JYTEbX>~^Q4iq|>d3(vcW(x)a|cGsGU2d%gC_{}>XAt3 zM)<-95|`9c8EY?haR|JK!1{YY&qhm^Jy(}UcaTir^2N!TTCDQWaBu)_ovQ z9v+a|@&kE%9Eu7-Cj(QRh~g0|enIw!suGds>h~5!nfO9Cs@Gr@X^2r^Kt5PMC;z}p z(6vLms6vm1(>MeDVV>tn!js)Gb!Q&#-&@?MQq^E_(^qM$K$&QR_|Nur$LmtIoA+sL z-eIg3Ev=|wR+L4m$21MD&wd`wfL8~%F7UIxxUq44m)M4B1oMY*1XewIaaxwp`u z=DI24XqY-S#@68-24=bhs%yc&a^z))#vuOuyt^gbn}uE#7$QisbU9sEjjCr|SSoD{ zFRh3Zd_I-Vqxj=3YE(~Hg|7BIa1h_=jD`^SQoO}Gk88;5*oHguuixp68Xmy<%}B_7 z*WS8m8JU?apEl~0Gq1`!w#hW;ZN=$uV^jYIUxy=tzY+gk#wz4=7rJVVP!ekJQL3JoFRv6c%{KV3#!JtBL~+TA^@ zAZa_;nmX=M0z7T@pPyfM7&X2Qj`yvJsRo`4`+zMy$7rKfoZ!gSMx%0Tzz##VTkPZYiOu-E+zY!{x(Z(Ba{6)Wx}`$^RP)4`&%iy(PsqfQ{9xP}j5k%? zWzk^s>iD~_EQHxZ&j2*oXDYsrPyy&fqv@Q5_okG6(eLg`qRR$%iEs1)MW3UsDF998 zF>U1|M^e^RzAg%1NK@2#GBsLb6Wrb;&3|B^v07TCgvUwlFa!Ei}E1+4`8>c915SP zOL#gB$ioEaW)%e=yT{ZtfLuQyNGn2R!THp#X+r*z*pomr=B@#T|Q39Q~KzjJj+iL zU*-n3#*BFpek{@2OGghN!4*lwQn_2v1;~w|vxKO5C~!{O1%^0qJ(PJAs2F9%^iwIF`oF0rCX>Si-lw7vs=|=RRK3mhaLwFZW{2xhx6SnWFWNhkyuv ziVC<n#t_MK*4s8Yh>pr0NAgYkS4nYTzn)Ot8b zB)caq4{D?x>Hh8G>ASIA5xL<$uR#S#^iUT8RV0EJpC%60!7U%uQsj5#KrlND57x7* zW~7r+pit}SfA;9#Rra0ST5$jEr*kAy$#W}JAhw@-SEE#*(4Et*YI?gw?NWqgayLQM zrm(Dx-r8)WBkfQh@Gd6p+3EeszRq@~|2-s3oIgRR7bU>&$?ILA?Ge#HF85L-!o!^zKGLCTV-R)kIG4}vxJu|=%4hDKxq}>Sy`Ua4SCNNv+@IftE3V4~S z+f&9@vdOdN>GK(nTrXUB@c<;jw>gc`Uz-ay^6WaBV)Nf$j_Qfs;A+a40_KN*-DP(6 zfT?9^U=Y9#Is9gRn)fLu>%F)4271p{OUtTKJ5;AjbbV1_`F-x>55o0bY9*wsv^tu4 zLZ5{U1-fWDg|R2%5ywB0zeobV(cMf>a}-mISIyM2@SYsZD~%89A)C#2PbkaPBaZ>2 zl9rpqCar^=!V(%(%^x;>NPsD)uFz86?OgR8ez^VHTw>N>VnT$PNLYJ)){`@pZQv!R zfJ5|9v($IM;PS*6kj~#N%LNHeHZc(4CeP;(=*~Xf_ApE@y|3Ob8^bg&uoNXH9C(?^ z3=sZcomOo>EnfXrsh#FS45zm)fn@MNeus!~=PWMlTPnz`rghviWtWok9hdUe-;!n_ zkWmmuD3E&tHuN<+jNVhW$2jN+qlI`i3JdO9?X~=Wid^%${@##5xV#lhkSG?zmlg2f-%NXhAD%Y zW%`vXtalxLdUv%)(AegD8n4FAKsG-wdcDsOe#@(z|?H5 zz7Tu}cWoNz&+&0FQze!fF}GoWkv$pF0H_|U4|=~-CGK)v`=lt#3kiQ~VV*t#<>1*X zSpa@K(0L5l1CQwS2F`#sdCs+OYv{xvjrH#iOZ4E3w!P^}`Saxpf1 zwjQ@-F%e)@o9$WThI}*tQzmx%P zJtV#hg7KzJy{xKdR-6Ylv1ZwyGn4GYGhwcP<}zBG1#NO0u%unmmoGlt{e>CRSql=! zz>^cx8C!G5O=jYG^9u$hFw?CAptFe9dFbsadINhQAK2rqB!M=-mHeo-F;t|5QfS>vFS} zxwZZD)6=7fN9W`pNVaf|3RjH9e)$WNvjENajr;}oJ-?u~PCqSCt~p78;IEsF8pL}N z4VCsqzm3=@^Wl}GEn4e_=7ZEs)3SUzBA8_a0@iK!+vpoqT&`hw>INrEaZfN%a9hyQ z8x5oehq$Xzg_lWWE#r*5othxO9{|#qB$FlEZtx5A*lLMF+(qDh$UTm3a5u=ic^DFe zdN{M;o|@NgG%Rgf^gOy}z|L;cR6Rzf;Tvf#zz30Mu&zuo7rzyye6LrMj<4Ivv`;hxmJuSk!m4^S!Ek(nQ~&YfQcKN+iEB!u|534rQV!)c%V-FLrIw2ClW zFUvodkC7w)%z4YsL1WXjWGH25`|5rL2q6xj>POoMo*P&1ox~luE5~`;rbW?Ov{CoG z5(>mr#CdIpS}RYJ>Yo1InuC(CBo5F@m_q~WzLQcYz973Bv{xnNO@2kTOeE-R{x!*(+6we@3K%Uwz@Kd z@L&y#;CavBptMVtmF&CCiqkjWDm&>qn>=dBXv28KJ0_o|3}wMIP|4EQj&0=6@~gdp7}I1)?m<3^yl8kE=B zBeMYU9M zVX$p_@pYaYv{in^cdi}a1|*4B^_p29gAlFxsk(%C2%)ocv@zV9EpwqeUADk%OHz~E zh6590$icI%M`@~FvpH+}jZPp{5EyWk;5(;2lo*a^xZ7skl#{m&H$fIL@j$7)kh#CacXOW#ioAtS-I+`^u^F$JMH*6byU56eEWN!QdO(%SddF*L+W${ibEMn%mIG{IDZ@LZk<05enoOnGXniat|fccH4)F9KF3xmGT`>b!;~G_uaW$% zmt@3(U>K!hS*vke?O0@**a<{$e;L_s0BkxCppPKxyp6p|y+(TJN6Oo+az{Lw^_tAN zKf+?D40f9BHIP;JR={|{qs4=(gxZdRrw0lbs%Yx$t=Ij4CY!0_D$zkp=_iTA-Fu?50o$Z!6n!oU&X5U z{EQ$8qCw|%DWNXtU7*)W*MZ_0#UD(hZNJ!(ULQo2PQs{>KSeT*-;zt=jJgpVM`{1z zm7!cHaK(GpaZq!xo1P^)fnY#&q|CBEu~Gb1L?7*m!#|~>(gFYx1PjU9h1DOl*V~7}4@LbP@_^jGJe$!sz(^^d$ol8a zOtQK7w$Z4h!v>vIdiLr=6@%OQS+`I=u|Ew!i9bn%>LG7Lrs1&^nVLx5j#OEGYa`;=lYlI_4%1U| z*ztK|sEG{~ttOIw$vtoQp;`uiO50a)zv0?4jn#4;Bpp^`uaulP@d*i4H_K{cLIH&8X8Y;SODujHO#Z)XjI|x|4^JFMW7;PX0TZ4AD z8f*G>-a+SY9g3B3S^Q!tVrvwgH_XYI@zDIan~1M?yf9^8I%h7J1jy#fZ$z|eD;6xq zV$#~>if!V+w+T;-765#imET=A-E|9Dn%uWbkSTUsmWCq%!OyMee>MF%o=<41B^Y%- zVuc#r5qgFEvhm|>hH53^zB88dA2ODg6$G4Hj;=bnxJAVA`ZVJqnVmi@R#+|Z%HRdX zw;THs3#NK@5j;M3VV*2-`nLVbR=RvoSY5O#h!=N^(c)z~X`bQJvD5@mTldU4dI|%E zie+8a-uYhl>MCzDGHdTsTFN)OD?M^dFPDWpi^O&Pnlo0BSvz)IH1$ER)dpVrc+9o( z?beNgFF0o3`qKMHbti7*XT3gEod>P(iDg~ft@O^kSo|vGj+c$@7)n zGYj_yIV-xsJ9Tybe&W|tF(Bl!NHS)ZegF9LU|h^`SC+ib1>&w>Ah#&2D$n)1o2bBL zKIIedOWpXz(xun_%JC?oX-R%|i9E_+fktsd$JmAktO^EIZ%&R_kss^40?g!D)aR5g`vR_*V?if`vr^0g7;LZm3U4np!iXaE?JY19a zHLSlEEGn9uAX4n7LURE`6829BO^{bd$e(WhiwW!>&4Oinrh3e ze6RTMH@N_YsCOL@@fXWO+0g*8s{aDAn{>9vM7^pAXYjrilY{M?a|Ag^&EVUBd2MJ{1JvRMPwCh# zXAlCxu{FFLpBJP$F3ulm#HVxyzYO+6V_~_EEYJ7MrUqtz=2Lz*O)Yn#kLtY8n=Y~? zadgZaBd`S8z~pXv)5vo~tpiS=?HqoOG;@I|Q$3X#;nL?Ww>A`(hBcoX2L@T0bZqQK z=*&gM_s3w!t{iE$k?b!}qXl$PlHk3M8y^NcUgJwsIBN)sP9002ulFW+n>0b(A$wx1 z=uz81FV3-aF=2dS9pms}-6fNB7UX=1D92^4d2ghPnHawK1^46W*jo7u!du5nG}TP^ zf*`WVowY8p`bw5WpyyJbm^w<-9LvJ0HjmY&@?7uMW=Jf04I1+X3|@|2f6tqO`eqO6c$Z)hx6}i zS4NQfLAiCZY{M}<`t*_FiygxV&RLWE*+{QBIp=NiX-?)WO3*~JI5=HwND zebwG0KM3iauKn5oH-47O++Ah+lzIi^XStLhqABK5 z=>6`w@bou3e`um3jrt;+kwC|)Qq?0cFAdpwM^M&CW&`KJ)z0iG%4{ljM|b9T&!$H6 z^+6IKN4d?(&U}Hqy8wvI8C(;+Qco1MNuKk=cC_%wa_GG|8b`xvt6A) z`wd?j)pX`lZJ-0XsP9~QPS7t96JS*cb!Q%(e9FEmX)_4Wle~3_aV#I9Hw@KUpDgG^ zprfgnzhq2z%2Mp1823nwd%6%G(_iDozZsyuuVl>AwK#BgHNqvoNs< zz_u@)Kb>AD z913Nb8UJ-MT%Vq(m&^uXq_=g;+g}P{(=}eB3gMZS`A@nt75kObrh;anqd@Jlj#>q3 zjn&ECI$hKS^LUWBA+hxwp^vQhG0WO`M7gt3X!skNXD!J_ZE865+8`Hm@_gx)`YqrF z-5;}OMN~ez!GBGRo~W?^ncl+aw@>)hmeIDch3`iZ4SGzXY1t zNbDCq7YbbJmgdg&$E zs4!-y>MXmFcY#K>%3P-D*NGvWRcgxAnt)NY%D!5rq?DR=cZrJFA)(|;2_7#WypETr zrrt~54waP+$H^vy7N$y3x*e({mI+6xz6XG7PVfdI$}rosM0&;gTu)_u*r~vosk+Zu zUu7h=u3f!0(y3Z&Ec?!YO!zq<%@*keJ6MWb!wt=oJP5&`^+U(QnD#mOtMPz!^oq^H zgp`i#D_~k`)(x0#_ONO8$1k#{5Fb7NOX(16K{=!KA1>{mXT8T&R=mSJf&T*4@8-sZ zt^di|4ChFoCxp3Hqlm}7Wq;cqE)Sa-3;z71OeBGW7C}G@*+^Cyao5H4!xytu4BjTH z6JzNIzSNDb<3+I^W#B)8aAES9D@pdcrT@pxnw*1vuq;f~<__VU^9%Q6sUq5_*D;L< za?>#dBiR%3)yy#Hpt59O#(s6t?%ojjz-QZx-zwHv7Ur7Q8gGQwSEP>*k)@@-KwA~? z_I_XIzEIxzbB9;E_adUluCqr6tV94y^&V(C$$<^-+-RYYNYzNY(m?=v zsvS_hV8N=w`d!vK)O}vdu>5DXG0>bzaWu(4BqVkI@dD zd#IG>p=jo^Ou7PE5|I~16&=48lhm1O+E(>lnR|MXkcIL}$cSoE z4jvkm9<-27lf|e$3`4LSj}`f5EyBr;#Kc*ofN!H=f3akjE9zkgT636sBT`QbPycDu zw$>Y)PkZ@r503i*QvdjpF>6Rgy~0302grSuEkNW#p1X+?P8Je0a#oLuXg5Yx&Ob6> z!L<5?Lrq&!X_1Y^g8w3)C~PMDy01|H;n?B-x~j~rH_PG?)hum7j7G!gA&XG z9Z3uSoXgQQ-vpsIao?e%oT>oWe{Or*!YWBG=yE?;ab+#yi8ipy1mjCvpN^dx6r441 zJL+Ay7dE}mrr40Ho~R}eF24uKE2u(iwxsWl-1w0fOR-5vvmkkLs+5BkvXtAuk-i-F zVE0SEiWuWdVtaPe@fx3W**#~O?S^6UxAlr3MphX2lqrvGfqfl%7cQw9>djwd{Z>|g z{u-uJXv9Ghp46!Uoq)%bu)?jauxjJ@0rkO~4j|p_p!@;?+2fYpa5O6{p#^2)emRSC z@bCIymLV14=r9ns{NAs=fk!DSiOzZqfkO0VxYCMb&)S6Gis%}WZlKIv*AZvMACfl5 zW8WOV+{<;gTH-B?i8hU@0!*GlOn6UZ`X7`d59z*Bz3jWFk|B08oP~^bl1C669pm=U z-t6+H$!#Hd#>mxL@+zBnSaGegYBAe*H@`=;!9JUu(s5R{|CsTRHu3p>C(i*?dgck@ zM)y|hb=|;q=E>d|1qdGD{YnnYqY8zLNYGQUR;Wv^ICfeQDl36rnXOXKA5fX|&ToW2 z9YI)pF-Zja_&|~bC;dj;eYqQ9{*Q6K1;VHqqzjty1q$m|sDPUZ2nZdC%|K%p`bYGF$U6ej=%&xo;Ct6KN5VM) z8GQ49u8Y$)4QDoc6$IXW^?kFMd3&9S`R<1gze?QNY7p+vmzD|!D_MJt?{G=xgmhy& z$_#?@-0lv5&{bX1s(8mE659gX3cS2sy}1s5j{o^t%((l(FS11WuXDK$jILrgd~a+S znbKy#MIWmiN4C?R_g7WX6uQ zAk4F%WdB}2>FOB2A~Z1KVy65Zfyxr=I_*hb@FT^I&3)L;S1FV0torH?m&|qE7A|-p zN;I@Z7KJ>_Uzn}j^`R?>5RaS_CP2WN8VsJio6hHFc+_Heh%!myjg%ozclf>e=L-Mn zV^qZ}|0O3@f|7wb1`VH`$2u%zWHV3~6ofRS+R;amlexvYKvbb>K=b-K)ZqR+!`@dR z{KLL@9)hixr$r(2P*#MmqVmt9*OHob?1Bbu^UHarnd?`|gBce4Ra88nZnK#sAh(T? zS)HL6b1Av$#ATyAq~23rDpoDc0hZE6=tc-ep#v7!`!{|tb8^||p~61FwSzPpyCl+! zkI>}^Df&9J9Z1eZGzCRe^a0&i^45RfHp7h3w=%9ga#_VPO{ZEbml@ghldEqu@+!MN z$+0T|5k)pfq8T@Lyf9NqUh^~yr5o%b_<#S$i(6@&Y>T5^=)5s@3cnRFmD#JPkghy- zbRCe(42;NJqQaz;K(MjKkwzQ{>(}%x*62TIlv4pdnV1Lxwx1p)n4ZitT+HPLyE8vM zTJOU1M9V(bAOirqLQhIBt(@ zS=Nq?pMeKS>^7a3d@E77;DevftLD1B!zpH{hkD`~J&lEeaR5|LoM`+sxuYgD(CZsq z^QV6#47{dWJ(oh6)u90i6Y30f^NC%Mhbz2u8BHaABDG&2>NRFM3vSfyX%hMu^lmdd zN`InlIdzKgq{=Gnna?EF+uLCkOanSWq#Rmy;5Sl+$vqt5$uH0cpnLWgXdQrlXqxA* z(hQVb6b!eGbzWkEFy46y>eCDc&ZlY1nWPf(?(0hlG|EAQaKHNC7pQ{`srf|R$ClA& z0*>oukWkLq^FEan3xR!gJSMb27bx{_S?B2>@qdaC8`N9Z(W1! zhbZx!bK1mfN(InSy||&#ipa_V#gj&W$PThImYN4#ue{wq0J-3eRi+pzmig+|#Y*|H zP5?6DlSs}eFeV$KLq@jf>21$!vN;d|@H-FYbRWIh=cldBbEY8L9Sk=HVAS@)J;o zE-D?4?#es|0>KHQNf>NzGVy1OXlP}i-b zJb9N9Al^{o25F!3|2H`ZyC-lJ1zV}4)PvAegu__MAiMfgo3FFXt6mLk0Xd_50{AeO zp8=l2-7JmMgTRizeLZN?0D#Dc?vK184Ifp>(_*>Y^kc7$Jyb>1Ch{>s3BrnpB-`eZ z7wLdUV&Dv=UxZdw5W5L|%bNh^*8~^KDys4eRk?=44=obv2@8Tzzfh;U=hCGI?0siI z%Y~DG05PQL`02<@m|Lxr!ZV*ou3|O^+O|A}3BK*`YzbBQ$NyQO4=xm+g;|*;#I45Z zRzr=1I@d_k7rlK~(SraZZWpXG(azFkd z%j=Fm-Y%r=Q>c_@OrpZpg3NX3|F!iCB`zbIb56dg-SKFD=54O_&2(Wv!OF$tZW6>Wj=^8*zUTMgXwUXuL!EI*ZplwS4 zOD6cR9U5>vnn$_xMGuHMbJfERlHJkL!8X@;V`k1fvcO2@l9d%ARk%o4rBU(Dv35VB z=hF*8`108_TQdurhw!QEa0D>dz$vP+U$aYR{Irj#U8u2ZDnjaks)d+f$&dH`N!Vex zU90KeyYMxGNuJU3$;qB|b;r=uhb0>B;kd0)g010MSgBs4?`EEZ5fnh6=_!BJv$Ep% zQcoaNN;I$_xH6C|#uhB3S^F1`m>vtixkD4sUYv!3%A2ArfR8E&WF=U-6pw~y{$;D# z?Epkk>Rk^iAARj6xo6~UOA0h~4h!?E{{=G0r&wR#*LyyGqrkpt4x)`MPsS}x3~%aosD-{FT|LxfrqMsLVStyG z_5tkEFVOH@^8Qk*@YKT82I&Y4G2(6#R4ckdPQhU^vJDAjSi?IoyjGXWw0=(igiOp@vqDnq}y`op$Yuv5dTb z>hH(0O*j<20QvZpL_ls|p~DoFU9Bgoq*mBA6Eorqc0o`khU`|FoB_Q( zzz9VDnWNJ}%PeiK?5+Zr;x^L`o;ypJUY2&&2^bl7dH(i~t;&!E_8?Z>kXEi>TM5CSL+oQa>{>_T&pgDP?ujUq#U@vL)j-sHsGo;!V#TOqoI_z-BvBBqH0t zX(+e1eXe@OU$adOLSgWMbx5;r2UxKO-EzQK84;ozJcR!3#xQytEV}TI7q41T_rR{rR~g;RYCL>yWT>q}u)3yD&?|;+qwrZ3B@8&#{UI8~M^? zT!jB@x)O#bD_+U1+ZUo%;BpSr=w@KYsH<53GhhbwCSYF1e;HpLWi-`hm}PQZxRZdm zxz5$d>zX$A^p`kq4Q*r8%77wXQ7cBPG})4hS;u&Ds{Ff4PngKZUm2MUH-YGW{`-4x zj6B&xvbQ-24*5Efi{cL1AF?mLGajf8mnZmpGq~ZS^9ddmD(+c<$=s6;-aZPfiw_i5 z9M7d>zMO4cn9?!nn`H$5gtZJO!~|I$J|+D=4%Ls%3SUP_5H4OS*eNHke>;MauFSPGu5&Ny8^=t)Nl;%2!2O0{ZiytyHEpi4f={Nz`nr3dX{lL!P?cgoLPyiun-ME$` z3-M*`tZ&pjsF5y?4OOj?*fu-hJ8Tf+?{ocDx{3;K5rC5bo!Hf3=!j^VL@Z2yABT0IeT(we2(nNk$Q_0bcoN;SVI{FgDkYvOjoY+9!g@H3fj;S1INBo3{D7jly##w>AE_U^v+k|3_{xJv@(yN} zR5Tfp#IKx3z)T&ve!g%5{OsE~#Sn~o#~K`w1Rn!nN{=cU?t~f3OBRlq&E1pAGS##T z?DJ6sDiXQLE)Ea<9m`q_;VM0;*(y8RI{$6trnJvW^GRm1d&$^~`ukW3HQ$223N9<=6Si1D!r7Y^D@IS7Y5YaS%q zu5k3i9$zju+uJ-?X9RW`wz86JLx7ylokJkl&1<+zu${dpV|v0oLy_m6h|1C_=Cs?V zxw6#L?Yz+MrO6x(R1 zGeX5UMhhkXC!7x>)Uve>&z5MpCgy=4c6QnAOY6%34X@7C4g;-Uc>Aoo*05J*!|oov zo=~@hmw(Qxc02Te2!EE}5kROnEI@pR>fVdK&URC+t20A1|CP@L(xeLpXACrtAeac2)iFcylKjLsj3nKLK{7cmb`t)#iuc#d2d&?H&FM&@Qc<5IdTJwbNdPMv zusw9)-})6o-4msppD~@R>BI!-PwD&jyxB`is;*rPha(gR{um*%{g+FUDXJ}ra7>4Txr>m5Y zwgFMy9zfxMVP=d=k9}8${S4!a={n4k&RLh-yZ$1&awE*CyvOhBfb7apsJ9ESpLzh4 zUfh{Sp~&n|?l2uQ%$+{)xkWsp3%qGg%}5ea`jYOq@ ztJg0LctFMnN#2Q}$+3b3J}`5@Z=XVw^zg}=O(tCTE9O6q1RFDm)kVvRpD(`GWuuWm zZ9)D+nc=V}6S$#JPcjDznh_puj8s_n^<^k)7f$IRb|=+dM%QsI{a$&OzYu7IXV50z_-w4NJLKJQ@5{$- zkZJI@Y7RkV=@YGaga&--x+wDg$;P0S$(sQqCpSBHLXmLn&|y})R2OG;D{v+a zPxk!0kiWpW=iHr;{Ua7BQ=|I@Crb8Q8aiw3$S=XQaoZ2R)Lqpr?FZCVK+@5dd;6l@ zt!Y}Iu8d2cI{*oiFw4Qcjd%2JcAWu5ZTkk0zo#JQiuw+>$rs|`&u3ZSQ)tzTbc^`V zWY;yTpiM(jM8fsCbd7h3D=?*DZ4FOYVh`WWO=>C-OTYYO`7U`&x<*9=4FJj8SR z>Jda!tqmP82YnRYjm2H$H%5p^m7a!7=#n1q_IJI|>-}t}N9nvEWTkygIz!Do`I{GF zB2~1HiRq~Z#;`vVmi{G;#0k# z{$)Vt6|-LX(aIkecNgVH&^HMBchRI*b9-^>b9JoHI7n?T{@t zTp?t~y7(m|Eg3Oqec|n*afw2&YMO_}1#t^Fks;|@9!vRNWVPjq31!Qw_#kZewHSlA zkrkIdLvZkw*xrq3ZcK3!jRA1z&)5ltZsAjEoEn5ODbX&vYOMFlQ#m*8=1(`Pn#X^W~>?mJ}& zOqp#F!n5{7r~@j@*h}NBu>P?ztJJx2k6+_XUl+cX%RVl%v}by~%YfNH)~k;66kdR<0_h zZTEVR9D=y~;j0yS7C1k{dxwM^n)-#c`g*wL?EZza!U@!pG+Dhv(TJhh=%-cDl}yL9 zsm3l)9CTVH(Qs;C&30JDW9^&KMvLqW7rS7)jt=1aKO((n&}Q&~v<7=fm;LS(3EEg+ zL^NHYZ3(K}`00bM1BDM7wftS3Lv&|u{5I*4h-vaLqxe+tkRu={Z1=#tX8f!a1H43f z?0dx>|KsRf{F(0mH$H};F~=IsMpJUAh7NO>k(^4-mAaLQQtHkelfyP=YHbb?zA_?| za_C40=8zG$$rRlxgqSnUp|SOQ-@kug_L$G%^}b%$^}JqilyjAEuWBlOPi}S)Fz(xp z_D>50ef9cGsPt*(>^w0t)}dyee*hAv>j^F6mts!bAU)A!t$Rmyc5)UvxJQvZhC&+j zgaR)0RSH{cX$bqOVooGN*T5muL0!kmd$tAFD;Eu4#`rD)rBSs_R8M{a>I-CL6DAEz zvr{&}gOoJ&s1bj4Z$fMjv=yrn%XB?#!76tJT2$01yCu)-@L4ugLvNiyNnI-%?EoX2g9@7b197#)gGuBTp2fz@h5T#K{iJ`15pQp< zGmG7a37ie9CYQ8>MM#-X*y$j|1*=V+^=^hkB)metqR}-&;u(GH!L%W~(sVN6MAY}B zlf`{`$1fW9}E<%`t73su7WLf za{TE2uQowe{Mchu!^rsIr!pvM9Q;vJP!^Y|9RsnTISLuyWMvxq^1_A35h^CFCqc5k zF8vs0hp4}%=4#+eYM{e(wHMF%K;K>i$biqxhJMOZ>n#{*wiGFP3?d2Y&flqI=QiSP zW#O^LJmp6<0q32F)}gMm8(t{ITAlR$?>B=a%GJXE*QUC;lcvG8@)ns2raGZ8ZEXd! zf)RJqqzgOKmVaRlAi{vLdZNo6(Bc2XO!)=jfzjv>Io4O&!u`y zo*9tra!@Oe=Lo71BTs%*)S}CxGc1Hfcg795GMC)6Ari@iq$Re8*J>wL8(g3kjAZX@ zXBnDdg4ks5QS)RN@t=0rCB;GLOJZP+i`OFi7R4x~=<5#W-S1Q4y2lJ+GnDCfIs}}v zz;y7>3GXaxN|aN24oyC0^_P2soCsD?%x8}m^5ggZll5zLJzU2L2C1DXd;2_y=)#lT5-rr0Hc8pJO{@Hc;oiV%b}eKgUi$4_ zy%mTEGzz#gTC3S36O7n=_je}1<-uHcBt($U+soANGT9D+$9;R}!0R6$gH?|)F7{Vw z>lZ1j)RX0_a%N-W=S^JXJP77z&Rad*4l~7Oz;|!MZy`lv;n!M=iegx_HI)a%=n<{n%LV|KOS$Y%urN1iSajVU_}L=hZS4 zbO)q^ZYQo9W9$tR1+&(8&XJwaB~tgbx2DMDPZ82dH`qXrrHH>*tgf^lo%Gp%g$q$g*yh{qSKwSuiyJgKrF#c+Wn{eRD!T3ZoKP%IbF46BJws*Y zM*q~Uc_T014KaFL-`NA6Wbc@BApc3LA8)TWRelf#&cz&g&RN%Mtzcb7WUt~066d2v zJDht0l$S!#2OQ#>t5|CAx5iT6tj_@{IZTniZi_z}EV;;jkWF&~9OO1Fl|5 zn%ybwogmLx7qHP4FNx>U%zHg$)o-cpycCPm-zvA{5sC|iRa_Ox5UEE4VCgM<_r+7+ zuOz;O%VW@DZ6z;C*%(%ek$7f(B!7Q~t0u`=`ptT!-qdyoWwhv<5;w&>`L=b-m9q?4 ztvk%UBPy~hZXt{}XA<4WgC1Whi&q1akNf>Noe10#YZ`Nf;_o>R`t=hGE>9!%Xu6S5 zD2M2L9oU`ED!y1^PpMa{85^p&vZ%dOR(158Kgy%L-os#KOy_D$>eD*T&7wiVl7M@( zE#5tualp7X_+~!od#eN!0>s3vVXQC1EBtqXu;S#=c<&a~pQZI!@Sj={i4QFcj~ZB2tWJ1|k46UP)cbjVDjBs9Rd< zkqM!L;C2Abd`yR9wBJmAqwZ&X^Tu5mX4!u;CVb}%2dWzoV6Bc?ZuxtQ#5W6Nnk$J4 z&aj6MKQHbep|{E-qe$>LaWApi3$qFZpKk7VRDDG?W3f5u$YfV76x$J~XO;M>+I+qu z8TaVKZBwhS$it5C%mhjWWKDFB#y3w@Oq*eohLa7|uI^qI1|o$@Y{hT;ynd68zfJ1* z$a5XkGqQAGC|bmCw8yzblb=dtK3pYjJxKNLbQnq`#naLY$1@9AzCNoQO2IVBJm}<2 z=~(jNC)jTQOgc!q=|~-+)SbP7hkM(-HUZA#T?)7g)5mzu*3^s z3c#IE0-W5u2c{S0*GbOTOaKBb2m-@noT+ak`BL2qmvFld?zqz>C!6*MlEfU!9Kw{F zAI$SKI3-a`|FwamLg`V=?_}z~A-uCEn?bA1;)S#f3U8yIGCz2ZQ)Xh^Q;)k{{&t48 z8oI4bvhDhY?e)(8tSzOdmi&`?-`ku61?quP^u$6`-1nkX@Yya^q{Etv>^)=`%dp|v zP6Hz7I`RRz3I9DyZV1aQHe(rTiXt{}+WZ=7I`%oJ-*3NqC$N1I-bTYIjSa-60fJm+ zXSKR}Jr6>X&dVI)^Jj|MM#7^7KQ${Pm8)9k*+!&5!(pvAl5%=8f+_gp<58rW83yF+ zHm5ywgfoN%Xd ztf2>fysLDKt8c~e8A!isqIZ}4q)U|Eb47nBA5;=Gc>;~!JmRcN1Xm%$k(aO^iPlwu zosaRiY62tY#~B}qqa=By5^Em`{t#?!Z7TYfha57@N#0DJL{G{f%UBghuY%zl1LO|} zG)&%lN5zkpP@N0yHp_EU4ZbyZuc8O}wogL4B*WA!#k1HsB?!KSuDarv6~?R%<2@Qv z$k`7GWy^kreBiVRp^0L2#j9(X1@$N3Zx>|_?k&~%uiuPGwVk3y@lV{fflMZ2KW_;j zcA+l~28{ltOaB8AR5XTKHE1bZZh6rnOnskp2N23D^>Wv);NS0XwK{FeL4QY!lq zDE&FTYBg!LLD)|UjYhq0`*_)mbdz>DN!o9Xw9DJSKL9?trEf)UtaXb|T5&f?xBC0; zMgukca`OTmmAMi2Q3e{{B02sjK8MWuvDY?~rlgKU8>e`|BwXxl^ClGVk z29bz!wjb{!`o6hi<&%6JM4y|v0wMWpy>p?0%Aaf-j-<6r4*pv2^CBB1wa!))JRUqD zzM|7IWTMV^a^y6#ibnPlENa2ZV}0e{fiC%Nt+H>;+O8F=zF)cCzU#Dj3Nb^+XCH48JZ8@spJ-TXv;`Z?R`hy&}RJ;9#fq>UCq$bedh zyv=!(P%1|_oLR(Ke_MMRQ0r%53&4ZHrk%LtU=`)JBa(Ox(SLnmgL;mR$6D^cat`A6 zdcfocRI`@2q%;X#WA-y$(q1zHW!04IB&y-hxfxQ`u$uUuuoV~4P}A{z7rcXQuC0uE ztanDfkJ1)HRRO1D=5<*}Yy6GAQgrl%)C_t+ZEI7n6AE3-l=_XwX7PuQp0njjiSs{Xg)n{l!|$C!cOUfoWDjo1lFASE zPR-gV;#Ux}qpk{$VU5dGD~hBaDlSjF^@_?_)*y6tusJ1s_S|v&_2S|cIWu{`hju29 zAcwOD5%p^wozQwh#Bsxv}%oBUm$==}j36 z00&`@9j;P~b=;&}GsaPip{u(lHDVtJ3x1_5h_jzO>i43;EkUzhC7p@EjG7@yj?LT( z3P(%YW|X6tbJ4PCG|5M|?|!mzhP71*IWBD6KF)mPeUPiXKl7)fTEFrt$r=0AxKfv9 zwXhzRotdR5s|Bf7dsvLz<=(Gc9q_A#l~Ov;VAZI5<2nbVUYXb4{FLjKaMrM{aC%^G zu2Khq{Jv<`dR;eKWP+%eol(vkFNqS(@B}%3uBDY1eg#B& zkP|)+VHlA+xUffF9YLfZOLzC#doSL+D(#+R_TjhUZ*D&=`s~r;jt^Us%`X|2{T@}) zyY;MHZq}yV6}V~f3q`Ds-*n^CrRZ9@mY!uGzxhJEQ2uSGLSdb@fAM~2cJqpXz%U1w z@8kpd5Nj>gp+ih_(5x}wQ}%~y53rRQ@%r%t_*>X1?*QfL&{6@{#VEZekNz=pu@cMK zVt3Ata}$*~MWA+>>1oM@xOkIwd?%PEcb>1&v6)00PbtPZJS4isQR?}*8OqL%r8!#8 zj)#+Qu(nBEl)e?q2O7__q6U;bJ#6=PR`9meE_my z8gygBzj#`;EhDz>n;u3Q86{4Xj^4|bNjTsUw#xV|YRm&$tyAU&BWGZSN2R$6WuNvc z$}J-yaL6`j11N8g4!O3Q;DeJHr@hGuwi zo(aZ5nnA}yu;=pV@d-7IiKiCuXn6S7Y_Gtv)X_BNQO!fFsSragzs&K_`krm*osIeU z4m>}5pAJXGLr?EuHHv}?UaeY(uR$g^Wt;g@bo?k!zOGM!c&bU^Ocwn&By0%U507Rp ziS8-qF;n4!-9+5aCH9!dOvW;HQiXO+8~&&2nC1zI7Jo{-n1*eye|n_F}2OMVz}!7A$5U& zWF|#u6v|tpt6e!A>TnmxH7Ec*=3Yy4v2;=U>-A5fpQs-5{we~aGmP{FD-GqT7Xzk6 z_$m}zWc3xZ^w&$vXUv9Li|fQDQEG|FZcg|RSFkp6uG)HU%w9#xhyzbM3+5+WX|Z9G z&X^u|IS#w~dlY-N$%Qjr(SUx}2{#@HLPuSr+d(Rqs^NY+EbDs|E&rzhedRZ(n5Ov? z7fwog5phcH{=T#hskH^>ztLnA!%;Yg39g8owyv!;=R)G3!! z0s-Xu!hi~dD|w2OBIRW>LjxJ~;U98*37C9k8EN8ZkVk3x^c^HP(U)n_@=YJ z8Tsj%C3%OEF|FyE^~zkYhV_0f#3j2-!X|-m#NhD#6yf#YfeIP9(&J_jMMXnt_XJx- zPNN0T-K}H7lX$sGb~ZUzCUPO45FjM!>Ol>jGS?!7bj^aTsm{%}L2>I&LCU*umZpO$ zVPY{|^XACbeWz>WNBa(Yk#0n4iRW8+tKmkMUZBX6$7%PofOs~Mm^b_qNk16%Y zhfnM%U$@ww2t6f1b#pPHx(*eUrlUYG-1dn~d3k0+l353EumXr?4Jk}axbFVYB}!ef zy?7!q${6%>{8yb&XBqO3YTXaAeKlsC5i==O#Mv|txp+d&l3bu!;Iz?>m_vLK0|ary zVrzownQV93rR-XR?RpTUIC9J?5tw`)^1I~rCQBAyBug4es*wVDL?2-PiJy7R97|yb zfIa`>NgAtOMP9gel`1fI$0|m!JLso8vgFwN(E;1sS=APZhs|@WnzQ{^--ov3edGSr zB&NU(AFav5=83=+KHN5X1ddl-9f`{#x`kQANmXLLEgm>)Z@RKJA*IE=^9jJz-q)+?+mO; zoptE+&T3VqjaykG()bhDO{%+4a9rE=uwf$PC3LZKVZ3Puob9kB(>3M;T4f`4SRr!} zJmx|A?BVDcaZ%LRc3dC6(7>SGLj7=DSguy%yQUjc@Fa9N$H>M6Y&R@-Qu=kgMlwtj zZ2n_H-A3Q9fMTZv%grYbxlG?;{Z73K%w@;i!4lGv_6hclsrlYv(}?rZ2HVsdP3dXy z_4Jf3Kce#&E(j+Fzv*Jt&8(oLr$H^lg6OAA<1c9q-oW9}k7e1I$=(?^Tw1$Bd3f{f z;6D&=*aAi?ACe>{JS z^cYv6SLsTtgj&cmlN>3DuW_d1iqwGzPcAc(u%~pAHsJzY(08a+Le8 zJEy=jeu^A6WQO4nmq{^@r#xh0akq9%;(KDifwPEp`+u(JCvNUFrDgiZM>8}CE=Cv$_zt6u;+jgEps!&Larrz9NwUU$^8^J*tlujy*hx|D#5 zdp<&zGSx(5emLjV89tA`4@kTr5z^N*chSo+;#Wi!Zq!+9HF0bE&a8l#}mJ*4$ll} zZA7$?Tzo7+_fZj~aF?yW{tu#0;u=N-v-^B5P~qwH0SH{F3M49~9fDo^Rm|rCekyuL zoKEPgzuNJa1~;A1EM$nDB5JPPJ87_jsvXkCa<@D-*ap>>$N&s6k%{Zf!2aS1j!fkf z%%ftu-iS*`A~?ZW1Vm~B&RxgbD#mRS^E)9Tvr)Z-1FcW#wM!a3mT%TpFz0Rue4vfc z><)y?w^05SsZ-f6sjY;4=Ui;>$dz7w3p&V&iy{IcF8a7_9#=wH^O zFBk2+EU#eFasgQg-S{P*4L@&_5)iacd3AJG^}EeGs`PR6*rrAJJDa5R6Ym`-Q>L?I zA{_f2ivIbkN{<`tL<*^?E?&y+N&HuCd<{}%(UAbDh1F{N?W>4^x|zBUP-4|SqrG00 zg8y_yp&$v$K@{HMwJNk$ig(Cy{Z@z->wzl*{{EU2%~OI;>3e)qRIea)Q3)X73f%Tf z{Ez6>5wp%cn~IKivc!FG!k#aE6)Q1JjFg)LND(*3(X@#>HzkTx zz@ljP=ILVrzcDD~DHwH>=pzUcpdarZXpVVNM zLDf;p`wkc}81(B7d#(u4^)6j4_2l<(77T?DtSdqv$`h>mh)XjAv8{+ysgIcV013Dz z_?OzI{*0e75ktw-!<>8b^T7k+MJ0QQO39{+N`LJXhAaq;fZy?p4w3Jb9K1sC_H1oGWN_BrGE|~H2Go&h zel_+l3U5)T=YOLvq=vv(7qxy3 z>qZ9%3j<#r@AzI=yL?oxT+7Iy`3|lt76An>83?KWIHc;p3$D!C`B;G>R2vO=vDUwr!ad1E(622%URuPk9{V_&%7?|Q7&UNNXp0` zzTtODZx!cl4OSqwKju=zAh- zU|}O42<(VYjM+&bH;u8tI2P#i37VpC2?R0$A5ZE!c+QHAKgtD}k(^T+Jo0e#Ita$M z_c{=-d;+w=vTa4Sd$IWsMC%#zja4HpQuG^JY-$)X`KAi4sXvDAEIMh_NL4bMq&eK;q; zzKRW))NchV5Ld%rW{qy;MF|PJ9q0WQp%;{bD{8`j>oe z8^?XgSn`{0E~@Qu#Gm^;Z;fv!Zzl+CbVhB`O?MOXbLoq6z?gkSPpbO?qhm8 zfh-}I4J(v19gvf4&62i0p*9(7XaG2#zOW9b7Egl3_3(6~gk`kCPyQURpG zv4MI~)2kAd-+t?#s!n#v1eI9FDiKp_VGW!)u1|pOgtOFm2`sJUV&zgszy!mdAj_Er z0o$FUJ_jAjQXm+`8%rCwh^n7Z)wM$xF%@8O|4q-mej@3V^z+JU2|g)OngKGVO~J8( zM-#Vk!6($Q3!L0K==@HXI1BVQtTD{!5HR~V>&?%TjTx;VHmN1Pr}%6v;WIAVOTtO3 zLjX>s^HWLrBhWxlSGcp9V|D_MS<;{TdL4aQLrXcUuxFdcK?mrpzLYdFGEm>V)VUzo?K}*{Hdk!7{rLO;NuS(Q{R9_Y51;^qz8|a z{21h6_mu@O86U2hjfR(~^LKtk6>I|UUoelet({kx=8@}CW!ds)+ZkzeALB<_? z`Hl}eFK^jx?gY&Jwa|{=$s*TcA?4ma?{&m0L{PKtBSnoZ=E55Y*8u_7XQy7q2ATek zYnM7+sYGlGZr{K{PBAGsMdPCk=x z^QE_wp($E?&Z=yk!H%Qe0=c3Z`AOO-qo@msgkbd#D*pgLhco8eaP{Z6J!a`6piAgS zK+$`uA4DVpA~@C4@r#A;>aS+|o-kYxvzIKrnOQZQlv@`{`RvKm{tJS!p(#=-9*pM7o?!TY8jC;E+Iaf^qgsQ1 zAT!ZNGh0*S98s_@NxF||Ss$M%4&TrpCi)(x+#~B2gtZ*N=d>L6$@K>|xSARM5LlMV z$&@lQ)F(JnQ5v{rSIUW%;0(eAYo0o}ivElsRu69pXLgt&d??d6m&`FWa(-uld@ z{u`8{)U`1!u!X+=C~EY3$uc`i#nS8djmUY2;C~4?viY2KbUZsK2x3XLtC}ntA8Sh2 zo~)Nr9PDvD`x%zLzj^ocJ>AKqA|nI}-6m=f1L1C8IoOR~_b62KhDCb1s5KLE+$4TU zA^H)^Gq1mYC0{h_2Zp~S(1SM%BhGT{FDUT4Eb$kDF53Nn=tin!He}o)yXdzWy2*XG zWR#ZqzvHosw~mzRqQ&)6BFGAW3Vmv|N$Xy$R@v=yy@S}q6FIo1KqOL=iVNgbli-AA z?9R|Hy3rsYXjkRpQ~OQYzz&zs)Bv$A#9(N&7AOEZbz(hgl&EAvToU>}kU}Gmgq1zi zK<&@8T8v@(_KJI09?vT*u{f7qiLx(o)K&nKd;OMyo<77-k(Ic(=MMzIYY>u1B*6={ zR=;QX9a#_JcjlxKfa6JV_)T?9GP!a>u0np)b=MyVElFewy4{)y5%!2jH$3t#?|+Fh zjVWPUu{_?TsENh(vZ>NKwONkK!p?5LZH37&7+#~t!~(O7nH;_kDNM0=^lx~)&%w*% z1kO78TT^e~1KwCBM-CMVg%?~8=3$y%2?ak25WG#?uE6mZzpB+#3v0f8dnW@zLtU?Y zCi_D1=bnV37AxMieoC7Id~5faak34Q#*WFK4}eg<2F?gprv7ptZB?wQJo7?E_EzrR zCqxeEkfq z%(x{j)8Xs7Dt+=y#fN43?~w4a#~Evx|V*Q9nRiX8E$8H!_V%reQYe*C6w|V)Elhu_wO;~ zM3m`1J()DxACO^5gW>(Nhu5P00YF{t%%~uzL-Q&AoH0#}r1Bjgldh7$bz`lDzA@7F zAlXK(nVv45MtUVQzR;$Vja?7q#=9rrkD~wL8?+oy0)qCb4F&gMZ}4Px7v% z%UOZ5&9=EnxsjL*d*cm@_3R-6(#?{L2tAruCJ~Q5jjj;;57Nc6`rKo=+h=NYQl)hx z+#YE$W1%U?j(KCDK;4alc>emnTT%I|VtjU}JR!<^7h-l`$Hk#o0^$Qvjhayn4ioY$prg!csiS}MhVv4%i5 z`usPAZEGpY(5I3G0+uCyDKkatS`YP>qJ?O zpaK#cLZ+w#WtVl_Pwpu44v8LCS^5Rgofcz|3Mw|ZhGT0gxba>dC@+&3;E%8u>eFRf+OcJ;x_qptFRe#O?${- zk)osPEZ34*SQszfM!kBwNk)HVx#ESp9Q0Qz`41%BrbiB-HRkhn6_3#Wwa;p`{MCHo z4Wzd?H1xE~DXm|$kpE2S_dbra6a~sYg)U{f8p%KYo8BG+SOsI7PeXb$9JY3SN&3u5 zHXieVez6GbPh<}8W@h?gw##0Ga$%0%k-&&1nMyM7%jn@C@XqjAn-g?kvBhwi zYb|*{I7=R^id^W@UwGx;6rj1id#4ypb}XZ)7{BjaKUp8VQ{Sc|ok^_-6W}|Af{{!7 z`~w?J=ggn9CEz6AregeAUn@kdbyI44!ghd%$08fX#py3JgJJ#M(Hx{O!N#gM5?#-4 zsbeMq-u|8|&Pr_WF%Djs$z1NSO02#QPiwvKgNQ*z9T`bp0zP40EqKB+p^p%V`cXe6 zT|~W@JAioxv>AxXrEoyhmTLH^pOBYlEN>BK3O4=u{64IEJ`%fw5eW0{z=S4*4T&tG z87U7xuqaX=Zuq%g0=mutFr4_V3asdQCu)PQG)M*b6I*a`R!w7lV&4=C??vQtv*3h0 zrEGjvG^ST(ZmB5SSq1PLQJftwx3I`GA3)v@fmq|3R8xk8Dt zEJYUwK2Yr^XL=!qEVyi_!tu*YB)IG4z$Nzw0+>$n4&^VJH4GOM6fLowO}))6h)tma zI&i+_O0ZGPzn-9Lm|7!_L(0lTRLkNgIS@B$mpBkBdIymTyNWyOSWdmZ?zgM@37t+F zkBbp^7kwj3olKgf8Pv>aj3|VLY!XsrWQe~O20Xh*@>fF2eTYX%1h7!|u&S65L%XVZ zKf%wa%1g|%7FfITnc`HZ2MvX_H%}aQK;7^+6C)JA7yEA#T#r?BkA81hLjG#&hNYuV z3xa(Rm9vzJYDi+{M9PE640+|u#pWYKSHv$cI0bH={q^y-HY5yh^0BV}!0$nGqjf3 zr%p^7Ek^w49yR?-Hj>as?G@u_(t|}LTnL<}EW0GO5rl%O5n%*3j zNUy|VDzUEyG^UgwaYqVO!h18m-1L)>Lm$xwU(aT^cHZipko**lcl;OYHpU{tq3z$z z^jTl{;6d=Jm+`u8R4*u=H)6Pfi?6mV_h0JJEtFu4_;;v;hV*?-&B4icA6Kwm>e?jV z$sA2%r3u_(-*HfFiH<>uuV$QJ)s{<3MnJ*GRk&)_qYe*_vp)e|Y z<4uMKt2tXU#Q_CwM`A3uiiV9^)YOLJ}hnck5z9(Fi%?+Sb7 zmWsZQmdm37OXbn!mOIi8l;L&mK#5E~1ONB<#o}sj3e60ajU{5&9}9A)hAlVtbhj<;8%vEu1`7VbnSblP@2K61DcVP z9jYn4brlcnZ^DT%K7S)daOP7oUO7R9|M#(^fa+sg*ANV+S=ilJC`(7Ec*{e&BQV)4 z>yu2q{TU9Y^REt4vPKupf+UiOcAIf-kFu{EwM~MDZbdt9>lg`~VS30)MT0(!*U&Q; zXu3~(dsT2!H<-b2+4EmEVq*}hMWRlw%l=zSiZH1fU)z&~p)CklZzR~@s7}WO_JUN! z(Wej9_gCX9cjcIqzuhrZYJTfbQywN%rms!CNHDZ^fn0W&tdPyiD?J#quTscboTa?m z=e@P}N|E#}HQm6Z!-0gQ_{?dOIODHHH`Cdk3Y>cpGze<(Yw`J*qHoL!-Wr4PIDd~m zdwy{$Doqg_v#MD_xDFtgZ_=$&Snh*T})lmaw{r2{HMlwn0$7M$3Z6zY*VQ^ zMErFte{fJDZ!&%wKkA<18B@REMM5P4F@cVgJZV&0I*NlX8NpRJF@6H9yej$4Fyuu)*HOPU|uX~+;1 za^PEd3~SV@H0-N%?ri5QIn>;Jr%5@!Mb|CDqcKYQ3Ai^Us9!^h#$X^88u{Q!ShWgX zc%D|^=Vh<441#9!oEcVyQ>BDWvVr=GUk`Bp^1xp=#HG5u`%e`(3GuYlKH`_xtYA&0 zWl$%GwnBf1;GLTp{ouzPVIS%}7xS(!UK@Un5x`1RAMUSYchGdSHAlYll9BW{8RNmo zl^&3crM=G1=b}z09lfMLe#CZ-z21XJLuxgB2Xs%LN4O{QjR8uRySCiq=`Y{XVb3}? zV@6D8`XWkqJq~THQcV7&5W!Q7%a`c1st;h?oh-{GM; zAy7JB{J`~9?UsLhn0aw4n5ohXO(?gA>gHAqqCNOMc_s(sy$0lEXWxfs|}-v&+yqjv-M#1W?mmVnEN)8bm^5LOl1nlq2t+{zM@z@9dSsAE50$ zA8@i7$dwhV#&;6Ye*JWO)ly6PxyHkHF1Qy812Dbt=Z1rv(ig=cMsz)@k@X~;X1I%<{Oah5A7=fqk8)`%#2T`u8)rftU7#Vval~<4md-`Y8=9oud8G`Q zkPT3!I>$#+R=1Zp=!A&~gXa$Ap;QYCg}|`ly2RGfmdt?};mZ$SK8oOR5t-xAdCoPq zpX1z0yX;I=`VI$4+Qd9t+S>ByUW>_B)Kzg0z`(^fzk4)q9RP`(8>Buj5`_f%^cRdJ zv{UoXklJsb!pd3$4QX~tDr;Yx6aMF`1n1B7&b?`vSKSgBu&goBsaG!P$4$*P$RA&& zAJP4+%fEO1&w=}U!3#nk=dHe%&*pSy(`k9>$>~f+AB{|4wp(|G0s2+0-{Xy^ucY%=#`XiqB<2CRxF`y7mGV*SJ3qs?SRrc%AOS^R+&8UQo`C<6|9j+St$ImwtR<5awz34a zKsrTf7W>RM$os9LFn>Rl_=VvEbG;+C%Jk?6ttU_48U0(A()1gsAC7WMEw3J=ftExp zV|rK=#9UeA!%)oOln=aAl9~$5DaFmPA)jQn2xQzGUL4--pW`60R35{pUcn zG=%#5?0&`V%5D=rz|vbzY>Q~)v4#?ivpJI31y-eC79sZkuTen83-6MFsNjy&%MC+)koN=$&-#aI|{{s1jIXUC(|?*FMH)4<*R|=p^r%M2$8cXG$lTh@2oMp zFodYX%^v&x#danq_|jiMUz6o%dm-T zKyY<&;2{Z3!8LYI93-ta;b|JjZ;)8bAFwnnHa9CVaYbYie*OZgU0LbT?fqO1#6UEj zi}#zdv|bQK&hdE{`m=&eSLsT2QgwRni_LNL1Vw5$b@HR+i5C}7Np0Kb`z5K(2>FQh z9MQ{iEw`XFzEgFqFk-i8>Gm}!dPAXG(GD-IZjG(Xtq@*M+%Xuxk}RF*?f^{J%}*^U z!~L185)HvT72E+6mD#?LX6;X5Ba^J@mc!Cql8xvc=C3dD7Zo2kso|YQv^ti#u@Bn` zL=u;B_Yp#M)$fTsOewBuBB@*NrRo&0h{vw!=~XLM^7h(J%PDUc%Coe_$MC8sX0C?~|o$Hid2H(=fXb*H%X)>Zk0PYSf? z3f??)CYw1l!*qF5HP^EFHc*=*SR>t*Sdv$FrTWlCagM_9V|x_BM!8zL(f;y@=40*u zgDW%LGhBlQHlsc9sLQSLf2Wl`RR7hiSz>i8!F2$+1Q4JA=`+JP&?Ue6>44FdiB`FS z26XCXow$);9(eS^nbF4dCFHe5QihD9PzAAG)NlcIu){AG{j>;q^}Ju!sTrCK1YkG? zQ<;}D+3^(|!73?15BhXm^$S@JGfFcqdh-a^6g)^y+=YDT6MzEEH7i1Rcs(NNL~4y} zUP@R3V)I-PYn^kpk{+5B3Ev0@L<1!oruI;Qn_+a;$+{eRPb^bOD~WjQU-rjIC)^IagBV&bsEpLJ~r<>SqZu zvV7ax$@of38R$~%K$nE$ti5rzSSNjD>T{qEBWmQ9GYx4ojnkVCuJ9XUx>gMJY4{Wj zY$=1+k7&x4!oLtwC<}_iu3j4Gce0Vq(&-XAUbLtrUpNVymm*1qtZ)`M_Kdd4(PX$h z@W1OBSjM|K>57MWS^y+;@8MEwoP#c39T_mzktq~esEY5sCcAvlw@K>>FmmywC}ret z*MrN=%d)W=qOc)MjpHuTZb7ZJvC_fcsTq%DTBIZ`dfnpQyNgE&StIHjvY`gK> zYktjh!m(Ea0)BrO2l4ba=6y=%YL&kH;9M5LHLQqJztDG=Yw9fD^&tGC>yQ|~)#3Kt zeT*+sjA3`ysD{?ACMV0Kt|{`B$wWivzn+&(irpNpeG|n9K1NU2q}n=pvdY2Xze_sH z%=@~D=|M_8I*x2I5B| zms10J4?NhtKp!lUD8lAHaY(UMp3{bOG-xZ+#S4|_djy-ayI!o0NTn%#pk;q}YusD4 z#s67!bmW}4wCQw<#ORqH*2dNTjBTsTG(x;UcTLZXTW-yVRJ=dq*VkE$jxsldc(I=U zfwWmr*P3doiQMuB`>hIPvyB=NnC0eA+ptgrkV>KUMvLzqc=DF~C8FBCR53v`wj$tA zZDxk6`+wxLw%gP&yxn^ph^QotP47ppgl(#$yv(z^MQU3T2*!o1ijXOSDSzP7Ri%)Q(OERUqdhbx zUMS7kh(5lrHCI-(&CeIl46dDAz0PNzD%w8tOz1$wCK|k_OT+`f2dk#$+TBk{Rd9n$ zHZ?u(IP_5yT+7CHDkRK}lSCw=C2k|?WqD-^4n z1?vZ@<-5JLp(rx?QCLe!s00M_MM%w@x)i&Z6KtvF7Uu=s;LHkDqR*l1%^Tb%nd)vx zAx4!BHnt_x=03m4Y|~_qD7gHNahWZ{{UebgqDw}uWcl;f$~ga1t*J{V=W;I?PC-%r z_>DLIs{)?WIaradY~j*@qZ2-6n^AWgyn?GiG&9X?p?Bsget&Tv8*>2{vHI+Xa)?O1@Uz469#2t5?$E8?%V(UacIEArx^uSi=782a*XFGJjP*dpSSUiTw2X$t52LM7g#2! zrr|nj&>rq@c_^hupPU5~$9d?}05MI4I`r|%Rl{8Q&~n-HzJDP0T^k`|;xfUR|0&@2b@u{Mr+Ek+p8PWr(bqv?B|xw%0ciw|1IVuI&=#7#}rD$*ZHsgob^(!w`a%5J-)4ao)=rV#y< zdO~FRQp?SHov0CiI>N{?2Jl;J+3h$4uiD5(LaSHl%Ve@8Y}$3M^AChqQf$V9_2W(ny!j63w0jG;>BXD<9+7@kmVI<2p(3q$8I05Qt9<7%hPRzG5c$zxcVBs5`1BF8 zm-e=g+Fp|XSJ6FzFZB#b@rjdu9`!xYtA zNNa~jDf5-|rekdz%6|p8k%-R)DegY&qerX*F0YLqNXn9EhE17@=WqRW!>>4CS8{FX zCk-8*Aocf6>~X`O<1QwwzUw$Q1YjZ;Jb?R%{=S|w6V?{@$}im-aS?IYSl*54_!HXcQ*)n*te# z2deKUVEeHv913gCd-jiUwhaZYg^OsvHUfU{2&+RRF`o93UC8>sf;|RNG3*8jFJpShTvYby z-C3~nx!`$6dY7i5-uR|tC)A6=Q`ny`p%zQjMvM=<;+rk(3qnY3ux;Yey#KQ51+5-W z{y4Sg@ND-bVONxW(yo$Gy)Rfr95e^wx>b<|%bUkI#{mn0JJ@0gOd&hkj7~9)%hF=_ z-aHqWk3f!jcYeIlKA@Gqp8l(J;?HL|x)I=h#xl<+u>|F(UCCcnSm~t}Fdzfl7od_B zT{pO8g_J$PZBaWCuA|1sFQQ>a2`1hH(*2twG@LGwQ|pU%qpBJU1(Rogq*QyO!DQI* z`ww9_I2_{8Ph_ryHIlyE6H4p2u{dV@NXG$yDi^ip%il^q67(u3ED4 zAu-E>EwI<>Q$b|+Jzvs45aB#Rseom|kYa@YI0|7}IDJU^(h>7Bu9WVr`>}I(7Q?3M z_VsVtkB!gP0lnNiu^|EZ;q7kKqQD+{QQ^$FLrVpof_qUp&eccg!Mzbg{>jNKoZg*kCm zN87_S*xc*8Nx-e#RW@m)0$)bypcz;+121$CeLzi@BG0I$Js&HRaQc=`j{EUiQY5N| z_7JlPu*-&wdCA}5VrP^_(9_L@53~4$O_=%r7JpZG#krJckgL=SO9K>6pbmJ^$VU@? zV|na?)$%;&by_KPN8i>3fu8rZ-vv?9C1ZrXn(u+=2kPT4M`HkT+2u?Aw3Sf5M66rU zxth*PyW*r$!k`8Fv#rI%{G1eVC7iC7S4c4KyK~s4MHKtJmPJeP<4O`Va9m4Q{gk37 zZP1lDg#J(*_w1DofA`7G;soz1;@(?C&SV(GA61SYpZ6KBz_(tX-zT4`JHS6>wBi%}Z5Pq-9fOIh$ud+?4w$P$X{y2zVVXYb6}f)aYu7c-e@@NQ2 z9k^imr!Ypr$U-VrCG9CV3YRPpazFjd-u2!%{s_24`Cr#Wx2d)F(4>02=Dng+DtV~M=_!lz(F;&WL1iKJ0o0za3*P~bi#A(KX z*Y5fDXlb8CxRgwyRp=zb;+{qE!!)TGKp#PZB;{k`q0q935>kchiD^c!jKpwkH;tpQ z0d6h1JV5yn7ZzLe{S0T2Rx)u3KDqiTiHc>u&qbgZ`V$Pyr~}s2V`ZCSM^l#)&fidf zA|(T?doiZSL!y+J%_&Y^PnPk-`SbHT@1y7cCQ(ylo-@~K)jR`|;CR3H-Q*{bxx6g_ zysDVa0l_2^rDhZjRg%=j6mq-2g9_I&*%&G4yALsYi+;<9%+LXVyM4!pA94A}7nsYG zL(A!4eHG*mNfx8~fc{eV*O5^qdbDt!I2df>o-1-a1FhXFRfRoJAP6Idf!NwFN*aok z)qRWcJc~kwoKh(%L#l76xFHiRbr|Q-Eo@#-`g^zg&{HW(Alnsr60})IrK(`)paKs% zk4eBn1C=t>;8g>GeJK;)qGA@O3nErQs;F9n&0l$a?=*zQ`snlG*_dRHdSD%V&-Z4_ zCTmrATJkGMVN%a{-DGHc_TrUEk?WeOT9ibqA8-QRTERg=BO+8L6&b=7}$)!<%8{MyiHcsKl$)7N_nmRqPW5i_Ebps_G zcB&iN|3Lb{(glJoy4}6X2yJ_GTSgdr`J;3aVQ4q{embekH-f2h73OfI$&*dD_a!); zJ{AK#0Co55O}Q68xszFR4zJPScIq6@1<#xZd>UllQ=lr-8aFkKWjLy43|LPbfZHj8 z(n(lh=4t%cb3-Ygi6@c{3J01|NhWbe3XUiIv5Ys1kX@9Q6U=0emqz2R{R342AuEWr zbdtC-D=>THFC%a%^;|8vbO7yEZ4)S0b}3Iw|4i2#Upnd`GJ|+>MQ6M{E|D)CDtj)w zwOGbxEfd&7Ld7r$rt#uJfXOjpez9x|#hz$OW#4(hJ6IGB0*P=d{_pB~^pN+Oj!sW> zY0Nr)b_cj+OaQ)0W}i}XWF7x^MDah6yuj{Odse{Gb}unJjdW@~b9o~+bX)yML=hkH z5d)MgrfObfg@;t4yV9A!(}@^VN&mEp@O-2AD>A2(fheTox#sHV}7C z>TFRNm@jWSQ>B43hnyEQ?QEZd?xL$atKrRy<#vvR>JngNvGpQ`{&8luSd0B*r(y8x z{iR5Eg(Dz|cX?-sG_`hXkujzRDIWsn*BA$C88anAzcnDnfj)<`8r%rBNutp*K6A$& z18y$6z`lsM5!u~tT8_eQ_lqtd6@kWPM=SuiqBZ;KFKM4fkWuDi`#qxcLFrtU*LSv# zfTJ*Zck4sKZV!k#_2Xk1TWGo8V-$+bbZ1U z_H^>A)oGMR0{z)GQ0N=Q0to%@pZEQ3fcy?BQu6!T@K5}l-H{;v(?cSVWH@7F1dvyx z(msqFIrXaC!3un4uEmc9dt@pusoDCU*YQu2x;pA$Tfe*%9K*ZMeW4U07qG=KSvCdS z!*`dgN^xWW!gGNbZ`G(k0y$s?TlQCHV67K`s5q2&-1Tp*BouFkK45YT6qDK*rC{+Zci{;sX@#{~ymwiJ1kZ4~UV$8AKQG1y3N%i-m6 zwkrK2isS)UJ+~1AK*a9-MMOf>avd}M?7OhQ668W{>kC+B8b=2al<8F+N0A5rfi|_z z+r@6du7o-L5!G;X?)hDRZj*qj0FmFFM@I&6j)pC5Oh}C&6Q$Q{qCQ8_-G+l>fZkfz z6{LzDjgFAMaY>&E0k1r#3FE%{yQ296eE4|}pt@5?zkd~!p=;7FdugONphCyd42;$Z z@}&Qvb^S9l)kq(x%1*GfK%&_OckZ)-5`ZzcD*U8!=`Rq#mVd8&bYmcl)zox{b9m7} zj7D;wCz9z3`JFPwPWM3;9E_~>yS>=TN0)m^F4T07D?>2LmUbfB!2-P3TaVvsp)KD+ z8Lt(R2wUgpL6ZL7vTUN12|G*2r%O}YPn<4mofS0HzLo&wSEZjWw7|w#v8(+~Cw_MX zC=wNaN@+nOXxdvH2S0oC`~TfP8K)09PxS;Mujj?I0@zxfq=nA{kb8(4T zu%ir^-kwc*XU3gikC%>S|2SzR)h5!BY|M$bApM`L`09n-RCI@^#)UJWO6(zE9@e!y z{xLD|XWT&Q2E!+J1E8>Ejb;Z8+(^l&Mv3rU7%|0^Oz?&XyQX(%Amp`v?dOjoRj8&- z*mxuz`@5Y{hsv?YIu?-RPKlCJ7NFG#%Z_E9IL04+wxwrz>M@)SDND;@yq_#a473er zwM9CwBsF+e-{fN{00H;BU_;@GaM*emTFaF(7OT$#7ddhpEbwQt5US$Sr{@!lpH4;U z9KnA!eS5Q%^Fdg5SO2<%dTMgGizd_68w_dWsbB^fGy`1^clQRvajHDGi>aBIjy;C; z&B_|)ooK?9lbRk#y7lAYSj#6>nI^rjz7?D@(L5VxoJMB#I|zwqF0tmq{J)xX3#)%# z{HnSX8}(X3h5`z)pZ@UCPwu)FH{~WBnupTUV{KT4ejwu8Bj>ydP7!@quxzfz_fhtY z5jvI0U)+TQVPmWp*hrT552jRI!?`UvAPHG&K%4vPVy&I1Il2l9H?pYR3v=J@dm{dQ zsz-q*$NgH`l%;z}_B_(fYW6LPI=;RK{SqyL}U)oWTfB;yx3+W4gt7#$6lMtm3 z7-~+ny);DfdHW?Rnx3Fgfcvl!XpFnn3#6QeCDCz+Xzb&ZC$#6naA8;KB zGo3*@?&u-a-}Fk0ELHMr)A9T?iem5D?1OFN4dUCps|^jkc6w~D{)BcdD903*v}#wY z7+ozxPk<`^_C68e>et3%Tm24zloj;lv*aZAStJ(WU3~EKyQkkJ*YFthfj{#(?%XwhoD>Z8NK5D*{TA}r4jY8l(WAwPfF5q0<4+1#Y z=24s#JJr&3od9Mm7wPoC;o02yb>rFOD|Ae*#OOAit=>ktH<&1j%}CsOtCR7gzjxG2XeBpR zPoGG^k}39fRNfpZQg!2^+aN%REYF}cy^0NA&k)Dn%W{GXrf)Ipg^L7Iqq*%tq`2AEU<3<%J|#I9Yw$7^584C zH*e+~a{qt5?#nfrW)&%!peCZ4{V5RQ#HS+mU5(&`Q0sOIf!1d(R*J&VzZw0R3~yB0 zB6;t6zKE@im7co|S4I*3-^1MZw_SfGC8}-&%u~={LHCJRBXBufn;d=TQIzzz;yh;F zds&s#=RPQM9`mXHB7~Zu@Rhqp<}jbII%8CnRBY*X)I}`D7e^$Lz&jgh_32@p$u<=L z1ftp$3-F3g^IZ7fHO>jtZsRrU$J6;X@SJ|FbWM;?!S)p+DX`*0fl6?Vr0K>ooJY(s ztOj&0LWQAr;$0bKU_NW-3%Ko<*UR>KAAWr>YKRZxEnrM;%1$5#z0>CQ=#NutW_-}g z_Ay*hFgwj1R<{aht2Il>>~X=M$y8F?g92w{h6~c*1XdTyr)>I6CYEjzmAoO%C-KRT z*QtQ$B2v%SJp@hGlZ=;nGN8ehE(E$$T|b7QoTx0Nq2K_eSaaoyFQ#d(S%pByW8r2$8x zX#N|wSc{;?8_C**mE(4))2!K2aU8o^$mny_) z9OguMspxGONV+3|M-cqh7&mh|pX~YOoqW z1R@$z?rP5X(N*3f@tF-tndpQ-q4DF+BNF5}sNqB2x~g7dI4uzYm_^#nZ*j}3Ua(cA z!=m9uFR1v=nGF!HcSjygh)C->(|Z1|H>Kk`govEf0Q@%9cQ+dp*Y*HstsrG#?F)M9 zZt7^G|IsIFSZ)%AIIkOxQdiVjE#Kd7Dpuq<;qz#&g zlynU6m%B%FE5g!l3A!iHjvfxJ1S1g_2Ut1PP_6p7GXePPM%gy2fxYxh zBJ`4o56nV~0KyXpuTxq+d!oxfgNrjhE#SS5BKO0FVcX7Fst?lXRbdRY*8I;Ci3~tH z7KU$G8D{!eL~p*=8+$j}1=ffq$tZ=CFx{;aH$A~kiA8fc7Q2;ba~0TZfo ztXWE~<(=O-0~b#N6Ywh;F>iL2gG#=qF;(3zBiUF61m*yw3K?R|Tx+eq>33X4M`}C` zhZV+;hKpF>a&+`l$xtnyfl67l?1BIKrJNdRR3#Abll@DyxJEJUnOX97Ppk;l2?g1) z_4x1=RXXDh=?k@Ss^x%a8kiZy$a(u_LLZGlg{LYnp9VAgG82t5D-h;PlEu2D<`Z=; zC#(UNguoK;s9g!3y5v3~&rrW~5&`@N0ifkw3qmvL=Aak;OBbqVk%mf^-qy?KxjC0dBNcs#o^9kD`HMt-*j2Z0s*AK7eD_Ti0cEc ztTv|qF96{QM!Vz;1r|Ovenv7CX}zrKG>uy}08>n)@8u=Hx~&Jp`~#JY zDbu^9XAVGxt=gn?)%KPniNIjF7(XU%;hq#HY*i)Ye+}m*d)`Ha67NR=uZiCZWP)mF zGx+$1>T<#nSTH*BFd{jf=jB&#m*B*W=ZTik}K`ab@ zw6l1$p-;7sqoY5nD3f|$4s6Q4bhr|MU6Wx`eAjxciD;e~96T~UpiYtk^i;&aimu|m z{F1ddm|R8s70d-7)43=)!Yh3svZh;&2qg}P8W#)HdZRAdY4WUJO07JAJORPbP0p6@ zm9IV-nE>ekPXec)Uv0(Znvqh=-7|q@@FkD#qOf>?yts8vitzfl{v1$AaN2-6KZGpA3z<_3Yzm?VEstJ`VCF*RW@nGg{fFe61hIHILK*25eU|6a^i+;d z*>4pwZ-XD)SvMcYxju#|xRH0sO>@4XX14lH9riUl)P7HDeic1t<#`}t2ZCD4fp6QK zH^6ox@%>loFu{Bm*%Guj#+7fl(o?-Mqj@!H8594>#E|KG)==PD=%7R&(F@h(kEKnPZ1hz4H+d{<;hvU zv0E*Fd46*)qeIr(+X)^LzfFdwXtUD37Nj?|pcYyu244E?emoDbdl%$h-91Fv-%vUM zqIjn`3NpIIeB3&H^`4CUOEQ5&uM}V8GWh1o{h0AIATI@R;P&_4?FET;=ACm5{bw;2 z?X5A!!$rRWZ0>SmElGOMUfjhH?K_k%$K1~p9=P+_Qz)bIU=xQ314dS3fs*sN0|$R@ zid|3N`H&&q(o$ezoyz0(M~D6&Xa?hE=d<{>&Cd~9YF4ba9C$cr2peGs@L}MyP|JFh z{?`iNAX0I0rs0(YKNLzh8;#M_4f6EveTXQ>Y3B z!(0D>uKxo``|Hvq8Hp2eI%bralxg-{?ssnf;2GU+VRq<0tejfq5aZI0qkEzy8f!P} zB;`4N{)^ZwU;5k6r{M-h%PQTOBQ9f5A@6&G)+COi;wM_gMx9i3e5w2Dyw9X$e$$I; zuA2qVHLdtnb88fT11A3KhzRq$2++Y5xOzSp| zJVSo1TWahT;Pyxm`6j>2m~F7k;?9-FVe||`T>$bKuzTq62x=ZEr#YaJ|g(sY-zv>HA@T<$H_EY4l?T^#odJwJT< zg(0Kt%jbxcP5NODF}C`KKR*qlV;{S9{X&)5d0*d^%v#VF$;?$;%hivaF^X5K(XBMn zOxp}!j#>P9PL|ih-dS}NjC#xSK>v|v(fmbTt7ho39`RFAtK4H$sZaz|ku$un( zQ>y$EYSUSgGjTF_w6$&*I`Q*HNkYI6gOL?Cp5(ai=0dr`$TFC5jPqp3TW+SbL)&J? zD7p$c4xCXGVc;KV-toi_Mv0sGX^jd0GrT65%(%w0K~^(Fim%#6tM;v&RSmf3_%@C2 zl=ztWHO~b44(8LXz1&<#X5%>dY8^8Cld#9Q;M3X>`tG;I7cJ@Mw{I`Bios^825;0F zBLCi>Oz!81^?x$o>^ysX{lsHtN0O3gB_DqSs>mh&oR`t4TR=yVH50qQ7W_^|zsdpVCjB;;o)#7&s{c38TmsgsV zPwKF2O5IwqV=eVryLmUmH^cY5UAiSTLe81u#(fFjitkIYa5)|mlSWE^dcLY%xsH~W z=a;^wutYo?{oVXEU|dbhaMJ%4{6%g}`5x8u_VESHW!|eRRS}MvKHdrgh3e*k zr7M52XCaKJ!}jL5Or{bVUyr zF{le_a)~P99eMQ|W@}6HI+v4TVw2TwtL6N9Q(EMpEwUfN6M)eI`bUBJn#SdH|C-f; z?A6e9NB;Shs3iTbzzyZsqWoOG?rTNpxDU9M`mTd$`O_~Olfn;#=M^)H*Nw4r} zZ6hCxMyp)8zZQ9!ySHUD5=nA9UAyA=P`D3#_a3%uY|quiVPQva_%d5x`I`Ko!;6}f zZMh6DWV~|nxi4{`&R5dir&V>`%~l)Q2>JLv_O(SoRu%nN&5Jiw*T9#_ctnd|R_o+x z*QK+)6H<+P;yg z3V9VZda?dYQ#@~5>k^nYMm95(ot2mf**b?uXx!q)?)C!J{Il^{vJLxvE2^__;tDqe zzoAQt(2(LCIB(6TPRoko^K!!0e$u_99j#dXdl@)r5%^j+C;(8qk3;hutEO zy4?VeLrKg1q_|bDiv>}U5s&>Pu|5K9A2CA zQ}M=L2**d&X;6lq_nvSIuLyjOINpeOX=_fsKRVHZK<6?vJHz^II)O;-96|RMCb~iC zUvIX$*S8fS6maFQ*8#_n-iERul*FXkn_I{y=N*y!2JzT&| zJf%{y@k;k#qzfKkk(_MaFQQ_#-Ok2S7KVAc=dABR(`k2z$f;;0_|tMHEM>!22#>tf z+hK9$8s#h80!HgpNycc7z|G_V2kITLKkcx-+Ce)h)2U9Z7V5U(PbGJp$S7Wt5mA*z7ZJ zgO~v7<0AvGeZhzL$OgbbnF&A@MY%1UJHIdmLB20RMj z?qYnm8aS7s?c1HGK#D<~1s%K}S90cAqQ_U%T)l;W@W6tMNT4+VZjpo#Tj#6V{2!%}rl=!o=JAr-bd+xjq^`kC50@ZxstO2+N|Dn# ztlqg3hdv-_Rmi`_)pFo7A<3LvEV=+~Rsd24IQX7Ugj)j5{mBbf)F8kplW zs$8|p;iW^7YhZWYfiSCjJQ;!#v|(t0+TpVc7fM>y+#RW&(b`zBVrcU}GSPv%E-)n7 zbD~lEUoh{Gg~igns*m4l7a`mtI}ZOq=8Iduo~v_mS(pTf&_TmqrKS}ytny>(4gn#Q zMxv{wTm?o81L{7Hq*@#vZ-FZfbyyJO`-gfd@CtS_;Cf(`M}@pd)~HNIPLspL3V79# zfIK5^2SrZSyw)$!NPh{Au44|sz#LXc^EXR|1RCl3E?=kEpb*(axElht_j{HM763Ya z9YRmB9Z3TCqWJ}Y5sC&?Cgu0k2_&PobF_1~gH#{OUUF=t4d{8MpH2XH5C2Ph8Ybkb zRkwqUI9Mr}v{V!LMs~K94_z}9NqKs>UU`1tpzeWOC?8Vl1)lHUN7LUDJ|?rsz`^Kq zqWO*R@x^D49#lL9UR{#Rmjk%5ci}ua`8epkeWhtKH?15;IdvQoC$I$URDpfii@lz_ zWpwG}mo|m80ye2Hb&)Q|I12JYX2JMNIDM1i{>hTDUp*#sWP+6p2o6iFDn^*7HQvYp zk4Tw8DUkWm(a7FNjr7<=*itz)k0k9e!?jt+rWDNM2!EN$9=@A*##6v;k+4XOSQ#Jh z(#v8AccR_rJV#*Y!`#ViFv7VKMDS*Lo+Z6@RVpy{zs2GdfdrnNp@y$V#LO>0Sj+2u zBaCRmMUcO*7ypLyT&3j5L^%=w(a4ZX86aHA5d+>sA*aPRT*VP_tuvuT4cfl^=aX~q z5r+f+cdiH7iE6NJBw<$_qsbenh?~^PBvXNe9?u_8K=(N!5YO@Qso_gyFDWVjg$Baw z5Ma{~598HGXf|lSvu~HvLi`KAMgG4<94>hnyA;dAE+){1ixME4lD%OEc!pQB4X{A=L-z4 z%_dsRrN>T~0yPSP!Z4*1pYzP8lcqCxf5!C09qa7vAjwTkuhJi~J393x6Qk zT3f5)hydyr^fPQNsaeO+TIH6r>69!RkXwsrERz)E1oJ&aN`&2~-Cg{QSb?$)tD^+Q zN9e|DycwfQz&722xPPE*X7mnTJ|W{~7rIb@8Y`U$ty@TFBcV@Xx?0O5jYM`ZQZ*_r z1fmlP3qFpvI}VbU>`uFDroPW=z@?E{0H^~_NzA%fI=rxjOP8Fhnu7HVRaY|lA4q3~ zWQ^AP2?DyKcf(*M8cm%Ug1I+4W%;pB>`t3_sM?@*EELoGkoPdG00kSY$M5u-uxtS}LZ*+f7vF&2XYYJ{Pc;@kbd+cxj) zIWc(s0|}07BL3oci+IV~cQNMHNg(aTc2UwINx-O0uTz9xxAz6hp_uijpD-tZ&q0!+ zwdf?er&>?)?yX=7fMB4voB4kNk5?+1SBTMhA*fX4n0tr`)HIQS*(fgIt|erqIatBTrdN^ z_v~h5A3uVaO(ti(Jjd)}=!E_}2QJri+68QFGZ%~`779=p4kO;iDX%EnXQF5B=WAa`-+mk*hS>INk;jhL3Dx|YWwvt> zCnBFn%9aCOo{E?5&|r<4Bt7|IzCT*u&b=B?ydDC|**dt|8Ons)bJ$C6>-gB`7u|+o z@RTf}eZiKivrLh1=Bi$4tL3CCSN_U2rtKKvzP)JN0^T9d7oM+fyFZR-*kY7x3U?KJ zDHq~nK^fm!P`9H07bV_mmx7pOf8cI6a#}hzJ@)JLpz)=j#A^a0kKNM{Rx8e}?TWLo zPKKB;x9%M*(8a6A@dSp9X|`Y`8Q|*4rmreU~%si`_cDxH4nq+n*H9sbryf4+$pjiBtwK?v+$)O(v zqU7xVcE#MpgYS|?q^GFqbJm%PR*7#DR5xYrAyWX?Zn}hS{h7J1YqoL6cpw1quq}L5 zwyZ>kI?UMQbIkslnr^l-43IZv_0*CSMYGCp{Y>sqVA!7wXunk0DUSYt)P^A zad~!TpE+Z>fWgRhojItlXVfjmC_>@aZ!rcF;|}_a3v^{2P<*ZBRFAQKsJXAwYY$zc z)!e)0DOI}t(W9alsH**bW_-afG{7t58mT;WlIQqP1+-H>y8XW5$H$rSj=LVSA8bmV zmtMDYRW{P(*V44-n>QU>JJx~w6 zInprDUcUHb|I>|EL7TAe-+xz8lrghiQds7w>*Em>DOdj>U<$IH%os`1;Ii8M>$AFg zaT3`vy(Ra$v_u3$v{iCDxwBBw0XeYh%X|?*ugm!5kuyEB`%g{H3wX*;;Vo^>hUx1* zGxWY5*FH9UEtjXx5V9y~Y0ikSV6V`z7}tSNjBeRqn^otYP5GwnqjY`w`?vn2sEYU; z`R}}z!TwRvU4;S}r-*xNQI8Qh&UPv>g(pEFD#is?AE>R|W~^3}Z@fHh>0MSaT)!V& zD_lCPqFy?zGgmq%1RJaMUM_pVVn0xB!P80eIOv<=rkkH>Q4z>_bGv3O z`iA24M9@W(n~*}ptEci7vEt8-g1@(EGmlPw>6kruF6Pf@wH3{@xTJ4yZS9p~iXHXJ z-YTz-NW-!dT2$%HJR6Li8Omko7=GOqR}6*r&-P}t&wc$RAU%<3T4}OSHdZAwB6TUu zdA^t1M}nU?&mihu?)b9o_H#m2sjGlBj&tSMd2!JG{p;^MrPJQ0(hV;L_pDp*2{p~$ zNPUzDP7bb_GH%P|3+c0Y4w=jP%){+9ZP zwE3H*rDU_;hTpy$->&CPEvhIQo3jZ^iWyT50yFiPulxI8pXj>B-|}p=gI5 zg^~34<%8EEhL5)a^!8^s;IgIm`BVR6`HGa|yi@KCq}_nTVtfh(MS`+r+dFTY!eHT4 z6JDMAS)Y;+9nS(?Q#JG}opSe)bfvM8Z*#~jyh7I?r_)N%rvD3L>y*Ba9T9`WF4mb- z9f1h>*&kkR4ztCX&n$mACvmw1xe5!}6T)x2Ccf-e>U~^$Rk~I-6bjPS@B(z9; ze6*TaJ}Lb{S{^bC$m6fnHmnW*O&%@~&nEo%va2{4WDm~q@_AT{S;KCgzT7gy-*ebG zT}_>M{rZhpq5m~agTfQH9>s-HllhRs#V_KIhm?d{!&e@xd~URD{khtPXcO` z=-iS&?S(vti2DjP=U-JstN+%7cYT5AmFAJfDpaJKHt_+`j#OuCyYu}&anc72lBaQC#HOo9*DwBQ3EHq|(qo*ogDfhM8 z&aa3)pTdZ>_m@WgPJhmLP8V!8Hl`z#Zuh1%GxbWYsKo~lVWI|QZ!Du`A&5zY@zB>T z<)R;QFlX_x;-mHlvGL>zw?3g<2=-z9m(Hw#U6JZZFVD@Z&gPl^`nI$8yfvQKzDl&? zc%PIz`zYkz(~x9a{@lmn9xonY?i~DV+YFakH&bLdO(>M`S$cOfjA(ZG zE^_&Hga0z!I9_f=&rNS-PXq|#aJ(1j@SyqZ@`}-egLTNdif=L>`fFHA_A1@pj-u*^ zu-W`qE%lx)=Nr~uE*dm79Bh^k-D_=)Y0Ns8_@dvDszXNtcOw^;rb#_PZY}x`+FH_e zo9AS~qN?h-5{;l9CpD{Ej(YmF22tK8tAlm$WoyIc_2^B1vsTPjo5H zLlF=`(nWsMCMXiAa)qN22GJ3YPpGOzZbBAgZyQ(oEuOfS)v#9z{ej0lQ5a@VBNnW~ zYO&b&zu{@yy~#0B15r>PdrN80g8}jzFK@L-ZL*pN)Ia$BDE?VoL$M&&u zq60aBi@0(Gz5ViGmM46(^I?JD4-xpZILZvfNQQLP>RYVoEh(iw5PxRSP}yw)^EEz; zC`@7fj-{nf2lmd+*T)1L@BEJu_Ep-^7-rP_X}s2aNy?smarYnS#zy}$dU|t4kH9zI zm#+NfM+=g`enx#g!bcRsfBQi`R4)b{8gpIS(a$QQ+*URD3M-CeI`;2`TaJqRXCzc4Qk!TkXQ2A1E%h z7s$on3fTOQdUnXdfb7+1i@zsnN@ztxr0`lp`YLnLA>UsB?G%R%1{YFmdGsTN`WUWt zvq;fGJ}Lf;L{2c3(q!;%#a{Ya!eTw2G$u$Ty)IIJ1g$5EieTSYicB!s$UfkYRo#}( zx=Z?mK`e7~AMT~UV~}Qg06O5(5d!wzgUSH$Na>LVQ$K68ZDV&1cONfvEnv>4{PTv& zaeRcDJBpSB%@fz=67bj~!-&COg=7EFD7Jgw(mh$aY7l*yd4dFU+QX0cnj7HlWrR{( zZAep^#R@mHz<@UP?`SSHmWhh~rBd>g)SF8bT#&AGe}KiOgnQs+ACPFO7Y|QY(RI=l z!3rT3e{E64ox_D#q`l)5C@HjrGt`H+VeV)(`|NLdfxnhjdy;-66k<+r?r5vW@838# z@@oDrp{z;{I?suflr%>1K04YimwzB&z5F-AszAE3@4g(PnWu`>+rG8A53UjH zE3>2s)?46rQf6Xb-{yBc2dIZPon4LqBzOl@={9Gezz0x$Tt5)Kann+KRToyfi@}16 z!gDnoxPm+!!ZZi_8;-e0qDVUYC;((0Tg2o-TVhovdjoyBhZyDKz_bzc!+HV0_$C?0KV$7I_UhM5a_zhG1Ozu3HG&F#=15wlnuLuv=O zj|m(a_Fqm7&ej_!rI(fOpz$XR>DjiYxQ7YS-i??CrHsqqaaim4MVCWEwV>*p5i2K$ z2|#bD!=3ES0v?Q#@}taW_^!C#VOr;c%)_mA^kEGxo%M~1-uE0JN*RPhcIEc@KCwvL zivJ_uW3G|cerSZ_eEN%zQFXuWcQ*D%!rf9rzlvNKqfdk9?+0MSWqGI!B${J)nV9zg ze3(+s(2{|7SU#yuD%M>h05$^c3e}z9r=lBEbp#afdxif%z@#%RNa<^D5c2h6LJGyv zPuNod07Ut@?*7d+<1Ts$TEIz+7#=^`YCdz0Fj8Pmhy-vh>qk4Nf60?jEevy zC{TaTB`aA+YX;s2i=Aqu72r|yOq!eFsv*4M0Tl?*RddJS=VjgNFLF8ehxqmZdPlU9 zH-Kbd1yk&_ZjncTK)(0GeU$1d9)MOIJS#u|$oS-?Utp>fE<>vBXw-T_qz8Zn-}+!b zsKHkpMME`XY*Hk!fEb6~$}xLJwb$De-F7$oCIq z8mn#Z#)$)WT`GV7$(sMTF5qg{RvcLsUAD!f9y13v`qWIDf2&JRkwS(!P6`QhU?*6yVY;?N+Q_>6{CuU8Vuu;(r6sr)8~Es3YNMRge=I zgoG>#)YkfqUl5msE)G0Y?(28d_r&N zDixQC%HNE&ajIDW_pJ+_7_^j8F}ajHy9D7s?y_e+XNu5lyZw}|kLOx0uY`A>m@+Vs zfed+VR;q6MnzU z_mKa;KN7leas|wFi-1aI<^S9>W)&g5m4#u%iU5$l_+mYM6#jslfO%{ri&`Y_rsdP) znpoe#Yg_uL>lA=+x9%lc5lV9b6WPU4)HJ}Mx~+SNrDrJsxBLTX%$^{+z%^B5p+bd9 zZfnqExa>N4Aw}Wlo0V5OPHb?bf zA|AI78E+%~Z^!_0+Sop=^-)W^Z_NQ8RyFXzq$>J7bsLq}!(aea1{6_`KBmhn;EMc5 z=;{Cpk}7~}3*+^-MHy*aBA91I8`suE?6!yFf&?U(B8(bN1v)N|tJ>i9$i^W8w>`T~ z$>hxt0ot*Pg=pr1*;@~bTVv8ktov?HRU5A|X%{tDfBD$zh!|8TIQGM4KH;CL8CelQ zCb&f|{Mk{qI{T=-PRmt*KXXx}Ew0vdPWd}{f{%&}CF6E9f-*~5?&)#HQq!fIc+nIM zOo~oY3mCyf1!j*_?dr%2t*zI`ElP&(M1|Ha+Yj8c^Y^#?V&hcS31nRiRNqbILvy3W z8pT4MUtE~aQPqB9+KlAtXwqhA=={a^D~nOC81SIr7$1n6dA&3AC;n|62=%YGV;oa> z-03DDRX}`^iCxy^X;{^gRIaL2eYi?XbWC>4?V2TR#OhjTTvK=$TQvDWrEz~?W%m0+U&$xx zPhx3`P6L+Sg_)u0@L~aEZg<0$=ATs;@v}z@bIN>otB>pybH9AJD>kvp(kj~C=VtYp zPzI~h78dw+AK>HpUX6UReD zz(J?*_}ol0@Sqh}co}Cq87(4a!ecTTAaaIcDdMV2x)z>P5pR`)Q*i5(NG`k;F-&xT z4(;ufCOvw@LkF>Y{cv#49y=H+X=OXB_4}vSB+ro5#}oqg&BapY^!wYfjSY6tzM_nX zExrB2xbCr6{83S7&J3)BP%)5;2C%QH3n;XgfaPR*?~E7bVE=s48^~-dy+!Nh1LY1r zr{|!{jhArEL4?l>fjc9%l;LV=b!?(Ht|X{jcMo)FCy8iYJ zU)xFMS-Do|I9U5Mj31lhx#j<~`P=cm7WrdIg5k}9mWUq{@?tx!CU;gluBl3LyR$Tg z2UqX>=v8KVH+g9F*Jo@FLv_^bIkx+L^`%792IfQFdMe+{kKL90ncnc_Ijg(HX@eX_ z7Aeb;*K@`{rea^Kat*iL{JZ+{^?(5H%m=2uq^RVt$E+TG2Qh8|W4>VCf1n)_H^O`@ITGS+FfBa6sYniO5Qz^Hk@_-IEn9E zzduo>bclAfP3^dzxwb6$GDPHRvr!VLs+&N+(z}eTY~|%D4+HrgRxWXR1?;8E&%C>L zbvd|g?&{fOwbqJlaPV!fKd;@j3|rFomZ$&D4n#gqAHAPs#&Sh8%jmk#g0A=Odd{5v zwdd4Ooh^uvn)rlyo`c&zP~TPdo!|T4*;sk~)!Jv|O>^7xZ;|H6Giia~AzOz>R>#?1 zZmLFx_Fb}=`r0nsakE8;itK~h7xpt`+3yOagvbt5dT6M`T+%@AAEoy?mxUC9=e+}M zzPuY~2ef+OgA<(Zb8AF$(UrpNsZZMyJ<8e5g@)h*{J2(073yohSi0Eg9@8s%g4fh# zJfJqhK2EQAO2*9$gPBrJI}-h?EyzI2jbGk0b;hPKEl$& zem<9D3ol<*i(Mab{}_UgZd>SkVyE%yr8;ZkXex>hXQOc5WV#nM4_51GRjQz?V zjVe*_E#&@0{-Y|pasuPK^!t#%G?P3>ckc!J*hW8cdCcwnrJ0=7@X%Uqba>fBChc%- z{%-=iZOoHwQ-|9#I$|ocwyhnPSYoxtu2}kASzjZP+I}ClSNkxD20Z#pc;tRl>UvFw zx*^S!#S}Il3jG>>Z6a&s5o_e_9kzbzv~PhY?5NM~S%C+5aa-1GUA=k{8CsBufN=+H zEvvlTaXLRC{i*bZ>lr57zED!w)VobvV9c?(VKr282Y10(xPu4W=oS%;T0X{-m^z%! z2Oce2Uy>*Bwf;;l0c~v&8aR~skte4!HnBO?di-^w$|=_DM`#~}QDg13dEg_apRx3# z9#5Xoy!ya%fC=}k^zX>YZ|QK;DzAa6eyP~FWc>+bCPHp@^a(IINWJn~>-jYQ-Q$91 z477uMHMbvE>CsA1)G84w_fO2HpKC3eztrOsf1~>FoRGhB6lKKs*Y4NCazVI{rMm2w zd{I6d_eyR7y+%S5M+0l^Yv!d<$wxKw3JNkcDZsgu!MuX3QOi8 zZ+;-WMBV%_fI`9l_+4lEiKbHZ ztmd%3eel$Hir&7Uj!hAnd!B8(vH$s(gPfq!zC39o$*fMF)@N{b{qg%7O9aUr zW4E$sax%^KMXC~8ygt@V#x(@p0fqylaT#j$l=D(hPt082IZ*JezS)cvdUAFKNXy@V zCN10%K#a8vwH7tgQ+m?Dwui(;7(Ni2<*xE79W;>Ff+PknfbHJZ=D3yM^0Hc+@fASpnVA@!g=DCL30WutK43h>TQM{fMfeYn5u-BTBrfb0_D08W+~! zx{PL^Nz&mLW34W1LoKlJ%l&5Gp39p8Sl#@|W-;^q42-4Eq14W|OzRJOOy&Ed6#z9E zyHPxEInu-?M<6H%aPNUjPbyT~Cyzd6W7n5r9t*}0pFE0VntGC)I*seF*N=IiRgAR5 z6S8`7J&ZfsCDVEhL|1OOso_Xu%C>m8AKctr57jv_)k69U^Ti(N8Wlg(ua43;uwyO{ zSl>WOC5$Z7|ETH4OJ^!5A>ufK0yfa==*%kxg|hOwK)0i}m8D<%9^n&^+gOxM5!#T2 ztt7A43J+;S2De%llWZaC$z?&mNAu>Rm1r2kOo-F$FgHOYE{vbq3$Sox{A341?fO9h zP}Bs({;0jy6PMRr>DoTO_KA1=*TmZYIR15aUg59Hw00AOxF|5CSdQzC(9?j$%fYk< z2~!6Vorf6H56hP^`;u`XfG{@mC>yd`D_N*WE;GhDl_R9J?-rPRfRGHE#*dbb(233l zDF^)!pl7unK9MOx3)GdFJg3}?83B?hLpP~vAtvY^r6GA3{n2SD9jE;{{}ZIk{RvPL zwxCcfxj};A+?R}-iL}43t@GAl-b2w(i;(6%c#Z=YplzgvlMia~0DCZKf_DIJPImR){e7Obk)*&Ch#IxS3 zqb>`}Sv(wQ4(k-l1Tols65$CW2-^rb#{XpEpbhH#(6T=UvBU)Q0vUhhHb_>ZAHV}4 z{o%B65c5kmR4!+$nZL!a21`xHlU^d>qGJx3vTpaIeRaG8q8Y*j%9>SqEB3A@l=N}b z_3k$f9Bc;(1IcJ$*XvGMDrTfo{x;u13MqpO1WaPNi6PpG2=^Jfu)SML@)fQM<_#hR zNLkr(s0SG7J`*%UELzL7|LKKA~`PcIYSf#URf_#BLVYoU(Gv00i}D?op7lVLgB@FS0E%o;`MeW zwH6J%V-z7XvsG~Tv6r-OOj%UxsJ?(Vrdh z2$ou(_G)~()(iCiOknPiy0vDC2bpvOSG$3V{nyy0?+ zMP;5uFh$w{kciMe#0BHOmT;k(RJY5M5{)kjm`mosXWYYdy5By&c?*F`7Maf?>pill z`yiqJ0iiK6Zrt_*mE_#oi;Kk0&is{h6oX5O3imJG`< zH0X-&WurDvf*@2DwE*50Kmul0_gA^HV(6cw%~ZX_$6Pd~mmWz+-(%HYrmT7KBJT78m&RbIe&lWp| zX`J;^8vqZEfY*%rtOu3J9C8w>Qj<0Mm^G6`IUiVGWrY8M#=xV})al%Ip*uBu+xj0*fnD8cs3?j7|suj=Zd;5c3fM zxnauqqgSYb^a|kk`2pbuEv;os9FdSnp3Pz1&17m z)22cAuj=)w_(y_UXGh0ZHsvf6GV|P;e#B{bvJ3T@%YN|Iokz5P!qoHUbMPlLFm`Uq zxcnxGSCW0EVE$H1D&-@+4L-FUr+BM&Q5f^~HWPp|L)J6~vR%VD?w*Dshl&@1GA_)8 zw^!^k>{~yeOaJkv@3wa{+4PC<#DGYXz4}()rl# zIUF0uakPH;7@lc9=3R$%IdyEe-UMa_no*Yq`sNaT zbh)C8>g!~`q7ul~4!yU&G(Be;%O-wxKE%Jhe$!1^FdVOzUTWGYXAMk@`pb?^2*IXl zN^D7Pbtn zd{NnvuiTJ~we8dAuI%a0J2h}l+z#Tx`#*k^CAzeY`Uf%8R)F@X(l*aHw;y3F>j z$A@|;_^(O-GBLA)5_wap)C$LK{8QxhtOsV}xy)n?z9-nuuuqqRK8ooRRtF&_UMX>=+}~Fz+SlbiuM7A(rK~H*w$#AoFByCR3jSPxMY_VB~=p`>4#km0whdjuHE{Hg!}> z=+Ta0i(HN(k>{Qf{xuyniMo$Y9FPAt)cjalxNaZOCsMLX{$-Cdax)EGEtB1!h{8_= z`Ge#|jBQ6IW)x=}1F~OfiWSDIWrL&e0B3whlNp7`XH z2e`~V zgtS!(^m1m_Yf_G%jkAE7&N#q}mVUy}&noLTd!k{>D^c(aJ9yStzw~oSE{d;?@yFTt zvk$P}?4I+T+A8}g@197zZx!8#$S|uMEVl2bG={ydT*u}nax`O$MKcT5FPk%KIy8w3 zQ8Kk;B>0V1x|3yco2Hx9HZ&YbQW+JFT35`STq)>|g7@d{Mt>nAUkNkV&Q{ z^g(x0FT%T7Kq@W!U`9|>S&msXib;Z&7P~;4k@}zjI&;wJ-fnOUvz zeOQdn=KQPoRDYd-T2~MTobWd#MYX(d7Eh-}BdJ6_dd~&0`M}LWSW1 z!(ooffsWfRg>P#cckL&B22}47>gsj^e;tI0zUWalGenl1QP_iAX1UvNNKQJ^;_qBchT{08CH><3hP&gLtf1kJwCnq zEW0!g@^^H?R2cyYYi?vpMjkiXKil+U4*L{;sM-qCa85|QV4MWsSxG|P_%_Z$6sx_Y z)Q#G6qq6DX!SI^#d7D|2>=nwFI&_prrXAl~f~8!9n||};C%mQ-(WHVMIExy3SI3Pi zBDv?a*C;{fTMCTmPZdn>hIeMSO2h;2tsMd0;j*vbJ)MSK@&WqI)Dh1(V=YbLvd4po z?GDtSd~t0^-e<*Uv5AsvN2V`bfo3Sx7aya=JLet!*)Iw${ycph!MN9Xqa#tWY*3zC zWq5N{Y+)L^51Zx`KIYl^t@Z0v1ntteXx3fKun8o|bbh|}rkexmR?*Cj0K{XtA|L|@;K6VHj`8}d4%IIc4&4}C6*JWI-DcjVH!Xh_UEz>;Wz|sj5N$!e91!ty=jG1YZO^HM(AaVHkk`{ zq@$p4yu-%^wq0hbt2DCW*19?C+JFHeMpc^jfLiMsOT2H@nynIrG&m`la2OaZ!qklnmO@Sz|4V7Ja3d|L=cx~D_k&)po} z`v6I;GKx>Rw>!|He)HA-0+g#Ira@aZ!PQk}za-th=q?tziocEPKZcZ;8#O~J1|2c5 z(!cGHd8?{>SG~p4OJ;Z-m-Y1{b90cI(D~Cpr|@OJhgS^H!wme^n_oNO)FpV9DKv)f zzWB2U54V3VdI|7_q{4=L8?+%eXNp$Bqv0f_LJQZ&b4Jq@=I3M9dz!j~#VR#Qw-Ik{ z$k5dMic_5bK;#hEu-6aOm%UXfvsiX9`(fR^VPJC;YuJq!h5>C(Gy@MQ~47ZZa-06a_}RP)l{^p`?N}e7?J2mq(xZK@1fXXF?b?!(j~%hFY+Mo zNu>F}-c$}#t+4wtL+pNJq~8Xu)FlUAlB5qqw8jcV2LV?9VhltnFklX#T6s86^H^ny zfu3z^0AnIiY`LQeYaa{HlqZJ(`{6p%iWsEeh7nR6F+tZ}D%=@*{TnD0vK|<}3hjj@ z)2WGXRwv(E++(C&4Z5%2q9=05r*x!5NW)%#49;YeyXKV)cGEaM2D`rd!-$JJBLnuK zQzph^iS`T)3QQR4hKr+CIllrw1y_x22=AvKmiX`M6Otf|)MbVT{xSf4x~k14e9i*T z$q4}*S|>S*5B)9mh+a1#>fcb2BuxYd-dw@2dc^me;y|BYbK@AO6^dUBc|KToKjf8} zR$E7EGhz}I#}6OlImJCvgs5-$hvag8C2R{6ym;1EF;k`%RKN1JziqNCqz9d60?j!h z#>9AHpHepa5CR?J;3cOr*KR%OA9@UNAr6pZeVpRi3vHyIug`1lLDi%p5|7r~;M2S# zemjE9FNBO}!^{j^;qR^q0h&C?TU(~+ul?cp8dw}a@Y}fm$ju~BnR2p2y7P|`c}1pG zh&UA&qfZT*jit|olGoYl0gJq6=bPdCsv3O*i2B3^j=AmsvJu{t90~CHj!uXb^iWgB z(Wf3I$#i9+0Bgo{$=$u3$PH+JfW_V|+)UDCTF!k-0_=zCB#Un+_1>YW;$rHe* zY}J*J5l6= z5M@;HphGZ~Itr*Fq@FHW1=?L*vvuDy!SaPmfC_-nSMDCwV*#d430Zt`-9rtC`x~Hf z>Y+Nk)J?6dl|<6(fFYy2^ppCB9TcR$G@xQL;@*(WX%ONf^@ec`pwc9o&L`#_^@r0C zzizs*z!FYBE`HQm@44PRM}HOl9w`>UW1MRf7Yz;ZQ~i^fa31b?YlnGjV^{Emo3@Vr z@si0*B)MWEokwM;Bntny|8^S{P<)t222cxzHF!C#F&WFcq~#tU-6e;4^i)x}5`Zlx z0U>K#Xs}Et3alD35!uGE)%!ywluVlhV0ypiqG4v5ZDl4|T-B&kVRvvx$&9gtrcR#r z&SB%SfO{JsLMCFgP{%$|y>mEX$C7s9Kxf#y<#{ay^A1lGNEg0~2=oQAvI7oN&$YYO zFZ(ikx4P?ahM8m`F79Y+hIaV-jRl1`&Kf}*=6ZzwO&;4aNOEf zBsoN9Uno&MsgaS8q=nv!vVzV}s94r4|IDQnjxpffqZ+c{p+iWfta z=jI(aK(r*#-3LD7{fDA{VlUar*&9f@6zCxj&~nVyk`r4K%+xV}?d~mlF?|`qsM~aa zaNwSVW~6p5EXW5T>ScgYqy>;XuA~+EK3*W|>)F8OSAguITY+95cS?6my9-IjgCIE; zXS(;QzM`SEjtsaEx9dhlzz@4{ywq>?pZp}P|o-7|| zj7Q)w<%4S>i|e(-Jr_e1DmE{AZWv?0jlhWUm7jBw4Zd?y2#Ps49{QOG(3b#!>1P*G zKX=f+xxkkH|X z7K<33+LRAj4|$OXM8N?*xSL#m1>1G{LB`!qK=U3MKz^*|md%FZiNHNwr~Z%m05LHg zE`38#B85X(qG5?Z$v`8zPmaphVvW})=^7_13ag^UGg zvF!C@7rq=02HZKqhJW`1?5DaD%mWyW(uQCsmQ)YI4Lb~EcXR~g-6R;eC~e;<(&~T= z0KftAFa?G&02q)7W9Fb2lkeTe`MnUEI1tG4Bcyk_iZocE^$@e4xaS{e5Xg7^KHw(O zpN~04$Uehq)rp`F`3Jh*4;v{W1O(|`6cY9I*@cuPYEvrgVZVsN$r3$y_y`_02`&t#plssy`EqCeBz z-qmT|`f_b4MLS^M`XZ!z@4saxft;)7{?!qXW5iGsnha*QP{rfke!>7q5**F&(p>7ughk6FwiHCR zo3M`Z@w`5mIrgX}^y)1a16w{|Al#?sa>#7NpF}Pb$_@`5vjMlm|Mi6cA<6FcuX%Nu zll8`e7xf~O3`$71B<37UbPQ^hxM45sAo-iy?e=P-6S{lf9U<{76|ANpRvnapTmO&< zbXBfOK5d81{EY3ffsBF2yfT^DO6{aDNn^T{u7<@i8-SILvDB$*AnYdF(u8%#<8lZG z612XiH;d4zICuFHbIyRvbC0`QQ^sOSeyLWvtT^Bupw2>E(E{ULo&A%(idt;yDx;@( z+vG_%`a*?Dfa*N4x?A@oB<;8v5tWuPzOpJZLhypu{YtZ8zBrn9kDXrZkc}I$H)UQZ zh_YG{uwL=S=Y6@%Y3W18{o~@gQP5CrDJ}-njW6XlENSzC2m|vmNrO zbzV&s!Q%@&8mfg1SN_4sE|HCzfDqHF)oRh}ms7*vL7`bBSqRZHsqZEey<0O5s^f z{Mmo#FSZzcw9Ze?7iX}}IO?81`nKSD;)^ItSbJkiK&v1pQN?cLC5AQaeaIq9`+aa? z9RYcewsm%IUh=t4YG~7>GuJJB{Z#HieatqLvWhY`Y@Su+Jw}}MUyZNbtr|JCx?lc6 z()aG4#!qFBwXca2&T+c)=~k7qe(@8b9r13ugjWq`mYW)}f9g)BC_hYXN0;70f(DCP z1zb+TUzRA-5UQ+k(PEig&WzE_3Rb_NcSi6Wm|F%*UEi3^J6gI;do9V*DldT%R-4O4 zWeI7IUSrr&|NSH*QuG5k{tWdz{W?%s7ipw5L~%Bs(vS8Uuc`0Stm~#1`?ehaOyPK7 zuX=~Ba8V5U5+g%ciSp)2`9si8`}j0?T*i;50u>aR?h!v%lXA(9E>rZr04@I#z)8Y$G7a_grvxbgED2R0SYQ4yp)|Iutvqo&LBv3Z1=w`^BVui8mv zft8XyJx4*R^UW)Ne|JX`?cGdaauEB6;GwItzNTuqfKYppk*+a&CY~UzcQLiQS2scF zp3g?9!~vIJn?E7knP4W%$_4$>YQx~)PJU(0R^0ebVNYFFvFDQWF{|>YDlp1}l=UhR z*p3=f`pW{^I4Q65D@L+BOT?^s@4-pE=OhAmqnG|vdB#KH5Wc0eT-1p)Jx_g8+tN8- z^ie{8ZMuHfmcojCag9m?BUOrKn?*4`sssOouM7E`zHp0xMFJ++@G1GjoR%#1+wwW) z2W|%i=9A0bmQia4S;wq3TA|W5o2YC`%2Mx7t#_Y2`+hR%zcKHK$vW{0RNVdM;N2ow z!E3e>%j>ih=+mNCJg>9hP+l_ZIBN8Gu>C24356Jfz&Q8#`|BI38jPmM15Il^5qgEn zaQprxG21V(FZTy<^>Vd2=U?O1Cik3eo1DLDFVgt>BjALia{KEu`aL7(A)KFylGz=i zj?NA-^*7J5#jENQrY^j{oDi*8m#4RwbFne}qOrW!4T=t__qzK)B&xIe>B!O8J3*W# zjW#mdZZh^)YBCJkJ!*7mrQ+TXNJM_UFJP?F7d7yIUON^T*z9~19M#O?EHNO9Z5c^J zqw(obx@o$7ks;q<<;iPV@k7fuNi`q}8EVJEuz>2O{4%JC*mgqe+~hD?sk^Jg=+dFI z1Je#g?<#|ozuW#snQPutfeY;cM-BLbo)!Kih@QyEC5}SSG{R?bHX1haB zPPd8`ui(#&54*p(lIT6QfvH_Gqm79c8X#fhZl1UjowcYseki3g=aoz+;{pe%b2wBevpX_YBaFob@={c_mc zVs@p5UHHg{wb)+7+o(z0@t)nIyAyxZuaz19iNWvZ%dP>tD+fh7%u>TvL_BaAgZL-7 z?H}(sN0;N7)Ks7oV^hDHr=Ne*#iH7I`{$RYUX#_BmhgmS{ZqRqKZ@uY!DJSIoe*^8aZy=Tgnft}Z37tKWFf%mPb1ZpjLRlqPVzPXU*<7#7o z2>u7@ILY?`FW#LnG1E+u3avBiQlD(c?+SH%qUxqGqMem^A9$`7Xu;2JsD#CNdv{i9 zO`hYZ>}ougYVeJSu}^J4=SV)Wr^=>6Q2vMc!P+aef{+@YuLas{%t;Et7G^7%&9}+= zax!^ZbB^0)z&1Sk*(8N8)e);rGDA=&TXY`n<&d1asacV{gxniN;`Uq`$JrKh^J=w# zDumojzwFvW@x=lWeO=D)Ee~mlU*FnxWIv=R7vp?30Le-13t!Yg%ve_Xs<|IW#CB&M z{#iR06L~BB#LlOoT5rp*ED4W+YR6&tamqWDXK?By)BrKc1g;}mT^tu{lzbOkeva~U zSrUYa&`i5u66_GXthnT!`H{>=E9HIkK3!?4nC{!Vt`z8>anS}^yUyzJ zjK9SX3V)I{K3p(cO>$Wcg>$MLI^8j_+nU_XK2@r&lgr#t6q+a-&4_o$wF-bW#Z`EK z=|qn|SFx)mXW86t5m0yl-g)D!enU=W@QHv7e7|SU<*Rr|v89N3PPe2gV#Z|4M`9=s zeYsZ)Odpxq`_S%hrfpTQQrYvoAq$w``Arg*!D$#v2HhJ7Ueyrr#H#G!6de*U5 z=lReH4h}oWa-2@48?62V)eD?}^-C6mq2%h%k;U>;a}T58mUJa$0^TVehsbPN`~qP`b8;aB?u9)3FS~rt zXL;9Wemx@+LgFc}aJhldjtFSCTFQGH!aR&eP+7tZv>7#0FW##hQ!xLT#*=&u^F=eS zTDtq~dXAR;KuAl`At6^>s!<$9GHzYQ$#0I?E5I|5zTQ?ZN4bx8v-2^kO^lMc4BcWk$MJ`XakqY6;$=mlnr4p*wrP*a7SMH zPFEht@@bV#!+Zu=gCH5dn4ep&kD#W*pPDfJsDpI@gw_qO_Cz)lPJ?AWW=kCJ$vN~2 zq)`kGb8w~il#Pit8)F^oc1J0I9&UzC;j>|DIqI}RoFY{^K<69#a$Oo-#vBYD_PQPO zi*r}`jFI=l^0`xZ$ZTr3Ft`VOvPz&<9^e4haG@jpJ(A}_K3R^C1*-xT!({&9t5c>% zJd33BvL!*C91Bt~Vskd!4I7VryIlYYcD>)!(;!u{0v=)Qm&cGvID0&4xz-q+KzB z#5;8ybq`4|b73iB(q+4Y66w2lczX1ufP#;plvDs%y;<*jE+?vupn zN#u-Q-u-N~B#k5u(rH1<58r;|`ZO=IFhEue8nXHRJo*LI)4ArXA zxW>V0pF#_SIUiDX@3l8ZEZ=pE7XwzJ?YvXVzc?Pv@x6khEw1|@3~z8RCf2D(v5>a7 zKv<0&3eX(E82N53{wxVfzX5Y^l(yS-C&HOd;MWH-7Je7`?Wx-~v zz9zuI=m#t`6D(5A?{a+z3xy9yznQJQ58GPzp;(?hi=*g?xN}cjhN7Xl-L9sWn7_J? zIplE%INiR$%(r^_eX;CHp3+y^$4GF4Sj(^lnXj}pX6sMUS@4;lp@({yY{)+1EKA;G zR}gGA01$Y7Uavx~nf!*lKA%z4K0)Z;y$|VDPc5I!6ao6_M57wlQA-I(IU6*=s#iNf@{rmj4Hh3-1rJ zI0FC;r^CFDz&wWxSt~fA+>2X^7K*`qu^aU>s39T&g?R7**9N=8o-#r{Q1C|XjSfA& z^T7mS?g8n+G7J|pxtHPtMfvD*1gH2=Y|lePV%;gK)2Bfl@_{s?j*y>B?h2s)ka5*| z^_OxyY6AOE=)Ml*Wau`(^&aQLkws-X@kZpjK`;~^Qu~%7V-5k52E*$;5IJtaZy?K6-QeU~ zNZxrb688YTj(iYy;DQnqA^|wTa>0TV6$m8L$0dZ9cw!;Wq@SOabw7^O#sJ_Q#*WJE zeuk;!Mk5_uJfVFJcrW;PpMcy!jid#KIsHGaisJ*MrMBW6?84+|K~WTvCu%0Apbl4L}6&w0tki@}J8Tn6-1G>!okNcw;V2WO z9wpNIOb7u0y;*9xR0vWgR#$eC*KZ@vuMPoT2vB>seY>HG=TRc~m>4iyUOqxchQS;) z*2LsoiehUiu}BL4fj%ex1A$A(nfD^dqVD8zq~5o(F-jhXQ%4ku&|tw-#L^(A@-xT_V~+LxtX=Z%$u|f;9nHi|&BA za&zHoU32@hrd}Cnx+*{jx4Uln5QugsO&vPvS9_|d32=gjwihT}mz2SqIo_*sd$-o< ztl<&Y8@>7rNKXXDfp;Rf11T85bS1{aBHpX1v7DzqCZ&XXGGzS_aK$HFm{A~tb#c}s zqQNzlM(lyRoU!~SBUk9`5-3B6@+kA-AWkbTDCNI9=Ruz){L^?uvz3-j^Xmp6aObv+ zK^o>p)H~Oog=`9J0w%92pt>$OaZj^#IiKfSq zg3r}n$E!8CuIs^+AzwY^@4wk*W#w*H+~O*lcQ7W>?L~t5gxV4O8?CYL)d2UHzi_7S z`e>AXv%n{E^u;C)SG|y;|P?pGOKgxo2D&ztWheFiAE zKMmm~XgUPvgchdjE6gV8-dx^TM95 zhcsH&D^wn1b07~E`=IBh`<{qB!7rxfgXT-o=P+s(zvn5p4eZ_|Q3gxTswkiEj{ERf zs&L&}<1TYB3~4hYMI{sG+Z5E@yUQRYEZk)Cfpi-a$j4>9JiCw^nBud}movq44kaTJ z4Z0O*V|<%B6@yZR1bc3ocm8Cditc~(f9kR&TPa{SIh2cn?H)6I;Bkc$Hp><;56)eR zEp)f4%RHd4jQCjwx+~`I*;3sTSPJG>>S*^{k;q1?2IsQ$9dZ+ctA~-KNiHQJhp(xD z$+mJrGfs`m$di_&Uv{?6>=%N=Uq7i)=xd64v`6ujX;H8ire#Hy(|Rk7?4H)pbgSYe+Dh{LA7zGKx{KNAF;6%==M5 zFgK&<2cqfImQSZF2frH(%H`--B^i1jr>DPU{s-dHP$C>GViu1pzT+5P;mC2}Jp{Am zoM*sh6Fpt+Mz0>SA4Vz7`jsKZYE_yYA3E=XCcl@r`oRB!V|&(KGR)fkNN_NkxP685 z%)r}$WFTG7Qocf@h{@SKf4QaAR~$;`XB#&dUQ~QVq)v(b{_}Z0qd^f8(zb09lZuS# zzl%Rn`8gWrG2z%fqqp{xr?82Jj;KbG=tt4}QHJGj_|Ue{G=n7t3wAsZ-_6>^(xmH} zYYOFZ?M6Ip=r!Anz0vy!S!EuT6i%)fp9-tCw)SPd{-6OOy`5_NB=fti{>u-`pFUQ* zePUfZ(NDh^m+9AU*;nT$B9b z+10@xrTI6@t&+Sn6iqJ2jE27$a$bI)Wc(>YCSA0kEZXeB{qk4KgD*~-gs7SHkQVRj z#y8IJl?C@BZT#RrU*JHy&4xLumnd8zp!&ti(xB}jsJ|~Vq}r$^Cxu@Zb2N5Px3zAh z99~$(M7eo5&-<*CbZfd=H)-+xOJ}F2c1i}$&XtFi(tU>JVkXeKEl2U1f$2#$ma%KE z&@6Y&%BJ1HpX$`4<8=0Zhex@d6*t?(T~ZFlM1xCTR{~1E7andw2ji|n0!9bBDr82pB$1h%_UT{XgB`!cP!jW;i|L$F z&VLrv2-Eb~Ne%Pa0-%S5RZr^;qCj!U>*X(7$g6G5Om%A&@*2q=e?HIz0lO#DTd6M^ zeRsrlDWcq|7avx%8wy{FT$h`d!P)KYt9}tQ8ph4D8fHBTEo1l|PzJ^A%-T%$lI^N_ z`v@cdPBCUZ8V)xyZjPgsWt9jOe_{ry!be)8dj2fV?E2nI{dv}{8j!%;`UuI@Wb z|Bn`LLl55@iHxPJ{wVDKtOmGKr&f=jvgbGRyvC^5?&ro(4>9!HY^zSKB;{k>g+g5K ztmWIr#C)HBR`EEwH*Hiftd{Pa|BU<2zyxoOr4HLNfbIQAvBLB?k02wjd-A;PYCMwc zFeO~m-e|{v>aWKQ{h3eFJF>%%2{F7?<}d`d&;<@%+cp@(p71*z8lUL2Ew3)K>iaQPeutuKSqr5ig_io%zH_BM!A91#Z zHk2ZD`Lj|#&({9*snwXhkq)FPThOUx%dnJUe_>EkWo`*qcE>PyOF0dSi(;G!TWJ1x zn$t__Gxn~;UL6R#Qk0<=s#u!0sp(XxoYKoDmwsKW8P_9<k~7j*oc8Ab_b6 zc&(eerXhWM?-?qEV^Je7eS@s^8=+Oybc-@$&9RJPnv%r*buj+56`Pfgkbd_7e12Z% z9SboWKdtPX1D&zdy~G~q1_0IH-Yqy*fzjY7#9p8`ii7NZkR_nH|AF&NdJjkQWjwPA{1I>P$>Nb5D!| z6A2!$tNo)v@BV2rfy_EJ$NKjF=t>ND_N3>k_!3bcL9XGdzSaf+H>(_4L2j#b10m33 zc4Msc35eY+vS&XsO`M)PoP_NmP%uK!eQB6OB$&~@u5A#kcm#8}1b-kL9N~Erj>u$@7Z z$V$3lCxOB0Q6X)BtYM_7HtcH+SQVq!L zKhXF=K*VFdGJ08R77z*u3|mq>MimvjApOV{dGG(TUXPm?JbB`jur3FUR2qtA_ws(M zoynPsi-!X`UFNvi!$HJoU#csa|o(pW@XiWLt zJlGZRa~W+8#Ai;~6oG;gU0HzEJ)n>R{2Daq$(I@#m^C*aDOnNN9RM-UhcexpGc@o0 z5`D;=ifwBY>HQMR-Pd7!`w$>Wh=IGkMT)@ayUpU}OIzFyLi9NrdDR{h+kRMB#SMF0*R&9=gHg32qCuO{0Ioo3!4S&oFlV5?U$`9OrQYn@#A87?t(d@vjD z%ajE-{S^oj(6kSdnCjEJFX0MB3rN->J-|VB138eovXEGEdB+5@@@<{yaThB$Die|^ z5XmX7G_}Z<0_iU^N@}M+JHJn)VnTXyAQh7;`nSdn!ELNfhtPGRb8zHD-kZ1tf6!1z|6F&(=l^r3JrTGaMUdAtQ zPC(qRP9Rr@$;BX@b9&imavkM6hzlhk<9L%-cKi>dFT5qDrC@&FiZq&D+?OUc>uc%4~F$DoQ%uvhhw%-pndHv88TYkK#TbyYgEQVJ29AJ? ztnWZpXAaFwf?Lfq*o3rBdi-APYn)&K^aq#&>V#U3fRR0iK<|( zoT)__dnK+dd+Z^MqX;B3;>Hl-hr$x1K#XCD$LHV^25&_fYJm(H++#5@ZCMs$pjwso zDMk@X?gDC|8;c-1v_8NQF-EPDe&v62z4;c)ZT`l(*Cc=ka$Sa6W$}Jqme_*l{Cn&W zA=peZZQkOUe04P_c?&=(Ux4EKf!_lw(TA|oU;~Gt5rFaz2!IbPfz-HLIHVuQ>D2ma zK~lF5zC6HM^1#Uq5c~LIay1IK^*=Lc^`znAxty~-B|i&AXkeWyfU~uZ;B6-yz|x6s z13-Z{D2Yc~S=Q}u`X57HT!9a!dB0NBJ}pznWF+j_NKL$fWXK!sg%!rd^F-k&_x#@X zu1k0-?@>y$wO)phfI9*gA|b@U3J3@Hmyl!hY`!Mzv3T8Zf~#DkA;pr=mYhgwxe@_$ zG^ZC(|5ZF*&<{A$={yTNdnieCesF+hPc|Vb)>%)uVmUjyciJM-$<68NS&v9h zl3Xd4uNY%lF~7KVg$doj9z!>*nA~ssbMg@5*?(a`Oq(-DjD9K>{lkR8-GD<2qu-&W z22gqnpaRs((iso@U#*7cpoGvswj3~ZocFZb)8pN2D8iYU&Vk|ZuG+HQVnblQd+KWO zYeWX2RD*-j_Ja960Av^iYz(%ZB%g^<5+twWEdX!ZEG>_hd?*j|v=l4qH{vt8hZsDY ze@M?2n{yDp3Hb|*Viq@cB-Ogg(+@2o%1I?h<*Jp!Y zyX~pok#sQj-5?tB$`av6O&h8<_raN5*T<{f56})X$>JdNG5b5N;SU_lVR6<>CJ7rM zonmp`7^A?9=ykzPj5Y^m;40(e-=vj}W{iIFpw8S(WMT zYEWuN`JdthF6*p4houj?=iI80j=H$+cAw@~9R_KbD!h9$gH52}@Q7n3i=lnkjXY5g z-1#7Fn512nM*aozb9nHv#?S4)8qD1R49~v8ls_m`=*esADW&llGQwh?l_mewHS7V! zC3Fde^Vp?7%hF9sRhM$ikTF0kro8_3gjwutcZky7pM$-v`3^l%XZfLo2&c-isO@#G zF}{YYo(d0MQ9~)0J{6T?vu@DuOQzQn->|3@)-Kl0a9gEWBNHPVSSnQ9^J!p|Eq`{T z^!4tEtc}iaN72+X0MCTY14yQucc&rl5k)XN)Q<0Y>-_#~W~o?Pjm5fsby|51c8yCk#FnZIgy-Zc=Ma#L(o99*#ED1Iy*aFM&V^Uj~yVgJw5M395b;as5L z*wl65<4_u!a`4|Jnyo;h&~+Sv67TPb+gp@ZlA_G zM<+ag?P!wd>HKcfnv9TCBhWd$4_{Ib;gufw&aHXmMb!`;e(j;(G^QNm`>SDjzin}Q zT>W6^_@T#P$p#Xg&KMi;r%&=&AMgB$jtZhL!CFonKC|V z@h1HqfB9J8nAcDBL!+I2eYSEbUs_UzQ;LSU5z3}{Ikj_ncdDlPPr5dDsR|{F7WKsp zg*^=kuix!d+bgb+Zwf7hHNMWR>k1QlbK{r9V;Y}$2is`(5}G&Y^aFktl0dW=%0kQ1 z$kS%bC)3Txis%o>7i}14gm5wW7BIqKxu<$(lkTqUzj>n6vF1KFc!)o~%pWQsk{J(d zn?OW$wkLahi+#(QT|xe)nuI~^nVjggPCDsb2t)TI6aR&btNyrH9ZvQ?5bhtDHJ(}J z_BD6-_@{fXKjd5%!u+$oRiVlvu_HWMaf6<_nH@Vm!5Pa9PA=Ik?=~;VD*;-ke)tP4 ztFIVZ>?xl?zz;hVYh1AV2O9AW%sn?%Uv`kuCift=&VIvN6h)Y-nDzG)11FE!&jtH7 zdbi7O(-$Jyy9UiSca!uPpMGl-B=O?ZmzeuPY-)($QYz2lOTwZSpZ0C==iFS#?;qE+hdCNaL0)IS z2!*tQbA#c=73yM}vA>^5QW8Et{wVwp6j+yhJt*-b{IY4hKfaHsN8D9YAu5UXapVUJ zCHfa<1Io^lU*BpE7%3c0nANS9c%ibaqQyx@m+=3V{iu6qFN*Vdx3#haf3vMT+b7y^ zZG}Icr#d;^9Gz+1VkFMjA#owZ{2!Ao7 zp{V0A<>2y}C_HV#-~Sc4nuG11W%nH?{n|c`Fbqn=F}I0=$xNM<+nyuo6`y7y=k&j$ z%4+ZH9x0?i41Sfgwb^C4=p}H;ZQySvEdHFYK5%&YHs0#{`6oQXw-pk@>jB-1N#}9C zxIBMwunkHi#tp0FZmo0iXyUpfRvKb1C&OP?k?%>7>(ozNl9stjuFzx==*!$DKmYHq#!ijZ^AVX|-G(07H^(OCE)QI=DsRfbEV{)c!BK-K^ zTJKi_v^wdnk~brc&hRYvn6F=nWOvkZ7B+$;7y?-pWZtjz2c&P==Y6EjD_=yY+UgP2 zbZQ5@D@f3an|9HvB51aNzB@Ee+^W0n#DMFRU!`1FBwCEi(076<&xazynWSig^VC6_ ze1yWD-eAsR=yG{w>3ix`>%GU#>Q9#8Wye&tatxz!i2IlFT3z|4iJ)Z}jU>Haon0^L zQIZm*L-ad{7tWH;-S9O+(AN>Hs1WL7)TG~nrq3cFMX$p^f5Fm-kDS%F-}w`H2)YX4 zrKsra5Y~_LC-BY z(!DOYzzfZ<>E7%;JLSnP7kJ3}i{N-o>DbsyGQOqRS$pfh9xq;Mo0v-Y^pXr{>0aOX zR3wlMh^fqmca+`VW7BO)=9l?*@7Z&_TrDLc@8|sU>0Q~}Vt4kVk$oe)Fm$9Hg%lho6P3sF&~2QNLL2-Vcj}6It&=FGPw?EvAemb)h@c^lBRuM zB=_S#v|pYHBHx=WdR_T!Dp2x_WKA**F>>$LC7xXFBWPa9wDP#zjyHaLt3zkcP z^od)c9QmY=x;srgpoGa^77v9qSO73E&E1AfUU!YA(OUu}Bvi_MpXvJ)GU+jXm~#Cr+=Bp+?s*#1> z`+8dD=P9nli9i8NpUFS2r~JncLdxmbAFKmyHSs^;qtc|Jok{n}R^4 zWfNx*MdnBEfUTWvsOvM=Yh-q85$RwWZI%~$@O|D`2`bd;(Mc@JDN_w{)=jSNlLNph znXoB_19{lxn8Gaew-3MQvNN=B{&Z$yGTa8EfjgRM9^5Wz-V|&+$86gDpbU8`c-nQm zbsPAp`H3Oq)nWi9+6Hq@ZxF1=*ZU*#>d3HgOysPM)z4T9uQ2rdIlzb+)$gI&T%C*A z#lDk1%he(nfje%{LR8|hPrK;cnq4=-)f1&~DhV5D;zUr`ew8v+E<%xvF~yVCk%K=} z3RHpc+fO6LEa};GAQa97`S~Z=xZ2F@_^LcS0u4XpCj53?28z zzu9k-+f-f%Bw#StOtZX{bxrxIoQnb-F6StrSlmAu(k_!omnTpdS6Ef6vF2es_c(#7 z0ii14e3dxAT*&2q2SRSSA^JW~n}oh@8L0&E0IQ!pOuDRyv9opyl(Ul~WagfK#WQ~O zK^rdw0HBf#6v0h7Ppzote~IEsR)lFHSYFm|`|A?L(nfi%A!>;}dx;SYVXr!2U&(s3 zTGE+m+9Lp0K@mv0@~_JnwQ-U7SHLCcaMQk4zYg9c2Uc*-!n~VQ37@Hm6HgwCXp@6o zP$Grj_v&*?=ft%+63!Oq#aF!#UR3L65 zm@q+lCltyX){_*hgnqj0(SL;kN!H>L7V=Va_Y5ZecqUbLF?4mi0i=Hm3%F$%*ZI!bI=f>VOs{RL;&Mrwr&fYcT>Z0$+kAXyAxj0^<+~o+_}yvyQWMhiY)s z4zo~i-9_A0LagQr4&J9=+H2GrEriq;R2z%@2`KKE`iG8?DhnCH8$Wasuf%8e`wtE0 zKQuDP>A%lqUR%L*Hfj(N_QZQAk-pWFDpwp};NdWSWM+T;MHx+Om`YGI=TU@bGQuQ0 zV}X3`MYv(FiTW+$_ESzS15j!-y^&4(YJ$2851V1^2t^1=KKc|a6VTIfdLl&Ia#=#I zS+6x9Yqs;`CBVKicT3v?AeaB#B+W(M1>L^{@@1&8-pa&dV?&fzu8(8f!Z)xqdV+h$ zEpFF)n!8kBPsQLTErU6w&&FZ-FC|&HPSJDVS0~EQTQ^DfH|ZuRHFz@)v_~w(h~p!< zQ)IvxU=M8jTquV@C}Y=wr`kTap-jfmpJ_D*=ob2~S8OQpUo1o=cA`QsmgqumL5luR ztALeP)gLMx%f8CsZHOZT#hMU)psJ%WNpnM;Orcq%luKtiIdmOpU>DT@ztW}+vg@q+ zpDV~EH#^$EmHNX%qx>#UceXbMM0o)TG{=g(m+40};fEZ^-2HzRDt5R)Cx|$t6mb@h zeS~;wdm;alsjILuPh;b_^B(@V2Hcg4<(Xn)Myc;Vg?PVz?Dz*+n{-d=HOWbO0?)v( z1|FnAa{|CtwU8vFhbLH%$B3 z2*13uhci57Qyd6@EEOwZop<6iP?~(zdtwLhvYh+ugaQpR0Z58T+ExfQB0uP%#cr9d z`>~vQG3_h~`!3>?VeYZ@N>U{p$=k1n#f@)ujBzcN14zx3g^U+xh-`=6PxU;jq-qCR zMnqq$_0U`lcUPRP--D}=04kRCY27J@Nu>ReQ0B4c5qVOw7k2MKfv1MP-Ej#`@lh&4 zyiko$J*TC15;VH+n5sO)e?OE1JE!&?fbN2Uvqsoj<_)|xk{`H(M`55OLm`$F^dxXNF*fg)bb!Al5buC*pu=wAP68WZ`mj)S|1=Vp(4Z?+Kzbka9PkTu7TTr_u{#F^htpXz zWqLomo#&l}O-bt(Ci2r{g(9}P{&zez;at3{#Ghr21hplD;$$&*Sj%K-L-z{2 zqbjtCM7qe;8)GjupL-KQHG#n)q22ZlzNyWZA_$zw*>7v^ZnoFzn~n#q3YTRRg*Oe9 z|Dgrk1^<>e*kxrR@I!0{w3qG%9hJ-xQ1`ns<1!i?%A-M z(pL5D_GJ$(+@Zj^uYA2vGB?}pc?K={pv-L*syg+#Uyeb3&#qU!e$XLz@dKOUabq=Akntxekj`46qd9zd4wqaBiEKi5S|h)h=&iFHm+37K7M zJ@C#~*asv5ZC_y_a-L1g3U47VkZ)cXk;Iq#f?C0%_g70aoMAZ{WJ{i!Sy??&iiPC_ zcXgA+q_r}P2}0wpe(W*AtXoyt{NGhi4g@L*=A!8ubT*M?LN@&t#kAeMNpd`>!PUpbI~#@qMR8iI zu_0EWw$m3>G$~ZVY#M;qe#Nw};|~kfyliot_Mkmg(P`_l^4ldST!UWiR<^$?y^^mY zuDx<_yF%2<-1@J!CK=wU+PEX?--pmwnKAIG{(zIZ2{~TYLQI@3CCMLEO_W;_1s@Bd zN;kREFSPlWldQVM_{%E_jW3iF*zAra%Xa1XGW;bq3RT573h`svhwlbo>${ySuy&rd zHWSh{SSacKsGWYOt7QB`Btt1jR6>xx1K0{vgs6V{S@&;mQW+FRPB(BsDdv^sar2_& z_*!2qvE+L(oW}{(&NfJs<7H-kaQu{A-qBTjlDUwOQF)Td5kO&R4UrJ+BmQ z-RJOEEF?$=_kSPvKM8udX&cO1Qk z8!Xv3wxvvDBP?s8EXC3()$sa*B0YIo#(} z_z|5pToY@Q`t6I68CS&VjBrOQcuGx!jnU3z*@W%(p8;wNu1?%@m9^i18jqCt%f6Gk z)aPNJQe}`(%=vyR`)f}Xsz@zVPX?`IJH@>kX`A$^Yj+du*5D$!dhxiJg8DG^z;4Ms zDm}-b+Z`IRXSSq8f~ZpuCU2`1?FA%wLp_cy4hA(#rT39u_UrD3LQG9Rvc-rKxB9IV zIfkchPG(kUhFDnGw^}pa^e}luRFdW z@};u<*e*PEK~OM9tFx6o68+QuD#hH~RIvaCrp~Sdt2@p)wKul8IV9f>^S#QBhjU8{ zQ@%?H@1i%Cpd%{G{x(u}|jv87c4GZ5L{3R&c^mlVwZXkPUxNI}_jt==oE{1>r zX20g({AXPM>IBwV)G(O+CIs?wBWfwOo1;ZaM((p!pf z+7dOk`~WV(vU!b+6*-d2X3K%wg5?Ityk}6hl-h`XBC1?Ex!e4bDggQ8-rdSl=(o$;M zuUnv?xssouoc0#(#A&~ZY#&xBcBKUGO+S@<(^Iwf7eO^0k8)HtG{OyY8jSwT#AILg zPMd`lMd21_r7MRzbzVSBc9I1Ik7sqQ^L?YD+!u3-!+CBwIVzA5ec4EJ(LY>>wdD?q zrG;I6HJQRMDLqjTYK5ezR|+~+{cEo6)AqZ0dCiQP6>n?|pV|GLXM?pKBlHM@Dmd&I zGd!@ajZ_TX3Nc(si?f_ba86HjcGBNbK8mm@N}bWzO+2QL+FE`whu?NgUdP&g<&a~C zOc_c?+We8EqT;rB?eR?DobK#JNXW_wkv)+pu5A7_el2YP(y8aBTDZKBCG1d{h--Z2 zO8u(Q{H%`VC$Xq?;ZqT%ob9LAZm(>64coLze#sE!%c7lbbA?2wZ0f;uOM%%2gpXJf zmw~^s1?SWM8@3pu-TP_p(U_A-m0&tD0%1~kh=v)aG+5OcQgKj^d_z2E&xz3>uhztK z-Nq84qWu%L`GZ)FXshkz^}8T0vu>&w2uZ}94a(cA#@K=sQJJ=Tn`oBZb< zjc4+RH}(r*ey?TCPB@c+=J(6qQv`%Y48HL`>fd4GVzapePwt|)VOYOP(fmKY%VRoe zJ;fi{R7ojTZdOSM!Gkr=l}f56IBt}xR#Qe;)7K$34%rIPw_Ywqtc?n?TZ_N*Dj4sz zU8w!JSYHB4VD?AnRNXfIj1!<)`|#Gk^y4xj>@Q1;)puXdy$Vqcozy|?oeU;tPAt$; zHp<}B>){22mEU)@d`H$W!JTK%7Ix%c?(Kwgq{#$08hcptU5$7XbtW7?2eAjVLGGsa z5-*jHWFDN_L^gdFmEP8GP+^ZMZ##{CX`bo>C5SPqgtH?(4zD2pjyDZa{EJcN;jaQ= zgweG@H);ULw_G{H5iyIpLX%$}AsfGZP1JWy`}yF3YpLk|__p*KNxPbla-AzO>wbFw zIbDtY4xhWVxv-+x)~umJS*J4pb%)Q>;EXQsJMjr`pW{|AURfHK}KjEo;kfpx-+rCqGB8>TP+&WVDH)T7AT21;~ z_7As(6JBN)TA=LkGjw1w8B>+BRJ+*{RJo?9$u8Wik7uglfWUG2M?driZr-3p~L4b4mgk|$v&DCbEh#J8X}#qQ#zP{O|VD$7;HA7Y;p@<#WE!1;EOcc48CeFTaR^? zG2MV78&%eBX@63jb@|o6CZCc3K^sm(P10>P0{gkw(^1UcqmVvPqgfAuVVC9k5Jt|+ z`Mn{EPO#xxN1^q%f*MLEriClHCXi$)F0 z#&K9*7rYu6MF-b!-+=3{mtD!B`QqqwU~cR~2AsCtE?PzIfDXqg!G{RvrTvL;tf*cz zEK*6Mw`22cw=r=f{^<m(K4?qMbNdaCqIn&#rH}U30#ze~Vgp^q!#w4BZ zIx)jvGow8l340!dyposqDgEly&7oYDe=^oXkYnnb^S*xjSrgz|{E6K}A5h?N7|Bf{ zzRv2O=ABn$+3Xz>zGtj$p-+58=WXtZ_)c*#DwZV@8b&dNL!|nv&_9A;@gCx3vT?ZU z^qS%vd#L)Fe7{f&UzDlIG5<(nrw6k5(zeQVcs1NY z8I&)#o&=&6UC@8eobY$Qf}<_;_M<;!=d$aUAY$WeVpUbnXcG zzEA4YBwA3EB|F{@ibOf4{sSRL206hhH9nNqYEox9`*I-U`1e#Jv{9 z{U=wK!_%f>%&mt?HH1KA@RzU*8-|kxAl(=s0bKp1^fAOu6kKE#I0D!WLv6E@iOvSh!6A-)o<)N zUz-*^#myO1E!$Mh&D+39%Z?iKD5uze+)zHmOPCf8)}e2`_1?&$(7SS+CK8oi-CW#U z6n^m3s!!HP=z1<-qQUAtZ3V+@UOG9d++C{7_qxSlOcZ3W!H(T@rH(q(t&Buh)eZiG zODe!{tl?W9g)2tq4Ppq!KBIm5A26k=eRvgw>_8ARuv3Qc^dKP4J=Xm55AD0pYqv2D z+WN_9b7@1F%jKT^@t>#2*0A{s^Z)P{Zu?KTBSl0GGs3c;Em&qT0vJMrr_HsF$te-w z-{S+r>RP7)4i7FAKa%zFZ@V+A3BpE2+Se4_>As%5$sab$5PFh$zCR2CPr<19QeDta z>Gg>-gK_#9v9McWKx#|BNGYZ%@2qa|&s_54(8nZ5_r(21SVRkA_>w%dAij5Ty@B#i z&2J^phKSO@3g07;24P#A{MN)|y zI*&9Za`wkWJav`l(WHI%82;xoh3R1MWNPOS3lkQ*y$gd0* z!OoJResj^MJe}|~Hdo30QRIxkL1JBgqw|MZ9qbXjGJ#Dx7Kibx{0xtpf*I&6ToVoa zUv3UPhYK@KHET8RL)>dQjmROe@;p>|{7R@(i~;nvUQv#WAZ%6&Xg*s7(78zK?k1jZ zB2eWz+S@=#ALtHx1(K%uUP<{)GQ$c8J^D4Wm9Urnl)DaAmdIInXt7l>$wKSmm9NMb zx>rrpu(%Mo0B`MIAwi`GNy(T2W^7XWdD#1@@Ygyx{TB#muE1f){(!Bb?7flIT1X`5 zv8SUF5b9MqkH0Fdq~ecL`mDAV{ICUgUK=-?E9NbZ!!8o}U?K*B!f&>4?-Jk zT9H5}o0?_x0h+oogbvz`fVA#U*gDt;abfhYZyIs#!1n(^SH^jsxiYR#u6+f>+oYqN z>s*~EAjgHsu2#^Pl8Auk7TSaL@|iOLJFah`a^3%q@Ccf`T6po5gAlYk=qmt#qB2kZ zXim))5ZKpM0c^>)4dTw+{cn%ujDU)*GQO8$K~B>R68MfR&*CwHv_Re> zvKR%HVXh&TQS{gs+c{wBAb>M72s)h%!wlZj)Q$QYa!O(1BWU|3!6uiPHRmd`^Cswf zY!1T~k|SWuxn)~dls{jNbn3)o=}UV{T%DS33wzyIZL8(5ld9|+*>8qsCD}!?n z3iiuFu(^Wbn&Gea^fi|oZ6*5evQNTq72dX}*1u+D>M`IwqvErYmLu9ojwr%Qv8G0S+SjTJjHHz_Mt$mo38liDh_)v&_9*1Gh?y7>)*h-yAVQ3GM_^w(`E`9$=R z3W>kXVowgJ123qO#EkN!;>cPrq`z(LhQeKNsYAL+Ckt;+@4kFZjP za@DPn-o_9H0Sd@Apj2%aa;wH5xC%kaZiPMHBY!Ic{gvsKrR!88;JH&V9LEu!f=n zg3zv{<^$My8A=O3R5c?Lo{W%$5oN2)00Xm@a$~l7`mg7)2EeqkTT8c8oq-Q_K6Icy z0*#LUs|S3!(=i3}1zrQPX8<2Jn5OkQ1rAXOdl|?H=m4U%uK|Z!+`Z$~M);C%)mDc8 z82!=$Ujrq962h~ww&qV!WvhmKU-$OvvUq)%&2)TOrB1q^j0^Y7$TELQt)cP{V(Ama z09O8~$e+7SsiGym<7IySF5O*kRX$pWE_5;R%=@W8#2}#@AQbtbY2N^gZD*~pisOCL zSLb}eOxK*ZXlG*07|9=5IC)q}xw!l8M&@n4uoVd_5|sHKIAPxnH@4>aPYTn-iZi4& z#Z1(`g3l1Mtw5NWOUggg-0fUBtlhZb+TWRPQ=JV=72=B=#k%4n#^~IE%Q=P zeY2s#fQ|RSF)p=?`D`+SOukd z)x4!m5BWy&%zwH!8TO?1aTAP$L<%VAs6FoQ-oF7hTqLVBYmG<`L=%%$#Ql;q!?7x2OQ2+hzXfLX83@DS=0paGKr~aK9 zv;gKI645!vnjL-V;dW05H#$afVx3ptrqprJ;j|H;Pd2#2D-4S&26i2m4=6~d< zrlz`f7FcsmCA(%}GV^?>2HH`t2*_jcj zOK*`@Htb!4qErKc^lUik=A(>;?hg{KsQ10*#g5kaMCdoWI*iPRv;3!r*nZ1wjJ~N7 zI)}2q!nn^!zOfe%W2ESx?`uLO#M11$#VW@gtTggIl8n$Xqv$7aE=&|%I{HO&b~&LA zw$xiGuB)!~)?dO5)du)qsWXt9B^(~IufmKBFkM6xo$_cmx~^%=-U~+^dNTRXKKX_* zM+*zg3Ud(8=6WOnlYb=07pQWhJv zsIb)`OP~Hk(6Tne{)AsdK3cy@Xpy;+#XTqk3&y-aXuRiD!>RwMx#69$PhiLk=~2?J zF&o#6`O7FNYs91`k@|)lZ*C}@`S-znN}qc{Ndr5e11_BFn=T+K3=LUMUr6beFqAj_ zYHsOQLdPO-@a|82p>;`8Z;-0@T>Kaz=M331ZW|lR-W*R(eJ&Xce^t0GKmFXo!fHNT zfvjQ(xRMOmBv<=rwJoYeaLpds(-8s1GNPeziUU76)X|mv#@=@jD13XB#hO_0Nq?aK z4Es@9$a7=ur0OC6PD}5TROgd&#vFC&^J+qx0k7$0c$}>TlV+s*yXME}#j;l~g0`Ob zqaUHs{`5~euyXgpAar*cGeXFROactUfby*?f0+&xyg7JL;D~>Ujc8SKVEQ)i8$aC)&(8eC zKX88DL)*JmLA_@9FwmC_bBw*iCZc?R{!}z&c$#m|{uBO*>0m>Omnx_j@xy#G^5g9W zYJ2#)*fCkH=aL=VJ$=UUJh7iS%bsTigoqi^jp^6O3o{oR`z|O}JvM9jko7NhqFhTz zucvsWTup6Jt~VTsaWxD6bX-d#sIiw>bNQB0s;cJo!uQskHJRHw4!K36bUJxozHFgZ z4lM*y)Q)$x$~vTT+*h~gcCS$~eAo8xtKTY7!v4rOycI$3*5W*BeOkG2_pdOZi{1|bqk?JYmz%(pyQ`#;-88VervD@XX7{#k*y9_P1yw5GIZukm^% zA&%deBwvT2iuqjnH3c9lVtofIXb)Sm(|a}1a>F@<6M}SD2Yi3QW>E*EUTM2>WF&cS z@^y)DN&ot8A1E*jY`(N(tZ)cN$PCo$eR20yo%o$>t2?<+J5`XT!HuvcjYkLJZL~QD z9`9EYPIxfHRCLQx71eSd+J-58-ieR@4-K9A0#S5gW^f@h4Pig)Z-L^nY78)=7?c~+ z;Aa?x8!dRqw&y~+iN}J}A9G70hOF9zF7X>3KJls=rYIYK-!!9Fd#s5=lsxSJbZtKv zs|dCEL{^zhA8R`%_9k1vWwv{CMgH?IVQcMw6i%kfa3E@P;(F%#b=emmg|mWvk6^&% z5X@ZXQQ4A726-@J|5x*bA;Zhfddoj}imFmMehQ=J|baUg_!G8KY4MWsL8sl-TBx4o$v0-bnF^EaH<2 zkKj_Z9*r1nCoec}A(83WG|ITd@wCO7ef=$z`=RBZW1*;59_cKmy_Eco)y-}KYSuXs zO;q23B%&rqLMWksC~|o2w3PbMY1^rMMsp8Rkgj;Q^<`v;M1F*wauAIu zBN@n0mi@h$jdx8eG-IANz(yv!WeMr_xs2pr8et+UF;!=wo8~fp-4~+r{QPQ;b?5t> z(<}wW}Tt&WAcUS*rF(fxP+qpt9p zs2AT&Q)P91Ci0f9mzT5><5|`O6U9JXJu7H$CoUAsO&!bIj59t!5%#&}M2{ zCX2gLFm;bpz7-VO?!Hldc*Adh`Tj&^^EB#LIiASm(u`k_Z?OG|dh~)u%C@IjsZHbS zySB;Kf)q<0aSP7aUPrCdmDv49AK`hCWe4y$uPqAo8QjuaH4*PIsL|UwJBPNqH}P

    Wq(L(FA4cWJH03*nnE+KU8A3S3@d(xK&u?ER+IXAb4%h_~U*kIb8^{D8QvuHJt za_roVxlrt6%YF%`yUQE(7eeUiDh}S_Onwh650z%LQtZdd9>e$f{7YbMXaByyB4_OZ zGKA5w>C10Wv>3qmYx0=C_F>{bG=l|=y8KcCn`k8}zCj*ch2I+JYPbo5?=MN+-^{s2 z{AO3(^@JCf&=rKtQ)VMK3r#J9hI+G%y_$F-#sZ=k_$^4q)PFu zQj*`c)vo87tTc|Ld)3`uFOAMVfvMBWJ5P1Z7_;=hbuw7*x^Py(IDcfSG#{~ z{`$)CS1l}K$!^Iso0+kM^bPhiSUgfDf4&ceKONE!boIVyjrDc!Y0UFE9?Xyg(fR}x zbCSRN<(8~dda;cr;ujI_b<$4X)=)gCYNPqKJ`I6kB-mg15SpmzIaD{K?c3t}iRn@5WBU7lTvtDcVn;iP?*+V-o5Z~Ox zt?dUN+rn-2@&KJ?cC3n4uJOeYv?!bcS_KkY*GYCd zrIm;`c2BQgW{RR%e530Tt@ve>TU%4Ag0+`35yWa0u`4^a)2pTZtiUVN5B7xOPguLB zw*G=trZEbCUmeFXT=XZiW7~_bet&}1m6}Z^Y+$_%6k~_Rc<+7!kvD0Hwz!YQR{Z(b zb*qTVBcV%-<87zK&d+BqeGE-ghUe@;rKG;}sv_pu=e*U_EF{k=^be%a$%;A(w^KZH zD>*R0$81Q_M)P3G>$nIm$}mZ)K>FS9L^|- zxB+t?en4i&o%x;+$L)=|*Dl=3usNyBjvgM=PFE;q9 zz2-iC{gv!&O=ud%W?{HY0%FG1+3zc^za)%Alu&q2G!A6AFazXQB1T@AAG~8yeP)~W z&Grb<=XiSh087n2xm{bz4i`=7h;?$1tE?J3{cBSe=iDmqybKdh&XxAMTMhb+yT>^= zwJ00%9*$-$M)0&3P(J4G51Cx~#e>=QyN2&*7{hN!g~CjO;Ec1qprt-Fm766uXHpr6 zj*StW?et28z}T;l5A_(~|lco4wA?Jw+~*`da-H{TuG9k51Yiplotz?m3Z?duO4 zSr&8)Roo)6l(v6e*B<|&VJxAt{FN%n%{Hy-i8Ijk-`qx&)d1mC*f%#PJ{+H((FdS? zHQ|ARJ(TAl-OdkfzHZ45=4ynYbhEKHG5of9ut?XCW#TJHo+yWS&ljwsig%$v*KYF= z)+sW3t**nM{CV|0DM}sHWXs=8-hW$MVbou(++X(`Gb#q&Slb`g*?%I6i%~h-j3(Wt zo;S3nCZXs#pzv0g*OT;-F7uJ)&)L8|RuR8Nsym>|$Sgm;PN+pgA7Wd;l)%m-Bv)b4 z>(0mHNY4(X&D&5uqd?6EHD54e7Ce1y-opVfk-r;`sploK;=|#RiN`9vCaJXAUHynJ zKg*r0r{l7P0>^s9yi$HjJ=RY-3i~p6K#cX(J)mNb^krT1j|1oK^jlOW_j6PU=kL7+ z!rKR}5lzCS=UrW=*}ue28$ajmHN#_ZbEgk@&bFdigw>kfQ+=sifWE^xTk5yIHLd;+ zZRP#VDq}39=){{=*>(;qCl13`FVr&Hl38A!Oh$F*RoxowJCnSr@Q*s zaq;E*Hrxp)zWi|D0rKQg@pwpFMVDiqXUk@|fvhs$^pq7Vn?Uzy3CK7iwP&!qBvSec91U|PMhKQW^AD2 zNgqI$8&{4b{zE$%hy_J~X77?yA8MbLRA1Kt=cgyoS02WRHQFOT@yoka%D~3=G7$R_ z&&6NJ>DI`;ifZ2W6u6(DA#K;VSsQ&d{ z0)13pN32U*s4`EmS*&hj=@LgAf_y*i0nx}5|CeCf@y+?OX062!=SYh+G@>QDLBGMI zTP_q&9~*EWJFX9$Rs9WqGI|$Q%-cUv4bi;+W+(hy2Ssy6$}8&{6Mw^R5)R6=p!?V9 zJ*_x(K|6^;4b3YY_8#}}ckX@##1SrKhTpYW#4@H2=+xre3%T@c7yP@#c3#aq|K|B_ zn+rkV6fT2j5L~AstFCE!J&}@eKu7-2@mLGB;VDic*C zz^kxUC6q}G>K&h2~ zV~PKtAEZrh3e=@#`{P}!U?MttD5}$UB^^gotjHpx1$}{^fILwQU96EHE)_t65*lAP z#8$)#R36=lWm)EHzGHkD$?nK>_EIDO4~Jvt3Zdb6tp-ogiYRm%4bQ`~&h;)H)&OajV}W7sZ|X6wnmvif1_fna%5%XZjfOPEFWIxM2?F_b_~z+377yo|$% z$B%=|#ZChA(%v07aVISwPD#0WdG0=0zTnPNw@Q$SrwfY9gdJp0--7Jl7VNW|c7$sF z3Bw&*3QGE?c`{;jz;9ulz%mM|uEjV3pjM6F(2Iy)U-XX5?)02VBYj4s@@nrvA+z-f zvr&SE%YE=&*1lJYCNGF&ij{yx9v0Yg&sWnI8{# zkxAggxHe1nM*N4yy++r*89{wFwBC-(Irw<(UrwExb_%!E3|6c;`MvsugMiE@CkXe} zDY4ZHKWP5C5Z2^CIdQrR-(R9HF4tzM>V3o|!JxdW)BM%Z zO$Y)2O(w_+Su~*W(8e`K2 z6KMpsWO&^`gNcu&*vbi}enEr(`ZNNBnjsYLrl z`B`C@I>pOw30)2XIn=gS??uecHgTM z-Gtr|BH~(j8lE^sv*F#^49cUil6!0#cW5D|2St0V6Zy|UI8+{l#d>uyv(LP!?mu6B z*l{0_XW7wFbN9m6;oEi;e{`&?jf?C)BcAS%Ow)`eU%5;ObGq>d@lhqA=El=!<`dqQ z3`w^wzhz+0F#YdF4E(`ALX&J)Fc`pLxf3_F{oB5h@VeJLfOUwuj|Zpb9MtbzBR;#{ z+P3-c?2b(&jqGpe4|vKrEp%nNf~wPZ@gQ0|2m=58#LxR!Di=6m^VB6k zie5dQtM7C?)}NL8*(UMlZ>(DLzAsuHSJ3i?QP2IcJSnrO`C}SaY|Bcw4M-ge_jvF`tmsg{V#U7*B!%o!~MUD zO0KF#cJI|KkIFCjlckCL%HY0+6egWzFCJN$MV(fkb-$56p(%a4+I=Ox!|2qkU#xGp zPHD1A+a>Trqa*1_D9;PItFlDrkyK~UTj&MoX3o{IaO)AE99o!BOIli*^2<3tPID)n zSzB)vF$a@rb+D_7**%vIzkjaPlfrA! zEXZ6;&K(M4J4O6`ouk-T?u}$?Ru+lm;4P31eT!utJ{;Uh+yhItUIIO712ll}tKGQv z;!O@xBHP^to56D>DIdzR7rew+%>#Rhwj^m$fhy9@nS?0uq-J;zR>|?^tYM&QaU7@p zQ@Tftr!v{d%0pms*!H{{_VKF4JePs8Tqh$@Ir(F%4exLDQKWaC8o>SC;kFSdA`?E6va) zkLE{=FzcM1dzT02_=~Y8eZaa4?7e0O9prj3R+?H?UbS~1s6847Q8O(G`s(4b73rpt z8u4|kEKlrP9lBK3zTwDy`zK4r0)LtK&n;iQEM>}5BeHpZ!t8Dchiu-*t?G=uxY1+4})OS;BHHvBtyaj)b<+Wn5 zwENOTKbkBTu?al6DkvE6=^yUeDxOPqpxz`qZYMQ5P>@!3q<-sXB=0c+N)Fsn*xxx;KV<|Sq}Nml?z9_V-Cckyvv$%%Qa@&H|1oBTmq7VhcK1d z9Av0nHwhFX4afygeYv)nMo*sGCgJKC=1KA16<}pxXStG{lOx+3#nF(&57=`z9*6H^ zv4V7WLZ}StwjsTQYkPC*gaRCl+dN&rYN5O2W2G1j)qOaCa;w~sTrxAwDgyiivI{Oo z25gPju(HLe3;X4_N$XRVyJC z3G*p}NKZzyN1t7nq7a%%k-k^2rG?@55o1Vdw~R-x4IvIBJ}X=@24n5|0`Y()R z7)XTB$U8AVd++0ExK@Y#IO=0t;@l}3@bU&w2W_5-wn8)hL%VNdstcxvk)fJ&Jn-@f zGJ)G%69Y=7O6eUtt5Zg>xkOiosInjU{A^58KSZ$_bN0^%6MtX-9)PJX;u^ok8N;%b zkGDSRj&^$)2c%~Ll|KR)1&3xya$*VDp!+i1=Q)=^a)#L)E^ZeW-Zz)7utEkgqXX#5 zRC!t@wT3EN&|}qC17+a34V8BxLvTk~AZY(bR{~@w8XL?d0>NqCv=GP_Ce|~$+(c<+d;Px5*82!rf1FE^ z(%>BVE0D^#o$xh%n9atX@Ym{ujr@k+w6Ny6omV2a1Px51b$5elrq=MJB-vL%=k55+ zNFu)z0n0bpv7llQwXVm_;!lM0yd94y$;HLuo5SQ+*2Lto8rLjlMY&NyU%kxEr%;nn zU$C$rs{fwMC{eJu!R%9~M-JUt9N#(0L88lRk7~oo?s{=$$9BR-P{TfD%cQ1hC#<}& zLeZ2~<&Jo+?`MSXEyQcUw%tf^V&P}rw{wI>jN;dUeI@*?56b15ZUQK(g{Nc>(A2;8 z!cf}=xm%+jwhh_P;p7cX9KJ?faEZF+hjewbA7n$;iZAM#YSKiyjO_VGSZNB&k!W}s%W956xbPT zy8!(UZ4`F9GFG3nVl~?F=<1gRrlHJ=fzm&wck)lFS5@rrJSKI5zx>|Li1y^GRj69X zHaWkxSXjLMoK)FklqN5I5^_8`UA>rltl%4)Nd`|L1A1;GQ_*U3(X7Rl3kVIF!9R^u zJvnx7+Z}%2&d&K;ziT)kK1>w2b}NW~Vm2=-8Z3@S9A#?LGW3Ql)nNC6r;|^}V5JmC zuFJ@4=Y&4?@TvlJv+lKnA=td|Reete7QwwOu-cG>tuG3lESk`cdT){FPg|2}GUf@HQvg5~{yT6ft++}_Qc8LH& zFjYw^!nKGc!kKGwO92H#j!772?Z zI`{zJ*WuGse7wL`J-+W{#Nks1@_K<9T??B&6^`Z*vNQ~h-)9wZ+6{ueh!O>(u%#54 zf`T5q{RyFt&H(Ftb66TT&UHEh*6ael^)~K*f8-fQ3M2gmbAJ^qDLyw);SI9Diaw2> zkWh$h`rE=cF*k_y5JBRvG8>%DZ?d!->9@X4YHk?emWFrF-x-UKB?aqzDn8ub3Q3xL z8E+y<#g~Vb-@^&@5ZJ%Avd zK;$1N93pS}VTc%3q@JUJ%anmKcHYGJdLP5vJXF6NF!F+7(csz9Vsb=sjH_CMC0~V{ z=&vJ2Yje{gDI*eLG~6*6%-EU5{sf;BH=fX|Kn)2I*`aWn4CL%2&Y}y+hee$crIZ^j zF@f4fM5-fS{Nc54{>jp^L6ytlWQAyR2?rbh!Bm;KbX);fmr8@gzUR#u`A zc9j}2eFo3*)B*(w{|_)h&%QO!1efnE$ca5Ml&ItOVna*GHsas(qkB_lU4LPyNo`xJ zT0M@cv`$(>PDYav80|vjuv3_qus!m{<-8&Va}hQK4Ngexg`ngr2mE0N~F z@%t-_VIHW}f%MdVqxxrx4;qHe?nB5ZKBrxCSFYl-?Br|l+M3MM*S9!_@n@>hLk!Rf zJpSY4{{U(X6P~Xw)f;PyU3xA|$Av0aNXv%ME3mcn9zODL&rx@ie@^`Qzv(!q zDW7c}D+1zMUOgoWRb;-Ea(&3_-IYSISqY31N$xPkZ5#6AO3Mnz>HXs5)|~R?hlFf} zo!E58K4bQKFvo&WtGdx`C4@TFil->wz+PG9)=xgOXJ1`jrFn$jVeQt8%>LpM-tYj9 zrf$+nZE~tjKv=;PSts`-!e$H}eM(i)%qgz)}jPN30U<)0XC{w?`4S9VDt{-)eNU#;eR zdu1$c&mh?8J%GqtGD!@wC}E6sdA_I5eJ$MftAcK=?Qd-_EgcrG5V_Y4%t|=^U@8YK zKoga5U1hezVf7nt-fT#UTk9Lk8-f8VCqSjt8tIm#VBnLVO_&NA97=qnv%AQ7ha`@? z^&p!?akY@qA!dnm`&c8|P`LKuiHca-Ldqvn4~s+q$5|fOSnaGWXOI&N(1&WHDOUui zNrMxdMReE1S00_YE6qE@9R4Nu9=Eu zN>j|@UcqAx&AZ#~KD(80MrY7~ejnGEJaFcX8k)_ueT;i3CA?BCR@U^-arQfE73Z4O zGwxAo3tK@UR(V;npmqn6>J4z|>s8iP+BCLW%(tvTv)s?ISm%~mB5Ov}Y>Hwm7YZ|gSe&-oZzT5@ zcOi8XEi|4%fd-uZ{{Rdv)Lj@-Bq5XvdE()~>CaE&jjR^;sbx7-I<8L*I#ujPwy#rt z%K1I}dbvu;J56f9sR>t+Qvi@i%7t6$2lY7S0Hcb64*{Yo0hKt0ujx!y%I;Zm01T__ z9^5O;HAX!*0NiUNhM?noU_oZ|f;eT8Y8$H&$rwQ(c;&UMu?})1FxPqc%kNP<@zjq2&6if7`FiU(%}Bxwvj2$~09u9?m-h zU8&^XAw1k1+O0j3rh9tGH}NX1HFDp63i&@w+s5*DHIvRmLGvpkFD{gIm5Hx17J{74 zSgr0mc_y+dvK121Xg)0bDfZ`{A#YkyG0kkoSRinO17kF zr=@dMspHy!4T`GF?Ikx!BhC}L_XSAP{Uw6x_v;UDNEWjl?ge_+CqnHbE?hL43fC~e z)|ke9Vbd4V&f&P1({7tYi#4zF-ulh{j_g3n5YA-kJUpx*VQiIn{0}($+^qa=4~+;u?>uQf zkVP~kin-`cX&dqQWV@oxSo`5v*CXC>H@OLi<&*G*nrXUczhRf!$C zubXdK{*K!Xx|$s1a8>V!OBiq)t1QORFxv2p!O8)+45b>erfs`_!g>9yrkT zw|UPmn`NhmS2rNnCCc$5ap%}<{{WX8$Zg3z>Q%olQwQWB4O&@ab&zKz2X-?jK_3{{VDeB~Dm` zW(zMGuD;B2Ybc*?MY16FrGI)m5+TF=%j4T8sC%82kk}@YI+j%xV@lS!gG{J=u#n$f z&3+-A&>D(oN)7~9nBmVI+rjKtrM;%sA&%scMP|hs*6cKJ3sJ>1ky@5?3f0yaBb9+% zoUhP;dh_U1%)w%!fR#1MxpDU8`mrx_jLT+7peLU`IsTs9XhtJ!IHIvMIu$u-oqJflTQ^m6QX64SHzyV_M}5JvkXfKaPktYwe| zQ`ig=I$QhbE-fUpo8{Vff<{oOpn|AaRDusG9#lDJOihXz6HJk@B#wXZ$I&ivYFC?Y z5lyDQjX`wBUP$X$WGfYWFicIk3VX(RTRqhJ;2yktZiw_mR03TBpl3>*MwQQ>*^3wm zMXCO2&YxyJ2>$?e8(k%joHdp8^<=cqz<4&k^p+jtN#&cI{EK#z%L>X&zTH_uf&dwB zPfos=>>E3XyH&dFrrd5<3<~kD%i5ad~kE$sFF^$iKgag%km%- zOceZUsU7x?f&Ou3!*GBbGW)gk=DlgX$xXDsmXGg4ttu z;w3|u1ZH`013KqY4QrM<1OEVs9(A+ff8Q0p5V!Bs)N{@e@&_8+YDo*P*v+7Yt)pl#q9Yuu>M<`qDun=jt)Xt~|U!41KuyC;Ot= z;lKJ{e9awY+V^WoVjz4F%`+v+hCZz<8ajY~3i;RdOm_?954n=B_YC<0LBTm75)L!_ zI{N~&YUXH99%81SXvgOYB_hzHO6N{I_!^q=;(X3OJm1{}LrML|{PCqW2ExtXkTu)+ zZr4*@O3`wzJwty6u>SxP`}FHdv68H*D8T~(v-x-Z!0iWZ`pvq*Bdn_$5emur_44w z&6mzU9U`)8C6|tThpv)lSyru<55;!1)sk;EOVGtmT&jgeiL=X#R@%~gmavb3v^a6n(Vfh(L7pHO=HIB8ONggh%kcxPI9*B_sUtU%NwXXi@L zcyX^PbHb~&W*Lw~2x*jPH3qzzI^nojnG!#?Hh-#DSuM zN!9@xGXeuYkpw9Rss#!7YoD_YBrP3PuYF0ousK`md0!6luIOypsfmn=*Uq;K+dM47{|zaN_MSM)I~c4{owOxnmWqZ97~uUPenTNT!+`%@iN7 zjBNKQE~b?shzYj&2A5&UxYCVKN3 z0Hd&Bk|7jh4d&%gp64f~FJiQo&MA7VV+>@IGeAvKDtWg&I}|q%%*UiwPk{pIP;%8% zK~iWvn6c|OT#!d*YE*PoWWR11W@)v$b3AnQFEv;zRF+DRv9BA3AxThJ6NA(XyA7Rx z+sd-Yh@q&iz*Oc5{x3fYV(u9)sItWUJz%I}YJA0ON_(s4jSf9mJv8B6Wga_Xt;X<4 zVV8~Ta$F>$z_C3TB@#(#@ZKuJ)DPFJz`WSjUZnkK);zOkVfPy1#8_@Q_>Eq{$$x{5kKuN7mL<$eSn7^KSb{`+>bu{ZwOJ}B|ZnmxKtrd-HM_~T|(nqMb zNn*1nJ`>Ndp~FMYUK(yh!tDlskVI(m2;5J(<^z9ay&(MG8vA7^OoFJh;?X z81$TzVXd&)J2u8kQ_x0<Q6cVJ6v0&)JMocoFv}d{2!v(ak)acSjqeyJX zJPk?3T$b13;g(}JSaGW@0p-C#r8CdRjWF)lINVj#*xKEuhg(I}Y}l)|rtr@U-f`*_ z*RJuOI}%7dgQ>s=>5MRz7Si7QqW=K)sXiKmP9KY(--DXkrP$~f#drheAyDN8Q?;>7ra?dXzf=6%Ps`GCxc+ebRETZbzxAZ&s3NS94xTtjGA$-HJOp$twu$G*{Xm9DyJz22WUx?mH+hZlE#F z=@m4xH39UDz~N74I^$ooTeaP+7cTIHkqKpG6<<*l%Pgtk!^aZy?04GPc;zktb~G+sVCB-m2w~gID2tY*GII7Yqk`&aaY&b*=+SUWwI3@nq*+3U3sIKydX)D zfN63_i9(UzHgnv-==Pm0S8AZ33ZkFI!;de1IX1cDjyXi&TR9<(YhU5^WnUjWU8-w2 z6qGkQy+Uj4P}x{8*%>|Y*70MpgKpdR`(q`|&C5*21xH0e4;9u}hSVvhlohDP z8ke_wzUkXn0NPnutO0IBs^&>21()*aRaHxO zJ+&70F7pIb_tJ=Dg<*22iaa6%u*Q0yyI$_sQu=M98+dJ06`=e70A4#~+Ix3zi%GhW z?u?oXojRW|eOY;O#-&~vDWn!8-(0z<)@!}&rq9}!@~upx$j1^4EGWJOvzc6mzyqv# zx^hfL1&ZoPYI4g>4nvd5`6yY7{xw z!xH4Q*(G&F6qLOUNBCq-F#%h7p_gN4R}D?{k<-{%)?U9jSgJ&|WR|R}SyuV6<0P<= z8jmIRhj34RtZp{F-K^5~c@w75M&J*Muf!bq4p@O{b+k!4S=-ynx?f3SO(0W<%l6=8 zudKa2dXPULy>i{p==8mdHc9@eF=mQ6E3A(8Qb-UF2-nS@!~@VnHsNb;B$9NxF($XD z)N~FdLHu8`xSIBRNt!s(9j<0^8Ua8xk(R8!9Jy07fYx!oDaqv8Xtw(vSI4&K+uk>5 zYNUxQSelhN-f=0|%;u$O;jn9{KAnzjv1Bu})*Mg5GG_5be~|no>dO$}vqu zQ0MkzNwaod*}hsd_cFW$Nz(yz)t)x>5mi2ra`C7+;xj|X>FU0G5kO|daD<6pj5_+zObsUz-v%RfxwmaQ_9FG0U&n(+6L25F9-JGlb9WgwJ$QSKd2|zG# zKDVChaJku|SBax!vof5=1X}uh&pOvC(wuSf3_E_$x9^$^!P0x-2xj<;Jp~Oi$Sp=g zKP<6a+-&yM^|t(Izmo1DU9%}r@mhw(n(gc~A_lVy2!ofvjUynH@71JDV)y>xs@kv9af`i7DH=LZ!>pWoquo z^$q7MQg*ifQL5Q_g2uoAAJ?%1s{8){mPL|bGWA?~E5N^pjXwVXJX~$EiOc|7v9s6H z!ZM3!9I;qopXylZwLo>J}#!n3ZjIytuJma)vkGMAr-sF)a`N;02w}`fq zi3DsYRcVtRWM$w6Hz{^InU3DGS+0>oUZKHAE6EbV=_?4NSpNW%VWUI*&tItT))VDz zVR&CnT1F>{@IHJo>jvubWt~{4&{sNVOug8!(YJbgQ$(vZs5Tl{pg=$-te0w&awfQe zWSv{XK1{{CcRkK)ZpE+5AwXkfm*E`gopbv!b766Kmv5#`K*d1R1ki)&;ZNJ1F8=`8 z$I1Mw`+oU{m2&I6s#@BvRq|`;+0Vv zBDBh^#Okebr74fz;@p$RCO|;-J<0w3yJNprU4IJW=b)-h0M800!{}uIVE+IT_VxN? zbcTNsTo{PgDhwa`hzB0vJ+t=ue&PpQC-4-&x={MK;Onzd+uR?!>Ob@78df~=#|Zg~ zVO7}-6XY}WIQ0JjXI<5E#Nl){6&o@C066~uFa0_}D-H(>p}eqf>S^_H-@m6uB|nQi zc9Vmy$xnZEK>a^XyQ(}eCnHQL{Y(DC=TUf9fFr01S#p{(t7ZD%>y`=Y{DO%+u|`#=(#LdH(?GzubB;J#)_jMw6!= z{-h880AyeC$NpUpSIh6gX*dzE9y#-0U#>@P{{Xk7>fs7G;re~JRW=|F&yN29T>k*; zj+9MK7!3q`d7sn62mYo10P6?&ANO>fZ!C2e!v_AOpYy2wppMz~{{TLnV?kUI8nQev zak2#Vlpopa{{WXwbw`F1rm2_!U{1^Qka~ml{d@g7Q6M;73i*&QVX*{^$_My%`ugN_ zVp?UM2qiKUrVMrfkW9e;0ORU$-=s5pa3eE8f&QYO{*_Pf$NoTcI>UKjw48j%{{ZA` z`-bG43s1tnH{kbvMB`kieIz{Q-z(tT(V&XQ8P!|8q`AhYxmuO`&34rG#ONGBU3?I; zxyrB4UtT-X>uiq8wl=Gqt1Ic5ZVd6sr8EO1W;Q{adX-wDnE)%6KCb@QzMbux?cMiy zZ+5$GPggOS%j%j5`jrj8Mx}pfyTrAuzZR`Z+pWgQelz)B zQ_MCzr(qV~lSH~>$~EmHPZEo?Zy4NR?xb-$qe4+{{ZAZLmlq}I9R_Dy?!%MeaM4&iNH_^ zIr(nh;^yD9?Cv^4rZ-@~e;3HaEA6C`{h0ge?`n?oy|)OSQeHir!b#`;_GUig(_gS- zJK~Z{H}_4nG$xYd5Pxo3imcE|(#Nu%pDos#Qy*@8&vz<&yizHvd1-iHS&ai z+jsu}G=JMK%9QobL3N)n{9FG3byN~ZR(l%nlA@P|a%tu5MbTOQcTmt$zxs04J~mmOd`}@3i$kvE15Q#$md+iZ^fmrju6t0RI3Ce@pu} z{hL-}5;69sl|SO`;_SHp01RXNJ9g_;)dMBTapT%gyb?abLBcDuU_tjYkERDp*ZnDu z&~TyKx7F2q`rvo{pI*DKj?i)AwkOfl{?Xh0ogtgU9iZS2*Zye&4_{wjr}=f=Z*Dt5 zz<*W$0QJNF0Iomo>$=|Dc7uZrx9cjO-{1cLA<`K^<62|1oOtdr=;(jI4wOu*kjH5_ zDcfh(P(NmIkMbRNTicG%aDVE|Jz0PJ9+Tz}20sUwH z0M{@1f9ue7&KE{JHsoZPeR42Ir|FLUcUYevw+W*FcKG#`N&f)qK|k&5x~IhBv}5PL z_s8=803+5`(Re%ys}*O96M!V z&I5JxU)S#X-FDe6`#WcJw^{9)d1NGqAbb!4GXhaoVl%4bMn1Lv+WwvFx9fM`o9da3 zwZ}r$2n`OtinNosJaoCGxHTD_K%8V>+9&rhU*k(Vz8msqBigqGvpi>r)_Q5SgNNMw z`?j}|T6jzDTTi;Nax@6-B72dHt~+&@`b+h4*R%)p9_*6o_UBcS8LO%|k4>G`i3Nmh zOzKIkDUILO-=a5t@f2Oh*><*TzJ{4DW7X1YfDCI9P7#?Em=F$?(^}Ny=g;>i%lV%$ zv$o_C?)MhP_n+O_PX@+ah21W;pKa|nR-0rntoD|$#3Th;Q$>xWGBSX= znpM`pYNmtCVn^d`KFZI>Jm*n7CL1*^TC=S-s(aDdseL3^);LJ~nMoc}2$#qX$E?2h zcWoBq1=2NLM-OI0?ijzbgp}#XGd2Bn{bv}z6XJ`t`6G(zH*$?=*6#ItOHekhDW*-9 zsb#gV*6cO+fM}BRstN3V=gu%Xy4*J(mD=W>-mE2n#u#M5Nf{4s+n*dnHeWX~1_MgV z)GNrEX2!hf{{RebnxBrg5mMgWYjh!#Z}OvZEqyA{7x1ZPUpBw+rHxr4&6_UPSV!Uj zc2GP{I>|ou6PtLwK~l)X`nhHZBhHl`!f|f4A~7*gpZB3upg!6Pd$BpW_|;+In+4bH;?-ZF#FJNNa}9Xq z*fnvnt!b*mX;r@-tYTRe-@j)4oiSs-88-nei>?zrSq}=*pQvFkcJm#oqSQ@56~;!C zue0vOGGC1CR0EZAds@wQyYX~Y>u92{{{UG+&ZA#EbS%ql(M|sV>T$~~g+Lxb!9JZ% zlYD|-_EvGo%s8`VJge=&*=??$oijzG@*IBOZX>l?n{ev?0IchoV5?2+YHY?UJmI#M zB{F3z*LAodv+e@E(#YVC;qlG_dzFoawdFd58s$!2RQ(1mVG5`Oexs=Q<%@R#v$Znw z{UuuRMKrocqGc&+w#Z4hr2a8N_9?{CMvf4sQ5jhQ_3ml+Wk{p6lxi)ix%?EVoogTw$u&M4-TJ?2Jw84l#$YPSb!^DhE ztfL)DN$pPWXS+tqs1OMP&AS4R$rj%Uv*r?Z@UGNsO;(~L6{MOzhNYgZXs=P z2D4b@IVq_>t1r70&x`e&OaB1(jx7EpRWw!TYUT=vlUn1qh57tu5VM0dS&VX=9QOKk zBY3%n3wv0mH4Nan@KU65^CJ(%88?kG3Lr{*4M*wj#n+2o637r~5y6*HtEQ*bQaPF*vlekQfr(RB z2g|@?P^-Gy{JS z$dV`Ud?(rZal`#*Dm9?j&-A7`X4f5$ORTA~+siKPwe$|pWX~8L%n;ODlcS`igmO27 zp(oS~e%`aIe6KNv-E(pUDN2$+0=z|Vts^3qAauZ~$b2It($YI8;xJLT_(R`k1pd$y^$!*Y7s39I=FAN5~X5MtE@xy&cEs&)RyV9*;-sk zZH=c!V60R~&|Db3T4`DZ)DIA3K3JL9o1NtH?r`5if$eWl+r0rLE+9vD%zRqIMtqi> z&K+$zCdO`Ay^*d_%J-Y3_!Zg|8R+XwX z(Rkz}Zf89B5_2S1+al)nNVj>qF#zU4sk}`9&zA~PoU+GU@eV_?-$BB3aA`F>+Qzer z@>&;Ya+}s@$4;01*GBwN>gG3No@&<(%#|)cjaUFW^X|wpfYi-4iBW!5KUcS>` zvJvbjwOY#ENM;Ps#SI(C+0&Gf$K`QHX8b|*0p4~SziiN766fs zpzXWVR@-QjbuvuG9^p*uUz|Vui~NZ` zv-<)0HfxVkGsBg-Mjr*qf2{Ri5X`|DoU zL@F&Jp6J(rWsSf;>enG*@8mJ${{Y;U?z>;nz2i_OYr_SwAG~ClPuvo|&@rogJtOPB z7T|ntywg^t#Qq=Q8sRR!pnI0KANJ@}8u( z8?DpRKY~e}(;!7@s+ID`qU{sh+IG&}wrzR^ownI+8k5aqffVum(xpc{uxeKHQd`?q z+1lLDxGKbKQ+TUfrAAn5vqlqkk}ZH`mB}gX%45z+J+UI}UPW&j+eHMBGt*N5#fO2{* z$B}3`j)Q-*)>E1#Sid^vkV4K$PijB75>x|C+xD-!eJj6(fP10b)(a?Hv_$Yp6m8}e zm=7H4cw$d_ZcDcPVA~q>5%V3fxFkxS6G)TWOu=~rK+J2zR}X#@=R7Z){{V77Bz#H9 zG{a+e<31n7A5+J5n}2VVe4p}1DXVVudWuvm<{I2%j%l^i&vr;WtUT`vF$k}Tz1_3l z?LC2G+?KZ}k#2W#v7Mq11)Z(CD3Vt>4Q}sGSqV-DP&lsIyQ<%C`hmIj@5<_%YJ%5Q z8MVy!B1S5U@FY;efR=Iza>BHxKC*D1hCV%|tmGVjS@9-^TZ^cdrwhomD;#dZJpiwv zO*MeLK?ITxH+y!~9@TFpg|TpwO7A5HO`1jkNaQOLjMSl{P>K)*agcMr?emXuE-kv+ zaJ@$Fj`CU)ZER4Q=EdjL?X-GY^=@w~YxX-`eYsy>{X1b`nM=iDB0ypZ3)R(^cV2E+ zu*bPg9FfSase>>C0m(sCH1h_PtuZniSgfWZ4K!+MQA+t&n6D~v<DH8+!LXPWak^ z_a30Fw)f}P7GVt4_1h_{k8;Ft$!XF>^3U8pLSE6D|Pv0?1CzMsC4J$mt5l_Ie|$IYWkbRwiAGDu&`IT!=4E4Gk_ zMSTiNf&+WA_ENt5THnHr4Fz&iY2s>r{B*1wj=#tJV|B^2T51;dQRr$M#NVtzrdOXO8 zOJm)dxC$_>j=cwIj@_mP84N^7qE2zh%TNqpf@%RY&Xna`PLTu*$lO#>zl+7JOvccT97PhUa zk&cC+{7OR)AVE0}UI!XG3Q2DZFEus$e@|{VkCk`2>)bw;pO5Ty5?AiwN)j~XnKS_V2=T!nq@+D+ zE9@C#^S%AW?4;Fvn2k*e z*XZs)r%@Iw?x%qpZw*{S4QsJOEqXCnw->l%F(^}*{{Z1RptXS~RzoIo>b;O z{9Z|OG)?f-w*jBo?Z!LHcaU$Bjb>_{W60Jz6$rQp! z!bOj9jvF0W?Y5@I+Iw^zNQ^D09%7)6v4wKQX5%=!zPGtiq^yc5Q^tptanN7d_VIo{ z{`md|+(rUNYvm0BZ7n@jlg7V1(caNnhCPL5{AnxsUqcsCy!TomIB)j@s+_o@Ay5DY+a^L*`vwhtvk34>_S9V%;iKX## zC|r26550o0EN}@@NI$f7`V#6|QaRW3`?2{P9a%by@EVciq}4~cXa|tT=G){CndkXm z=I`$Zl5EYDhmmGn0iM4#f4He* zy85*>>a8JbNZ40DTry1q5tT-0zMS(Od49hC0Bevo-Sk$&Ze#hj@yJ_=%65)r{{V?cVjDkrKrw(DJ${wP8fXkgY&CQIUZM98G5I|mBv8a~^#1_q z%l2U-$r*uPJmlm8TR-EB{{XY6G@#2WVDu+|!(+)o^^gJe?s4nezn4ov;e;rFWCjs_ zN0NV>8@7A;{``!6y(UAJ14tZHV}t(y`5pPI{=xp#xwe|F*){v`mM`f(E!39RuEbc^ zaxIl+syvs zpkxR`_e|tv?FNs%K=*JEF{R0&K%?bb2x6@VBozwT(Sm*LbbC2mjRDUx!eB$ zsm86TsU5&3nN<1Gn6Gjh`kFld0A~%WcBtOto4s|#Xc#>9c2;Uj_~0yx&`kufO6sJQ zeqzJ>A`y+};+Hp@w0nGm$96FK#C|y(l)?U9%;r zrT&>N&ec{dqC1v#_hiI3Vvz)_WL7>wzv52ayY)}G-brbF9CDznikh+?xH84|(-apw zX;dfj>OsuYI@cNtXtf*4daFF9_UcW1TEQe%DoPSA2o z>E`~HkPD8cLRAc}!#u&o^wzd_VNKbTMxbe6O*nG);lCH+mA4#zmd1JZPfmSi_SHzG znmUuUx#ec1`O_;OdmJO1Uk0}kajiHVoVQUj9@j}J&RSaRX^y=14!b5u`PLOrU z70ZI?Kem{tODN{HEFR!Rk)?RBVV)S>*4MwcxNTS1(12>GN3(CXDXdFTAX+SoK4lT$ zt0sG&Yy;c3M`?dOjihBv4Ip+Ym%?ew3w390d3NsRbu?0QBUdV)c3ik&pUnDQKOd*5 zrN?8vsjVw((#<)VK^*hPtzTndIrkYQo@v%s{{WO0I32owvv*7T`Uw)Aw(8 z7W-+_U21-+TeSw=zTo?_Wo3B`^I?K8CV58lzKqR*^TDg1TjTzV{DQI5en(x zYBg6n@g(9iWb`(-s@i#F{G^J+6@Q!jy6~CglDt)8SUsq`5#jw1) zSdc|kP&j#FiOVEAYr7xJgU;smddnG#7-LB1sL;(cQkDre0+p$*#e2j^@9=_kKK; z3{J4i5M-HK5-D;AlIQAi+x$A##d~dcVstT3;DMRQ@%@;^$!T#O>XJ;Mh+$gO8k60M z?7O%%)&BsY>h5c+R!T8emf8#QLFf4bTMErz{-VA^V5l;XKTfixmfkp}yCz$ekdnua znjEsr!$Zo{;_NpVd(i8#1SC83W@WJWSlvt?@5z9RA107pY*0FMNR7z%$#~RBY zx)L|ZQP>Xs9JiM8D?H9bPSp$U0=Q<@CxnPmYdQ)Rr!F-81|84JrmF_3+*WHxXIAl} zLs}zVNvE1NZ_ZykKI_bIGC>$%N9)yEZK-kAh!WAvGO0X1++NGLq*l?&fEklE$Z`8I zLDWgRl-h~mn$$nnE&EeNUKRHR$-JbNc>!emy~gfOZ1y8PYHk~CD32_$sp$-}{5dZ^ zSjNJ4aU;Tt&YfOVsLR=lZy=uU9MNleCYZ_nSC2$DznwI6WR9-Fnyiq|6*J}UNnOH_ z#1IPo-)?%&M{t+&-C5lf1;a+Fq~@d^C%})t8cUciB8J*{BXzq%k`j3pU}`-1W;x-9 zALTqdQd5*9da(Zhm%8LHQr5=kv14PmgY!1u&Z$z&thcsqUE@+!UDz%o@$1L;ICp)< zS*4)E_T(15b9YMGo|0vBMOu8Ic7EHO)|?B zdS4{N$MpXIk8SnRY%6Q*TfaS+o=IS{J--H}Tt^%&Fp=!{4g_7Z>z<_CZ4=(zhK(gK zynr7t6fS>fw-BQ47gr7qsst)~>GA`qcjbCz{2`Y)bBm+L&u>#l?y6!n)b6w0u_%SHPT{V#LcMhiz1WH5bDf0yhS$RT zD5l&^W($9GZ#;2?tsJntP9b=1MHmc&Ae{9#Z3fj5uOCY&p}z3LEV|I)>g4y zaWv1Q)ch(+(v|W&z4(OVo6Uxcd0r-pTMM?Wa=hAQMrkIkAr=l`3;=3&pjK1al!1=j zx|h3J+HN*A1P6)gtx6ixkA^FDd;6WQanQh(xQjzAYBYZDvboey=St$IzzuE}tp1TJ z#FwMratn85KKt2{J=?}mn3o5KWNWZTeFSQbh#N@G$Mn;K*;;E#&@->W9_?i zvSIn+>fpX-)FxnK2R;f0SkobvAvM^#vJ%?GL zSwu2IYSGu-jn&QDTbqbw6lpY(?5N8Y2yX2(_2X&CI@>YQjwuvn#Q%%F6OA^{d5A zVGb~T;Kf+~0Eg++n4yB*p}3YqrW9l&_*m72JQ&cQW>mv+ytgsWY^VhCOe6-J7ytqG z#=2|B7%3(w??DPn5|9o&Rh#x6t7Y0P z=NeH_SQ_MW{dlwa=T=oMQpTC(%Dhbn0ppFIj{g8~9BXi-Jy0KiE{VwwK{>455zX=Z|DQ5(kp0O>z%K&3qEPdr$3V{z2htSdr84m@)e zuMT8W&k`~6A0hy9duR5H_8+*P+w0V6E~GSd$avyFh!)a5A?1f7ddKYoLO?7@Ry~wt zp1|M%{v8p%aGI%@;(WcBL2j}T3F2wtpSK2G)Y$-e;Gg(%RFjN>jCnBq21x0Kzm$OA zhXwN58>Y3@;l~R909tTc$h!FVBgBjh6X<*6w@<#{`f32C5ZNg{s_N9E!#4OwzwYNu z7;j|4{lt3Y;EZ5>-OdIxns9_$=$)@cxUjjPV7&Qahxd0>^(3)UX^Z~sCB8J!%b?AeMD;ae~t_{eX`OYq5dI*)u!% z^1ginus`evqie^f3~{yudboK|eyj=J74?_HIKV7BlmV=`2n_~2K5x$*ZDpV&rwdXNqQU)$-^X>jf6 zajB0CIBZZ2M2ZX;??J{~;P)BA=l2tg_V3aQnP^0Gpu(++Qmaa1=CA(%BD)IH!SOBJ zs$HuWJ~n4bQVTl`3|08yv7&~0tJs^#NWybExlycUs~ zeWaXyhyA3PV4r=pEXK`}*|ab3)={tQ0DG}g{?U0BzJKix`?llstKY9jUoXiPjal6L zsb83UTLtM9v~EOmO)M^oM`wRbp50h|H{2Zk9o?dmL>(u-LEuS@FaosV4qsr;4E<@_ zQ9ir&wbP`GXNzwn(z&hEDXl9?WC`FsnEdW(Xw;|k4eEA_*2lm$=|M)_my$Uy>HbK1 zdw3w2vH?y9nzZ@HoTkfpeagLgsGX$j$fi@N{{XB+)$kHo28`$X;y0)IO=*@sjWCG5 zqg>jWEN5VueWp9$vJ9*67h3yrt}*`rj#{OE?q0UN42G0H0`d)HQ^=)E*6MO@FR)1~ zp}>MDU}lkk0gL$-B;&2F@z+02Ow=Oi?~uC>3c)fDw^lGcuJA|oVjDLgz%~g{PmY_Y zByY1#ar3A9*tq-)`=TN4XzUSN(ptiWratP~4_Z3{Srd05z zJXP%kB%nTpB|)g60MJuDU<^My~&a04=cThtEZcgJ1xC60ki@IurQ23m=rsi*6}jqvUK%wXdlI6l4q0L!9T)BuZ` z9yn{D8!=jWaQ9=!d=IOP`e(LB?iuO1Zj>H5VgCSLx?;c~W^edFT$7*E7$o)IHsShtSK2>Wp!@N{#dMZzhclf$ z#N>U%*5@?y#*T&NYrK?L&l{rLO4`)``a{WUg^p(l@Xm^m!9 za@q=jD^pq;P!U1P9GySOyf>3Y6dJBPHQN@EVoOvuaG4$`1Z@RpmD*SKnEkTKNk{!W zvDc8U*L@yy$>`ycufO!;k9%n#g-Be-v-JM}ELC?q0lb7mW{%C?wb+`ro-4lXcx0~~ ziKVj?velX8^I1a15Bx*uI-L}MDM!{0q49DaU$+eEQn{g_@y`(Yer>(h*xkWTjNaNu z$sv>abvdukPA0KgCa(>-q=E%k6jk#iPy}gl>z-9b zql9|F`@Y{CNbwtES+rTVn&~II49jwT;!h=srP@VOYN-RT%gI;%sl0r0BO?Hu_1lC- zc!0Ha7KXG=YfLN((fXwsj(!;EEf(iVC5KaOD(&_E0ExTTQD^*nQAJ%EMztgpW+#Oz zlNl$tBlRP!!`odnY{&~ikSCBle`Y2;iajQjq5BRpuaftAo%XtMuCroYj85BH3qm0F zY+9^VI&T6`?vDkGxXN|39S89mOMR{<`_26XEz#*oJS3Cxvn`<|F730!D z?l#kkSNyt=807Y!T{IMehd7Pw<$c1cGCWU8_9iQLx@SDwBp)gIh1MXD&O(JaK@`Ndp-G_Bdw7DO+;Y>JgTw1DT=A z?Zt)0kp&)rjz4ZO{xG(6ntnwTdlKhmxTR(aX8J`^lKvECB}~cWjRei^xmH5Kg69q2 zN4UNM~i{{U#julBW}foRK3(ie@O-^+A0_o{DG zpOC=xtwkfO=~gKunbqV%zVRQYPIruk=26bQAAX#h%Oi%i=>AzbkN9H?(LlfVUHbIc z>L<0%t|T_(y+I~|03T5I`UPLSEtUYg~0ooe|?@YoijRdJTjkCuD& zmEJE+#@?2;;H+SLBpQQLk@KZIv0-fw=N35tGWHDd)pzviu-id)O75`5N?NV<20wO7 z%y3Re?Z;UNu0lo7u5I>yp3F>~Be5eo{{V(5AKb4j{{XhW0Qq;2qq@Ccj<&R+cZNVC zzqW$DmZL`@Dz+XO_5fq{{{W9i+g9CfeEt)t!;u* zmGm7?LJt+kty{CO`6H8D{7P^^Cp4X&6lP+jz24J7?!-x&9UImcP0+7#mu9EM)s40Hr~ zYbgXaH(ZJ>b$EVfm`ChY-*yLM%vdedJwqv8O zOLl2bu(6nApUA?DjLLuli;lel&fv=>#rr2$rl2J&Qb+?xttd`>a>Zn2gpLW-BDW6# z`*Ar*b{cCG_=Vec_Vno1Pin=kH$5ee3o!edy<8S!iY-s{%6i#ica*WQV!{3&Z_70s zk3vY=?ISBJltKv1Co}8^FC4NMlWvPAs2tCqpW9qgzr0RB)cKFYUmj|rGTGtW3xChH z=>&D;kvH7yV^50l=!g=<0=-=)8{A3aTLmT0)2mL(uwUrcJB;W50JL4CU+P zm^1zYJaI|4$ZvPsyO~8HiUgrND8$64-W2k#K=2~J5`Xz(-t)-+0JN?PtJ>ML++jX@ z;!#rnM6z^6`AO#H?>OXO}B$vE{1;^R8$b$n-cOODB?YY}W| zt*R4^A&%N+J99N9hTob=1oFsOpE3Zz^F5Drwz=F_`iZXN8KjLv{LJ+X>+rTlgys%s z9^ZEy$7^V828z^YOopTB_VeM2cNLtY>}*i21oCUAQ8LJ?QaiXUnHm}72&-UVR_uw&21nfvjDXl_^^-52)hGSrHuyKB#WciXz_ z9!aE|Wk=zv8lh*!;`6QqQpp^sQxQoXTNvu zRUxr@8XOk9S2e9()mQ^+ca<#2o<}Ci!j751Jwf_*r8`f#pfW5)?RNbRSP-Y?2A4WX zGzyRa6d*F(p^w28&QDOt|?ITsr5laSnCyrr(C{ z?Lw1mXx-U0YUQ>2DpFt9JhSa#sg$`5SFXO?%F#3>S;Gb;Nb3f;u-s$4w2&dEr_!u- zAK`3{U%UvXo+HN`kzGeRp*G~u@XQM3=bm-T96Rw}9QbCouSY(YL#>CLaqAq8EuQL4 zw$pFP62`3U;M+q=we7r>C{)>2s$^7J&*2oFDTX5&9_7F8ml8#DGPR7*gOqWhrG6k% zhLp;LaWxs@-qzOF=X&8!RPZ0BS#jfziO}7Gp2nrCbS&&^M{c>=>!3+e^J*-`JsY0W zM;pu~fZ9e@@dpFHp>DI*ar9>&GJhxlL9fO8efWQHStNyoZYpa}BU)o~(@KMl^X93l zmd2}#QHN1hNM%p!#p=|DVYR$!&0;!pNgVd1b@Pp+B_Fq^OD($1bloAToL4W4FR)^Q zSk@1eSxqE%EZ=DZI%UI_K5uR}7wDc%wc*=szV4mQOUS9(*j%eN(`hD~XJ#uEX1gTO zdvm2XEF+PZ$L(B@4o9I|!yUwt3&dDmEusKLQ&vz(8CNiJClAjQYT;)CEWrIad1C{! z@;5W5uH@QCF6}uUqMZx6v#!yab@;xjt=bi>$pdQX(z8mM!6lglu4HCOWM&5=9cWu) z+GV+eaJYgP?wi+B@fr;}O#!DG^2}kF_ZdZcS;TVl9^6R(0BoCkHhI49i*h8Xv$M%4 zN1#K$lwPw^g=&^<#h~LBEHCvR>i4Z!Wq8rT*!I`Oao?(b`L{OE!+m0=BNO!-PI>%3 z+R$?4i%TgckQcc$qvgvY2krYY!{6QJzAZ=hNAdN0be~76)o3^+Z^LQ=yn=0(?~uG! zEz0qJTXeOxc9mv?#Jefsu0@{|w4*VF z7y~)L>(73E!7r5j$|d?qLmAaj)HzfFzU@@=#^K&=1{qMg5kPYLjdI2nzpceC{9|j0 zY4(*k&ht^W8;hFe5?7Ayf~K0}2Wd5uk7HqfV|>^QVvs+JsPV>n((RW!g}(9qLgFTp z(UlcQ;Zo{JuNvtMT(MKUS=&!*{W>WEIRVXUS_Ae{wC7wcp}lii&OQ|1LaQa(oX_J{ zqhdM3*N*nDk?X27lS+U@Bk-bBW&bWJCho=l*z3 z=z=@`&bmhg{KnIH9YC&q234gwu`~nEAE{6KfUea+kmYt?Xkt8&3s4Bl2f+;8h|US? z^+(~n(%%-N_SZfb{6S))YpMg#=>R=}KpuQOGe_i>vXRxz+ zHzEtSEJ?hhV{sI(C!C9J291!R`+~3S>++B4q}^|*hRx*s$j#MQ@FA|`AbaS?-H+T~ zr&d<+c9o^=v}PkV*J8?swO{sD)IVT2>5qoF9^Z?6!SM#yV=|;QdETxB9@KElEp4pd z(I!SOVnEVn!27KXN%IEAE(;sc6ZW*^HjaaFj@;^*t{0>HXDz_XuLjyxv;k)v68UAU=88|D9 zdY|~RM?<8xSPHFl)k!>q0)FF$(sHB`ODvO!;I5{{hMm#~_jwjo zTx6UB(g?!mo)iK}3JG9nKm?ljQ;9yzd@KI|p3Iu zXP}m2X}QzUDni)5hPVD~D-TLXcPaDEZ0D#lfxf;^7<58UsSmbSec%+#jxvr9XGTl~LgmA|(jsY~W zJhf1_c2av12m`DQ&GeBg7+dmMKd_!y_WNzVH)R)5R&|oK%7jp7izKtp`4S}+2_Kyl zp3KUp@z%OOwDlv0`I0+>fK>L*bK9!M0ihy#7GX^IA0N87zY@s}1-@zf+=1c=_u+*- z1^uS$b8Ba|jo#gg`wLrZwdR$oU9Rf|eNH%&P2GPhSi#)2#0C6|C*^Xj|qMfCl0R8hxk78ZDYPf&mPg zOnKC=3i;Qc57~dI)zP;#i2dGJj@s_;%}i*ht5L2hM?WwH4($nBOSr+`t6^-XzaZ#D8Q$!@7{h-c~j-_(8Bn`d(+t)nv5gBkw+0FrMj zT8neGsaI%jOk$FCoJO&G3y7m(g9V02kT_Ms_w>(Ndn;>Mb=uoIq>3tad?k2dqInu^ zGf?SfufM=~;+M&Jjs8Y!erz*Y_AEstM)j)F%CS);lp_=^85zQ-@e$Yq)sEe^EriYT zrBR+f0<;G_hqsTv5cezflcpsVMV6!vL(dprD&!l!Wo}(lL}9MzvD!-O9FAo(I7-%} z2q4#pS~ORWxB0jDEI z^2fA#iWec5PqBGZM7tUq`!Z0JIM_|?TrH)7V39MV(pRn?cT%YnoMiely4}u~A2n{O z*D8gO6HvKdE(UotH%hFPq4X4 z7p`m8OAeNxU&fZqvBwJt@_pGZKa*er;FH|-o_m>hILmHp7g)BV=5eZmD7NMw(%74I z1ymj*{Hk$2-y`qzb?EEsY$J|DmGz@&B$gW#Xjrgi^M)uMpyJ~*&c+KQZaSu4kDP%H<(X~dA&vABA&G``f*NC<>1>{dK|6#Y7bGy(S~ z2ohx{N)z}^J|XAJ--oSkqFuEC*9^InPI>TdIdj9L<=eO`h#&%-YeoS_V;;D9$QDTi z)^9I#0>c0fm+h`B({q)e(FsVwP9vG|K6sDOa>uW$ zwO3>A-Ah)T>{phoO+C_NVOn`acxv^PzPJiHJL^$2$vu@)H5p~g{y2@c-rYfJ@LUk} zmVG?VNR#pM9{~FTO^`*gTI>sPO$V#<+Iw=eSs%!tU><9B0&-RAu<9m$H?^ zEmbfyx|wPFt63>Xv;J%_rP(S&8`CpHq+&L67-d#IMHqF8lI6|B&e{g4O#rT046(De zw}mWXFl*^7K(Rb{ky;$+Y2ogsA+D`z8_{uRmFw(eO4j7J2x!u@VSV; z_{`J8kgU<o!rr6pqoDCZ{?D z*DWcDNrbxOgv4+&<}vjdiMzly+2SflmPFLxaaZv6{n#$tygP-wiy#ee1idj{42SuD z{%?Wyj6?DcHBuOEBvT76(J-pez-AI7xGa;j=i5sQBL4t5ILO8^)4OMI?-tCFrNoO7 zHO`rjekATaxw2f_wZXPSBUXl$u9HLd9KHCb#kRfw0B`K9OC0v*j>~G~e{1ocsfC^d zhBJhWLa9DSfblE)dh{;W-L5XT^S55f`BJA)79%rKv=sJZ%)8HQx7)j5?zZshcx4Dm zjDR2-n&;1m7>(2oo!!;Vg?QkbeIB}6OEe79RnaZEJ=HcQP*z(;FS(aKQsV>+4Eja) zMk@t|Rnu%FC6tg0`GH!I>=^QUIZN)1a}TR>k}(#cQX^Ue>S0wJd~pE{m}%^;Nb5C= zHSNu2R-Oo>mTQt9!uRa6DwkU4#rxv~bol~Ef-e>{9DMP}(A!Sr5JF~uk6lXrg>?2sZ2zwPCth^JyP5QsojlRU3_xI z)x6I4VjVt?m^Jg@Mt;m?7H-{75G39V#M zPaMdDhrDNv6GzIZ&8#O1tg!d8;!HKEbeyZx{^4Jv13;;5*1BFXzHPJ=i!zgYnofKQHF;l(e5PH z?Wo5i*4~QExz*c*&diZizOz}LjB+zdWAh{-VmyvIFYE6TF^*Zf(?HCMD9jlN&D0Xf ztKk&`F`Wi@i~j(G!AQhV+e#yxD-}?>p?(ZB)k#uGV#H-iaK;z%2gy9o;y!h9j+dKX zoYce8yw?s;u&`ff~1BupUc#?ZSJ7V^JlKHiWRsK*M%*!65#k`rmMcAqL_y6&kh5oH_Yog6p%olf0G^ zDUL;_OdOLiLkzg(Pkt!7Kb*c*`1bAoJ<7M6-L*RUIXBSl>vF5w$)(fDb!nKFXK2O8 z?eYjO%i@)zwfS>KSH?5jGq%~gSGeX_wyWk#?y!uelIYTDECmx&il{!Kx&TvCTxT!# ze)jD9Sts8%sO~mV5tK}ht0Kf0BM{Q)jF7|-fsBq?h^%oP#J{z^tzFg zDHJpZSC%myz1{u0yx&h^w^2aW&gKTXJr!+!nPQcmf;o_a6I~PdvCwutM&~>2TmJw{ z`CDlUn4q-|^GV93nWOx6@{&m1+G?s~P*9|R8GNv#zDJ*}&-A(ax0dHv{{W{Y6dL75 zso*PLc0F}_TW#(Qzed|EC0J!FB({<>s3237J@~6^zH<31L9VfKZ<1x)EPmng(CzG5 z*v_%aBX$0gR(1S^KWvDSWD}8`5z)cAcI5YIWgOz&t3n-zPf^aHl%Gi9oiP^kwR@9p z+fCuyzI38j@>SYmoH9ZeQ}D@2%RDKi{^U8$s#C-N0NqECMFr(mg6_d)ugEkrn53RF zJXZCLwrR%k;T$iTC4^6W3rsmdsmh^0#ZRDvUwG)8nwx(l@AOq+1gvq>unoJ zWps&fq_0*dhIpTlDByZH8iQJsmLxc@_fzsqL9^EK-dS*M>06Su3D%5j7W%w%OB8!5 zl;G7Cjpg=oV<)yoJ9O6bxc2;WtL+zxEM=7P?V(B+VS-Sf)1fLG5K7XJWEx9Daf8w7hAPnjM*IVZPJzw+MR9W+b5B4jOEWGTcN zc;dl+nr@^tvhCEM%$5|Td_K$(zIyo%Y1$2MFyz*3>m`f<`tbj$2VB+Od0+!55mz zR&-go@pGoC4C@OK_a53F;HoNf2JF?z|n1E3b;9zl~$biR=Aa^ z^H0ljO$Ip!B>|)*7SN>{O9KS{r5m0GWvUKp^|Ek4OIi$P{Vvm5+&ber?+n)VeM}M`LO0>wYs+BwjRprZ;D(*W{ zWtnKtH@+?%M_MF z$Q7!BbEQsvG0VT*=gkrP=~v^rI+m+p_|4v3YH2j^+)D{+^%@jbt4%Vr^dHK+o_^x0 z0;+rU^N-e@!L;qGa~_*@dxYv56emn%(1L0O2=?RZZ|%>w(`dQgUN;(=C;>_k>dPdn zm>_YeBb_`k@^_JQj%P>vgxGvfA1m9{;&gr>+I)}5scARc7!AHj%Om5TAL!}s=p)0X zymbksvu2#OVtHYCwbtSu2Lim^A0GrKbTBuN@f*-prw5Y zcGGqBu^Q*|n%A{tR#F8bY3@V{>tDqf4&aUjg*noL#qQkP{PD)G-)nLSf47TUO|*9B zA*<|nJhOqe#wn#|mMA8*yYk3japXT!h}YpQyF%h5X#W5&e2fAsO)r1=cJ=fEj-9cF(7WY8-vdob-Tz(fkMKO-pt)jB} zyJ*uI$1~j7npYs!@=7R82gHMcua-GO`{C5BKbb$ZR^Dqhwlz1o?c|xS!yNH$bhN%m z;Z=4uw$&`Ku5|VhiYDW*EU~Lb^4_kY@s&wXP@WVzsx$jB`=!`?y~wNDo~1pGh6oaQYfy#=wGl%N zXk=)sR;y0A5Q^|Zs@~=eB)1S#GUXij&8h)Ov^P!|mJK zXa%}b5+6+kD_<}8_Pf=>vLDRyxbiQyOr)Q*N*yLFTzOd6}p z#~i)2X(VP#gpwo&EUI{US01PR#U=J+r^vWo&O}mGYFk(L8yRmDg6Em`*VN!(^zUDy zM^(Kop95NW*N5L+L{8t^u8EGyNe{3BYyO{(l&7kieCu34AKWUz7<+&A;e-?hc(xZJ zOtB->MPY^r@1B+J>=o$p3ZI2}x3ibuhF`Vjx6M?O%$&!!D&kE40B{idGDx4$cd zIa6_X#1)7Ii=Auus^ofu)JXSjo@sQ%s*B-=@t{WYpxKe{j z^B~vtVWWKMQC?39RY{G?ciDnuU}GQ3M5<(#Fl8Tls57tEUAhiI}P zl1H0J85(i+4nKAdpE!Ax&a$lN{zNr>s!CVDecnj$<$Qg80qNN8?CI;C5J&L>e(%?a zQugykLn}|8iX8lho-?nJ{{XxGEx*FUAw zBs(+66qQT>Ndv5(cX!6Y+jb8jmO1xLDpDjhVx@@HT$BoeGdi;2Om2HK=;v|wz4Ugv zWw-73VzXSlOH?Yll^0bSrl6V)G(2mTAUF^A>G20YYE+@0aiHJXu_n50Um>Y$UkYvL zytTHqA==9d>!htl^Wb{i41jwmOR z4Q9Un@;KtRAGukDymmuihk?+^Z2TbD@~-<^6p8rTI|)e@2i_hLP?MC ztjjT=U-{-=5s9%-q(sZ))1(fzk~ zz4huxy2)i{Voq)xPT+q6C?i!lxmBfesRJB`wEp;ixqG*^QtGep%`Hn)vDeZZDh-I& zAU@@I*6sP4#>c`J3-3r5&4E56)2}bM`p4c<>UjQM7>TGs7=0taJ5ih3MRD#>e{G*l zV2xJcZ*DGA<7p?6R#G^&gmAI=Xj+bS&X}a_Ke#{cOOepEPjmAJC5EQWTk~n^Mz2ie zU5gkg%dFSdyHX7Q01B&yAMxm+v~8kJoLtICN*BoArEzQgGU(!I6P zTYZkz$fe%B~_PuUf$02l~)#^ak9NVnTuAq zp5epDjJ{Y!&sb~i&hqL&l0C%I@Mbcz3VRJJ@5bm_+FM4J){(;$OO+#zH4HpXlm}m! z`*7aem9E%XC5uA-KHZt5t*iV=Ej(e>rwvcT?>_M?fmD5<;Gan1Nnu?^tQ=E6_~GGi z9+1olTK(e?P=$gkO&#egNr5Yvg_u?f@v8#KG?EFUQ{)K1EJxF)4DQi{BxRj3BcT&| zLi@0UcdbSE(8b7PGC&BW7v|fo3?6K%ss1V+E()PPrsTqHHo5@QBt@Gas9 zU_V~FTS5e2Q7coIyDSlk-hfxrPdefzoqkbEX+!#RRf}V-mebRc;pA*Wl%rI9W)Rr{Kld4{a(yF*lMEL z(z0QRb=7P~3eN!ZlCH4U4k0Tvou?@ic|U<{Fe4`*2?A{_y+&qHPmA_{o*Aq+tHeFaRc9qv@)sU)Eb)Q%BPjz1J^Gb%ezyte)1?=l zCP%kLZy9+Q3XHseL5r5(j#*74kW6grbaWzlwfcGHceHGn^D&xMEfS>pQc1&PXBqF+ zYF-7EBuxhFx2TR9cvHr_@XT<>DvM+#gK;3^GU42}lkvOGVDgw%*iQu2P0I;hTJhGX z$kuT&GDQUADxIS&bByDwd;5DU$O6m=Vnq&IjekLheHaK3`vzE~Wkp@(`v+BKg^+cg+e9FBK zl8+2)9BN5<2h9A_jOn&?_~m*ZD02AVZQ@BDiESN|Lcg1Ocx8A}YqCxRq8Um?-(s8& zsxHB@?TxCE=KlX7Qh%PYkrgGy#l=qKJrUR-h8e;aUrlBw(V zwlv$lR`Yc?F1e=Vka3C;!7jF1g{i@1_I0bkmug8JIOUS*D&R<&$F>JvUB6#hwfc#z z-WzD`da*OoMUd2r^y`tRJZZ}sC=6yY)0(pigZ@5#%xUA}PDP{Pn^)y^Ytz`>-p3c< z{{T{3)yz9>nt97JS83z0_A9$M@>Nv@Nh2LlUv75u-bA*bIv9;rj}fG?6$F5P%MxuQ zNv7%MNasopA8sk%EN?}PuNTo)(a9P7I}+ZG37#t?$8tp;?6u>PRHhn`QhZ2!9AtOt z?$)($muc9PM|T=(yjMx6=6HeUo-8B|QJCiRpr;H)ZMY90=U>sLyFRvw<613^Ekt!M z$FZ6_&&M|VM4CvXhNO>9QBprOc>KN9Wkz5JSJv0@ZLmDC2WFC3tE!nUy)@&QsjYZ< z*A$G!A3}m8W5n?Lv8~!&hM(i@b-r^7?>3rfg{yC`OAy1mrwp~?)WsZ^5o3zbdg}-z zfFkoJ01l`xS_`eklEKPHB%}i;!n%QFL#I)z5u{SNo>(}YVwAilgq*?Pxf-8kKW08} zL(8_GB<*<*%A2c=CH`-Aw#KbmOC;?>U8#WRIK(p9ood)>_Vv*|%&cmGe>ILgvZvD; z+C8L4u-byK*vAwrtNx?9nPzj(RB|~<4}eNnF@xHo3urF@_1zID2b3%{#HN{QR7EYt zb(Wz#Pal8s(Wh@^Xv^a$xFj5P z>;C}T9r>{OlNZfUi}+`?s^&(THBD)eC_MbJ;XmB|*Cy%oX7*GlA8)*ZbV_I7lTY;9UPb-TxPHfvXcYq7;O;I-pt_JffU zcq6a?b&;EFw%U7>bWj_kYk6>>pB0)xUouFoISLGV2F-sa?b{n=?6g~}t2iZZGbBpq z{{YGZ%!7xv&pWOH20*IYrAV#(W?7J{i`c(0UI8~eX2A?&W&LWb+ej7%?gC9R*`ft1J@ZR6{-Q2e3>hEn= zw6>VWBbN1MF9rM>5w{ziNhrhU82FG(QzlnU0@sB*x^0_7ax^ZxBcgrcfZAHx;1iJ_W+%V+{NP+p z@5+BGeBXNHn+`q6dDqDc#cSTREdmX^3jo{*zu6Qag45&O~!!u9% zy}MmOv2DGr3}9Z`SXp%yYfxQY<<~F|<%@wB%Zi-oO3{5b+bw5p%eY~Za=VuKc_d+} z{HPpSBaj-Oo$}^Pj|R^?vHAqs!=sCUZLjL4*4C3%#i>QEwQ6g3BiC*vdpf6MX@>z0tp^JFQY>DAilTKpb#jm2+NtKd@ECrRswXKM2f}CrK`w~FYw{z zj%MRO8}luG<6FPn^T}SvDutliEYZ5$+{4Ux&y6W&)dxtv{4fh6u`& z81hmRDx~ABd|QO`OK$N=&_|85k_kB}K9Zr9q+}{U&kUl)aPITB<+9XxgI^PuEO6f- zTYQ6Q%Iwg(dugo(brnCespzhSid!6iKCfOqL2}cuU>%_!rEKF zq?tyAV(bYukW?t~$Y)*$h9RUfI4>a@!JwxCJbkAxb`ki&<>LE(JG_$G>tjmy59P&X z`&{ZPeuWRTMoxojX$)pZ)B(%@pbF|WAkbGYVa4^N zY*#*KhmQ~N$1QxnLAe*qJ1Hz|UvIF}>wYZV3wsGHC5dKh)@`H)TdwZ}a%=U$mDsYx zWf%wUBVXE+KH1xFGO0^>WxGZL_yR7f<}{Mod3bQfe|WZwaNXxb6`I^yIVa&7^|p^4 zKrVSxF++~e;@r9pCtqpCc@17gxU`dO>gXvm&1+k&Getc?v$e2{inY^E6M1 zha;?Z^S37E(OlSwphi_`6jbVBz!C@q&{vi&EvNZt#7(J%c+h3`o*2k^R}bMc{B@|e zM|(SSDjU7UUQMpAM_|=t(6u;rdfTICO(qB{{$ycPFh+R*I2j`IV!qvN_nB?o6Z%_) zXiE^I!j(MzEsBly(I<%|XVOt~BDvPNW%lRcgrn1IuKaJq=+oW*08$#=s2p30Ey&vM}wUGdmqzZrQPYX_up%6_jXeCH^}T^7ZB-gqRO$Vvs0WzjY3-J zHK97H2jl0}&!(N#*qzAF;}{-;r|N?n%DbZ#COgvb#P%u$uZ&p+{$}6wMupxvZirrMm3#G}c%Em_2@3 zeQw)#KGpB3tak}f?&2|m!NVl0`K>dr<0Gonr2_*>fHC^n^s~Bl?&|EjUFOXuhR$HC z9CD_KB1qLzIHaM{9LGX5mRfViUHoCJ*6Y4N)9v{MeXr$dpt-fLTX96SCG)=oVaa(W&bF&jtf?)zZCPj$rgVl$qoqYli7f2xvIMUbUUEq( zUu+ZKu1H!`FHJFlnPv(A9L}m`%$!QS?6~ZZE!FgIA>gq>3zNtxTAGuP12e;(K2H4K z{l$EZ{nlAd9k12e_}}4;b=_{yas6Iu@bdY$)M>n;w$}EaZEIVwy-w|eBs#dBYIPsP z+nMZtB{Dnra@uY1u#7uZeF>WN2k*J~p^Tq{P!dW#NTxkZG##1QyP4ctZNwPwBYH6< zTcW^Bx zB@vE7mCSoaF#c1>>|5ETO6*~?wY4nLRfolGiYY57zc-SqYpO{h3GWl+ha>_!^|Z6I z5L>fI7g7oXo_NGw?%iv+pmu#yK9Hb#k2?5M&c5tGNNVfp*R{S`sp+Kr9e$IK)UPVV zx7>*xn(ezuD7~~<3l9iYlB@t9;>LP@XS}+Rmdn?1L#{@pV-(LyijOa0z}lU<** zZ5w}72rWQh8eUSo#A}i1_!tHA!|8bq-A?K`H}Uw(5P~Gt>+2h~DMJ-yNTSwNq8%(( zk-+zz@gP!gM{*#=V+6Z-j>rWIQ2F{xb84See5p)YOT5i(e76_gtxf3konZ)|T!x)I zGp-$Mt<416DR)ejwnm_fQLF>ZHCY}Ph{jQbKVmYoE`7!DRr`*5h%C}r)+&|oveT@k(~>|g8euCc##m?>`~!$Nd_?$V=Zd4eJ&e%wHAyK$)sWJ%NO(EVA_Y_r z16*G`9}zx|urhFw%~I>zreii`GUWiD0~bC$=`q>pcQ zQz%fVQiKzoYsUjN;Fio|l11wBpd=5w6y1~(?Jx1=t73Dh*hBfJR*?#u7#SH+t`{)H zXC@YWt~`!?I+%tlSX{~c)EU1O6*Tt!*o}20m-5@Fdc!0=N_ankH8oqS$!3Mi7YKQoD=o8#u2Wy; z9~12u85Eojt6yo{WRP8|f?Rwxt8x9&nZ>+YrJOJ=sfrMAprwA`5UFvct_0(kJiw8M7W*L8`yn^LePRQhHi!j}YO(I6#@EqzK$Vj9CvTEBzED_FVa3ZT!n7d=s|cQ;n?i)7Nmpz5Vb1m~BQHN8t) z8_5Oqrcg?f6dg?&KvVdAnee4eYl^2alUQN1zMmepxB)g-vdO+WzVUoS`cy+HVR<1^fMkXuS^;jd9wTe0|2IEQX@_5x}= zF)_yZgX!SYtx4-iF2>D7wMt6qB~5^_dc4-!tgYfAnIl$WM|jyA^y{y-@0*r+957U< z40vVF*@3d%7REb7hK1!S%!A@}qPdZIX`!ZM8uF$#tGc#>`i*nA^k(T%6ta|{rKuEu|-Mqm4dv%oSD+N*mMv;+2#{E{!B_*sR=p(?eBNz(p+~@ecGvB3xa*{_pTH=y7)(ADs zQh=PY@fhpdchBZ>XkXzU@4VYfVz z7L^+BzZ8(TgpiKjXSg1ndj8w>3fk*)w>{x+7eJ`|@m*2*1sQqg=Z^^9{+C}^Z5I-D z4Dx)&qC^aR5?4Bw-Q80LF#Vi>q6$NPYsQt6wvZoDY4=Vouk(Sh8u#gi-i@DxcL{TR8s!%KS>l z>H{l=OMUVT!AK@IcNJZ zX|i`N#dOGu%L4&VSqdv!_|x6T%L;FPQJ!teQ(kMvCH5K?iWsMtSnnhxhWxvAr8T@- zB~r#eHkUpvfCpV|+tC|Beop0NE&HBB&k`@YjavL$i~Au85Y-ZA?BT;N97o*w9^TZn zGv4ENQaJ-W!)sf@M_B``YZQ~gE>%V``h9uij2CecP`7WxwF;Tg3^D}$y_Virs*Z6o_D12GKKMC%D^1t zp1wa%>arLvqq_WsoQDS^q~#gPnUHFEWst|&W(~R&Xe3nXkZ3}wK0L-PwO5VnZ0WU9 z@#8Fo;k9D!#puA(wBkwP2EUU>QZFeNv$C!M01lzM-pVApYncNpNGhzrjVu5lgI;;z z)wZxJ6n!Y!pVTtQHEEiYrH34dIneRN2bytjjJWjs?XI6;spC`o_V*jDBDeKzC5@ej zSf<+7h9?%acBPt3y40R3{oPkd1(oD7&2A{EIv`0^RF=?O0j{LxToXe~ zV>iCu?VA?4ytTTwwz!p9rG&qtM`a7Fs5L+o02K))@<}k3_9(7U3Kbq>+LkQO@}NkOdh$w!;f9XuX}w%?TblmV2$S5Op+J3 zmJ}-@zv6k(QQ%>~1z;!vAlDvKyZtr#W!@W|t=-{<9p*S=Sgs+N!9y7&DqFiUPNe3= zm5oWE7~Od9$OW}KQD1Y#x6;S7xmvETOSzirRDuvvn?oB?jw;$?B%- zyj$jN4b7C$OwhZ_BLX!$nvqkLGRvMc`+sBdNyFy{um_cl!tYpoY z@GC(z!ChOX3=sB1ZGEw0CoZ?7#q zuCMWF7y~j(v()$_A^c@qy4to@XwRH-#)VlyTk*D2w-0(6eJ!1 zvx*PiIN99C^A_U9>12JWg#>k~C?p?+fvb8{hT^mZXlsnS0Vju zF1Xu^%lTgBLmsbtk7Ba!e(Kw1?k?rEy0+X%5-dLg>I4c*nxj<)gtYx8pr=lxV>jDd z&h6Q~o4ZvTaDl9=fW$g-A4LS^BKxR*49cku5-J74Y9B{^&VZIh&dCZPy9o zoNi5|dQMBkxBmcv5vi}%#|_zs6XNtHmFUeOxS?&dtLE~se=h>1j`JT%HhqFV->^%Y zo!Ma$B(O68OBoOeCZdO?gH#GQsnwMWy^U@4&wlP^-}h-PZ8is($1SAl1d6J$xoA;c znGdWekjQe>G*r}m3$4htGHSNg*L$dpYwLp@Delyb+EFs4>R#NG-q)YBe$$)~at;q) zJ}i^K@P>u!sN_jC2Zee4ryom*VKTXi&RiO#nt`5eQ(xJP=8wuTr_CCFk2ccKk6*O- z^O16WXCbX6L^P(-ZuGE?MaWv&g34K=xbs^cDKfG)L0-d69?c}Zr#|&+B{Ri+4ZB7W z$zeK7R!q@Us>v3XD&z%W__M}J=Xx-AWvHkBVy#pA(*D`jLH$ph?{_q--Ib@auH*a5Hg3dO%D)i)Vn!LFAL`@Aw8gLB{{WCU{cch7_a;1w-q(ookCf{2ZV@b-m=Xv$^qd!r zM{>n@?m=9LqufC-F-AN@f&RXfz2~*=3AgM!b6bVoZ7i8Cis=JV-B0PLW(`%Lub+lA z-H{|0+m8LXt;$KX-fjyeqZK4{ep(cwhfv6-MRTOo*E;7+X*&LSOJ%2{#H{n(H~qy< z=B`VZMyL?lx-GujXzu;LxNK+9zTVk50eWkx?em1I$Oe*Ff=e|kKq*{wKgZwQ{{RP{ z>a;OS$b@7iITwti=!8gVPqDN4uW( z_vNQcbhW3ftCye$GNy_Hc@S{*=hxq-7F&DCw@Gz#e87brJpeZ)U`rF@s4|S{#AnUg zZ|^tdirlwfwB%Ry`z|>plKW05`ie6^bq>y#D${+HNp1vDH`rumY>!ep-(P(m?Q4y) zUB18+-Fjf8rPwt`8h}EK#~?A~n>W|K?6=<2bKPWB*_v`Bw+c$6V}VMYTr(w!6*%he zhdFkeln)5B0RlSXmm*=iboaHRGmPK&Yl@!Kh#+w z*>)Y%xvk;RxY}(qOB9O;jEPBD(29ISYOaALPw${$HJwu-Q! zPhghm>K+InfUB*l)!u0&h&z3)Fg{+Ruav&9$*StZY=w($R+uo3)Ixtf)v@5lrFKs3Ql(aRSaei?5>!`+Icv4ZnX`oQ%kd>JtoA z2BLxE0jM|=z~aVhh^@Z4Do$OkH*VW|c&5ZC_dHk@nv zbQfvK@OGzN1$$CX&o;AvxBmdUb^C~1wPP*FE$D=7?in3oP!t^Ib{29!a+;9RyXymlrH=VAcP6$52dHaqpM+M>3&?3>%U#bkY+ zbn+%Uh;-%W#Lx~Icw-5>U0m7yLb0|=bfe#(k~;AsTU&tDJ{2?`M?7*j_x{^m^?!)A z^`~4Nu+SaFGtXi>5h@vN(P*e~~B$ydcJNobT{2_;RzT09&S#BY= zka$+E7<&L=PJTG?Kkk8~n{C=RdE@~s?yn-#L#&b^Wi{bOF}OKapyTxq@y9FReD_A1 z?QX+iayk%DU4&Px$qnsQ(+WXvS+;8Et5<0Sy7Hem!$T-#@gAhT+}1t8vF_BxjVWGyIAVHTzK_RwN`&_R z06$l)+wEw3m#xU(n+*x&k4_$1@_V#ohBTSnWQ1%f2deQM`RGYGh(PlsOnP9^8Gs}O zqZ6Mai(80ok!}UJ*CcVgi&j*tA~OJ6Nzx57G$x*S9@TQcc6 z5?Hi@?TW>rUf#YuBOok_Bn(HcdiOiOqtZl#?N>`Ax{W%KvScYkT8fl5}8+48d_Std=OB63sG-TR?X`$mv5tcne zw)c+A`i{^27q1@g3e@Ojj#W+~LTN)Ds)`V5LBV+sG^z2AIpZH6@~zFC{SI*EEhjD3 z(1M7L!Pr5nwM%!dQp#;>tXPUkY*z6`j!}p~1esfY&U?3Ey5F{|b+^CUkFMS7NnVpn zSlk*$D72)Sj-!a1mvIiv?h78>?gupT(aSPO052{fR$ZDjuKG3keCHDe3X01b2Fiq^wZ zrq|gKuKB0@str2<9FQ2_GLnp0N%KI<{6DW(R`-_@K9E)r6rQSKJyxaC-Gp?ga^#)4=UTewm1=gfnZM=Wp# z>;C|lpNIIjBW+S?IsX7W(4TNF<4MJJTt{ILjTG0hEp4wQw@!HM$>gq~p?Gne5I`Es zF2j!h0B-r1<7-Q@E2cskKXCvt9{gc$JJNl=_*+QPU0Mu_L>ph;O8wZ*KerG5Mt*zw z&*ffMtKH41(eWvT&8HUQx?Kjf?eXnXh2!0pxx>c-mL zo7>QCdn@$rNuv`+t9TGa55BndAELK5ef8Y;c0I{#^4hJww9ihKukfA}@XsCBXXI{s zeM(v7dx&dE6pJ)fXRAm`v!M?gEoc$Uazsvk?)`kZecj#7dL1UYJtDbnO;6+owu02AhFaTzrRue3FyC^goqUzXCr z?LjP;6vYUdGN&v}P*sZK+>;F1VVT8`L=Ru4CO#97meoHIzxhX3UkU z*V+XGd+UKpRVpQTgq9Ky8QGQg4;oDJ017gsfU=UK0~k~3fz!<~_)Q2O4MlXH5XaPi z<|hmC;=0K!{wF`PlKWH)NkQRRR#>NG^F!`LlbI|ku^-DapDzY)u0P@J)KMe5(qN{U zj~@&mRbC{6=Y^mw^Q37j7xGt?qGfQ9$1G&VLWM-0Seb-l)!lLW^kj(%QcY>Y_F=i4 zFQ|}m=Zy&~(XTa&Q7xxvti?TeEV`Luq>+|}8I}YHb{1H6j32i>LDWl#`JO&h<%+{F z3e0Ii!}RdNb{1Wx2~(V1C+IQKF>qo%Gd3~Z{^ zAn+9Zc(YgF7d%GEulA!h8)GwBa!b{apJq7YiD#`Zivse1@)SN;9lbg}uw5YlsT@xc zi6pxk0n6R?;49B^m~#w&^+ZO(*{nVEhaPVYdBZBkxjnp8dh{|o$xTF(2MS}JAfrl} zw?7KuOE-6utU@_z#>Iz-KKHpc4ob{@(lA#(gQQ}s>TiU3;r6wORFmP*dBUcydcs1ZbvXng0Mh z1bWym#~ck->~V=|^+e&rd@o#eD^8d_bqW5U!?z z(P-oe2Z!i!ccZ3~Sm!YKMne^Xqfac(7Q3>3Oi`3*ih{WypY-V8rEUtfNk67o%uRCl zQsktl@va7KZ1&>ztlTv!E+B>AggoZd-+c45E{|1Xlqo;Kh57MN*UK{;2J z9!RIXl$k0Ly#D}D#TRRDV>m57!U=0(j1-`ZiKdS@BHYg-4}6i6<@EIE7Fx){D3}m< zjvnk?+gZg8QaY<1Cok~D8%?ZqwX%8Rg`{wj!st<1*2R$WiB7TDnwD7WP zW}|+YVm0NElB#sn<^KQ-UoN7&Fl=eHcq&c>nJ5N^IOBN=qa@KrJQ80#hmd197{TfU za&;W6taCXU8q>oR(Z;biNEH$TL0=C%QKXin$!z&vGR3q=7x_jRWGx_$8CTs4C$mOI z2i)=~$@C|w{{Wi0Rzau{%D-^J$qTC&jnpyYPuY%e`R7H*_i*qY947u>EauU)FJ1{G z5Y?}&*sFWbU1VHBFRoJnR=MMndTp=P?{)gY3b1;H{hHNeGS`m}U~8!bW&j3nA%l=Q z#P^J`t+baH3rL#n8d2bsQgnIxxz{Xitd*BVxv0{Lrk)J!2p{?Z$5#IUZXer^#=CAq z&o_LRamv$kTjhV0`0l$)QcZ2RENk?E!|zw zy1{E>V`myiYyC3R@NH4INkLrOO*kJ?lTvfVCe~y~CAf+tDJ0UCCcNZgNFQetj>_TO zFNX1(9OF$==OyDYaQ;hrr1f>vO0et=x^%BlwpQg8mhF2n$^QVnui)%kIT-5+diRn% zQ`||`xtV?=m_eRYpa32?wOg5FSh`W6EWE)KDp4P(C zUH9RKT~^e8oh;GE?yRwUWFsjA$AAx6_)Y1aSe7Pgp+KXF1W?e^jVtz3o+ns|65xpk z8uI5)A9gvfll!|qLl)m%vDezMu+i$aG;YIQD^}*vQfpVNO-7_aZA%2xSRsjofPkpO zW2?=a+rtQ3h+In>7oj{g04rVuPd|~~&{Hx3M8q0dvxYq^b?@B4{M*yv` z-RrLL-YY#z>k8Rh2XVNKB8_2i@&sbaLCu$A*p2(UcI~1#&WU#jWnrJe47%IHBOPiv z@*@DD%sLIL>oBGWD&rvn@T$2h$$E}xEQ;(~jTXtmnCJ$b56G_cr@ zU#iyEf=FvfKPl-?Z0rUd-!OxivZe0MwVL zH!%em&~y}DmjV9VOAnp{?!iiwcTx3asv+GV>P>$V?|k!)VOXdq)C|>1s>dR#-EYgzyAQk zHzVWxuk$r;Q{&!g$2B|AIe4~v-;4GfVtP_)?Fiz6-j(-1A1txi^O89tlm!eOTzhG; zwzU50y0nbQzh4B zTJB{?w7a;zxVB%!w$k2A@F^Z4Nyu;%_T%ZdKIIx{_=?BJzChM+y@Y$&sol47^?Nqh z@%rnsjqhqJ$*_-OQ*N@vD@i+7j=KU&$o~MzJ_)y4%qDrREuP}vKp{uvo}&|>5Kf?= zioH!oh{$8uU}>6U^pG_39_~KON$B<4y)PZr^WI0xc~2JmTKdA!iju^EQCf;03>-2i z%*kZ58Yxp!2}bd(*jK6s#)rqdUEZYs6PsnvUIHR*DTNQ1q>?_)Y=u!!ey1u{`j!_SyG*V#|M5nPYt9dA1Lvxg03IJENYK1r#ouGjU@ z($?|)olX5Ix95;;4#6dnF44SZs2A?GV+(~K=FPU_6xT7_4ycY5dZ^;AtW+ue;8)j? z^zZ=Ziu+~$oqp{h)H+o)JbWks&YbvTHRljFEZFlNNv6Lo{pP=y+M8E>>@^7}zLRNM z)~e5r!p&W5%TBd5UvI#|LLVh;W2sit&uC$=P+ByNs~M(Q8c>|YGN+9&{1GQXQcWPR z<^Fi&-R6gljpxXGnmxbummJFAN3#v3vomdNC5AFh6G086Nlb`m3O&V)91>ZMirVV@ zt-1vy_UDOidJ!v9zMs?d^TsprpDW`UlcMCC%_Dz6;`^BE@+Enl>%Ozj zO47$-q`npGSuG%S63B=`k=)>QE4X&;!Og{$yw%)pB255f$1|x#G9sQLymO^7CK;lZ z4SKZDQ{PJCpT1At$G7?8TgoEWi#pC=cr4AT)50P)VB__9T8L{@c;lSVZEO+!gprv0 z93Hmavjof9Z??@*b#9j{S0hN)*5QdFnS#ej9zfR_&Du4x-&R=InC=?TupC=LPfGiA ziv85bU~PUhO$#4}=k>gzd0OO8z*x1zWwqGR4 zLcIE&1uu}#6R)ZKr>5goLyGauLroete3 z(Z~w`)zvJO1QC%7q|{L6c^YFmEbdIP*YeWtNQtN6RZ^sRlEd6FCBQCC@9m?x?aunk zdL7lu)*fk1^F*5zW0*wt6{`CX7)kq_1tabC>KAm|yS=(414*eh0YF12t!b4;bp2Sn z?TH-0G*Sf;Bdb(#8cj#r&+f-UNxa_P+F4!+ZuF0}OEYXCNaca_GG1AA&#--_7s|ai zWV8POPwqV4KG(PBh7NYOcfV;_M|U;E_M5$n^x~E`aI68znL*CAp&5fuhY)+Ovu%5; zuWdcN7aM)r{%S~y%D~fzBQxf6^T#cJZ+5gl41B4y_+NwE<&?B^J~5YbJ;>|LQts1n z#x**QF&53NShH$lV{0LMZRHvvnb@v;yEWb?b?*&a?EFPUlTFpnGAm`IBpX|m_%YVF11;#`a z^}KWBj%T;MmZhfR{8rD4$rBbYdvmasj;maPOqOS6W9lO#9e$%jx$JYSj~&z_qDqi> zdU#XB(EYgly1%pC_UnkD7ITK22aiAjRb1t&fM!V4Yo2}-#Y1iV;c^PPk+HAAW#hNy zidC^5(#@_xEJ8pTX{=P}YUtRrAV18*ym9CFk6ByJ>X!Cjm)T>4!(Zk+iloz+T!{7@ zZmm0OZQ3o)@7mh#>#~9s0Wdu_KaBA-*%OZ zZ2tf=X=fneu3DAnRU{A(wxf|4lG6Nx@#P5WNulJtX5FzG)(f)VRgP+Osm{+Gab9EL zUYcEbtT<1(#3$ytvsqLiz4%W3X57AT(d`Y5^S>3_10-xmv{2T(v&5m@-K#~8%KFk)rfQO_Q^(W=4t@gzdz)z)8`zcXFj&2q z+01n1lDv^kT~>IPBDGeCx`CGSKDg-@w{Ma?4yq7%5reqy-Jvx+a+Z|v1Z7_gv-|N^ zvCg&s0FtxZxfHgPt0{XSKbH!UzG%``C(2MVRN=GSb!8uIT}HhStPzJ0H6O53?ZrLU zeC@#Nav9Wc1OfKD0qzF4Z5PZ@Q+elm+N$Ng*_Zl;x*;TDMtFgWOQ1s0I~;b%A6}&n z%pDpzlC`dA!}Tfse(Y0!?py^}^wbqJ9;DCz0MgAjpB(He@;5_d#tVQv-&eke!bzD#y{Bl|0mzKEa_!+e}1% zs`1GaGYBG%l`L))MnBYPP(1v8%tNQodPP{^smgeiKJ=6OpOMI5CP67*c^Y4Fd{D@$ z!^rrKrk==^zcN@Z3XTIn1bOkqL-kh5RtaY{gOW4<0CEr6m+QnOznC?91@>EzaO+Ig zoooAimYtNZV3&868nIr61MZnJSg8fNdM?_Y1Jrc6QZf~coWJE#DeWNQGkr&U($?^; zp#bq&!4>nVTe6--PrcGorzA*`*J&)vZ($v479ZRoMsxP$ z`r!1EK^?8Ttm0Ne-0Bb6(=_{V{CmdtdnuaK+9diksWQfNd9SXu_SX(4ugJDr*tB;y zynU{-w}!%Pt$Tca4|1uq9(e}74Ti3?Z6ET;NBd=9o~#d1Ah_A>?FH4d2(%Z%T{%pTd*x=B#~or zRqE@kgoL5{M6)4p;_ABhdF|_EScgmoYK7{?JybcGKZS932G8{t<|85bfQx}0EBASn9G+M;)}BR zTjJ;`qr>vg$I(dk+N0^Tw6?9bK~^8hlWRN8#}b=s@7g}nw035iJU4`XjBKp7ebeRu zOAD4oj=6?~rS>Zu)^cebH|c6n*-S>Nq#*Z{;6bR zrb*3v)T-A2rsBG@}%Buc_47M7cNX4UxQRX*X*+l!s6xcg;pHQjFsqzX|Z zc3OCn4oCK9hj+eP{@rJS4{PRlVY5hyE7*^ZU!^5R`?9b&)eM|BWWj8GPgSRB?-h4* zwnqAo;+%PSP-5C%;rf4Y6gKd~PcZ{#J@v#j{{Wx<4W(4HUnjoKc6nY^gGq6?W5L-ZGTZkx36n(K+>s7whKUk;&LP(@i4*c zG1D@4cXTKJ0Cz3Kk-8d^0M}EP^-`cxnGCTmF30UDnfFQUqL!`c4eL~3pc5LkMF`|; z&lUSrc=oSTXG6y|+Wt4MsFO=-#=f?utW_nRF=F(!r#>PuWtoqR(jNeDFfq`qyN&dQ z^K+8o>RDS!j!7NXLHpWCEi5BKOUE2(pq$7I7ODv~ElfgRH81mBQT^!7Nb8=rz$Y`xu?1D z?3!P~nw#r(n>AZ#S6f=lHd&fkHMQCZ(u7o`o7nc%Fr@)GVpz%Ul!gxBOSYpk#63Wg zM-NFS;`X&#nFCBW*!r&fKjbaokzq+2O(?6Qnxc_KM>>I3qU1;ci6+?A($<>XPf)Fz z)6>>k_nglscc@G>^xdagIYV3CY;@XNyp^s}VaA#}v^{cWP{au42tgQ0hw9XYWxyEzV zw%$#(!Lv0+6etfSG&;fJThctK%NgC@{p>Gzbg(O;T7D!MX+Bw3EJWxbeO}{=ZY+yp zDC)+#)`SU@Nw3%I?bI~v)s=!ov-kq?4>gg(U3XkUUbIqs^7`Fo_!^0WiBcis53q!s*z;8~m zmo{S%jM*yp#wBUVGCanpL3*|g`)K;!MN zyA5j14Y*~KTO!X|DGgSD=3f_ykL5(MNhtyX0LqPAlKkawr^ihw-V~=iXSR5v z)4Et|^nwo=B=_&>OTB5B6pB9ytT+$%XURb8(IEPSE|W{8*H8+P8^~-{ZFdma)t*S>d(vyD(;DDI`N?KGEj785DcjhJ zMkldR>(!OFeOSpGw6A*!DiKv4M4ujb`ptLyjriWJn&#&!MT;At3_Mih2l^!0b)QtxjlK}{Xg!hqar(5iK?0i3e=~=>fkAlWxD#W*cP*g zZPwGOKl$p%&Wq34?-jab+GO4qdmcKR^LQ+cAZaB05ugkl565~K6vx~>;B<8Lee7_Zy9gzw3SH*@?&Zr z<`Ka?yy=c3+H=l#%`I$i+e3e6zh+yved{r-u*l0S^;!u`aK!+VxD0Wgruz+N`l6|#=~O`iP;SCskg6&weM}@rfZ)iZxphGr%i)K(zAL`iZyCI#-3R0kBI!fFxKp6gXCzoTivXY%YM4us!-pP zKa90vDI~GihA^)9$;)71b>jWzlXqE5Q@5DxV)#mm6ZT{1U#B;_S7pH?O}xb=nJH_bjMh^eD=&*lW?~r|{xSSVw|>0cI}-JM zHa1fittx9w{q)DNr_>(ZP$a$FZJ>H^0A@UR9yo{OKixGw@OFM#V)H>9aGB{%GQgHw z$!nt`gos&m{s4SdMmPr`^*e3)U%py`?PSAIu9|TluZ}9NzOMEu{I%R*k|iFZyqdqR zn9A>b@x;HbP=|B8S?f}DpH*hW*DVV6%?X!h`B2Qob@w7{Mv4G4c@@bWY8SFQgjvd# zwv4R8i~t-e4LBUC0mgD)s@;tHgmKM%7)sS1q#gxoIUJdXzdTP{{^2+{2k`e5d&cv< zgq~Cbz^su)8sxB43D_<=gKzZnxO1B3*-V;r(@K(8z~!I5rx()wN9?%aUX|)-3|LT= zp#zH0`bUz`a;777zub=ip;z*#?J2yjUP}lT!pS70mJ$0WKISk_lVpF7Qm6WJ-4l^+ z(Kw7R;-RAW1H=mFKtRQOe^omi#+R|($JRBe;Zt5Flmz=laAp4Kxb=yoAC*fM)s)VQ zF`0=zMh_;9*}LP_yL~!e{i)odgfoZgD`W*S^UPtl`pes$YKa4b#IFy2E1U0@K0D@> zmX{-ad)JD%v06(S*sjg5xf`&|t8GD8&#A63wlXpgR(oe_cV5LQx!QWl%=%acE2((U zfI#*TE8uwIn|$xzr~SbJwB6*kHoY&3L{>3+i%=3P@p_GT)N-aV9#x_E$CNCSYxXg5 zO_j@PYHj%Dyvd>PX&Fp=eF3zCTRBXx@`3`)ox1c*k9O}(l!I{_-P-|1Ns9Fqe}Y0a zRt+#Efc8ctZiBW{; ztO%tL0j7sNUR39aJ->0?9j5|Ev~L>~#@!RCXxbre?l=6+0wao-76Zq8rdaerxMnl8y}Mls_SAWUfo>w#qW0ZoHsF9 zM=G?B44O>}va+2(*OBq9L7^NejIVp`A5A`^OKC3WabYvt$8d<|bT1o9%JDLW^c^}V z11km<6g9^x>_4~L*S8k6l=&{FRTP%2jb_VHO686%b%;l4c@-#ZeoqS6ysm%tmdz=K zSynPapJlN6j~%|)w-Vc2NFx9`G=XMZ^XRsMXJ0o|al+%|%0USgJP3osdi^ z+OuAzNh0tHz&Jg~I2Msb3%~q~?P*9Aqk5BFI>P&If zCfVfa5}*ly>WY)DHdKvSDe2Xq9YBs)c@M##I3q|S;Fk8kitQYdX!g2|vWN5Y@edZs zS(UOF_5&xW>EAt>qO#tsO5-yqkwG5CiL~dIOntb8{{Xe$Qf$tXw+W<0(?}W?$Y)Jb zJy>U4z&yEUH>CKV`-IfkntnUMK10>W@vOGyp)Z6oM$;H^JW$(cE=r>qi^b*`&N~y+ zH+|LEv&0v0y|Z*aa!I+i_6r3QRLM}Qr-(GJUU(<} z0CcWBtkmfB{CAee@)sMbTD3bg_O)r1lTOQLx9>^k|Q>r``Y zeZ>vaq*mLMFqtkRr7I+oKBp=83yKzBc%^amN6<(tcK*}47P8BAvNNnUvg=uE9B8FN z$N<(5lAzOop{_Znt8xmTWYhfsejhh(l){4@_;`(>GSu>MoZ@StvRp#=fsW9>MN}9Ow^2T1~_EYs+W!xc+ zR{Hz5?-pV|mR33AniCiCFqNxb0gW)j+8|>#nh7Qmzxn9blJ*)_>xvb_UWnf8DXyLu~@s8ZQjC-QSLV3hm}eX zur)pS%>MwmUye6lD@XCC8siXFZPfn&+$RaCrE8KR*7o*0O_Ew^ZRGnkYgd)#ne&H= zGB9vD-~AZw7*3=>QIOt#PZmQ#PfZ4o#@8Y*v4Du5K$L`)r=eVr8==a2t^~iAK+;$ER5-H$AG( zDB`-fw?!@)YdD}~A%WpuBOZei?spF(L1%W#P=omm@USXJ9wZVm#eCQManZ+O#hw-N z7N1=~z4=>DzOyZw^`0Z;B2?MYhSc^dL7%tWiI0D;Ua_|S0B{|-5=Rel+(6PH$iptT zY`Cz}Km>EA8Vqo4D*T>BS&iW@syo}G*{ z85p!uNmd{&Du@8c4mtVo#^338_Ve`{v+gc0_X{&F?JO$@MVTWCs!LRBA&zWo%kRd& z$#%aT^4N4Qyt@-__`c3vpB&!Cwrg$mRwA8jNUb1>&3kq1DxZ28kR<)Ff&m!)hw5K% zZBopee&M3R@o79w1N5980P6LT?I7~umOTr(ewBAF_HCPW+1gFRZj?_1k=!7XHl+yx ze=fYU3_0<}ik~2H%5~spn&U@cIp8vsR@!#xV_k_ZFRqPC0=*dc5vr!T$RrISnHuuO$G85DcP{MnH*-9D zRg#J(fNo?tjI^yZWmBxweja%F@BQ=qpDllhw)#10Ni=+(^X^sKVv|>|a+P?sFjIx6 z3oLrH*S}T&0894`>%0584djunjCUsCp(<3V(yNxDNf`{mrFmBxAFDfV!`WSm z>ux5N`ddM4lN3-0)XkWtS(C>+_~YS6yA&-H=~`7N6ZxJ(IZuH8Tb3iu7z|+N*S}w7 z>T@f4i2&tVexaA$kANg;5lmpvSMcS_?cvhXX#B87%_RD*$ zwjUx{m0g&RLI-}nb^hS5opx(G2U;Z3RQPJ~$JKw@<)gmseY!cQi8@~VeSJ&l%0tZY z#ElwA2e8Jt{vT=B;P{w8KfSv6`dFQ0>7v(Aras#eMkvpa2R}S|)RbkCJ23~ISXz0i zv6T^6$r4k_54l_fW&=K%Kfk0<=)E@-BP>Xya(b6EIr}iq*3zih6p)y$MvR{9u7oPs zK{xXL(7r#F8iV?D_JYZ$Ee8y|nb3;Uh9Ap*x3?9K97!#M98tJQK#9W>VL(#eUA~^3 zHWqU;ApjK2pYX%8Iw~lP)esW6XuoXcdWc@l> z0@Ks+(~cp_K7`c7*TcgXR)<|unk5q-^=pqTPY{YjN}3^!Vw}q3%6ZxrVBSM3BAfy1 z(+FhN!9_(l_+pAn`JIU3n4Pr~DnqIj?%i9lPL3+QY9g}NtNgo@$15%8lGq<%A7*>` zXQrY67MH0Sl|1b1VR<&r=r?D-zgvTG4Di!Co z3iwDr`x6j8y>rSXckm+D88!3$A3K2;jGL;#@ z?T(sxLszGfr`d;=*<$!W4da1~v$T?jatxBZa-j12h62+?7$!_){{V-tLIa-&ifL@jm7;m%nac)_G#~q8%go590aSyG_dWV@H#&-`&kap9QF^W#kpW+B zELz=s)>7Na6mmrb3`9*Vu}Gj{d}1(4f#nP{gOiSo#u31gh$L6t`elkcz0<5KXX+KD zPb1;%=ZW*LF;-^qwF~|zmIRG+J*x63{IY@k-hiy2e=|RK*F77ulhTVaF-J+|n9Xvb zs%x3y;ZGbU+BRBsWoss_2`5C7!`iUh3b020Qqqmw*j);B(`lXx+nHewI97R0A-507-F6nfCU6a@Eg}B_3zYnEh*3{ zbEwXld3~c67Ta`@eq_R}P97Mp0b=VEuN;#5BhF$NxPJ$1nHoaOShi27&rZb|MJwmy zTv+vD6xJ4_FVj2~YKft11;kQD<^8a$g&+Qu{iK#S`s8$nRwcz`%gyOt%v1K_aDJMXrAX!Dj4$V3ndN?gsWFQwcB4d_T(_i~W=T0COAv0G>W*r(XOMh31cJM`b zSdw2SvX!;QKuQEt_Y;K!uORRHFxymZBl=}|bra%|$J6@{r{A7E&uN@Xaq|6kyKw`hx zNi4J2C}aQA#nL zNaYkc&n~N0rJZs~YhEhFB(TC@rLE(-Sm3icirjHd_oXkGh?D?&%34|5$!QGCaP;MwkodD$y(QcF@zRxNop(6 zYm3)&0vTcq8zT%O8S2M#wHEeodkTW+wQ*W$;0Fp&<}qmz(fDH)e?fbFA{{Z}@ zbHv?zLqEnE3vx@V=YKkUImBjlf@z|+PQM`4?d`(_`2w!Oqkb7JUNFNya~98DiS%;K zWA4+wI~_JVW$fN-rrKDRo-}f-GU5ToH@TuIvRNdelU;5WkdZ(tCAmW2kK)pmK3ucJ zUlrV5;(Hobb+yG?m1;h+wYv0{Np2;_u58HRKJ#Kmi9}(QeUaPi)^_eYZ_Rnjm|9IM zP9UCQoa^K4$E(absb9fd{nh6>=MNboOj}h z^_(fCwJKLwriu;K$x=jrIPIxngo!+p>9wtumFCz&ypYGdTfkPC5jEj?15{=nEed%2 zBj1zm>DfDfd4}DcUM+(C!3QwkEi6QjFu{oMuaL(k?Rjp;08wJ7g`z+|B)B>4*PvQkTkM}%_r39|+nVq93?5I0 zG;5N&$s9UreH^t@DhgvOZEU-z(Y>Q=QU2QFwQZ4wDXfbZV1(uIvM6s6&l11T2(I+69p z_h;Mt-+pWN5ZwI8DL^#>VoDNeP+um_nK0&YSM)CW;eMX>*GcPZ@&Or*GSei0uL@C3 zK<7c8KHYpb@n*iQ?~pI`AO1boTY>St`>jRkd$UlUE^{8NJtuml^Gj zzG9zrxt0iHjJrcqQJAT3il;UOg*nt^N@Lx3JAh0qnNnIcGN}DW!!9^K_iV6e{yg}S z{{Z!=IQ=d?$TZ^K-gijpYHB~^G#F59}`+eBuubMtXzb?b$oqrMEU)04PH{4U&?lhY< zQ7kohZr5i5G~mSq^<=RCF+G^0^R?j0gn&iwYS~1#*V0@>t0F*1SNKbHV+NF_bSK@* z2fGOoVG;*1$(hqk#Sh2FFK3o`f!}dD7=ElT@CZ)~zwHH#`51nyf-)Cj4dPF<8WTN)a5-zJ`@Dj zr}a}6g`^XpB%u@{oCoX10Y1_X>i+;F>g0l^yKy{vE86`%rG^P3YTM1WpM6G+d0l3S zmS1V1jIllpPgA5x<6XAuGpgN`BcA{jSdcuMKY7Kytp5NoC0AlX6ZTUt^T#e+UFC)6 zd`7;y%1>tgz8hL0JgC2sb9Ji2$x*W(=E#IMkdbhV2k+Nvw??Yuw3dTs&z2m7@6w`&jDKr1TV3ic<1BlH-MMH(W}>2lHsA$)rkJ$7b9L&{Ix#V0#ClW` zK&OEN4E_oD&w}rM582%1`dw60Jy95tdw^l@IGNhF5kBjDh-;=eq(A9rWYg^Q z`*G1u^)#B9t!kx?YZraG7`C+Q+Nt?ruZaBNXYhy4Hul7&Tgfx)*OD#8)zsl`l~N=; zc!Jz@3fGS+Xb5*vjGWmuuk&n}_TeF%c`crwe&qSKbdbgchD#*7W$4b*6Bw0|Ep`aD> z^PR@pXuhgh-zlxN_R%zJ;yzuK+wEB*8UEln?r)Ly0^XxVUDhac!k&(3MQS2=EY`EE zL1OFKiB!$CtgDm^z?4z}9Z~%)zP#Hv>GvJEnkkwo<0W~=)r@I1uMw9H9PsyiY@2rV z+rr0nhB@PFiqY%w1!@(c8IQ9Wrn`*kF8fmKBePB=B5K=+t=-sDy;UO-2DL&P31Xz; zCqpg_%91G_IR~$!;`)Kz0Yq_JFobchOOO22KeHb?-hDRh3bUoNwbn~VmDAxAP@zK& zAPNIo;u~ea;McWNLrmO)I@Tvi@6fqs{YS3R$s}(#=TBO6m)|O^fEDk8J9TFte)k>1 zh>h$@$B_}#c@m(HyyHB38?z#nes6Cm{L9?VWB&k`)5G@Sr?46t5lbDO1F~DtLefhW zjYYMNRd=>q`h1lOt;u70k0W;S3+3MfsSDj5=}{tXGpuZK0jp2>NdWuE!^_yePF*_d zVQ;N?eqvUqE;?#H(TZie9~EuXrQQq2_HYRxk!abERVjONiR6|)8CV~F)G-!RY`==0 z-o0JH-QD>Oep7Y24Wl|Hbg2E;C-!2p_vx?GtCF#9dv(03ThbmyAQ~QAD^7gD#YWX% ziPSiy@wT^EDqJ$nQM9@#Y)e!}R4S~}c&vUn5)3~(`1lFbr1|xAml4m@xzB796~{xB6o*%lclbuVZ%7&KmPz09sdB@uEM=QuN%odcv`zU%n~@k44`>40gnA8#`)aJ(c7isH123A z3s$^*e*8NJV0Ki6@1D_xv?Ehie5g3rNG(D~pfJs7tQ(eGO=9cLkVlSUk??*W6jo|}Ua@TH_0gLT zBdwP@{{SkYPdK3QavZyO=jooCJFU(1>1;0d237uJbzZ7{#B;>xdvj*6v|Fo9ziABV zRVLmoENf5~(eYBec~=eW^U9RtsRdp?uB$cZt+Q6wQ&?o7X%D+ltIbZJ5?%Jfr?@Mp zi~Xx8!RZZ)-bo>r;^e~_pf4kqBaL%z6|PuuF752ZV%pl>ZY0f+LmIBG8EHT`Q#1DB zdATj>RcGXT3cCF@mq_+|GK$tCqfWdLl!i!Bi^nXi8^M_oa!2^}RTx>O7B;Iah00SIY2oExemR%qy&mtF(O!R`<-C`QZJ1g2bl3K~T681U z$0M?AEyYqsdh+b+rM8FwYIvASOt+#F*P*ez>)4a@vipm z4a>OgM{;bNjppBRq_afwx}X48)T%%to+BJTbLCENXImzoURAZXK_{?d5?{RVkQk(? z1*UYd?MTPV$IHayIPKTGMcbPUS06bIlqoZTL!m_hp{7H}A2Uhaoz~VS!sh4Fog+h5Baivdb?XFV_h*K zDxC5FXYQfKW^385sxKN=AoF%SJ*WJ!87|$O9Z@Tyh_5AB=p-rSQ~M4hW!X#_SmQrdF`VRpqsfUm`*G{jsHy>A7NBvUAF}~U zsR!@R?ll-`V)=}H#uri>#Y!Pj<&tq39srVmPMnOAc<1dnWq?{03I714f5Q#Gsk6q+ zeW2L!C-_^(uply#lmqGCzg;0J)ftjKzpl6>CrKFqc+)S{L5G^UoQHcMucFjn+)UFX zUeyXuZG@7s!ZD6BULsGSd>*TBw@V$iKCSf8K&PC5Q{BTBTUN`s?y~fDyGx6=9HZht zSwChv3x<3L%#)GvOB|NYw!IYH>TYi}G0JaC4z3#sF3VqTO7W}%Ww5A?997faX7a?0 zy?Li`eM;Kq+ApEn)<(HD?h&X12O@$<$REmHAozigX6-Mdo5i;Mw_WdT8MRxuo_I4U z(pCkdlC{%2fuzG;1du@(`WqhZwM~}H$7SQM$RA%c8mTQq9;c7g*Fz?)=xbwyik0h6 zQ4#%!NM)5ulatrXa&7Y)BnrCaw|NGmn_M%rav2=)s5RkEJTdlkTeKGUb2KXJ9qPpE z5y>G`fLpX^1tgvwX?Pj*VXRYK*RsIam0l@pg z#&dDGgL8uWX%W+JnQG#uj%Wo=b@IrMW+Hh;u5F}zZa873MyD5{KOU_bQIcyhYb273 z*n+Arm0!m8=waoMt4hZ>P+Xb2W%M=%a>rf8%$;#j#PF|{M~4qAH@#TgUq@>^OB6BL zz%9KzL|}uY0!~#N>U{Ajq1xHj{uC7>zV&E-(N~Z0VD~P=EY@bd6Ny|(T6VSM%=mIW zarP5meQj+fsb&LP8lH6f@jGkWF0Fz^8D&LXAPNp-(}g&aef)T0RL{A$W=j%I&_!R} zOAt(m;?rAE5o7n5qbgG!n;@@Y(-Ah^Zi)pYkY)+|K3I8@_U2;pGe-}HiROPyu^T;@ zblgJDmsaqk_jk1-f!e{a!u^e%ITk}SkuioTzW8v5+zQ77>(k?@dAlv;=kgW(@n^Riax%ru8IrxsMgU85`?8IB`r)Oi|3 z0yWpk=0qL5vO&*ol-tH_*%P_8Sdu+UC+L9@ROL z8qMU9M(!r_mtjuC3?z|F%Cjf7$N_-HGuu5u-6MgmmfZkn1D`Co{kXB(jpSR5vs9(H zY7ahoeVqN+n!UMAmFw@fy)^Nqxa8Hu)wSt5QI0fX)+Ud@t%{PutLB;WQ=Io<)Hvf7 z@Wx;j0chUZoR7Mgn=IcsGa1{|t?3ozPCsrdJ1Oo`TN6~4Dxk?$Rdr+~B=CinS1gGW zqWO?W_4@TDF$D6bSD4Ire%wWAK3*vhRxw^9o(m?{y^ojh_u+bZ2I)-#UlDN z>2DES{IJ}&5ol*;XEdf{wKL)Y%kKB#kGV(M{D`l{*pL%a>a1-s5OQKHzUd zoaeVwHC|Jrpa|Gzc$#}oc!XNgWfG+7vM;KPD0p%s?8Hs$l@=2;!g}ZKLT8S6;bbJM z&f&o?5d#FbbC1&=xVD1)qu=_T4&FXEHO9HUiq=mFYM!m7|@ov zeq+deo)~+l_~V&uZOK};&yQ8HQb{6cb{v+J7BdR0vKXPA8ghz`4nQDapP}iQ{;zgb zwYuDuyy-YOEwd0PNFeBNDk;ox^2ECzqF+#MZkj7^>8lc-Pgd!59IKa7Hfni;O4lsT zFW>#czD#orQ}RwPtZR|UHE}mCuM=5H%Nw+@$gsqX7+C?&myQTI>oqUeAEzQsa6x}4 zL+UGUnDQX8aqq^&e{Vliu3=kyo4u~yc|}sUR0o%&fEJl@pu^Sv++M78Rw9aKp=-$)o4XHSKG)$ulDo4sP*n`xs^n$ zXOVVO=``DJM`nN+_TE}?NM3(&^Vtx%`i_tP0NzWsWEwW@w)w6I^!28SFvG-EbdL{< z5&r=F(7VzSCA{4%B84Q^Cq@abv=1Je0jJn1e6SV%9H%Qzukxo5)rx>-#`8(Y_2}@l z-o#VO9MC?-DzHdANt&!*b~|IgPA~TXwTY5n=(~gK6+Jm%nW;m;75!eyj~oksYunsO zF0J=&Lb<7u8;DdIgGO?dT&tZtu=`*Ay>r|3Z)~(_$9aVc^Vx)L%}0T`T~+jL#2f&#-3d9S+l^mdM3{-p}yk~xMVYIxL(cVS&VC#t3g6{lEnU5 z@r-{LsP1vpwEEH8*95-Z9Cs1Yp`*BoGVoyFwy$k6BP>=;^i#Yx$6R{p3DjKixaP!L&?S6sFbGOU6zV~Si5Va(g?d6RT zzl^+!5NE}xJn?DJ{4M_gbyQh6Z_4~*lT9JC@>JuzgH0UuYSd>I7hy)tsqeM984AQA zhudFLz<27l_v@(J!8^ZhT-&H0^%`wH1A=L4F(FZ#dj@~xV&8~cuN{Ylzd?`f`SZRw$k7KhlH{Q8+EvkY@HeSi?>+aNNw0mt9} z0C6|*G3i=uQP~m*NBMx~KQN>3_jAVYY5vt?xu;g|cAEGDR;9UuwEqC87gGiEO(wkQ zk$a^0bK}j%w&hK4%3Gw~X(oMlAedLztqp$ml+W**R4!AkwboOy8?Uu2<&tL02Vze_ zd-dzO?c^6%J4W3u-zW_jUaK8E0ra`%4nzaxg|hzIyE5ZdnBBJ(+-=yTp?WHa{B)+c z!xaF63l=peJ`~0I=O_4Q;+@TnUnkmg{!3A+BhR1O&u)g#(5neJbuKTW$X>*YI!?{>V0M!itnLK)=n zDi(pMP6nBAt}vcm{l|Q16mlL1#W}UFwb$L{Jc3nFJWeK(y)=*Cb#I_?*4J#C>J7|= zx0&|D{{ZMiPq6Yh!0z^6OFC=)4$pQjGaY+~s1Kf%)lc-A@TD=D)BfXrKv!1N?tcs1 zu%R{T=oZFC7(P-#wxi0rla485_V&HHpQKV!e5YGfgatk$`e?KqI-| z?3+H`cOBAHiq0{qiyuZn`d*y>0Cj#U(9(dMOWC%4$9~;L!?Rn+{K7Oj3vbv?!?)+DG4 zhms$w;1&a~gMOoTe$Cx|-6r?4B#B^c;*VUP6t0Ov$JvsPCCBOC(od(o#n^p|4{i4p zmZx@0iKS$>6^bQxs-m%>e6waEwIov$a%n72@?M{j!z}**_TIaKayqu9X$Q9zou#@- zS~+79DVi|q!b~oH+;<@Lo)@vh+cQ`ZrupvSa5=K6t1#t3T=TED8hQ4siMy`Ta!CQ( zp|Y7Ae;Y`o4o0K`eb|Ti^Wtr7ZdnH--MieqPg>l2OEjKrVS{%|Q?J@uGBY%hShE(i zLa3SXiM+cJ)ZO2^r=M;9n`jh6ESjWN$PSE>$sK>xWHcQ38dnvYFJ#$4yDs^Cs!O|g z3^6i_noAr}&dLowGZ10IfLE3@&yap7vBP4ays;FwIOJB^)qRE7S7Rp`y>3;3b=;b@ zP}1ymwq}}74U7ZMr-o%#>JG)fjnYGAjiYjq5vL_WqcT((*1VDVtq&YeKRDj;?KZmB!V7!7Y@0I{+i#}{b8E$EPZW?-*;%LH4bDFatL1Cj z4{8r|_{PCOHWn84n~lTSvj}ccH6d)e!~V*i8o2QwdE&PJ0C2h4?Bcpe+UC`+G{~t# z&?J6T=lB%=06LX4r2)o;rG{;^aq^u3S)jZj4{gptBRoDcPE_^H9Ud zlj+~4?jbg$?YGE?==uU5OUB%I8WWH?ijO=TSLr;0{>DWml5s# zSQ<82JX)sOA2pScB=%Y5iB-HLmRVGVgo#cHk&)26Y#8c@rFmsR?9Uwxuv`jj4;kbS z>CXzcBefJ##V;Xg27F^LV#H}Qwjv3YcJe?8&#%{}+SQrzg^G?pQxZII|@Qs?t%)W6v-;oG^0?i9XveyeQn~VavC!|;cuqzu>SM^}E+0dwDR$-QO zs0YU%B0s)Al5g#K=C_W;y_QI9^Sy#$eFafP1KM#8K?-N?t=DW8z(z zmNWqO`-s8u$?uO|{d>Z~p+sy)S-A?3eU#zvraobYph+u}qNCJuC;WZb`$7Gj!xppR zTC*ckhR)_gdi90y_bh}Zg0saGapV;pv!1>!`qOtk$9J?cdaa^LDsa-?9^bbgqd!3Q z+j~!^@f28u)5v9a9Q~j0$6o&cP_UqxZPzVsG@0Ut-<*@H{{ZbVKl_Q~zKTYF%da1& zEfmMMsf5NAsA4(!Q^yiQZMvyyE#)*`K_dK#<#k6@3++b~QihS7*{{WsFv){2RC8-u$GW%;KQ5?2yD2(Doh9rq6kJ>BuftFuWjEoNg=JRpg3r1$B+>Fp+{VOoZv<>EYiv7fr#jdfkfpmJR6?aIHe3+v=-7VFrB>`yVH z?fY+D3e~0-T}&+k89kprYrJ6$g^pXx2d3`r-YsR@Qi1^T6d7S{@8FeyhCU*?zV3Lq zSesm>a`*guAV};k|z>MqBE;5KcL19 z$hjo8+F?Z5zXREm@=ciDTLwrlp4_bqEn|S-f|&HkC#kW;5IR{%I)@x-piK+f6||DJMvLR)<%nnH7VONAVzHCh4HUA4w-k!bvf)xtUb>}rlRhXgGB6KF)>i5? z#B!(U`hD1#B$^OoQoMY>R~%U>@2wPuynN72#9M11#rFW*~#ea{Fw_5l`EO!XC`jbxD6 ze|jZg=^0qSEHHgKjHW0RoKQ7=)$zqqFEo{D7`e%-m;=h5bj5@7tLv#eP(u_o*<=jU zRc1+2Co(2ME#(?Bc!bFSjOV{iJa2Z|q+serXgt49ejkAn9aPCcp+0oPb=j@e#fbj^ z7D%2oV{*lxIa#MDtr3g(VW_3T_@3jW47vzl6;~|zeV^xogY#KgGXull@B48{p8eZ5 z3-qc<{s`MMY9t ztx{UnL)uw{bmVIC0AuhTSsv6-0g!zed-|MpEv{r!q>V~=0ngd&`|t!kH8Pbx2OJ6g z+5DAj<9%fIH4+fW%#t_cKe)lu&N*8ofQ^h~_ZjQhKA3i_J;`*j&BUC=c~IlbzNL5G ztgNpQwaR+HLsmUSopuXzN&BC$OyWSX<|lv#|r)Um($`tT?7{W$D6`k%sQP#7$S{(xsJokSN{N}BRK2h z{{Zgduxwi+%EM3fSc(4tl6fWY_Io`M_Ty##*fqb#4@$kmiu$sQ#kne38uG9GFC9h{^RtaV+XH;vo za}35=mb^n&OkOSlE%fvlt9U+I(k_}BA-Ehk67jJEj|DZw#A`)poP($meV#at&}nJa zmg(@E^ zflf59-G^;l$X0;YkJ-oU`|#G!H`tCfcW9EyMjhz6a%$Gs+)u}AbA_>H4+L+?nyM>= z2P!_%>(iEdR02qJ=8+FU_MRsPavi0kEda)i@UHrht|Fd`>Q`5Bb*5CgK-}ERa-6$~ z7|j_s)=^poJ`x6sIJ{T*vO2EcE$$(^)2~vtVxIp1dExBkh{sh9lU{!A80LTO6{!4~ z{lkB4UmR($6}&$Z61~6U;=bn+uHk^|b7^U6;1I zgM575c6R`CCToZxkIeNXQ5ydM5*pA@<15@>F85nBL{jAMF%W!JA-HEg#a&E%m}9Ux zM;X&`E;-LRR+fx2+v9w5b#euo@8rQ-W2;hYEys$xdv+GnB(ottU`9qW+pjpYm3Ikk z?Jg9E<&Xi#i1iv%E>+Hzr7@_Q=0%7ZAJBYjLsO5Q);=uYy!(s%o5KD?<5oG373BW_ z74CL>I;UZOPjhRn*6b4YzQlV1Bvd{m93M}#?j7f0-!|RfV3RI_QV8k$MOZsyqbzT(&}wmtGQF4b`knWC*Kl?0PQ4N!q1>Gf(= z(m}^F{{U}Wu5raa8-tH-{zIwHIOoG$`;z=gLyq$LP-*#R^bQ@&_H;DkTgt1MT`z2O z72towy&J-^$L+&CRc^gIyzVyr+qxHW+w5M#>vG%eui8ZX+kel2WR+eTuc;&~I?JlD~y?kFfBk4mq60L}QgcbNL5TsQ7RD zp68o;(^8L&e{H&s52^En*q>v}H{Tv^?0fJ?@M*RvO?h>aUijPNek}V)h)hD{{T$oT1{rI}3r>bnRN?eaEXU#+dLcTJ}GiJtcV0Jm)AXJ1-K@kY@|)#Xl+txZNl zjRC-Y2ZmjzZr?j{U_r6&JJ?n>6ex`1SjK<8udOLvN=pJjH2W3LIaY&jTGgu@x0rEl zv^2D@KOooY?NF~s`AjxeY{wfFxBXrnDpU@T%R1JTznc*tp8>VExQcCN8*>c?r2zh6 zBl6fD2d7Hq#2m5hcHKnuqD3XWO+0B@jw8gM3T4L})$-bId8Z5cCbsL9)A<0&$831X zD2~3Uo3~oDaq4PJn1a1UveL#8ywpZXCBpS-XEb&<(B45DcJCW%W@>_<15yF6EP(UG z`)Fa36t>V(84U>MPd|Mz%^X*7Hv{7SV3hY4Eo*rd%?BZ|KC-c^w5g=ma+v1YElpX9 zzMhWCZA7vC;H!z3%obd>k?qkWzuTda3VgJ08s+E?$l^X(m2F(|1fMv!tWV3M8bI?p zsq;WpzQ!Zoa?2W>yPR8l7Ru}zU2hxR>cZ5w1xmKzGg95{?X*%&J6L#b#ar=YXxw<> zTqsbgI$^$I31N)sduCvD4i(Y{gPm$AUwFao=pncesjU?LvxyUTX{zBnL!i+^Zg?Mx zZ6w+o_M@@+S}s!_#!Vz}R9R`Y3wr277Me(;j4APAq^V07t*-CT&h19)3Ioi<$`lU< zIaJf^#9R6`=qbvf-JxZC23LUf4=n!X`YKwoRMd?5;te+3i=BLx z@l-m=E^RJ<-rS2|8vg3Mai*_j$8S`4b=-xVitAbk7FecH&Y>~6!g&45-ZBMOUc^C#_sB3G(~SCApPeE+7u2&pGuBd@#1lje{0&lQ@tEQ zg?)y<{@iXKIIU`0k=|<7wlyhg>_G>%%VjHz_T(en@kbFd#8i-a)Axne+h^95lDBDa zt4|`&PjM8^xTo729qV6&>3A)`P+xLByXE8?73Dq!^7{2thpegnW5ON`I4ud~@lB`?H}`gArdLvv+8 zQK7h^K&u35-r*#BjKuZi_OnTCey~j(GD{|43efW$y_|9Aw?Uc;tLT-p72-(9`!SH} zBZHNEsqm-B_N#8AJYQGMctbQ&P}M~@9lgfcBG@zyAGclL*=kD_m7Dn`PnTNOGTL^& z<*-&IlIG&t=TIV{;+(Mq%r7299yq1D+7eCn!*z=$w^`JWD~Oj__cDRyOl@4=w(c!v zi;nIisZUv3kLj%F{{TKnqLO1YE>nd!?)WlIsw zEMO&>gT_lpJHPRF_3PQAfW2v&lTnpw4t2+xJ>|8^lOf0*Jot_y+-rw4dF6_h9VSBJ zT2Yw&^D!n1Qdwk}NWHwI_YM!Ipw4c+&&QC<6+4_4T(d(k*74gl zX96J?zLn}!iJC@+ImW`v#^zY^;n?Rs7(b=FTk3 zNCT@mFRiaY)gq+JC!Y!o{4ov~w_7Thqn2RYeI~yAv00ms=xYys=uC;Ufn!Z$?RFIP zts=%{dlJ!{7~#J+h<0EI%8V)P)rv~;WF;LX;8rD8_cp4JZ8%~x?oDjwNh8#(47ne@7uYkpWX{Wzx4Xi7- zqe$#l-FR+mL8r0Q)V1uvJi3b&-ckAD2v3C4H@L3kuZil~)>|k{cXF(*P?E7dI&AHi z=6?VbBAn}p7u(M5Br?Vp+7U2SV!cghsxo*qkPDy1T4!EV!gcCzjdg|#TF3X<T4qLBl}lY$=wh{@@hVcDXX&i?>0)Divx=&8(w@)e-+7;+xr?h^>M zQ)=weR-}-`0ZN@!H8jqrjw@Vyhi!Ecd2H@%H+FS4u3deO_D9-U7q%Yhn$&fl$_5fE zEJ`9@W+=jh_PVjZZLaP^@~kbAQ9`R-Czu4&#A2Uqz25fd)$Y;mX16+)MwqiHoB6a_ zW>tIjfPg1Wu$pV=-vje;LDBd1OZz7mlq)iZH3>}r%NztUE9w$)N zo}F3pFf-`(>%Q0Qv{j^;wOZKt&aN%y@EuO8QmO3PXf+k#qgK}5%0#NxZCST0oxEN= z4y3$RA12n9vaB}l{Z=r>y=Ilbr~8WP5ytf`7LY1S4~rEIecTPY$9=cj^(KbiI3iix z{H$9?e0~YOyy$wtY%(hy3ZF)8^YhQ6CYtvSN48oK;isnl@ zDNz)k8lq`_o@Dg`%EH>}>7Qzfa?zR@H0eTlv13JDMyJ%njd5>(+?&0vv~l+Yw&@Gx zsTnOV0>O0CTWMbfB7&T8NtL+#(e6JEp5twJaW{t&&S)4)vYI#bs~m^ZKk$8giO(RF+3Nr@iXMC!Q9H_-Zp zpVXNx11kpGRw9L$n7KyPz@$1fCY?fb!1t9YVgSC zj4xmDZy4EZ8;x4!)DxM@vA?OU!}Pj6w;{S-q>;xHY%fqX=)>*>Y-E&&z_gB_5;d2d z-+N~h-`iMB+ag9EuOz7wn*Ib=Qth80D^tUn^WDF&?e`mq>@PQXhjBcmK2kWOm;k@^ zB{7hTLGcpQ3IQZy*}DGMc?>%B+i@u<^Ee(^YkM`NhebV$QAzDjS5~_@=!RyR7zo>G|=F7I!OEEO+Aq*5(JwOwrbE{B!20J6H!kh0 zL30sEG#1DoO>$%8Do#3Mh*j`{Dmut%aBeMeM6Fj#Qk5Q6$=Zy;qD`L1$MWH!3!imi zQSOEANXQ*|hWmAJ@7KO*FSnS^O(3PMxbcmC8D{e&411St!wd=XRvjI;w-|K@x1?8- zzY0xr#6_3#ICHLe)}H-J2VMBzkxH!c)Jn3$0@OFQS7k&NRNq%sHeP&d+`|@)M^Op2dg`4pj(sLrVOyhEttrG64WJ<#8OD5Jl7-7Do<{o zmeTOBlRlF-m;`v#*WGDld(4@g5?))}s(+-u4Ga8hO}BD=Q0w}u zEU5LM2lAwx$tuVILf#|Or-h6!{HYg5jYS8ITD1G|8TUqxrK4`8a|94i`d21zYJ-IA zMb2$hf@RQbYb5&`m1?ELmW=nz`0|Y*l}*oVIWE>^i4hgCpDx`y6`t0U>3gJUG;3lj zk`4?qq0WMWr^^gnUvCmyB#C7xjLD%xDHUoOs}3oZO^dg`JwS6**N#Y-(sIIG+KY7;@dJajg{|RmnMKr$MLQ)0g^neLK{-v)D^C zvHt*1O>8z~_FrKu!{&(R*$@KR48tX~Z8lrA%k5SXHO=BN5)xE^sw=65Y6Wtyh$D_z zbAR4$_HDdwJEZa2+fN#pR994m{t+HTF=e3?CnH+o(Wv7Z$Z43bS(25TEl-eZX4uIt z%6myU6MJ%3q?T7(G!V|wM69eJZu#%jOY8Vrcj&4yM9@N1C@Yl!YH|aYjwJ2dP0SER zE_#uNaNx;F*oFYq#t8|T;aoDGis>P^_V2FJDlr>5hMdG*G1*3vIFbp@E3KJOnOT?# ziw_?Wk}18dTZs1gY6Ciy4Brp~ zP#Mq@?!{H~$#Tm+$8^(fQ8(rYk5!{eX)M7tX%!$>AyNk%DOz4TFtb_sha$6MRh@h8 zHX&VWASDnAbj*1WJ# zOK&4RrNlRVRUs9~qDsb$c+sos<^ZN9?a#+6%dVpqifuIOLV4{)buC#z4KN4&G`39j z5v^=kM1h$}CpgD`t5@cwStLSbgq}S8{QP-h`tB<@=87xLaY)K2po)8qY2)w2X0B-O z*|qIlg58>S)`s32ltp+bvmCHif(Wi6hzN|lc>%i?@7_-19IFg^g%piT!_+*5Yx{9k zwFr#Tu$lBm)O?PS?aTF76T61j*M>=ak~n5ytF5ZGucFszq?XN}8C&1}o(XlE#|3eN z`(j!{b1M@ORFOwA0j+6538+3qR+y8z{Jaq($V{=z!ivNY0VRO~l*=<(RDoPksPaxJ zdvOM*NwCn!wP2Z&jSE!l*k(wld9P83PHntVE)k$^$QQ_vPgd7EHuY<_$u-n+lEhK8 z8V(+w9{T6U6qY;JZ{6LcwVbf^7ACBE*HZ*5@bdp)$$z)3{ zNGndT-WC|w{HWrUrmTd<{lfi{H`-2nbs7Y?`P6;VUX`M#HDE;ti4>?6@ffkVmMM1U zv)U~spLEx(q5@k<6%FA+Jp6nPG>Lv%`EP{Nk7KcJ9mr|Ra%&LS)$Y?%V_&U!;xbgZ z4)QBCHlK`<6@_GxEE2;qH(A&1e%#)fqK)q2lx6Es$o2jx%YZ!2EG_<^cL#0S{ME&+ zgrTL>I!t4DlZ7PtfErU=wCV$$aVY-)-bcn8q5lA9e5a$==^DdVsXp4pZ^0L>$#NgW zYV*>uKDu}*$k9nVv&N&x>x0v6^pmB&Mm2Hi1mjXl{{R&79i2rwjyK3H?j*LF?Vh`BuDMTb z_`coIQmv@A5x{NgyqGkuS^c7LeMF zBU<$%QVH~`6l!Om6PYHt<0R*rzn%D|)?QP`8lNiB>2*^GbvAX$bCvQfa@ef)j=F}H zI0D#$D-O}eJ$V>Lgk_r;)%N;!7UggKD)32ZeJkWd#bHdUI=xDo9ETnxVfEk=u1 zzv1!;DDn+-ki%JP3;MmCN_!1|y(~UT?1~9e(U!{Qi+kRrpm4-~Qs3fgF`GE!{MZDYz8@4wWGG56SPegzIF90O0itVLcRjL@NE-CQo zp(exdhYMvm?iDwW(y*%@i-}A~bW%%Dzk&u_LAvP>i`ffwM*Kaj@nmli7Gx7?x_7PgzaY;WH`i9b-&weQ7scXT@7^H}Jr;v-x zo}@0!B9_|H@)t{)k-9{OiYWrH0hB4zAS8;YU{avHF$O;6mh#H;cCvV9v9(}l2vTQ? zs?5nFu&gYq80M!~2SsrgM}TlkP|3--gc{nDT&wwYxlWi|ib$#MY9#Pls#Eb}*;Ti$ zvaKVd$CB6$rb_PHtt>S?p@Z-G=@8nDDooFmV?zq6cqSH0mxLI zSix`KR(nUcZDH8A8Qy7a5C#g;>(--5uT`40BBZGc;46+SvQD?-F!*<<-M=WvQ9eZZi^t{Jq4YuQWN=BlARf{Rl z`E2e)Typ86w>^0I=Y0CQZnqilHrp{QbD>l746-Akpy|A5k(nXq)1FC|wKUFxp#K2e z{{SU|rC9iH9QecI-IQdbat;s2?PxbP)Mn@73|8nZv`J{1L}Iahp={er767J z?mLaI;fCUNc+>t-O=HNB3cFCRtJmFAk`dDF8a3{_AYyy6`5#l#AEy0-4cgu&-2s_RGfJ&JjOX=N z4Nvu3>UGVVSU%@)ZQq)*tEur)BIC=5_TxXj@*l|?KNxm=vzJ(b;t+lNn-4gq2e!Ue zjkso!Q5OO~KTkqEPLdwk?YJfDTG`upjVq@~@Bj*V<0&V1_l>|?eaCaYnH6-^*pfv_ zsba@G`A~UcuXZWz%O&|X^WU5%SnVX89z+Y`1QSRn_R56+0Mz=MrG^;OL~)`a_=<`W zeb}UVFC>{JdF7K&;dUen_*SRw#Bxl&#Dvqa1;zj>%R0+hzUAx?{{Za*r1u?6jwFa_ ziI#-tUN~vyB}f5*{a9E?(c$7OlA-?q>~NLwZx13p)qcnA?fRa$$sVc_C^Po^FxVFg zRF?RUI-fp6EGXZVb>fZMYg0&2LljUqxY^IzO8K;pp55?&LG|gDTYu&eMLE>aPO zHR2(bSvGq*3pXRZ86n5?O$?I7JR;mA7M9Y(66ZK>>U?v({Wg3X-vwV@gm~qu#!o{{U?tP&?U^aqbAE*!yg-B1ynYnG=aHTQ{#h8l}($ zNzQ;DsGk{pPw~gYTI)K#6R4IAtd&J=wm1GC;;7DsPj&K0) z@xOU@_j32$%ANjdTSjXf5mq~NHOS}&q=h9;qQumiju`z0`g!!nvwoP_8$QyrM0XXE zc_}5tjm)%+1pztHbg0WC#}}=0Rrf7difC!g9k;H(kYt)m30!9p(tInIw;PxcFfK(dGp%#g&cA&zk9>o)t-xgCd${!*OEkHk zH`MV}j+`Y0J-+l#Eo>Os@P-{whMNm9CzfQvMIFytor2wW=`Jlgh>dG!EcIf2LLjVT zS_Aoys0FPTBT_Mn?z`vhua(@4Pa<94Lv5ufbTq|)k+l)|Yo@M6TRfEF-38mU{nrq~ zR;rlmrT2G99>n#(BCM6FS4&@xB5$#pPXU~P^vnmhidF!(`>r$udQB^z>dLsC)w>Ex zC*=+e$oo0tQ=z(T)`xMamOW~2t4CF+Cgs@>C7*WOhF6*?R?ICVWq+28Je^RGTdKLN z7T)D2xK=hSH8z4ObEv7UKnGzPfm3-mcw zo0;qBYU9^vc;y(YCm_;Uk6~u~wqt?hvqM2FR+rn;9f^g~K_rb^+a$ySx}CkW+kN)g zG}ppOcZmn0MW9szfIEuR00k(Z)|kXiZMns{#~#(uk8FsRmI)9$l51X*A5M}@LNg6D zDggi-J+n`3TXCojx*U6JZ5CK#t*)+_fjd!Tfo?6 z3xl4dzT15zgx5OYUXp{Gik$c<0I5D`e+x#Sv}dzA`| z$v^b<^Jvj=f&ub5>^h&fcK34K$X{=?+^%E&$=v7iIY<;xVChk179+|O;f?i*dS z%4o>*pmCLQp`rV6!{0W4exDxcY)PQ_pGU6dY?SQNlaWk|{T7|pjxiL~THOh3Tb{J) zU3^NZA6~t$vi^f_n}kWY_Y|^OjbXZNU2HrJ1t>?K8gj>gcfa>B+ja-~Z)irFlg0|P zfDv!1hMu!RO0^hJ9vJy&yXQN8N4c}RRXRwv$wPwY5))4GY5-5jsM9*LjI{K?@ z*zIpR~N@0Pv2ESnsiE1)$q ztu=eAjX%>%t%~QmVI9JWJ-Yf;9n>$5VzuY($K4J!S3{_+Q%}V;+Ko<{3IM~c)#?RG z_5Jko4dYrAg2aS4`-_Gd9lH2$b-1{m;qGtbdyB?kLpc@u0XgIJ6Kaw>coNTP0@lVf z(j$*ne$7A%bIgk3;Yl2)*=F>V{0M6@*GXcokbe-erby(q2bW+~#E5WlfO@H$st5%@ zAk+$R@*aHga}XCWsvC)2P!LEU1tjySuZZXNVpS{Lj#~Q)dwB$Lz)Wb@XO6NvKk{BH z;Hx^yM~FfRL+jhWOq-ib;S&Y0<~E}oht^nvNA$&F4x<}2-{0!~G8w6!6> z?CWQ(VoOm;e%z~O7oD5=^lYmlPZXK{X!i(l+v(A*t*|{vUs8A=299ro@f9^ylib$)oSoQD^pm#qQ4|J1E4I z7HW3tM`}2iUQ)%X)|7Zf8~dwjRW(2bSe!m{*mXmuNSmc0R*O|h%-0$ef(!UYpzA?U z1uI_;IIjNyU%PT2z~%n{kv&+{nXJJ^SS%X?GOH;tp%v$1`H?bWKDf#1OqP%&=6iCq zejwNG@WZigNQ7HRgh;szxO-3dVLxI49BEDFz5f6Np5w(yqlO@V92nqcB-cHUmJ4*; z&;)Hq;TW^E-L9R9R#T_UVF(flZJB2Lk9tyMckxN7t%Al!AWT=tq>Mt0e+EBJn3~v7 zyD$m`dHtLY9k%W(h~y9$wdel;DEsSQb|lsWhILt4p=8M}q_4f^Op;2%AvA1;GyDN_ z_LH8QTX@0-1hFEyarSc04cvDX$(5i96f%=g*_QWE5lmR)FAM}z+)=St!CMtrK&XWI zM)QDKj6*rXuy5JaZE%JO93Px`m;V4N;<*g>QnTG%%Ocl386U9I52!!1JkOC-&jX%c@MYz$3Mb#4i7U%Y2(_43XD*iRM zkxJ7$qC_esB(FNFemrVpl1~(jcE^bG9=$>~F}j^Wf}DpAKcK|Ow3lB4yh1KK@AGMZ9WVbZYg%jY9DE$XXBzk4g6o7b)JGSoj zb4XG+5;Xnr%c%L0T36YK;jrdWu{5k&hSEhGF^In(%4lRhLUStD_I<_13V8?poii*! z0m`QqYzP)0>z{CT)wZGJU8-2{DbBVpdlv65`8ue9Fz6u&xe#en?4ifRZH3D& zz9Py)8Z-X@(}+W_gqX-yEQ86sd-n7_eUlZtfR)lkGUHr)Ek5Tgp;wyJ9J8tYn5s;` z5*dELNL58tiF1O=KJs!-NhkH{-Rj(b;74)T{%05cvo>Lho(b?lwB9HQsELw^^cHR*Yj#&## z*6a-W;2aztz9Ihd?myUVJ2WLhUYzbp_;pCgIA^QSTZJ^R&ZLZe?fsEiO>=j<_Y8oU zo=$@P?H8uUPmtG7XgK=;{g+qTTC=>^T8d9;enQ!a4EC-2wNiy0V7q2Ovd1^O5u=1C z$G&{9GuOr+Rp+#cp@!VMOCH#oQj{ZHlNwf_YNM-h;2X-nV|Jp<(A~>%rAyzCIR60C z3Y0$5DhG!e9I*lMFUUJ6HIl44%O1?U*W?KG7OPOPcGabiZyYgCatl|h)`qmzYOxO+ z#{MLDhVRsk`)Yn+waxb~L)&5eC+JI!Zb6jrCSY1bc~g^^LDnS6<5!9989wK6&d-cDtBuLO!QLq!ys12R=2gE*|Vj zv~d_(pVQA4OPa*5qP4D<@piDpv;Hb1mSRgj=$=}F)F!e`HHw}~pKXegryaZW7S+@Y zB%+n#X`h!Lepop*I~S-Vj56cg%GSS;>M06yK}tQ;$t92FnBtIA+3c<@X#7O>BC({` zDFsUuIaVODg7)KNrrt}7h7U4|it!401H&_1Mp~ngK>&}_@5VLqHz~Hi-RHtrc-GQN zbLrdVjzwo{QgI=B%fWRVTT+X!nFWP;qub1qLd%8r^PHS@pxCV<{{Y*)>7^QOALQZF zm1wsOJqh@8Dy%3^#60nuzlhD=J1h=`t)q)^m5(K13`rS2G!i%`$A&f!l4jmP!Ff%q zJ6+7Xeq~bSM%3496{4Q>du>ey+-#Xj*4WQ#dqgUP1UzJ6{JO(zhSpu`+olv*MJocv zv}z*~R-bigjn(|ZO9>J+kMi`;`1*$oSo!9|S;qLe(9+e^t;(qI3!06F`)L*Cn&oQu zL@BQ^$+b#587tYcL&p?xc;^I_Df+B@hZAXYKK?(;dR+;0uKwXg7%2hOzRkEQ4XYg}K|avmvTL$j6bO*NYE z?KV@>u{=p&w6<;8lV;>1mhn~Xj>E4N?j54eP1uxRj}6CBNv#K^cyp-~sK=mLNdEvP zluEY|Pu1-4$Ip-N!b$f302P0CdaVM({TGWv$7@p8S&ggNt5b|={yv*y1y+{VnTFoI zWnewFQdF<01Fv8DIBo5_yR_%HZ(YMnrOraK8@(eu>y&5A5l%SrPph!adGxcq=8BB! zRGM%x+kBXiR1PQB2e8(d>0Vc%i%eWt1h{n@>D-UY!1`q=N zW1wSAQO?UEii({8Fj|c1T2xaM4tm?a?L(aKACzwmmd2m=GsZQ46MU7Zy$6t^%zik~ zZ2A8H$NvBzYb1uxxv||2D_3Kron>(1DWWLF5#nt(Y$SdE0I}Zo#H-PtVQFt|nxyKt zy_PsGtfb<4LU9eubf{94BQZ?>0C$^y&iaYB_g$!2A?^r`jm%_IOx8B9J+;bm)?rC) zZ&vfG9dm4+i2*586z9g1f~n+SJjdubQk??VAwCUP5av5c75^Exr(o|UGRAV3|bBdU* zCYDE%T&G4x42{hk;PP0X<84=la`vF!cW_V zuOfE4jE`{V!~Ag4p03?0yvO>oG`4Bqg56E5I#%RXHTuU1s(KWu$hPY2E?2d$o<|YJ zByzC{2j(6v}+xI#4o14QO z8r*-BYB#i~>Zt2<^mZDk=loqPyDgJYkHQM}Hum6oV(#!Z0++*h-^F2VzB z*~rcaMyUdz08fv*o*uA`Q2ufCulWAFasL3zUjG0L=06}-ZFH*otqN@y@gR!bizZ$* z9jL`tX={E|)+a&Y-b#wcBsZs8?W)~3O}fSrAXy$*g-vJWI$j2*}!Xb9m_F=sC29k>r8 zu%mb56#?#Ipk8_x=!Mfsmklc%VriWxMo3WgO}nA+;q)lX8!(qLIh=kqZkHam>i%sFNLmK6AM3 zw~cx8I_Y;2A<+Q>GAJoh05zpXejM?>x0V?MddUHG3biw<5)NM9yA+-?&Ta8pGM|c0?`M0o$$CC+;K*b@09=74oO2m* zr8(0b=zE~5a|b`L;eV2OmcN*7b@XfUI{)r;gCmtM6Sn$>EnR9nARuj9>5ISRuR zY{?j3B_y+A`{{U5``+T#+qY{g4Qp{5cu*G8ooVBY zZ(*s}-j-VLz0=#O(!a7=+%&CLjQNdf)~!0deVwYXFi$Du_MI59Uq4@TK?F4FM=C7< z&1;YpJS)V5=Z_qFhUpy=LhK#JP0v{%=TCpL6&r85r5#Fpy~6oLS@g!lS+!CPjIu>4 zMIO$jg`^;wDA6N^VG~5L{eY5soo^g-JA9OG>#JV?1u4K*nbcRq6?ZrBLV#a1D$Fz- z$tAegD&;~jrjK)XSIZeLSJ~3mPfj|-BG}cNTR9dfVyu<|-llclz$Rod;c@|N^k&8* zU?mM7Tk%oUpKu1G;vAdI?|LCsWrs$ZvM?UfX^_RH&h|R?p1!)FOSGh7ne&Q-Ni(di z98VRgVUYP_?pVIzkU-B+qJdaaLONvlHlTb)RIj%jZ|))u^6~1W38rA?26@yB_~N+L zg=N?_j^Fe<`+bVt+ulhp>~2kPR&;+8dG6Gx5gIHgfGVKCU#YkG^Q9uaFC}#H0xHZHVuiS ztLI+iE+MS3#VMM0_Ry*fk?s3`G7A8iUHT#0g>DEE(F#ZtgBL>L;qI4~+$B z_8eAsJj#7Ftu+nq(#W&B*vhrFy42cjVVUX0B%aI9Q(Pmb95v=obI6E8kK*dy({GOE zIbPleNTV6CWf@dv1!{4g-3`Tr@Y`NX4A(NX5-7t;Nu_Ab8Wdc)mKavYC9!fUu`Ov; z+QgM$OTs3G#NOnQp|TXPP#Pk85uewoNn;#x2aWoX(=rIBv)hRB+`0-~+ly%%B~}Gl zjVqCADF=-!UKwS9i;!yW*P~kT)n2<2Eyh~)=hWDxudobe$%d4$`*47sN|LiLe=KB? z(?niWvIqHK+-OZQ85&gZ!aD8Jq3acEm5<<3rN(EEA)gakVhQHCTD51lrt?jOsU0lo z_e-<2t%A3`Bv!Y!Ytwr1#3Ds8#|pEbAPLAlS;useHDHzN9!8>ontl*-r}}_CSfZC_ z+#*$&!yCaMsxr7F58@-zPx?t1t<&Z8>{?&Iw{F2OF2qFEO3G- z%$*p={V1erit`8sef1diACmNyDo~4WxX^0t?jnZXqffc5r>kx0MyzZ@OlC@Ti zu`5UCp8j4q=o@C-rMRV>Gf5g6NugQP8dUm#p~#L05?6oPt?k2K$plw2pm^3!l1NaU zHPX@44M2?Zt#MGjpyNxmv&bx_zRT=(o>6TnZ1vjx)U5KuDW^+sUMOza_hm?yIQ`c0 ziHIG>Iy1lCJ$KD$V|+Hz%)pmCVZP;oe&ESuHE%o4r)qR1Ybt68f?&!45GBn2Gx{51ep zrxO$EX4mVRUHu!1ZKQh^VU~LDv5dpSZC;L67Q6*CInS zu%f0>v~f8mqdj`-Pj)3639aFJ!3^X(0_$+;s))^`Mh2C9xG@5N=S+KpQPlC1vDNAL zzMD@h*uA-ut7!x?q_LQ+QrKKXzdq_P3kj!^M^aF)gLxCwZT9MW=%SYXW}T^~HIrO| zJn9}4)RC*y(uCzo*A_jmw#96(W3@uImkgq5j9nBCt_P;#dO6YtY=b!lOajoHr%K{e?-g#2EHSbY4~Qv_ueJ`;?%myb z(yiUFkks5t14W=@DMBP-X`KrJ!ntEB+}-Kedjh?!t>)jj%N|Q-1c7HVaXGLMs08rz z&~oNr`1i;>cb(mNcAp3C_;k}S6}LOiRb!IZXr!uOGx$RE6IET|lL;7tQxoS09mR&_ zw_WVPVYA(>?~=a^NK;pkBrzZQm)nYMqkG!>f>S;I(|fj(Juft(Mp8yaWd&J%qBiiR zc$Cr6(Q!GRZY86kxY*nGYVJ7=`}13|B`9Y@1T==-@A*}TFN|)Afh17OR1To-H#d8j z>+Vy?mXQxaROvxVRDtmxRNJ`SAA^xgFwy(kx&hI<>7&` zt>S#EkXW||5uvQ#YMxO(+DN%R?#{0Lw~jg6T|XeP9~e_AEN;dq<*vm>6sSH?;h%Qf zcGC*n>f7fT#uhjtm{)|RJySA|aXbj7W>kx_Zrh=fJ5aZ?xm?yTqB%jLX{15mMjHTRRgJ; zj?KE?SSI6rc9Hh5P+AnCM%<}FOMod(Iq^Jch?`$=ZCiHa`)<>>w7uMeRXTrhd2e`IB82l|x| z(=Hfvn~2w4Qhm=dt5Dgk?&~V-7Hd15vc{^BLq|=0(e7O)X$Q2*?IXxe1_2QtZ%>$e zUA`NTq3G;~Oh6yRW&PUFdrfJJ3w`Q-oO55#Vbqd3g>YU{e{fro>vP9X3Ia*X6-C>= z&8$+lx2p{DR!X|+8`r0-o~MPce!bJJr8JRJhA0`7JQgH&Tq#k41jn_G#x!W+mPnQ8 zT{@BtL~s&42Zsb@{wm}vV7+b1W=Ea~rIm7yLmWjwCpLit80u?9)(<)g)Yor(rLu!> zQ;ciwX)68}&KRKNFIpP+>u21O=E5CyZ8hm2*FusIY|pcVz5xU1EQe~^J%QYBqLy-3 zsn8{Y$x}hqr14Py0H!q@GUtlc?~@MZyB(d?t+Z zVf`BHlzA1-PhXGTu_f8|H7m~~oTBB64)UT(yKRk`5V=bpb4G-g`w7QSEvL@Hx7$26 zEpVqo$E<~bc=~`R!#^A_+oitMck4pNs{TQ`@&XcAN@sKTesZfjMP|b z@oqZO3zdRjhQ_B!6;HsCq4#Xa+d0}O_WleC%E-Z_8FlKnZ`f|8mB!;dC{j)WR|iqA zIMAIwDhk(yK*i?e-kT&aq&qA(lOv*%S}4HLsA|pJX^@YFw6Gl1jAMu;rM2XnJ2TL; zPkTz*#&=Llz2(|_62L2irsV_kPOhqjBnnYi@n-u-2&1i&!xhbyy@+XJy0>HMg#z2i z5AWORRgt-VWQ1@$a>tuTx*L1jtDDH-p33EkM3u?7jBrqs1Y->V&!Q9-)Id;iYlD<5 z++L3xt3B;aS|TM+1sfmIl zV=7Q8WH?rUP*vD?~!J||-O5$jN` zL0w+VtIrj;z0tqHdnh-Th_bGig%&eFeWcR7=nhrIW~3Z@jmc`G@ZHT<-9<_rp2D{7 z^-5bfqCb~Lp2k{n&@E$KY>D^Kz=Hb z%DAG6<_(%|kg=KztCr1@SJL^`tYZjE8dRY=dGf>VPx4HQxu>Y%%ffxhC59cvEBm{Y z?F-3XHAehevoy0a!io%$Gn^(|1Kh>hyLu5|_dC=VE{Rr0iXo#riv0GNvVN z{oQ_VA+^|~wpP_i5y?jlN@S$5V@i6m70ZalTyq`OZRc)fnv*4G~ZInD^?p zwmWxewd>8f8SZaRQMn?Br;r4U{_1$}#kY3%r*Ym0qu2xxZJ>T?sdQ&PI+ORI$Rz{L(mPr(x`1T!G+3dEK zQ#6+L@alYnI_e>7S^!3sH5^bV@;pU#_jlgk+ru5*)T*&51y@Rv#8Ry;a>%qN(EXs79^EFTRrO1&v|8A zn5KA~OQ$OA?oTM@(^=mCbbqLd;31avech0H-`yo1R^; zX{CwfuJrkX^T{mhY+9{;$0L%H(2!5DNq;geSGO;^l_B<^M@3M+1%a&_1)4mK9A)5^ z)8)i&NmN>sRW&5Gd`@_s7klorbUNlBu-}`|$r*{-V-bX-x=UBLp{R&}H2`tadyYBt zzPpxkh`6qsLGm9M#q4*E z$hz9?+j+RT+V{(N%Ik#!t!QY(M4^f0=_4X}W9aSIVEUV5+?Pq)_EsCuZ{5lm$8hFW zr9mj2Wmrh!z!q%AHFq<>Ox|g%5{(BMnQ{}CGF^}pk#rFIzv?BHva(bU%@pR+FX0&J~74aM-2!+Xq0CL3E2e zqzvfBipDAs!K=iOO-4NK4#@4zmclDd@&UE(XzeY%-rll786=bq8kTO1l?8fy2m!`S zF&|Upir*JYs^itZV%^C`p3lm9{{SIyJ@+u#%?*f=+Lqs7A#dn}OkJ9HVhnBW1PU?K zi92T3yF~kh`!%7GNGJ`Z!a$~(RYq(GrkWGP99PBO`_E;pJ8b*)@!Hnlll?}*TedaM zk``g@h+pc#wR?X(5mb0R?YmuR-cTgNwJ!(yw7KkFmISi!iC6%|Kvg|hcO;Nb63)YF8)ch5qXbtb zXysZ^EJU#ol18$X=U#Y++6i-NuefhptM1nkE|h8QmI*DK8taszskkDvSET{qDlsMU zzRh^{qTeJ3CNWSY7kaaLLztM!EP2MhlIu`#pls9z5fL5JFVV{SK# zw!D+2z

    9yv&OHn7SsHAW&p!9K)^t>AnEqE4%)gyna;txvJaQXrF~#N3ABlk*d1+HuG1A&fd(Jic>9>i^O<< zdyi1O`cL0G@wFFdZI;kF$1lw>=_Bz00iYfxFs%7&Elhak-}TSw_iqciZA#w@@V$F; zYAY#GN(oy!5y4!tr{Dt|zrFtL`Qp{v@!yUs*W&yF$+{?N_tD45xdm7*NhFh)xdph= z>%{)#N~_9HKQUx}!i8xEy4rw$7y29y_`J z0C1hv8eDB%n5|>mGHO+heNxLACxmi477?hZR5c6AoH5FBSX**QX7rNDa!FcNu^=-@ z<k4+8d4YZZ@RjJ zlaHwA+S(Y$QA-vdf8B_&&vfcFu?D%*^y7;K6{fzIkCOiY69}?_iOw>`TesKLe$Jzq zOI4nMNyW4>NFrTKYnjBPJ2(DhW@u+blK>>Cj}H~jRnTDfKAmv4RT`9lIoHPqCN~I3 zp&-*gW*n{Brc_so!AU!NRoqByeLNN9mJk~w>T%NPucZw<$pCw>)Qcn$2`2QR;6j$K zunhco<8R`B1oN+w#do2kvBx!Y85HdHj+HVMQblV1ZnIgD5FfTEVxVc^_AH;l?wa=b>yz#c#KA(3+_ypGW=Gwsj0MwSWQN)r3GN%tbZ92c~wdU3v zyAEk$cZOR5;;XG{mE?xJsEaj=`)Cuul78kyJ_iZ|lh!Kt>dZZO($?6WVuU$058;s+ zX{pbiJsQL4^updtiSL4<{@@y2DVQwE!850-l;yQ^*icAT{3MS)FrjMFY1OUq-AL7 z@tHx=hgDZeD3g=1BySc=5;9 zmOFY`D2{_r-8mvMrO(>C_CP=Wcsq(n%P?4PY_#T?{(!3r5q z@SP(P=ZYP|6@ujhqQ0SCObH=}nACH|Xxlp!wwqY0Sb|73RHciNam9u2ZYcZB6Kgh9 z*#sYxs<~J0bS_fr;ck0<1-|mO<6H;+xgU)SdRX%5 z4_7+kj%~U~EZ#2SoL=nBaCBVI0SdDM71a$;1k_eal_Yw!bF}TWqiX}!r*=zXyn7A3 zY06Jt_J~uoscOd^+C!bDzWj7i9o+?pC9foMJOl^CJ6q%fO~h;^kkQltsVHo;ynhaY zaufqV_$YBA<875A64}l=Xey0T&k+OSN6o_ud_=cjj+0F$r@hv-twyHzJmdSzT1&e+ z*6DLTBsNvfy5!MKVm+qrekHK{y(YxNNn*2pjIz_W?x?X+yo@n@wBOv?ZVsCj)C+YQ zX_5)FRDnhiTlIifP@weVn4^{gjCdTr^I>JV?eR(6_R z_%;IX>FwUtb2*FhBa~ObUQLk8GkC~q>eC7ScY`5DkA@W}@ z=A2h$szFlc3!aUxC}=||$F|g?YSv_}E;~xn$O@c?Am^{GJ3q6&ntXz8+Z;A`amb+c z_4RtEF{M}qK`$c{gkem^J}>W%^ZKxNC)j(+;`+w&C(>-*HihG$sW}qe5&r;j42W~m zbkiL0V0&)U&2}3GX7ZAI1?8G)F`UZsG4sIsHb-8ZIuJ+F9+BXOLZ9_2(NEu=Jc?)} zpHsOVXKhS$&@u2~z^{?P{2D*yw2vbZ_L$?uKo0$|d`3s?=p>ju3C)I8J{aYSb9 z=}d(H9#O3jf2&TeRiQX`q0R#p@EHYsfMy_mfF9lYWt&$3J=k`K@n!C&I-C1j)Hc`T z9b$<%$Tj5rg{!=yB=Wk(xob3J_8Jc;zv2=~g#8CzY4tYhJ57o}$#c||XbePBo^=O5 zuw&JJmRsCicNMHiEeZ(;9azx+0P#>0?I#~%V&t5USdJsuO|Ec60+8%iVg#49DX zf)!9FAB<~;Mu%Z5J5ZS#1sA^P#kE0O_CS@5W(Ftj^E zPI|R$);gux+5BqM+I_0D_hnCY>ey)3O7)AUbsl~EPI5X_+wGV)=7}0HUobdTeE!_4 zhTnI(SrKNBrv%110iJ%nchY{|z zX;@bm?AbC~lg3wqHh5rQqB^blQ+Zm5W7otUnr)`@sv0p66!Xt7Z|cMFZ`O9vh%O9_ zn)Ld;U=AXI>INlsn=MwpvFT-&H_jwPt=N*SoF0C%z zIzlBe^UpumOk8dETWpsdXylY!w*WY0;ZS_|;=w+|*ix}ExJjLjCCc%&;_%F@4n zSYc;q)rCoH)!z!NjE!kYomwduvfTq9%8S^NGJkhc;j@X!SfqzvFl$fOiurd-l+!fH zKSG&PPQQItmG=xIPiWf6?k8D*RZp`zR}W}x_AxZ^qg$sM2Fgga;zxOX#SII}s7m;+r*oc$ z;t2GB1ZJE^m)nSTo2=qiBuEtIE6Wy2!h1A`{In625y-~N$z>&ktb%yujnSicyvV@p za&w=hRDv{cVn)&j;UkZRW5XI-TbquXN@R#BH1&d8hY_A6p^6x*drN9?^B;5GXhKBK z{2)m&cOEz&P&(&FnS`vGTlC|f>cbx~3=yzNNtwCu2NH1Ig&~3;AAZ9za9&+jCb+;ZKYIc#qk<)PnW)}m4|XOinH_S2`3&D@^Su1j0z;UQqxNJ`{{Rv1 z{(VH2NW%`Bg4_mNP9BME+tne|M>0?N;=x_ih6yZatbj-zoT%=k{{S0GJ0AUjKeyMW zRT)45*k@i};ll{Y8os4P(s&;qal-E#zk?5MQmh!rr}(gN4t>7kwlVb`A(Atf;=rM{ zS3P2iJT&Ks-HI0Ta9vy5Sjxr`l*cO&e#R=H(E2z~{{Xk8R(=b|^!+@rW^F0}V6l!G zd_1ZSK0f~d@+BPWq?T+D7Igv9)=v@cKcgr;`~7hR{nItZ z;oq0G5*K?GdsqO@s-o7{H9R#Io=5Q1tCt%7uzzTF)|OvPHrZ5#mU!ox+JGHzcW|`x z3L#Lnsi8HlRQm({q&FX>z_{dk+EUowZ?-(oad&kjj!PRmb857UTFazxku{ZtRs5Pr z$B8}3>*YVF;`aM|x#~({wv0g<45)=85dsGgNU1d>5_n_iy`Cc$(z9gUSq$g>O(T=T z@cKN?XFeF`svDg~-&uN=!&75kiL&II4P|<-C22OQ+@9Q0>=(nqDZ^In3u>so;aGxz z$IVFAT-)4RO9X;ZB*qxyl#(=p5K#E)(?V(EOt9A5a4wqVlrr0yOD#P3`?Ul2R~>us z-y*LE2l*EE`%6j+!%q!uGVJBoR@>axTZ+=Pjdc4@I|~$dtQ3j-KOz~^BR(TOf4xGF zxTh{hSk-CZ18 zjP>PCALET;=EHc?ODLo&dCDE57UjKe6pl2P5mup2c+BaNy`R9hu0}zriFWslMNuOt zBo2A=%bqzJYMRo3{i6+d-y|As)Z1Na=(amJ__g@;$!0Sg7G~JRDq4c1HY?3hwsP62 z3}MMu46LAFoWr}@(rZS6YRJr_f^ySe%%?n-gmSMeN_GSRE<(Jx{{X{?$31Ota;N_7 zH2Y8cj^2xF!@dLLTMCRVPtWt)18lq`KQC8Mh7AcoE8PNGFv(wPB~kgE6GE-Gvy*(L+Qq?+zMRrW@nnp4iW z-7j;^Zy=YAT-@!)VtlC=2c9PQ?fW{e+tcYSuQMOg#LSyfA9l6up2hR+IISij4^=U*@{QBxhdQS}3r zI*tPnE5e-doZMt+Z0^7sW>{c$&x0{zK~7XaDaM57!yi33g{|#qH}*E|YL%)Mq0vx_ zR|>-wL8sMgrIy4k6UQ~{5!~2#j}H>Ef=)>5+INWUg~V%QLkUrx$Q%igjWgk-P!BA5 z?#Fj^(Y?I7G>k|QRd^4}T=TA6&z?Sz{7N_cZ{n|y?P_4Vv9y)-GFOjpQcKTjIX5qE zNrhPvoTV7yX7=6N-2*?xp1g0ln%4WcF5_m22_dqPRD-2*(#mKu;A>t-9)YsQacf}; z${Iz{#1WlIBR_pH!u*O(YkT1D?w5VcCBD}Ap9T4cdw6XlGQGQ!%eU}2oI22stGXm` z_?A%|egpt9>pOh=N$+0RwAxu3J8SDTQlrup%zDWjY621|&CO~!d3SKfe{b~Dx(?wH zQ9YjH>2qIGE9uipb8s`S!o2wF`kj|3*#7`zTRN7scdVPgA92k$^*IHHzp&X-+UV=g zzNoJ)8gRjL0Ion$ziF?#9J0z@X(BNq0?nSYS5a+IeOQRuNU?>xnY8i&#H^|a%9>bt z*1lM@f*sahrPkK-t4VkLIvC4ksf>LzYW@$fN zk?PlRZph1#^r;O}YvgjSDSp3v#CAQq9@>UY%=a8i8aJJ#+Q~*;G^nUi`@=fcnC{cc zcAQ$CmvyVvah^}dxK}9SRXHagnRXHAc9f)o%(2kDXKhNtTGTDr42~sVVmnbHHe0V5 zJAI|gh-7Dq;%Hus#;aI`Dt$Rsfv+wY_af8F8vzR=O%MWvR00N;2lup*Up(<+{^5Ro z({t;){{W6OR3fRx(?L&NvD+nS?CP|;U}#=WHA)Abq?SaQ*yWN|L`0?{K&tF=V)pNC zow1_c?&VQCO-PqbPfV+Ra)bDDr44E4h;Tz8h({?bO?6kowFek{zaa8j8rk_|THRC} ztA=klHrh)i>|Jg4vgYP4J8rB-^{;Vavs&~f2s3rRSq>hD!XVn?y82{V<#cm z?x>m@O@7AR3UfiJhP@|vQs9s^b&z{F$sJQAirT=|wo$Q{<{28ff(Bla1$cAJcvC!A zOcq!4$5&xO*;EcA%DnNH@!ic`CepP@dPZb3dP~=4{}05K(mdZk~Ve2 z{D#m|yA$j7bL~ZmU~@>yvpNE0?ht7f$pyS!S*^@vwH1y;nzTYQD?%EFHD&gi<%xT2 zmiG?eht{fc6a$FiUU`exX1bqzZvkS_+)FS1hnGS|!5VTLB?6#PO>V zx<;T>Vs$BE@f+(qgY{tS+r6-ib*=;k;)|_K9V0gvm8&lvr=Pb3na-X zAy+D$BjT?gaK-mg%l+;t&aUwdg$+A2%dD4eb72=P*xa5DM-7Q;Y9XVxjvAZDtbQyi z@0W-xmcS~;rt-qO&5RqISAArNIs}Y}m9*#;Z1SORi1AUFt|dVtO$pF_LSy=83zMMXNv=knTy;24oO900=mh9oEv}TGyrMKs5l>6yz!w+raVThz>up zryiOcaLyNFC26%@R;t?&Q!!VGW0PM8<_2(TS#Km_LMoEPwlQ6~iJ+09lt0RXS&$So zQfpGf;>@08dE;AY5V(N~>18WXh=EBX+t|F4U6Q@)7rn_prq4APWbmvW03>O#WqM;=`{*`gJ=00OXNE5IK_KiWa$`Q&u&v zvo9VP^3SaHu@1<*l^iT_#Ssii_>9OYQSHT7UtXLP;+JK9&d%(07%*JI)RMZ9#b{@HMX-?ii%RSWJ;jjzqYF~$0QFFmG9TBYA1Ny z5aI}ALxPwdx1()|qBiNOb!4WmLZ`J#{{Z~Q8L2nRrI}|euz>oA^|J%u+QR2S`-{hh zCBN<(=`4E-d!2+ax-v^aFIfKotDeF}_3T<`+8`kna;~ZXc2VW&)Ht@osi1`+8GKq4 z5$^*W-N!6*{LS3c7}w%fb}D_Mxr{4&nd@vpUK-b9uLA;Y)nwXUEFnH+;gsA|f?pN% z@A`DM+boeY3G1qvWVGYUEEVTW zESJ|s#WebhSKd^DPwc}zPcsVlO*CITf9VKUOHgdK)^ z^mjV|a0AEcU&O4zkGi^k(S)<_+o>dWONT{qPMOXj{-r!ezl{$pNAmseAqhui#%$_2 ze!=8jd)M>U(z~zJBTFT@>#HR3*#+DPvO}NwiRxC{wb)nM1UEZ<%v0Sv(Z4P-V_FlbY7aUL>&Fc)@@{8Zw3Y4EuPidyc;XiHu`Q%%W&3=V zGw!-57*Nc}N2hM4#k6+RlLs#-lnM$vDEkEgK6tOW?q2g2&29y=z{C<-D2XP6J`@Mc zVk%FOw=pZnV^vnlMDUb`?R}kUa7$iKd0*R((p8Hr$1182sqQn>rtLkRVbn{Bl%8Oz zuiB*It-JfVVAmDRt+b0=tJKso;puPy%fgsQe4nyd?MEdV7Jn_C#fS5-?C&D@q8Q3X z{{W9w&yt~Hzpi>YyIXGobjdT&=a{8F%rblXauG{!ExaeKCb9ys^>~A;FJ})dFIVM` zMOq0WMllG&h~t6j(|}?pf;gg8tOQXQrEpbzOL-iUJ9N~&o3>7;(txm`C7QITG|1(j zJWICvo!pklAx6_|hPp#4d2wp$$e&NYmNV^)TqAY7*z!H+4zah~?W3$VZ);&+X0m=X zMmU03nliN`tjFAqV#I3fNd%MDhS+ZVeWF-e-UzIbXaW`l`4e37=5zC=GdDYrZrxr< zxl3UzyNs==n6k_(Jt7v-9$8~HD-rhw6j8Hgs}FdwPw7Y zHrfD-;HTLNHO`ZL7y!!bcaTQ9EMP;ABZ1ssowyyP`G#HiR_ZRq8fFyOFxUe>@ zB$k$~6`QZD5M?y+8jn)7r^40uW6*3j=x<}SYm3WiF5xtcwaHa0N@;l3HI6|_{9>oa z7n%8F)y}f2RHoX>)NI9K?xuYKlHS7QV-2}0Q4a{LV*slt1d_y$*Q#p`oh6B<*2e6) z{$y^nUjb8|bjy!CX}2Edcv>rENLOuGS#?3sdb0u!mC$tMQ;^eMAmc7OTD0e}ep;I{ zvBX^0rE0|p_7PTJ1gzT1HlU>~sn;r6X^=L4y=$Sgd0|^ckq8HYT&w%l;teUznDdY7 z*3nA)g~Uuz>7)iI7$^!E)ks!jO!B2DDTU&!|auw-G0%Xl7(S<*8q_aZ`J_TJAJwhi#e( zKqeXOAz-|P7$Ugw__^Z02ERkbl1ln*Wes#zX|ZTK`& zM9D-(BSfi7V;s@e$CR{WwB|N2J7l;_q3`7X07A-JTgXGJYG86EnI9Tbhu?^k-QF0; zWziYVgHS(haqT6JQDbLL%`Sb(<=3o!)YJyMNGZ_Q!yatMOKPbM@tFWn&RgvSfrH8M3VI!)|KgvOHcIa9CGK0RyVur&l5|1fBi638nMD7K}vzuIvTnD zEkuGd#%0N>>A2hi{2$8@!At=FTspaD{NQ6oI_cPhs^=S9U1;Vp*Ac$?eFUC7k4#c*VL)`RlnZ%#l| z2IGrWj!Vk+>#b{=eY6_(vmNMUp5#1laV$>A)#}9+y@Xp?>R1VqjTm_cW*<>Zwi`8* zND}JVuR@xY)iinKlO$#^f7al8>5KO69scShlJ?T!Y>b+Mnn5d5lZhqkIPwZlyF4`K zW_@ily_;b2#kjEb=FsaU*sbk(w8$a19F@lAO>g2!7)cx~r9+og7|5I3$sN-Ty4O-n zpq{Je9JMskV=Rb#Xh_InySe9ENS^-lONr@NC9hF zx_Xe+Z|T>zCAS0_D9z1yweoR+vVx|%dkSmRUt z2@6nVPsG{t#bu`PG`8kzXg*#by3ylRmDqeVXPl{_reGq|4W6k9Qt)DTdN(znb-kO^cBk$_LmU+;kdq;3?dGkDzT$89~Ke@P~K_=98=j@ zvoc4r*IkCKR%G`fT7ulnNU=Sc{{RsoR*J;VqA-AA2kYOaq_mQREa~cC+DT>r@XED6 zejiQQ8~N}(5oo0qP_VBupbxtZMatD=u_ZlyyOT`J(Ek8Zvok{shCo6^T_7F<#5Nh+ zk%9Vml+j&J5~PF6(7ivHX`ZiT z2bLjTUv5`(8RIhb$<4ZC>h^*NH6B=AzPEQAaKWUb7O*NoC4sH4a?DrcDtv5ShRvG- zX_)$twR7JcRbayo>|v@#S{t*FQV#-LWT1RB#m z7=Bs%m@r9g56x=TsG>Hb!lV&SURY&49!**q7R-qmW_NQuHBx9EMlwfEIX$m-8quqN z2Y^*v587ocn?n%MhFDYz)>q3ac>cUcW4-j)To}aQc#P=Yv z4ZNs%o;hQUMgS5rz#St}zp!KX^(E)Gv^_agq2vh!x7aZk<#%1ljo3Y4yiE#IE<+(- zZE+7St8z$M+W9RXa|A)L*ZY!sZd{Q`8+&-xHK|L9AFzjAV%3BM zc2+&QnH9#{atlRwZO5FNMQOs0ihbiRej06?da_Wrn|zyxeEDaMq0S*YKh&=IDcS~C- zp5F2q$&D-gvZA%&q~-^{zIgigC4KhZo!gv4mGLdM-fB_D6KZ#(|Cm-C0;PaPC%jmbOSqD=aP!ni`Pu#1tP5W|g4hkI<`|J==4R zd!46nwYc9UjQ;@kdyzC+hGSb>+#IsYI@Xk_$n(yNmHdOH`Gc47-JSg>3g+~+w02hY zoV(_Iha2NO!$WS(bWi(ww=&>cn!8KTv5j6el`SLWFPSXedNu8a!Fk$NyRO>aqdy8rM`~0y5vD9@>EZ-jC32tkJK*No=GE(q1TsJq!}a> zpgl;;kjLy)3Rrh<&19INAx8v2>HU3PT$5O#vi zA7{?3)Rxt3?`F1kAh?cC%ejLgn+dW}L6@f&o*(_(@V|}zFyqp%JLUJe43$~VKfcaytoaX?bA5jp*V)%{4PNG!vy5%7*qdL+_FFpeRIj?%%^f(+XV=1o zVyoa{4I>37_`38q`W3R=>=xS;*DVB)Fx4z-5V!`tHX)d{bvpelL8kyQsFc;GUW5%4qn`P z9gosKse7%sZMSH-HibbFNhE2JJ}yOg)`~TIvC=#T`!?nGYFF9v&SS%P>;u9}+UJ%_ zx2x5Y!9z=B{{R}jCMO|J^Lvj@`0EF~{cYHxc7trSy0|WsS14meU{52*Drewv=(`v8 z+udT>uJ?P(8%2zUX!?yKurw8`ApiqWMN%p_@*PW|_zOYtHo_Vaan3dJEcYq4#cS`k zT4&fvtML+9xk9el^z{PNauqW09~RG%_3O>#OZ4KIfv53Au1bke{3`r-;qO3xM4D%U+JyccV z*H))39yu4f(X3j#a9X!+#pMGLs4{@fCv-ndMds~2+>Lj)%BeFy#7Wi&=f<2ox#QM0 zZpO0P5-VNVR#-yQrlPTt#-3xy*ASb|eCtXMKTl1w(AU*Q9<5p$*Vo0arB1v>W1$Sp zwUt}VT(Bet$x+yoSr*?Uw-0$e%FA~m`pXlU&xoiWb~Wbi-p)0#wX`u=#qb1B0y39NTpR-T1F3v54V%j$+1Nj=3PiSkDgoy zvj=UxO!2I?uduotxYMmiFt!*$4FL z`)!8ycpgPfL38#FAGZ-MH@gdI)fuy6LFRC1xt5As5aM>h-N=v@b*+;nYVj+q@;fu{o@u+Kgi;}awy??Gs$7)niYV` z@{^oRAW0P@uk9R=AJ;h_ZaRaw*~x4*F{n{P=fjUYT5Z>)CLK)vKhK2wut+jqC&>m**D`Il3NC9cq={J; zpz5tfKw=a%PDD`G$AO8vSw8J)SkFrF8C4iIf&ylWTmnJ>2+~1X6IDE`I^IaLZYR<5 z4P2T%oH|A1FRqfTHZ-@^LsqTk(p(E9RvJsTqp)L)!!&CD0L_jek1IK>(hDJfVS(Z9$GQ(REnT&qIpBYqz zvuHQQk8QJ&TXl9Z2+1HFYv_E4u9m3P!a8a-2Nm0ta(4d!Uvs_;yE?}tk2>**A_0gW z>aW6U)UJ_2F|Xg_+!K9Dy^bRu?~K7a$-cQJuFMkgy{x;9VXGf@t zTd>7acwXldr3FgR$*9*&EY$X8>{qU1_Cmhm?%BJ7E5Wvqjc05oj5>nzL8(ThYO38Z zk)%o5vAj_vZoz|=7@IB94&9$_hkK4bwe8V?h%*SIeGGbz8GqXjn#R`gopH%5vLZBP z0-ZvZ=WWBLsI{%n%y@nIFC_HguD16T1d!XiLfL36MXco7d1b2cR`d2YRa(SqC9=`` zV>|OUd%S%MsM5!9fP78qSu~IWgeqjTU}!@`vPCci>Pl)m6SnSKBdptF$$huoN&K<{ z%Mc))dVyH3;N(_XPYaa+r1&vr*lD;&HLtMPzv1a_(|3a0`p_#3T!sqO(Y!cjwovfX!Wj^Sfa@}W|50#*vd*F#qzbNtxlE%UA(d4k}`1j776Ib$=7}Zcp%g-ph zx;}ftgf(WG&d%k^Aa69f+Y`hiQB-WS@jh9_RgpsMyK{cJ+b$*CJ0ozDYTRa<{{XWX z(o0LnpsXNB!5Us>M_BH^ai*qt9_j79t9i7GYw!K89oK4t5&rF6((cU#X)_dFs>Mu% zaF>kJRDuvjIS-zH@&5ozcS$)f_TA5)dq(t6VwVr*b5|E-_SvC&n%(pd>};K_M98Ki zX-+=&i?3?!@9qxwZ<+SbsFs2Wla0l=s-OO(X1y_7wNgLyK-Ra>L23A7xI6BesbV)-d;=b&nKy0Qn1OnyQ{BbeMd`LbM{)> zwy~^R)z=5RNoE+L0YDDm=dW?vex>$i^%{JI{jrij0!Hkp?A{BgjZNUAI%iC=^M3L4 zr|KVX+&f=ww<&EIqsbgEENVFFV1>GBGW^07c@PN$7mhLgzWl??bYJ%u$JKa8$(qpw zmVCI6HsiYuq;OWs+OPc@{moX=JFpo6k{43L)pDdBqThX3?2U@-ZT-O4dws(i4!yO( zS0{rcplQ*|D&`5rorlqHsC)f^-Fs>~EzZ~q)(gvaWCJpiMUhzt8WUO(h%FAQ+m+t^^Pq*wn)7ux3-tU`c;SHoy5bh$Blsv#OgBkw-l#%bK$JIS& z_bL6o+Df%{JnKzUWgS}bi1uIBDpVI16?u^@+R?;Xcn|T-k>9VFZ~mTldz<)D;3YsNMXCP)Q$nGArG__JT)TmCt!hihc^?Yc zt1HV?P~JzgNoMd<54mMYvL;g@!uvswmyefNkCET@tCo*&w!93apXF%xS33JW_}nGu zYwq@)eZJ<*lD?nK*Qn){E0?$3&lXWjXH!Q!ylH6d_O&Kyq7`k+rU_!ofi+mm`?Pkh z%Lw;G(MKwv3-0w*E$mCUAie6rX(6Krrenv43~1xqy4zl@sUW!ABLJN<7($;4xMvo~6UgnYcsfLFbie ziw51Tnbr@JiYSgj<^~sTbm@~;$Z!OB;q3d(bGEfEY^z4l+luFgvZ_lJ(;a!M8uo0o zkef>z*bM9)Rb)}nCf#&~OPJ%9L8F=ADl@~fZ(DGRD_JJDiX@V>T{R?vpjJXMsjm`o zJ{I&a%U-_cO&w-K z>(IQ=zINr7RrtXks`>fT!vc|B#E$oIhK6IM3F_qDK9wu%&X`u>EK;gprGHaA%<8s3 z7y5h>%s$nQU7dL4VIB?%l@D)D_~_!fE=h((nj>9Q_=xZrizeG7Dm4d<*{Vr^s0YQ5 zEE7$=tywEm+wHYe->mGjh~TkpL{BWQU)!=|lv-rK20`L+kjfharf%)#mAbZ3x-k^b z$HzW+7`Gb~BF}M}DI~2yKV>qdIO52g8rMDK)%%9QkN|%K&8{MBE+cS%sGyq%DpNV{ z{3LYD!s-P^yHLs(JhH8LoJmC6E|{&fg{jFnd+S{P0A?K9D_#on#}!*L)RalIis5R; zSepspfpHI-Fd%n5fX{sN7S|F>IYu;ypHB`R{1xqmkd1CF;}Xvgu0=d_{^_9}>UiL3 z%O$H5De;D@6g02LJcRpUu+haWZ#92loB@OTdKu+)lS>U?ABU0h!w^9$xuR$7#*L{aSQ=EU@JOo8PmCe!s2NlPuwKWgC3;T6XypxB zk7gwp5$y&40QvFAM2MjMd-ums-t~w&q=>2T0>1A&16ZOM z%A|l3op@7~e2y*JxKt~~-Z=ppNE`(f*o;Q0Ap4xmq_G5_PN50i*|ayNpSKA-Gb#YF zu8QP;W-LhzKHIPo5V1S7aIrEL$7erqUu+KEp1npBtWH7At6WDmlT4av5&&yc$M)rl z_QJFk!J1hoLExp>1ol;c1#--%IM1(E7MC(ieE|D$0$#JZQdQ&RLCE_!W8{DT03%b; zt-#*pXclK*Zbw+=QtD;NM|2(|@pk(&BOM1HJ%Nh3=hqU>~+%kRq& z^2}Gj7W8iyEJ;QLmhGIMF8JzN8n2kdPym!=;fVVZD;HG5P zwd!3WI{9PmpY}lwJHG(vHV_1hVOoze<5xY3Q5mONdmYZ&shVi7MJ0y!uLObGFpJ+K z89jb;e{s^>TYXi!ww2@&J6p`9si9Y+1XbbUnEhY=)-COBev56lP$?6jy@j;aq@~RA zAkL#9AvtI2K3Mu+@Q)zeQ{j9z{jCQ709R*CJrcnP#uznAa4JQD z5@Kc?<-4b_gku5Ky4-hPNV)3v?7FM>1q*C$IBk~vdty7-ENXaBF>+b$>Iyw zQTG;JSux89aQo6;_?wgLrPFd9ZH_0%r5c_uvZ)^0O4`5byISd9t&v3-X{CL!oW#oZ zOp*PbOOTj4-=7m#3)c15sWFDrZhyGB}&HJe>*zF~%N6q5aV0k2+VK zaMy@ycd==?cB6Mr)eU1;)m)`pmug~rdmV^~$*`xZhi$deEO1wADiG*v9sV&`4 zYGsM7%A1FC{GCNpJeF4wnz0#@4}it2jwVOyWfgKhUh4D94z~AsG#hHKTaRoe(u)-2 zwX~prqw$*C1p+9w)T4$gn&BB}7ByD67-`&q!y}`KEcy)<^s&J@iY$6{PBR%eeJsPt z1y3xn)WnvL0m)oIV{h5#IdTpkVh0YZ29b|OK@he z_Zdb@H;C!ITXnb+%`s(DS{RI3@ThKQJ|6rLMvPV0O8YTXq`bD3ntGd*G?aJR)uAqu zpCsAYmekfYyJ2dZ)YaFOtI0}R7UY^65s4Dh0tQfZD7~v9O>Wc41e$=*1t?SsW-FMc ze83#=+>s=?o)rBv2Rv6kQ+m96n)A+MG#c4`pM|5n#b=XjD@i9lxy`gR^~*J%w!D%F zx6_131H zU9Tb^aGuP6XH|DsQAIONBL4uoHl<4b=%}ZBhSaj&lLXvnYA2; zOT~F^#%0$*Uwg3DXmyqr{d*G2Q;Z}#HLoT-FO~6#BYRU|WRcbX0BJR|?mK)E zGqkqRPV5x^DQI1(U&K{UhC+a2C)~|T3&|l1*OB7{n&uUNQSQ{k-f@T2*50EP%D1Z2 zw{Gp;Yq->FbexIl*o4%+jHvr7VPJVDddky65X};*xnLW_ZXW*t=Xz4x7f8}Oa9zNl z)}fqG4C_+fej^!cOF?ZF)NUdzB(J0iL}04O$}%&^${1SndyAFL%9dlXnEoB+sR#j*OPU z(5ZG(704xl00ZE1#_rbH;@YE$SMydnWOZj>-r#uBxZuE6d4!tNjOl)%db%EJF82ts2gn4%GHi?;C#7J zScK(xQ{YvnfFA5&KBZb+#q{rWwu&VY&k`W~@Y+n*5XM_Ene|qj_;bbYjZe&E_*08% z=it&opcmuY#a53htzTcQ(`wq??M-{aTVnpwO_iEt*sUH@-IP8szzVzRHk9s*`^zih z`-p}wQ(KaHpa65=wMJ1|d@4DUTYa_*!M0jk-Px*JJhD|%;2khEUMBHvd7dJt)G}ZN z2j^Xdj!Ulo-)H3dt*dPLKlfw6ZcDkbMkwQ#S;si9DA?3$hE00SEuKk!vrtba_P~*( zlK=v3J0=Tjc{`R%NtJDF`&QvyRrP>pk~qmZ)p}@NRa%o=&RC-Qn>46TVs3u}`o%9yhD-AZeNEU9vpgt)FH` zjiUjau6n$l{o>j!E>Yn(K`P>ct65wcQ!gyC9vGWr3cJj1y(3jA%AN!C_v2Hk!Pi^C z{z%+$$o7pczl~Gaq<180Lv4Dz=JvifyJqcpZq{qns@R*_iJih=oMd%bW4cW~?QEB9 zhQ!PP(f}$7uq0BPi5XV4%N5Dcwe;=CQl7dONn~e+G&2zrv2YcO3yVpv6?ZA7HsFm60M4r;Fy&nH z`#E9RREb~YGLKgt1PrpzmNZU77RP10*XwlqPA|smakzC>c6#dC-G46FT>k*M_LS<+ zEV5m(Px=KbKaOjOvHS3%_{q$H zZpHm)DW<%ij=`&rMJ8VWqCvL3%Mh{6igRtH~SJh%>r-vPgo)*7m}| zKQBW=9GaI(s6hG{QB)`d``FW#EiKX+a|A6of#b~no;Z!={{Y+n02t6(ZR9qr{{UUq z#bpk$wOb9|#vWg)(>3bW((R4IP>)?bi)u@SM~?+!Ne7whpzbZs?%l1Y1LYW=r>zpH zz%FZ2wa&F3{5cF(5!@xjajCdNRcf_Gc;#9X?G(mKrPD$39^TJ56Btw= z^@OBQkSXCxXFBIa<0H(Xk&;yKq4B7tYERwA7S4CQ_}@XM=Gx9Jz^KDomnqj&vu4V* zn)^NU(`j|P&GfqMEo!jAte{OvW00_p?TCvrc(1k~SX*y*SN8Wew{kt(TkF%PF;!6| z6?N5pMvF!q3Fk^jQ4A43ML-5#0;0dK6wiV9{{R7_w&y!TuC;aP%Vnm9J6v&elG4{t zE9xVSV9`&wsk67^C%m!EJyR5e&D7(m{nLNAv=-LYk3d?MCDuSlI>!=(BWX}oK{~t! zVPUqUcM{zCgfAc(SI>=nsppMPnsI#_Nk$d1Vr@RBj_vs^>X7U)vH}~^rw%) zHqz5K8_YnGnFx_a00*iqzWVKC>9kS3N(Lv zQ-*)1w;b)o_xp;RZf%sCFKIZ|^=i_j(^HDtShECs$~T^zrbe}{o_O6YtEdG?3Z&$9 ze}89hE%1aSl)1K{(~uw%DWqjef=wyy!9=eTvo2Dv#6M@>%N1^0cH&awwpOmzzx7>; z?DrClrKsy$*xil`Ka;Jk2EGbZDaB(VO6VA8A9rkZXJC;_G_ex2jv}d0C_h2NiT2XC zW?1fHjyamT3uWX#&&*NiIsMam{`zTHU36fjT z^|kEVn?&yorVg?h$zesvii1;-_h*ki`mMKJ-u*J(^~ABgylE&={{U(S62ICOgkp_X zliF#j!qZyuLH5^|VP>kU_+_lDrgL64W^bwmI2aij>**PG@f006=vP^$RUlW9KA~Pb zaqz9K`7yWz>h&NdjKZXh$qGV~!-&Lo%YRg6O^kK7cJ5ClgYHpXznri-L@Qaau58SG zr5Sl#G5y%-R?gwnMqQ$a42UMD?XC)a&M3=V7?xL)GN+NJ-NWt0BG$-Rk>g|$62?zz zPigIXJsREJ9k;5myDyM@*_T@XSQYS2> znd5cshWhnAMM*Ar46#`)U)L&yYVrM;DY}e|lS?A2x{{+3E24e#Mxj6pFkb1~*Vm&| zl*y@3Y17BY4OElmOgYO=$rKVZv|vmGF6@FF4+NIHDqc46{vq4$&qAo+2^`lvys;p_ zBwY{ySn(9+Pi8Ffar<+nb6VYbX1fTn9ZFDa9$H~L%D3iPFhd8h7a21J0Oa*p+niCY zCP@{P=Ev^)^2PnXZ%uI$7-WT>NdEwmI=x7bHkVR?qz@7?SD$O4*KD6vvaw@lVw9FD z+nZZY^J~F6v`qEd%&!zyrf+;>+LlF9JwCly#SZ5zOLDQr5;J5U;bBfb+(2QrT3mdT zvNg=08p&;xVE*B*dj9~=5+CA9eW0@`_h;i=NISmC2HL9?yz*{U$)uV@6d6#3QV#>3 zM-X54jn!u!)}a_NSz~%Pua{Q##B8l{@l~BkIV~8^t})cq+11G`^DwU(1wZ;lK=uma zwY!SxR5VaqEl-OzKjvx^?I3$G3$eP_jb@#z!8K-`k|-dnU6<$={+-Dn`hCRxdXsH# zEt$~V&U`t>9t1CY-U z$zUmwPDFrf?lt>xN|&q1L}Et zmR!84i3sG@G)WQJ6qhpjh?*uyWCY6}lduvHu|!96=z5Je%rVy-bwj}7O2cC!>1mlH z97low01Og%^=$g5^VzkTd1mxf>D*k=VT& zxt>QZ9^5kp__rgXO3hr4JpSzcp3Eh)!fCSt6O1GoF#p^yiDO{GiH#9^FiwHJ&u^@bEk^Lq7)G z*0mQer?%e3Jfv5FcWFwkMfZG={{Tm7mucGY@dNILHo(Co0oNG2hS|}!myQKSt$JmN zJPQT}qbdq{SDp*zduH`YcLGmxN{u>Y(5gRoL4o5YwK|!B&V*1@nJ91@e}}K7dw-y> zRy$7*;w%+plG{wHRUXEQO7zS*C(r(zfImZ?j(e@!_zD&>mUwq4vT+r#db zZyQJg+p30=FDFqNk}3PF4~fc{j?ixZ0Ilt8>g7$O21#J6Jkx158VwzMM26EzwAff^ z1A9f7$Od1y2fjLcaO6ODb*%p*P z3)Z!*4J*SuP5%Je)85ssoK|<_wnuU$R=srfZrCO%B*(b zezZ%ZaNx`&C;tGFicdP{jcv!$KIyQuS#Kv*)h9|c=t^tMd<)YYf1NWdG|IIH9L)zl zs}|^Sv98@;-ag*ejVM;u#Uod=ESO43IkEU}AEQ6EfcU97>(TCZ#*W19ttzhD(JUl? zgr64n@E&x>kwds!%ebz?Zw#|;vQ8rD<(9044=Nn}#~n+^csCvR??L|ndh?H!^$_vP zY>`72vyWfdPH!y6JG$B>9;}uw)|nK2tPw(=rh4;jySeZCiv4!Ii)oqflrgKYj4%d) z%aKKnq-RbfW7xNj!P`4OY#Z-%?~p-Y?5Y+hjKnem9zK{L>tmTUrc|am!q3fL8^0!v z_@52=Bc180BuN|$YwKj&So_}1`D3M5ZE6UiQpg}7)Ph*HP6qLNW4L14H13!CWtHQS zSky_=<)pb}jj2l1dbv{`WB&k?cC4H4Q)1iqJ;u~f1g@U1iv(16j=VGyS1Q*tjl!It zByvjnPEDcs?~Hs+qS;-$Lyp79wWo8t*f`fc*8^1EB`dX9%NZV;V;KxSxR!3!uz5E9 z!*#gbZ&5YM_UEH*8U51jQbj49c;nVSN4#%R4c}|n?KW#kI>`{c25IEdpsOrvP$<>^ z0H(j|IKOdUiT;0;t=YfL?>#+~6H6>rHTA_vA(l40lGUo(dJeVcsbLZ?8A%u!KD}o5 zF6;Vz9+ZZ}$#RCInIu~KTU`g)`thjQexChTxrE$aUy*FWnpQZR(uabGRG+kEopQvE zx8u)|IMlA2PG4JHsgmSTRI{2epk~wuZzox_g0DHIed)K(#h^K2?yT=wAT#*%72%b5etD#`nE79%u zJ6-+5?YDQ5I>{Ji`DE$?H#nD_!jIlsXHm-zUs`VV5vK2JVH9s~Axd2piP{b#c>sMj z?tgKskO!VA+xr|Vb;cy$>vx+C%1@$Mq>qeis*Xpl+FYFy325nK5J_q{@K##ZQVApS zSu#Uot1Z6UxGXmh>9;V!8IEcmyoNZm(EM^WN)JC84tT5G+qAbmpzcuJ+}y;_RZXfY z+(y*{Q`?#ed^FT#b#lcAi0ihrHuN@}k_tC?_R1+LYvuVOwQfDUxYXlGZADvKto%vN z#T8B?Gd5!KY<9@g?;D2Ob8RiI(q)TtjEzRk!=MzVZb7Ifhb(40dv4sV?qR;)Bes)h zkqA`2D-6%fbk!cFP@{p!txtw6RvtO_zV4y*ylY(N$*AaQT(cUyKhCKm+Ius*$vN)c zQe)^w2UHP6K1mw&Ug~mlcac?x@X)FD)Oh0I?&*Gl(nPkisr1#^~)=M)$*~vK#pRZD9xVzi!knHx>uXZz7 znb?wiNmc-#U>FM+w(aWvRp0M!qP3Es%#ok~45*-~AbUwXO>xFz*9g~2yAB(y+ftgN zqtV!1+{)Hsnlc$JJXGO>*_t8=Rt_-0ck9%miAlL}Vt!3=W=>#AA1Rm7`GNW#PB z$J+H#)kVkCuExK+Hy4|1Mrj+^`>ZGB903-S@>fNw^H?3+txbp%a4x_A3wJbJ)82z2!#@VK<>F{!-h8ya)5jdJ%kPX!I3PS;+X3uG0RI5p^&LkSv1S*5_5eQIA={@btg`Ap z%Keq7!LMjlV)yMdO%ll8jNh9m^NMo5DJ)-bc}pAt*9pmBB&LJqm)rh0c1^t!CT47a z@z0MX;(f#J!})mi-Db8emcvW9rK_K^-I58@Ugsnz7FshBu|9yX&(l7gFt?&<+87(D zD)9@QKV~1e+GVq}TbsyaTUMnB9O;(|k(Y?3G>?sbCE0wBG{4ZV*Vk(6%CKL*bsEet z*l?v{WQ?Ps@n!Gi06kH64|H30{7TnR%_Y-(D5`2l*-kaZ?`rmQcTBGxl(0o^ht$l& zBTDi$;72TNtNoyFmCWtTIQJl?lQ4L-FSJdJ;YL~*-o!6ir9}rSvN6Ex4=2`5u7WXX zdj$LgkwCs)INrzfM|nBNdt-4B-~lI3lNwMTX&CC?jz71*jks3Q4TiIe?Cxx;JU8IE zvfA6bv1MrRF4w6A2G`U`Btjw%d?r6}!2_=_?hmM&{_kk%b#RGf<4>XxsOG#i1La>x zJTdNFrS!vM?aTDMv$l}#0P0gD%+fC^=p!tv@la=tRy_uY2ijZVn`=~e8;AuriaD&$ zZuGz-Ui?}XVjgPox4kF=Xb&8X8lysoCyNxDD^%gY%fk1x0%7-poYeAK9zy6B% z6H6`qr0*P(1PYo-I{XScef;vhm#8%9Q8wS-v;cnULbAA(sFP*8N0DSX76f#*JQdliA*hy<7i5gi-(m~{V_>eGq zj3AjMF?QJEq zTW4q9ysm{PM=Nsq(1oQZgiu z;W-d%!1?~lVlvMzxWc_c$y3J;W7k#uyG;zSHAs~uwQg7|#`b3ZD9i~0M@?h%{#pf4 z-oOG}lhk=8C0nQ{;0g~Pb#Y+)u>_VF-o&R_=14;7)(56<0)w*5cVtwQ7<%jPX&cr>AnQ z?XTcc_x}K{HpXC)MGV_5jjHWZ)lG|}R)jU_*M=a9kqF(11&|LTIPNcJqpT{bG!Fm? zu4k7VM>|-%kSr7hF;$k z>BDmkALYp}9fsPwJbuhEs)c5dD|LNk2HkrM#^yy9NNJ>;+Of*@AN~_Udr0=;pK+UX z+oy$W5VhNbs1F{jNuMv}YkoWw`C{3tg^XQ_qlY<1fRYg^ZBSMxs+)O%NT+aGRa z{LN;@CjS7XnaWK9V4-BlJ@Xd!Rf6;}NuniOWD0@-qW=KX0FVj_f=;UChdx^8a8;B?It8`QM+71(e`=X?ABABAbv8}ATdz)|zuwVG=lu)P=7nP)~2HvdiUhU0o zdq~Kdi~4gElfwC(Ex=(`R4$_Z<1<7yjqV|Bzgsm~k*dZnIyDpOB$^Xk;w0A@+Y)VM zZSP{ZTfWr0QK4Re7G51qHK-H>&j7G)GtqFqL-8e> zGI4!f{z36g${RQ$;534sU-7|fG5r4Yp}6?8V5S1BYUjAr)U+uwTvc5R|5E_)(Qu}et* z0Q*&mGAxVoWD;(z^t6TT)dR6W7eha$Z@XK{9 zw!+?@kKf#FbbAOXPU>DgZHc#f+L!E@);5pdg`3OTln)TC!?nS>T{K%w+)-|M7=w`? zRY(Lf7tpK-IZ(0w1DP?m4Z!SHsQa`xlI@{Lm9!Qpz>rm@n$JcwN;l{zxUc&}(&!ftl^nPE$})1esYX*l&9My%)nAI@r;?=;be^vz((_|fNQ$=Q)yK|hPzTP!Yd1oAm+Zkh$lm-@f@~&00fLYM$7*ds;F`x+ z%&NJx)yGrEr%t{k5Pc^;SVi17L;y!LJDe$&Y@+Bd?yQ=s6OjZ8jH#Y7>mLXFeP@#& zkvL60Me%1fwx5}}hlcWH(CfCht0kuKzp3Bp_gr?{-HLDK+!3s-=%nQKZFC*wyvMdK z!M-)V=dgwRrn`lvV7Y-wMLD7|T;rhMs%Q}<_eTD-RV z-GW_h>eP)|+C=n#GZNdh(MeNZQ$rNB%YX+F6LTMnwkkEBAn;wTo{CD**SNIc+a$D_ zM8p9v`x~mVnM$8A3H=ML(J&-aUArqfICX!dPU*ZggHC1Gj^_IztxHUb2cMfm$wo|d-4NJ0KM zZYqKXQ2L3sTc3KgWo5YBqg`|&D~9Q_49zsk!juR8ijU&tX}23Mr)waRD0Yb#Nz!Mw zjfn(guhc|k96d`j8s(;jp^m$Z{CA=e!)})uj)l1WnPQ{Oxpsn{x=ZrBwFEac^Y3*r zhF1z3!l!{4X7K=-7hB(P-WTaT(>foCp@QomJRCtM8u~`B9Ld908y{uBh%R8XjvIw2 z;V$Qa6xN_2ji*FIQB7JXYs(r%9Ty+foqRIY=J9GTE7NU`x0z{q-lmg`{ycxwH9I*r z*qnbHq8}hT7VXwqU#?3Ou(gD;`LLCGXn9Zo2+um#8d&>hw`~$OF>IL%fpamb(q-(C0&nzzqT};bz#r48Wl3TKNRxJi_U( zI^pD-8@3}6-QDa_3W6fBZ}K5oW0XiN$2EHo7()}}oDx)=0(wYR(H@Y+9YL?Bi1u*A zdCujfqL%VqV}O5vo)l_V{xrimb~d7@C`TPlUD#ll$NdUr{FK>AWo9-j*_9e8z4+k; zq;)Ie?T+IjQGyp$mq(!IUoRi{;Tl?cXr7I{{YV{7LlP{E{c5w{^9XF z{WbRD!u;!otfJn&rMs8qg-mHeFkuTS`1qT496Y77pCU2`Y;^^DZ*mFKd0V7;zs2vT zENEr#9iLcqiMrZqM1Kj-hIGsPFyH$93lc#!4IM2l=%iWN#=_iDIgvxhB;jj7rQgAo zaLQQc^y`MxduEJendX2BXhYA(I(~x@PW!j+ADJ8w+S~^C+PR8wH0SKZ+VcuhdvLX} zXhk4~%0$Z=o1#34BKDwbjPU(PAY-TrwcJ1igtZ$y>0f?$ktY3We=HSduOMme%N9C& z$_qNm!qkDxF_@)_!Xvl8T(^honI=wpnNA%M7L4Ng*VlKq^b*DgHmR z8bo`aYN2(US&ktYc9+C?6(vb;xk(|reNR-3S;({zIb~{am6XfxMOq&S$S$YeF4-Tik9_v(`qtB+I;BFm;I$v-F#>rl z;d5_p1e&>kX_xMraL38N{y;WU+2T`H{8mpWSKDbN!!$+N(flNJkykzYu6p`6=z80o z)hIk4t{40$O{pc zB4&a@-^*E~k-+gt$D2sZN}*L;mL-&d`jOP7k}88=Ms@!HlxlCWb2y1DxH_rv<U2d~TDt2^X7w}0;UvfLSp+_J?W%|tOPEOFDttCn1=kJ*2s{j_^~>2Afe+uKQJ zC&)OjT+BwI9WS-EPBop#0==1sV;m1Xw7s7m$2pg!qlE&=SttafGHz3<0^V~Nc_=aNQaJkx!dmc>DD5FAaz;=W>7~earb_#B&g9wK+Lvd&-^iM z({1MEn|hj=wtx1vm6KVytwO|<>*y{^R;PJON_3?da%tPMhiXbp3q9!EbMP9=U&4GrO5e|C7C=KF09r70$#b6WU^F$$Z33)pEwT=CX4RGy#fjpxFqkl376YVvX!hzYk!O(sLc)S3ay5~tm5qoMsf*GETyP@d)n^bA zvD`>oLXrl(G}Ko*ejq84Jh5BdaPB?wrM;%JM2C>@x*IE8PhqpZ^3bU@{Y|Q|TcfVo zY#2(mwObnDX22uz>xGb#xDyj}zwK1&-s!j8n%rCffa+LUpffLl2OvhOFf^gAAgp#> z#|)7~BA(48F|!KLI-gS1fC*A4O4L`LSkPtTANI{l+NwJ!bt1gBY(kovv+I_uvCk!D ztpzOEV;zf3vNWwT`^34%FnZ6euX~l@*re5JN#qrnNRmb3su#t|u+VK=p|iPp z*`@TvORCa^2gIVh+u_T{!x6U)whhJs8^)SzmYz*RrM-%ML>@!O9L2J)2N~yfwA_w> zlaW>9>%_G*j_DwU`VM9aFTeHB~W?s%7-3scKB^~MvCOp@uJZZo-d@c$ji$z8R=devGhWl==r{? zmhR=$hSIC-b{i@G01Cy8#EqbRMY@y4HKhFb>*}e*xUQ(BBg&k0;!`}^Y=+hV{UK6` zr`1C`O~WtxfDbK09)z&L(PJGxT!pPT426Hs9KrqSaqU*K`&#)^X{P?4tkrCICmEq4 z`&BINM&grEgcv&ZOv^=QHe7#qiJK4#IAbv52N=tlYK_n?PqCjB#!b@%TbVU z%c-l8QBp|EpN4=Oyua%8yhG{c`7=3({jqfBSgXeBiKeAqL!~2dDvs+Q1g$XVk8L*; zJ~ZUIJC9r2w?3*ZOi|5yYabt@M(uqxS{Q6gwvMfcMZJ4XKa416mOm_yKM_%KEZevu zyodt`QPmEiOw#ER>Hs2YSy zZ^e#k`7}?e-S94TYh^y;fPZeEB=A3y{#vWBnUSl1-CNDC5UIA->g>&88+h<9d*g}`@JV6!RX)|T4XuUA+HW}|_mN?LaY_!nzB`Eb4Z0MPIZ@1ViGr&Y z>NoIMz+us>O`V1q71D7s(PZh3uNUn9pU(9y5?Q%_K${od~)>h>3 z$t4?WaulQeb4B9U&Cp=SX^}0Na8A9wH}DJx`Z(6I(?$u2{Zhl|3WUw-$0%}G_ zEckQBQ)qby7Vy*G*6=a0d;EV|IVR4f9V|Nvaz{N!oBErFTa#3$a;#w>NZY~`KGr*t zOu}tNFK-EW-%{3xS1NNf&)bTHv5*!K{{T0uRsB^QJWo7leCOo*wk-buP}4?rdZoQm zy?c`i^6e(qP~Szr+r_Jq%$6B8uQEJke0_#c7?aev;J4PDMe3z$H1age=k4-1v9#Lc zg#>JUWYms1;|tt;i^=&9{Vi)(FAEkWnrl|;$Yi&9L{hLwp|L`eR)Ir9UbseK50(kR z#ORhQby8FzDt$(}#%6#4l{`JC7BTJFR<$dUUI!G*FYd#((w!uHa-HpzoPzC*4GOe{ zOA*zp5TD*_mRAv_RS`lL+xq9o_!*J5jW-a=XX(X6S$WixLBxuCym;YFq$`;cq@4Iu z_2D?RHKnJzbx3a}RQ?V02s5w7Rr5<+fA}iT5EP8 zFjz6>LbwQUy~bR=NbZl!UBsy(06{d?YnFVe?4?QJi0K2YbxfC6A0I4e{MOCenjNiu zorHo0yGESPBuw7TK}$OavaZQ^&etMEXyI`hmjs^Ys20Wu?!iGAY_dFS{E~SOwP_Eo9JEUvSA2Kb=V)B_W&mfXT;Kr6ahzQ!9w3 zQYprno4|>?8KmDg{oQ%M$#+_6gsj1KkdE=T@9vbnyh1cAg$ayPI6^E{281_W| zavwI6KWC;6e!YEw*C{KMg-EB5JzlE)`25HDc_D~gPQzOP!#ZRM8B}D|!%1&;j(-VJ zQX-N`;Vl+)@iGwUb;?HE^G!!O0nzcj%_y z?X8GdqLM+URcTzRN9)73ow0d(Sjjp>bV}tT`0oN`qq}a z%T#_uLUxbf_j_?F($~^_Ms)MUzx;C6z)0rz)vAPoDPIAIUA3q< z?R}gTxqS`9dkCpVKCYD0LoV_cm7G*tEMktlFfx-XvjDNVJ^ebcf;l${A}wsm(=`$` z0;!?Q*1Y_W9~?rS>-svnL3CZ>dhiHt@+bDvYgMTga^nqTOpUlr=2mMo^`sAwX_Kg zK+#A8Sse9gqL5EAHF%shlU+4%B(V5jY^*-=cr4R0oGC0JFEIl-0Dz!m^!d3C)u7c( z>7U!jJV!9g9Zb0)Ib~0_zJGQL406pQD#XaKnCr1}Q2EUo*bJ`H0=1q+Rg=TZKTd{8 zhJc~K4a>t0LvHR)k*E*T?8755c_T-yQ_eJEttHfja^d8R$?hN}>zGbQq#$4uo}?*T zbO5xv4~R7Tg>fB~=95ff5=Vg*`^eAr;yLcZ0m-Kr_R-9f%Q=o8b=9PJ{gg&zm&eTm zb~w+V&rj02U6xH5<`j-c#+YfPh^U8DJ#4aO0-61l#Dv_Aw3AOzORlPgqK;^)c|}cD zB>+msH$Y{R>~kZ30a8Xu$5rcVE|r+G^#wrGGvZGw;#9YhGrU@&Fp>$-!k-8naTYe5 zbIHXx59Tk7k*tyb0MaP;!$jV4TUVA?6>>=K!@t+5b6f8!nywu5X_j2SPb^1@eYCcl zHT>RYzqI6W6K9aus}y%{?PfP+nf}2Tl9=(6+sH_EQ;60_Bih2ZZ%{gYEg7XL1W}7| zz=A(rXg%a&9P@m=;e<)M5kCNU*%B-qX6ck~qDYe2G4z$Pd@2Qr2NEh{A^g zp<6G!<%SK^D#WQ)Ry00de|IeKymlT^^M6j=2>hakEtEBi#Ha_lzRYn&;O7LWKk;J& zIO~-O%U!sUjY^ZBF<%Z|KFmBCM~_jrx(iw>ByK}{02OBPP)#UlgdbzHjges1ZClw% zWtLg#+hz6|Wo7q_9^d0g;1l37e`b2*hRnvoc_T+Z!~pjm1Yp*E$N5oP+&EGH0B!3} zF-*L{q4LFs8$7el8+G`_s?gXG*ao(O%t+9S5(Q6k&KQ!&e}w0^RP+A;LlKKvZlErs zDlp4GEU}=4d!h)$ux;|hvVZc~So;G2$Lz#}yB>8?AIg)9+GU<7mPsF9JaWPO;?3_x zGRhGGFz@IA1e|B2ZNFrc{IQ-dm>JL=M~Co(hyHWA;Xy0eT=c2U2+FjsbTqD2;fcCj zm!8t7MGiFxsTRtulWIw7y@j*wv%^&?)Ug{_sW*sc{#%?L=NKJQ&$M>z^K|Ymq*=-k z5o(~NOr!-Sd1=2`A>W5O{)|qr& zRxG|6)Z>@<=fbyi8`?ag#?zhIv8uHl`VB%F^bFGZj~kNOvtGpJQ=IuCI}cC}G1sGR zUCkx_-!9liid)MIs|VD`K~q&Kr3uyWfEjZmI#(V!vG(2e%eyA|C-oP+f^=ZQs>;E# zEL1U2yh+k>1W=Ph&~yI)_cW!y*z$eX$G7*~j?JB&{e7-$Eq%mLZKthSG}^-^(X3T% zOfDv|X(6hXC+roWJ$d?C_e0nw(P_BFZ?q&aqs4BTT!0C8LY}|eQW`=%Cn9KZ>ucQo zmj>f5@wsf*7rWGxNd0TK45-GMAdO@P^0bL0C1Nj9C?Yu6c=yiwoqY`~+O9XRsZzbW zpZ7d**R4wK+60TngnV#O)z7D+MtOn!gs~ixM5ESMIqMI(eLlIkytt0`@ue>sn|DG% zN*vmLq>ACrYgp+~KwFkQKW6&Xw6580CedNhL}nK;kgZWnzEGrcTa`Q}5*CmxE9%5X z&tszHJU(Ns+QkPllHKbSBD;T{>3D{o9j(=~ZlxG_;HR~DWr`58B)5%sB(RB5jAC`Y zuH&@snyw*PHZ)KhL^jVW0HUnzB#ez#u4#DyJO)w`PR(QnccLyNf- zIi)=&W|8=2M3R8QtIrVnJ%1e=oo^$HdTjO1-Mr zX-&m1ZTo^7x0bO@CCqBkL#+Ce+S+MkhBN~*=&IHA2BlQB`5JCiE4qAD%d|fq-_lcp zmhRruWvn-OPL9O+<5B4D>Sx$3L$i#r72x(Jgi9yA;z1;~A-62Wd!o+r_TFMK?Lc=<{yWCE!6S~e4|sR;~JfxC5Go9*XZZxRyErTwskViE8W|1J{J!l z)>fcwc*xLR{Cd*=00)3?;i5g|-1nPw+ilgw)y2KLbYz%9gcT-+lFmfRXn3Vhk*+kc zeL3w5E#5um#tS&_ZqUq-3-?_l0#wUqXp%ze2&q|uu33?cU*+v@$-K{yX#OYV7UAFP zc;&?TV_(Sl)h;!|xP5IkuNWz;o1MMbc;!2iPclO+uPv8G@KURioohR8@3wYLvTo$F zjN4Bz7H=HpTdA5&LqQOzS&p?*LahK5C4d;jcb47W-NU+B_NMbJH?}q?+lpLU3wt|d zi~_ELX+VN7g}@;iLd{B}0!B2+^n4p}#G>~%8fZ4LYW91{D$?e*?QGzu8F-#*QrD%c z*Iu6WKXclHjZkeT3_)k!kNTg|1LWR((Km|ZTF;UlX+S?kGRyeO#($=dM$*1La zlZ;-ART^T1wRp`7y7$OU2a>s(D>Je)`1rf|Dxe+X2oVpD z?;U+o+{Zd&;TuKi!5v%E&YUy-IenOSDzuB{=PBoca(tK%;8BmNkEd?kJd+?mC~5|H zc1Vko!IqTs_IP8{9exCA)tREh6(MGrx2W;=3WWgw0G2v!9l<(y6I>+C8Bz}#(+{g% ztsG_LKwrRNaqbZA=bFiQ|#uk5=0|KF4XeG9;2qxFTxT zAPAZUT}fhEql$t!)`J@V00Y*hEhZgRFY?}6EoC`qY#i)`x7v+NRf*F0LIt{J!JCC z!7iN161JudKzt9Xpil!`$i|lL)&N@K$~B5YhA?PKfWm~HCoV(-pO!gl*C^(iy`G?F5(*dG+GALiDyN9iff}!bHfn3xmcA(M^U4(nc=#Q!_f;m={eI`Q?7@N z385a&0}9tL$0fYmw@Ky#U0Rh|h|(#Hl_UVcMG5nusLvO@y{fh<-hF*ai91%B#4=Ap zoG%bCOsR_X23kd$UluCmyvM2PjvGzNIZRhB;DJw10&B{-`+bl&CmM}(eeLI8g^2aN~ zG`h~OOL~tGIGS;llk#4pY}xBg zabfdU6GGp61s}^kImeLcAls<k&#ZDfoc^9}LB6aVmS;7f>$r3x-^lpn$_NjY3AD z&zGJBe;;2Jdbb;eEj=P>9#xCjc*Gaiuh1cwWf5SC&s+7rL*3)J;DWP3M{QAhpj5C zIO+ZYz#cRerYXG2rNg?{T+>n;8ZmM%C&+X&>npU+4K6>jp2othxN;|rXQ^r9jD_)k zM^y(R+h}AqQ$u#;WR}+AHq;F@$|$V9K=G{)fHs)(@|a|Vb0fi#&|W&halN(AC0Ff*=Zt$HV|5on`5t`CZ}30MM62vcx+W~2^vg8 z76B|hdUD5a-#dZ`w(EFSc<~VLWQk0M!K4`^;gRlKau$Umyz&R{QZp!dnl{g_H}|?oj4|{vBZ}v)86Wg^6H+& z3oejYjynj_B8g*Y$Ypc3qPg3*MvmPiP~Q+$jzWb`6C8$;ukg?gVXMNIy)Nwc9jB>s zVR(_XD!WS_pg;wZNUHJ4P7S5}2&OWRj%nTFygGe<3%fTz<6LGTJx&YGqob+c=`2ZR zYjvTi$|=Mua@|xnrjSKi@`|wsJmQ z^neVAWZ{%_&luj@zqs1_dE(fneb;HX1g)Lor_I8olF>zUfl}o)5<*63<58wZiaFCjVXQYqMWx+p0Xj#){j_v)?~_bNaOC8UBv!;uCCoDs`7%_*mV#Myg-(tW^g8(#S>vgs<(T|*>5 zHFKj}Br-%RnF%kbonMO&x0+jgk6inyIG-BZ-lX%_W**4xnIp*5t#m3-bJE#mOa||^&AZ0e?PG6qdWMDJeuS=k zGZG0rfpOzpXH!{<)NM>ZA(GV!wc1TCX z>p+Slb&#|VYb$zZNiHq54;^fhK|pyF8RuFIV+n>sCAU)OUZUr1EOz%{8l%u+>MZg# zE9qHCrF|8l2IIRvIkb`_JbPsygx`-o`++v+Qq=BTNg|MKc%ItTd8tOR_=1aS+X6c- zG16`jU0KK0j^-UC)O^!M%H#Maj8>egQAKNsn?=UaeBUY{oXCQbe5sZakH_;Y+?7HF zJsn1BQVz^EivrZxX@B< ztS~gfLrzmmbe64GGL<3Tmu3S!KP~OLvfOoyGAAIernIF&VWgjbjygTIbk%8f8eF>y z^(hj%tw*Ah}8Obdxh^@4m{sW;j-6t+t0xRK;anumAEH-E%XR_Nw#Ko#Mjl{}Niv*o1P8l;& zoN*&lZ>N%_Iv02^BG*`{RzXwPy|ueZgU(};GbX|nxmrs>J<%ICxD(O6M^UG?yoN`T z9m3XBEu`v5!9LEOmHS2|Ti;p8k)_7jc@bENT1h5`KG)RaF9I+W2AYLyU(@y6`%g6T zO4b@4OKWPSOpO~nTIp;oy7;Dy7DZBoCw%Aa>GqED<<$dN%Lx1>R-pL$Yv=ajCBEZh zV-r#h#sc*r`h|(l;q@9*o?aMhPj_2gU`?&&T&|KmZ^xdt>s$G^<(1{~WKE=SJ*hSR z!ASjyUA$ZF^6%PV+Fp2!Gg{jg)savN>8I`*4OOqGXG#uOtWM-eCwXkIZ(~4*PjzG?c$eE{V^F< zgV=OdgQ40L(USyCF<#6XGb&5B}v79z#vOg+)%hA6&?DQEv4JYWPYbh zn5f~;AaMydJ+xZ%5g->tWWY6R%9S6l5tX+aIO#$xUDy6XJQLWolx2o_FI8gAa=I+Z zG*C{d81_gJ1dWD2n#3Ho@Vwua9bg849yIX#aaV6JRM&9Pw8ZCH(!7Yv!lOJ}Pdd{S zpl)ie$t3n7)=l`EtX6r_R2Yn2*Ur`DvsH_GWDw55P=E`VgKN20avfuVg+)UX_cH$9 z98HsUv5&^S1j_V z7`TdF*mn%mU3AgHq%9N+8c0n9ipb@(XT*w*Ll?jMO3iyPL>Z)M(!p6Gvjr&Qnmof^ ztSfu*k*&(oAyfy;?!fzoI;uO{(_HkADit-ZSsK#3@pC6^LhsOxmC0tK>r`J!r2%rJ zl1QKer!$KL97}sv7#ihhV4VPxXeGFkSxHqS3mnqQxsllemKpm<1L@QWdy2+UpfROs zT4Xvm&#<7D05Lba=niuiP`H#4F9-TELoj1@@BToaz_Tm_U+z`JqmHq8B z`$0Ig*0owCTK9H4O{9R9k&Tb(fy`2S;t*-U8TS3QIm`KH>GkRyvR+g*q-ch@u+J|H z$G;9GwX}(%cag|%gwT8V;nm(z$7@tcD^i9C<5g;tS$VdzIE=sArty#&G7pw~S3N|I z#{PC?Eaoz5z*2;qxSAijp8QT1R?#T8DGCrvD>8>{ya~%smyLXJ#@{mk0D1cE9jv)h zr}UUE%N(f0R;-ub#f)+0HI16GL{};TjOX<0)O$PV_0IKhE+lD|)QaW9{$C;I&lnEu z`qaBMxm6H+&@@`AsbDfBD9BgakBeV3e{fv4fb)|K?I7~> z9kKQ6>z>inl*Vv-8_) zY*?d4I}=Q_EA6Sh`!jnWyftgr_dMBrlz*pGUCp|~w07m~{oJv^8MB+D<$y+&k^p2cW2vC3=Cwk$~w!ql_L z2v}?TsXYGsczK3Zjg&Ag+$GlG8^aTTfm~N0YnEB%@5NZN24@aSNP@X=`}4~Ur-Fs| zr&6A$l~N+bg?aY7x>Ll{!7|4jZ(c10NA|=L_!!xl!=_cS*vET_5PC|vU;rL}`bUuG zi#uycnlc=%L8zsE5##25%v@<~Y;l^~7mH)h+xqg*jtW}tMJAv|)wY*_irU3qTQcDz z$T6Z8^8OGp)H`zhawiZXu0)u@)&BrD6Hgqot{R@y-03kWA!-Px>H7RJUEkT)RJlrr z592kG^@ya^d$;Y}OzTsQVw$1KmdG{%1 zNTdAiF_5h=1XdWyBTF#Iv7k{>DnJImb-%o`vRJJ2we!u=3`e38LHyYO&6Pz+Pzh$z zrht|gU+8=#w|dPV1cKkl9JfQpbZ~NQhQes+@J&xS8slGQw4{{at6O`@MZ|epqDIx> zl(&ON5b+V`y}O5Pmj3{_IyU=!v%1?s8lRYGSk^mpAQe=Ol`mS#MP7$2R6w^E4z?Cg zCBoaO5=is`>eXpvKldG}=>tq+p-mc#J2x5KZ212GDdT)gmEYrgo>>msjJxq>lpqE0KuP$fxBOgzk9*@X_}9i`M0?l$K4Znt2|ZbF6AP{^^apo+pp z4J#I_qG%q z)Z~{S5=JGhU$XV0s*#7WWwnJVR*&0nYD$wRn$?Nqlub&NMnZgF&+P<^gU~@{o~abD z1}!B=4{Cco*o!+%j;0kL6P71v=4JQthsaDwElk)jJR> z6`Nx-f{*3~Q2Aj;Qe&1qzEH$5Dk+@^IdD0X#)ra~u#Z#98F`HTyw9?j=T3dE)vwCh zEvMtvrLW^39PDGOuz^$aZ||(jHifmeD@7cX_6x4nY-g6ezilTCX9b8-y?O@4e=L2U zJWDATmlx560-6;f2`;MSMy3E{GpChtl)tn2j_H6*wY0Rel2u{E&o5F9C-_86#+-E# z=Z)ilYpzp+h|yJv>c#zXTOMNFtGfC&4D_icy1XszwSg6nWr_eiOAw#{20L@y)>-Aa zj7{-TGE+}l8lM7mk zijN+(uiVqE?av&LCZ}&(VsF=WS*Tds$6BBf&0!5`BXF`Wwz=zT^m5=Lu|3mO8iuUYc^t)^y=oCsDOZ5(he_B zR?+G>QVa4mJDU9lf=w6odyuf*eJ%;^-Ox8n6uv@G1; z^5+q+vG`-;P93O&e`}F^nP9 zvC8q7^>LG^G@_0nj$q>5@c^MfUca{HK6}Kt&&a!3q^O&|A;#+2sb7vmx~nAm%8IXR zO>yp1w6IMyXwDp$Q#Kf}1ocDRHW2I^t=Debf*Kpg(@9tmu1kQx3IaVsgDNQ_m33XA zxZLmC4X1OIK({tvl|o8tT`F{Q(U=QbFanGL7_@8YYp2z&stS8qUTP|mY~qJW1*zrL zM>Ct%WU$Eeou;#03}EG+AOqvpq}@v;&sel;O!Si8c^@x$t#Nv7r&z=^si@5G#O8wU z9oAZ~mNlG*euF@<8qFJ4b*Va}Mm>7XVj9ZP<)w+1Rq|1TlD$Km$#7D4&=n#F zf%SU1WPE*woVelnAao2P6=_?KhDY?_i^Ynt-q2LPeo5xJT3Xj4ZLQameVjUP$d((n zt~Q#bXPSDjENvf@lCc5H{oSj@*)kIf09vH-rz#J3op@m(+mb(ywH)jE99XoLW|LF1 z+fAU=Lw7|cg*96RqWc})gR!3d8K=J{-dDA;rA8lZ(Ml{qao^LZ&c&WB5|nWuVy2l6 z9w)Q+TEx`h%TidRODPL0 zMp>FRe^Z7%1=KdI9;K_;_MsL#0<4W@h4M~0M~`w| zE6Od7E<-K!}^Z8%yE{2?R|)|G|)`}5_o<*FEc;cpB5!alHf|RhG9wyP!Myk z9~|k5yZc*-U*;{%0OMb8{4tK()K!{kWA?2|U0Ozxy=E2t*qF1}n!VdeJYiIWBz@Rt z032hhlQSIKPO5Vm`|`wyQJD)V0FFApXAy{@5>QFCtzl%TZnWWp*OVehD&lZdU5v9T zoUVL=fuCNO)a>HoMF}$U%RWBbScZ;6k*f2iE__y9eyT-rxS^@4yAfw&8VfVENTrCG zO;{nZ9Qy`w6h#Sd6=or^ob?*=RJc7U7OvnA;T-B|op8%rv{7mlb**SQeYm+tPJ3Dc z(OUeGu&*rB8MU?RyycmtNt8=0h8g{o4J2>mWG5NMI!!OqYbaYuq>?sWtnoN#?n7oJp2o6+%VsC0)(Ig3fPs3wxM6qGJyr;V zEhF_3Mhr@0jKZK}($Imc>nV%XC6b(QC3&T*ws>F$%s|O3=Cn~w2o=MGlMX;VzV3iJ zD?F^tp^jiuz8Mejz)0kpf#bxF@xoTWr*2zjwi?~3Z?vK+gHsNXEu_HGv19R`zQ#dX z5WZh&T=^q?4lOO(_TKUjlL3izASkO6NFhaNGd_`1KzNag-NGm@cDsvfkVJA@%&o^I zF*RDFfKlo^$jAa{4*}ZT@ra^6$H;mDrh4$LIws}sWHPfv%`{O#1fP-<#a%p!BPRnL zebox?S41n=%F-$Ut@J3WfCyhuBv!OEq2*kDP+fmPST$O1mZHy53Xz!|fUQ3=iA8>T zYG^53^2A-PZ^h!ZQ}MQIu$CAhO9r(Iv%#=F`6~s_%w->yS{Y^Ttf--eJkE$hPIvPqK-9*R?&mw`y!r zU|RL2hYeOp;)YDRB<`W445X2hitBB+Zims-0%imcQW24^eym*HZhQ2s8boPfS}`mb zI26-GqSBdHGtBv7lWxB&k&02!Gl=ICNff&7L1NK~#IpNejGB2Xc~zcJ5=B1Sc=v4e zV;#=ZUtHgv!{UrmnP=*+`C^uRuYH&gm$VYbvT8IFvl{1^SdM(S;iOv6kk{OfryQvi zcI-nWl5#3r>8!j=k_VIVHQLI;4{2195MKuL$?5rT`*v6S>Ew4Gy3s6u^A>SI=5Z1Z z+wSNkSfRF9<2*~pGcfZ3V>R&059?{Uq?G(`SkzLR$~J-9NqNnP8QK(hKPvqOo(~UC z1q!S@Rf!A)3Af#yB?8%9nw&MMANrI?zo#5n+xC}nOr1OCNDi)O^{0-XLjmpkF$J+T z^-|i8b@@!XBk}U@A|b>TW)#tnkBy5K z_b@X<1B{;qX2BQ-sSumvSw2F4Mnv_BtAC|LOaS+s@n0pj&kn3W?QMRqZXAQ@<=nSDG)>W={pFM*iswpnfF8kI2GioN!+W~OxOY0_8;ZV5YL?Gu z%Ir+2lSI!X)#}GZB8dd!A!QAae{m~*_?cBMCA_z^wqu@{;sE>DntR3_pXt14{{SUx zw_e@eu18x>scLw#g%lM2EERq<;q@kqO~|;`u7<@Rv1Y@J}hGv=g(-Xh;zqjp)+xJTdBD(`oXPl}p zv`kz70EKJrt}FWv5%EEXT=dg`&_O+gv$vmnUtvJU6GWofTN%X5 ze(3I+OtP-yEh8S4iO_-K2AUD(O>4@O#5=CR?KvZcSU;n|ZjN=yB$3FVaLY@^#=Iz~ z-ZkVZm-uG`qk1Uhp`_Tgq?XM#)5ToVYSq=)Se)zb-;$J4_?1BG=QEHH5_+_>?rr8} zGDg#;kBMY=M)!gMua;S2qjKzS-Lzp1Egx2B(W1Ig@TP1=ulit;WHnT&1PcbYhiOu+ z9fewYS`oZf<&F#5ZOoHJS~P6SWe$hjqi7s(aNInN6ZNEV`>hs!%E&P;)3M=D zvkrtnrms+&QgWlHh?P11Ay0lB>Nxkp@hrDFCf|9xnJia-z~H=3m|J;d_YyfGvW=#K zk`N?0Wi8@5YWscfsTfDKTie2=X{zc=U@79in%=G+>f&b8+8<6JChNH_?(VcUp%tC2 z+m>q5nwk_^Qn{-W?#7b5r{f(pJNEeh0K$JF@=KNMQ%x)zemltM*4WvZ3e<+)*J~X; zKC)bv5qPYw;XjtF#~oyv&%7s=J8jo~w70h)>oHFSMr4{I2^i3DV?oO*R~zBE{W7tI z{{W+Qw&{I-A50>6?m%j&G+AX;SV*l%Qb`;!TibI#nO?*cxL?Dt@vVj1P|146!-T+2 ziVD$3H+#!(+_!@N0C6>gx79({v zUOl(BJ96J|xtf2?GT0Uo3Va&+nwayhfvUCVTqDUiC&)K+e$BpP@|QB&?2f?f^jev8 zTwjRRomjm=HT|1C>Zv4*NrnuzI|2`*dw%z^+gynuwA(iQzA_5SE~#V{%Az_IbDsjh zbLE@+zixL-`*On9o5tyPaG#kRV%F9GIGE&TRhl+D#Aj6n0TnpMc6?*z*tM0Y!SNRz z(^sV4^WS~E*7kc3>1HpekP<_S=Lu?|-_^ ziu$Va6&ZkZsZ<9|JVk3E)W{u6Nys>6S^y|WIAg8( zv*fB3VWCUo{x@rN6?^8#A+yG=U)kDJD!%mubk|6&8VTvHC2l({$&uDDdmnKO! z3#GMUKPRe#MF12m%czn?YDqcxQw>`ELhd_DUz3Mous1qF$b+qi0HHOaj zH}?cOA5C@!)7%^Fs&D<*6^_+rSOkPYuIa@xW=AAIhm$c5 z`~c8c;^(y2&EaZ}pO9|h+Rh>{?jqxhtdCn>v4v!;Q0^;E1(?PXapfAUELda$bM|}0 zlv%GJN3{g&hvp>p<>@uh*)OvjZO69l=+@g^<0bGuiIUD3RTi}%My@EtWKBpsc;QXo z1cz^4jq4o0avG0>%|&;!3m4MB5z8xChSemV#Vi9HRwj}s1bF0hdw+FLYGr|KA?iv9 z{vI_Pf#FU=#+ZZLJ&6Y5uv}bS+;mX|XlmRjc$#KGG$i;}7I-C1cCmG}YfT2q8gEjp zv(}bfo%w2ekgbCx)BXu-2eV?r;~T9!kbu6M1;bbCNG${W7O%>=(23hBc za_qZoTYB0hq(3zjWJWq5J0B3{ss$=)*sN0=g07=vY{5S(xqics=#~>mZELK?*soq$ zs)(vQ0pR{8nWPH9fJo~1=j~;>3vNZ6Ye3Gf?;GXDk}+W1{u*)57zNohSvydXiu zh{&{xcpR}=-SB=#$>f?XUl;g4i)$_IHCL<1k#0VMkyk1nSckUs31kiom!|de%5gviN3+6*6`_d@}QQ6w|Q#Tpl>_UsS~bH;{&Q&jpQt2Nt);t8On&f4Kop_0knV#0G?#$jZKGcEZ4G0 zbJN?vVi-j>rBgsc11gqa39Uz@13^kt75TW|Ag{OA#mF!1lV?_x`wO2W>o%J7rEc-I z$yZk_XH{o&3QX*hEK)}F@}My*=>5L+2gyu!^|yOApFy*cUs*I2I`siUNg#qfn2jdH zV!es)W4}9sN3FLAu2EwtQ$<+T1$|VYqY^T%t{C|#1(`%{Vt9 zJ$-zXVl(w)^Qzy`06|?RG02Z*7yPMM0pyJ)2azR+50AJE;1Dy^fePvb;KQ&6g!^!K z!$eCN(=rSnZX{OjKj!fy{{EWzpG_z=VnDV~a@0k5a>tk`41L*L9`ZX6H6Z$?JcpJ$ zdI9=%8KhFgwno0}Na-~On(JXu2kphbif}Gr&8=0V#<=$DXl*b=vj(!;(1}~iGg!S8 zFJ8PTppspOZ`9y*SGo5F%dy3Sfg`FyGEUjj-3pPBxz@{Wc zCBPsKypwnOvw1DMOR`(NtYB10GKVZHN~T&s<|->rc=yiU`VD6t+C|(~kzPu_&$oe! zbefgvO6Ig~dcGc1tqwYOQNcbx;VWL(ALBJ*6l=nE8n`dL`87@?mN_lQdTC>OQAE0qGjjd7@!>f38Xzm{N%*%K{eW(R^o(lJ>i{ylD- zu_tStNm8w|!+4gqYr?uaT;w}RAxnDu5d&-bMWwM{@h!(NAW0-ZN_&o(v$4@2lY72l z8Q}~nHK+doRI;*>{*Vp>bhsuj{{Uxp=vqY|&7NHmy=nZm1ZX*&-%#aD#wz#i@lID# zeP1TA%XOcN0fMb-wikJ(d2K~GkyBeGY2e($3n?rn%LV|e3}dUid+pn4Wt(eAE*v## zrPe^4YFSuN)`Kc>#zJn}+c#-Vmis-;q*4l{J}y_o;g>RFuNby^}aW~ z({ithcM;RxQrIrat>xF4xb*S+OC6fqt!$Q}T1j#u@kkXIcoE+qV`(4MjlXuZmu>Et zRc%^5Cs(Ra-Y7F?8T?F1u2st!8^5Ew#>cq9y7pzmNjy^P3>D&!Pwu+0q-0XMMKU1c zthF$1Zi@c^*6GuaVP?H~b`+!7%dyo$kcCu+wS-iN(W=m+!y`r+2=OG~ljED4ZPv1w z>F1EwkNDp(AZ|;z-M%?8eS3?Y0|P zMA8LEIgkwoVxE2j72ZouUGCLt%esHfu~lz~HgTT(R@7f9(tE2xiA1hYn0 zGDbrzc`feW^;>7%q?>G>-*N4ec{G&#$k;r`REZ_bD$d|3R03U8Ko1&|7p3ICEpItW zQmgSV7UeqKO+?gkJ~zdAzLIW7dYyXn7$Cc=DaYcon2iHfCU?Nx0j4 zYj4_K=3UO}(&AIsw$1y!cMaw{Si5@4_RiQCuB~k^ zqB6WyuT8D)L@pOG>PXh4*Qib|*S=8O@ENG>x!=RTB5^J~9=gif+{35Va$8k*M(>hG zJe*E_gC@30=&a9()VLmlw^a7syJNm9SnQkD+jqN`s>E6C%f;XpbyqU;pvr*yairY4 z%3XqV-8+-EH@hvRRD&o9ai(F-TG`o5bj#L=Yfo1rUDE#mavvD)FG%omST)tQl1)Zg zK0xB~>gx?tA8l*Lw2fN3R;?=%VV!;HK_I?B>cac!hj(qZL0Z)&SW{R_ITBVU_oNw- zO46d4<%<2Y>mSqW%e@bMG#z;WCi>oJ6<3ahazc~NoM;KH1~h%=IoI2OYyL6$3*-Jn zySGxRLe}{md0tPzc;%Yrr&CsSrC#uO$BcF&ScFaDU07$V#?i4}+e|L|n{K^=+A>&C zDVY?bh6bZ5)KJ$O{nxoR%d0_W*?YFpb9X8QI_^Nyppryr3bQwzO8)kdnZIjqT52s* zVJ$SZwpd=&T1Jj4l&*p2F^c4pMJ>>b*bv9$@h)7uqW7e_vjS#)ztw80S!xAyJU9d8 zPkuBTW%w|Qd+`4NILb9?B9$3cYg~xWiSjhh4s<%rit?y-G`6tobx_sWQ(a@tCAjv` z&hX4Ommbv6O|Q2`oQx74+1q#}CLwD7Hz2$el%vSTT|_ z=`re10?kqwD-H@t8Dkr|cOcyNd3JjX7Z6&hhDk^y#c(Ld>k|>zw;&ZVLm(lTFFb4- zEjlGgBOlY_c_?^nFHnhM)t#+~77OwuR%fwl5h^GOl04GPn9PN<)?0F&t>q{lM3S^s zlR1JDs)dvVrAg(DhS5#N&^(Yt{TTgHr=bjlX_B#*b_Ylc>tf&lK^$=Pwf4BARGM1V z?n80rrCPR{h=Mt9N#$t`kRqB@7Mrkqvqo|}KD~5T4Y_erL_#W4tVRa2H$F~ zz)0@eMw9Ac$bsSqr-pR#&l91g_wtV+I8%`|~xm_mpCom+GC;2i;}^N!o4Y9YOJKLVPP$1XdC3#jfCPH#Aml=TX_z#w7v!2v+v{k>$6l{4 z+Dq&UTC0#W(10V3PjgjoUu##j(#{kBTimhik@lzuruNOk$~hd~D_dKxLRFDgro7R^ z0z6uk^TV6Q-MlTbt&dLr{{a4^EfXCetwxuPl1Q6L9)@E>>ik%a_-mX+VopoN`F6hd z5agA%{{YF?@9OL|mhRGYEd*Nl_O;@@v41d6y&KqB{?}<$fW-dr+OD8WZNp@f=PceI zUqmFNRGjoHpjPqM)An;Pdk1*3DRr~%@V?)=$8+e8=*bgElpo4@S5)g-`jO=vwPisS z&3-21+`it$xh2o&pVVxo!%FpUEv<}qD$I>TVX9hUJ)XYZ85BsO8GX=K_Zic@5J;}aM)$z(&-Hy|QbBmOuSn6y!GVOSM?e@3cZyP_0BJ?$EOxv8>9?{G z?i1N=6QKjCCtldhpimRjS4kKQvx+Wc)|u70d6QwerOve+OLN3|E}5ZKh1V)oT$hhtTr~oH znd3FwY;JBK-z{yQZQbpgDWPO};FqFn2PSd@Gs+2q?4XXz%b)l9P`fD-1-KtIuelA=}{$80=+sM{` zLG7FSSg$rH(hHRJQqA7q^G5{%8YuiptW12l;pM0~U8mPw_ja_U*G25f7a`Ka>Tq-Myvk-3}>h9-)w?DgmJ{^c|k0;;S}*w3z*(I(CB48pbsoW znmy)nw^2zXA}{77@kep4QNfD^S(UWZYYsA~=Zf{7MPBCKEjJ*o#;1} z*07Qwpt}u(v)W@3kd=QT{e za?0PD(XCQMqgyiL%1Pu^A$-qHCAwTnVvQn6g*6Q$LlQHnDkwAL6dp9s5wBM3ZT$H~ z%S9qlS&oTSc~?_u2mW@a3gI=5=DDoer6#&~c2Fg#hRab*$t_sp4OU5(GB4He1pV?v zj2Ag1;PhQ6ZvOx(;5wD!5#3kbDo3*m1KjP5(_3^N%27p05gC;EFjaBw1Y$I8E84Z- zb<|CmgseXbwUg}4ABT$5wNgfrJ?4|i5=cm81Q!RXD{DLum4T$vKon^eKo#RwQhmb} zZ+~rbcoCzFx}88QY|Q4A(3D^S&b44g2eT3feRiE+&Z!>TP{^x0Qkr*y^;}54NoJL~ ztB9IrjE9j2ZzJHq^u)GSO*+FNNnKi*NM3}1eL&T9XUK4-B*(nnLkrwSvc)ctN<4Z% z0Gx>6-rsd{#fskft8y-T5}>u!iFP-I8!=dfq4qT zliV%3h+uYRj`LQnIfdy=go^Pdy0WJ{M?tDO?|i`mrd?VR;BiqVOM2c z%yNmbR&s&~BOpct_ZfHIORHyInisVVrHJCKKyx~)N)f>iw+t%nw~@8XZ2fnQBv4@1 zG_VyF(?V-nQNX1#=4FLvog}jgJqlJU$7f$H{Rz}sm4l>-C79s3YQ1Q7F-i?^NS)7j zi8Ipt;>YTpeMPFkF(5Arf@n{)f$YLdw<)V>0w!NgV+h*(89^a^fYy}H1h1-^@iJ7B z8`X<6X?~}i^;wOBR#6#+CG%voJ-?vHE$P$EcLYkNLDQMIE^NoyOupP#F4r`Y5f}y$ z#pysjqmLZ2=Y=QZ*5R>VS+JK`Quf*z#1wAb5Y2kLHGsJFV4fQ9EHI;yBQIgwxaqXq zW0n?{l4(=;P`R(LW<9<+W1nNVx42t7#YiqB9+i?sT&Ym{xM@5z@%u6A`e&o!Y<>l2 zw1RkMg7lkha#N4Sv=yoBYeVeAW@mt*g+z`|@!(;PHTurv6DW-hJ!nwZj|0R|@$t(6 z4$CTzmZ*C4EX5o;P#R=MJh&R+^%di`uU4#K-|Xh6x36BzT3toWsnpoo#)y*Kw#inK zNeyo)-CAQR#~AjMvUry64a|e69^M2nNI^1+`UOX)h_5=}E&l+g8HoJ(h?XTPB4ejn zAknxrIb}i299%D1($lW?xUDLD)`d%NPjcHWqw(_8J-kku%h9FwZId~Okt?lK10c6i zBNr^o^Ne9b4N>C-!pq?G(%NZXg=D{K=?{#-8L&-NsZ+a-MD0^2752by4Gp&zqCHEsPqup-)C zGDOH-8A#UAl?JA{YUj?L6~(IeK)$$weX*bxp`G423QEdOc?wV}o(u(fR)pa2b6Xov z%DDSW&`m9ufh8!@>|~B8MNxVPU|C{@KOZ7h&@*`xjGXjS?C~a)NTTU!&V%t+pP%f* zHvQFiD@k!J#HQt?I-ay<82~B3C>dli7W}517iF(d?k!0@J&oz@RG~4yJHZ%%Xjg{B z)xtgZAR|bk6X;}KnQfWdrz5mTy0q!YC?Buyz#ifaa_JeDHPlLKEnmES*tF^Se)4Lv z#GGg33w33!RV!C`^wioQArfNYZGes^BsbdXz94<1cg%Z@n`||ZUD+xwVXG-V9Kau| z7nXarHe8o~vV^Gk`g#+<_0&&)f2x94FC=Iq5bLG2DYbBb zk)O1E-OtmgaN2Fw$4T4~<0tTg{(j7L=Ht2CM!`0=R|oO22g5ZSIPunfobj9di_Li_ z572B~xT5RsEDrNsOS<7k(llx#U&pmC^(BsXB%x6x-%@;W){|)2cKyQoIG~wX9e^iK zzm_w5?e^=m?Xyer#1$3Qs1Od3k*=|d~O#s9&k`Q(E00Sdhfu9!6wD8kXO)|$_e{CPy zH^^VyPR_RGb+yAjB&%w&@(+4#!di z_j0SKok0XaXs#5=B!tsi(PF4B`Gv>Yy)VFj3j9k-p0na^E3eVkxxdwHFI~MJ!(qwx zKhUaJy;e=O>tSZ*##fn!Rwz~oBbEC`G1up&{q-llJKpK8``dAr_Caeh#JW}(qIrl{ z(*!_9SfZ-xU|fzQW-uB z8ie#>eH1Y?k%;bEp<)`|Q!~jjUx)A>NX$tjj{u7-SRdQg1_N;&!ICnbmFH7Rfo+iUO z#{)|Kh!uTuIikitd4SA=z-cw{#(Q&Sm&EjVwOC+-Z4C7(?DYcw0G<1)(AlO1i?sx_ zs?81K_hu^&=tdE6PPWf#TSxhw$(8FSog9Wjp!ku%_~S8oyQIi%cK3A*nzfE6J|iv% zi06&7h( zj~_FOW%L$}2w2%cVZb*IG|c{##DzB6(%M&+81(2jdQ`7jDorC<)l|N0D0`1yI?@^y zqV{Y-Dw8C?ba+ranXMM{K=3n3TW8fRauNed1*Hu^@H{D%aK@%U%M}qgP-pKNv*%1R z-r2XW){3V~PdYJ?NQgymXr zCb^MLKFW+g9=?SmU_$aa1NMEmf2G$!v5?Jr;YzZ}WAPGt)(HhGn~6j$Fh?4$T;O)g zpB&=@rmwCRC0k&@WjR)!!{zS8oib-BsmiqFPcC)v#5~%ndbxGCnT#6vv`c<}ZS7c| zr{=x2{+}^bNg}f5QbI`Bg%B=#_lGN7NgJ%CYAB;JNCX}~#h0>}lN&3Y5o!P$`%j0n zJY`&mK zp+W;@NGF|ZO4G))!}8ccB!XtutQ^KvBhMU4i(BPE+;ne9gy7shQ)kqo(dg!K-DGGsI++{-&J%{Oaw&iKw zTYlp#h4%O^BX@e$RU*|R62B4jK9Nksl%Sx;kNr}P%KrfA-tAv?x!EO5qnw32j! z0%<@s0b21D9Py~%-^sM4#uoByw98XfufMT}S0#$o8Ev}EYt00}Bx@}yinZflC61x+ zAZ4?TirKdJxR%k9Xx@1cJ8^EBB9;J9REGtad`(i-%AT7VJko}kfj3GvWEG-yH8TwB z@X4(d6X`&pP?jdS%=Vm7YwOYGyB)agUF8($$23iL&0oc|x4p>bkVW`(1Pm3FhOPW$ zu?h`_$7y+ct`tB~*PT%@l7t~uz97??dfpctyo1G z#iD`=$Q8S;E<629oy8{k3#`w2mgK!?8SUXqdxuj|RW}jLK{YH``QtJ4uG;3)w!fn} zG27cuAdL=f6gM&psA6tGp|+MJAOIAp6rckd%_>ytRyG9tB-hyYRctgG$r<8!KPsF? zDH3sm?FW}7a~WUwvz%1jStcP68A0=>zK0%`3#cTrl{`OA7=oRuS6OPpZVC3a_8Ta# zHQheGVJDTDD#Y>_kzuVGSMZOyJ~$Xt)Z|HLU>qQd6QY@sN>;pTPFy+tn1V~e0|lm& z<(+?4G^h=TsHJ;i?U^r3txaxi?6F;asFFFBI#EuwqgeckD-g#3_U+XSj8)`x)2BvM zIdP${kK2dUOrZ<0%w|3R0O5;I9ld52f(R#yooN-d*J^8E{-JJJb)+DY#>ZgQq&ncL zT0X-~Qn5vtxzn7PcuL~&kK3y>u;?Cxwl&vY} z%RV{R*?_mcS>r6D)n5+}+xKG;JX2Fzb2i588i)vahQ_jQ@2rdE4gGFtX)Z!k&f z?3~9XN#uoxj90*UQ zLaKbf&k+LT$IS%r2aCa&Eq{GVOpFKq_7({I)9z4mJ#*8`T_Kf7L%?8U>BV1FNavP# zjJSqS9`(Q)bztGsHCQW_U|KkVjG{3CfbszSdN@&~lBlF5bJhM-!o1NCLK>eeG^b@D z@fdG4ER6M%!?n8cvU?$t8NZk18u+WMk>}Ka-HhgfjHXQoNv@;CNbupr`h0;jq0bD> zGa6{9k*cDAa~b*Y{{RC~jE-;ZYgNlRX4iRNm2(|I-0mU22OJw6cD{v3WpH*YtBSJA zdP*=#&m>SROYMdsWbjWOy@to@&hM~x{1z9xb+q!@TNP;pb$3+BDp`ovPl|$?Ks;(s z%-i?&z1y4bbY1UOJEh%~o$b!Ffk|khcg|3nKq`!CLa|~Tob=EN9K1v03f3gm+2%he z@(UWf*61I>+w7o3w_e4B*R2B!SBOH;2TKm0W(Zk?I|;KRrgOBKqIp1FIQxm8w2`83c$Z}!m|d$iR1uu}FvV_g!; zH)&o*B`dgHW@*BK$ReI9aE!kga5?KvWaHf9XMVg<12s-t&SkVwWsWl+jKdF% z)63^1aVjT~J+M-4^zRRtk&;^>8!!V^wYXjt$UJSGKI}gS(*D6%qK4@=7P|;oDqdZd zVOmn9m2wAB_F@xx#Qq(l4AyLMEsc5>BNS`wcYh%A3b0&RtVWGBTl-EyOg!_V<(T;= zijQm*!xwEkkG}4t5Zg-wN)E6gwusj%X0gMc4-kFWk9pZ&O6>rW@g_FRp?Z^DOsaDy z($ZW40683ptxr5e!^Hjqu{7*BUWa>XB2;^yCW&fJfU+c3jJ&41I(WoPgu8zb!u2rk ze^L=?B=<0`b)~3Mr^8D?Y3wz`FZ@gB+P<~6wYqGns`@z*y_&9pKXxlgSNmXhcd?}S zf;nVqAdaJRO?^3Hb2`SB6fL*46(~|em5{vBWO#r9>crfAT4d6*Zt4exq=cIImq`Br z{F92$>Ayh)g^j+%?!zE%BSY?^manq7(jKA>E|$gw>595Rplm;TgaT5{KosamsQd3G%q#ntJ-?pSio zU^v%$l1UJZ1ScMYr2hcGeyH`COGxo)pso9AFU&A4U)zSF`kC}`ghXkMQu>eo0C%aP z`*ePu7_n$RdHBDOawgMpnK-mGAbR#TyUmTRAH}u#h9meDb+TTk6#L6Q##X|>#wf`- zldv5_+&eeAw!NipH#EEJNl=K1c{>x};WCRZY#0(LO!05Ech6;STj|?&`^~gR82sra zlFHQ-@uY1l4yUnMNaJ2ulja}X&j8|A=xd?pJX&iu?s@Gf@jZ)flB5#`9_8EGU45-p zR1Je8tGs}A2*mYQvvvn@?wfR%>$hH|ylGCP>af)693qlun?4H0IM%eO+#MuSQI-gdN)(!qU8_I_X1J-?{_Qw~duP>foi{Z3ept0J*txgj z9BW}aL$GP(L9Z38K~{C6QYH@a%`2pi#3BQdZ3oiL-7U=Bz}A~YTIj2Fa)ASEXK9` zsAG^0a+8)a?cevKvaJj;@y;|k6`3zcml~8?8ujK$95s57Slc)CEtT^kgCy%#8pNk$ z@7AKv=;U(9&A42Ay`l|DB#?YR_kmIZrz#U%_~XxaZ?6%;k*?8aHT~1I8%DK2-}aSd z^)ctxSQa`8X{i{6*nf4uFd3n&-w{~WTiFnnn|*oKzS1|WDp!J?0j;c_`Y=NyIdncJ zvXkT{!}Pbc^hocyq_CpYEI=^~2+g#)Z8Xcmq+*Wi>lbz0umfTFXOXH*^Dz#zBSM9Y zQLE~&fTl0CK4j-oSJlnPI5!B>ZD`zCYA)|~(+#?c@=I@eddwNKWKoQL}ynY~6 z5y&;j`c{YGr#SlD{{Z`iv{{WqC!|YWp;Xo>DfU)kssh5GrZ*8_WV79KIvc6p(>M}?} ztt*s)hulV=V&C^UXOGsmsN(z{j5VwNUd>}|eLo8f>b5P_irBEREK;Foig%Sk7$JXz z<6%EbqTE_5yZfmpFX%30K9W8e0)?e`ic>6loKbydy4zCn(`U3uQGYOpf+1dS6hyv2 zb7nc3Y4E0RE&l*>Th0(Q7I_cETqBJ%bAM2;$YG(i-fd&AE4`V|x2!P=lUP+Tr9h@K z4~q=-Ww*c5owIcLn>cq{?ZZ*8%RGpv2%yv%lTZX!g}Ly>UHm^=caGowoqKh#*lk)u z$|n&`G^{;DC`EQGDgY3uUtK+dNkDs`_6LQcu=E$Lv2^SW1V zv!F4>6Ng8pT;qk~6$jGYLOGubuN2Yz^49kpOIyh|JB=$u*6S zD!Fz`CKCmqXj6>DCXldRzKdqzs0gYQ&Sqo*0oQ_V;;p zyBT*qrOnf6(Ry|h6QF?)%NbErs zn);9G+eWuDMJ$KOV6P+jc^@9S)9TN6Ur6nFyZ+w$ z4{vpkxc60q)B?9f(dIbCk{HAdC`oLXZ*ERYEwQ#dHBcU9Tu-!4Jqcy~{bZis}h0#|McUKlODP zhu!z%)%ypvdrIEPcTsC3TZD`TndOF8jFU=)jUpuHN)`ZCrl1f*S-Ieg$Tphjc{Lg~ zb>EjleKhccx?@G&QFm2#;@CW!LauRKiI#74GN{6yqTOvfv^#WnS23}UYBr@U(Q zS`BTg+a7IQYC#1h*~e0?MXd<1w>Hq$j@7F4q^Q%046&517<=8Y#_wS5-O@Wn+;<4x zEuqk!r9&SIQ010X99*3%LNT50&hpyjy_0C$Wr6#h3aN+{DgmuCLTRfyu_aQ2T@}>g z`^30+AlvDT8z^|KTTtmBza68s*F|?}tGtfQoqen9WT?1QWkfAih%6C(YIiNh#@6u3 zWM+|To>c>uSqdDp1e$Q=i(R7Ee!1F`-*t)@-Il1OsU*3dQq+}S3J`c?PZN^-lf2e^ zZZuz${{UlNi*Kuny?q{nEuSUb>>N*FU6WB>!tE$c01KHwjxRI(PCC){?%j3V5zj13 zGMHtlmS&D9)cHAG5_n`h@sRHO+dkR4w}w${=39L!6|_%0vWkk8SY4boGpW*?e>0Xe z4l(jC9oA{J_4x#r_%t_Y_(!t4TC+^WATdAZTUm=~b`@V33?)J`9lPVITkX4axx0{9 z81JPGnxQ(f9FS93r{V+;ENphGuHLcRB0I86wnr>=S!O9pAK%EBnz`vE#W=Nc#BQSZ z9~(Wit9NO$nW3s<*hy}!ZZ)^ITkW2uO7?4OcNT3zR56d-9kSi>0A0nqn>26BhBbQ7 z0$mLSRmOUA&YW|uI>EbQ(&A|wsQT0>l>Y$sc?r+ZibG6vkzEUr=g39!UR$THe_ICz z)m+x?<86TE7WDH~o(d77#V)=`F5A}GN4&C=Vzg9b5)o?9kpM07VZp-;P z>O(Q*q!2*!#RmDi?H1dRi?bsz+((te!RlBZoC8RyPEAPIQluR7!)M&K^Kl;6VM50p z*hQ`U3!Jif64kwwFu8qf7b?MBwObmIBY8TIq%&jgT=bG!!*6fUibc7MHlYfdP}4mO z2xU1AHOOLBo%H*a=TcZCwY`olGF=goZwFIVVVTOAk~}cZl5weTTGns27w=uIWh*?| zQ7`n{Fj|y66+a)s7^+Pp*e4OQst^DnaypSLxA55{wnb7l6)N>|Dd0){c&WFCX1TqR z%Xk+rAUbu#x_Y4JrL@q1c+^l-U^cXP&kZML+%ILmp)Hja7KJp~*hZ9GnrUrX zmDH%njua!woCAQHb>`!`x5|s_du=OHWEyM!pGg$=*UJ(w_8o_}6mBoF++Id1&5hzPw2UgTX4rd=Z&`(rtKwK{{YvnRHY&#WGrp3t7YP3SI&H8l~spj>c0N~ zY@IGCZ*%jL(0?oepYH>tSC};YB_YsbIUP{% zk#1LTi)#ZKJw7AH-;FPC-0YScfW6*US($zq;}tFK@yBOW`PYs6`U9%m?RdVTW~(mV zt!X1!(!@kGra4}~_hK<3$W*}5Hb@5~W5%v~6Lx!f(&Zq#xeP)uEL3}HPG7elMD3qe zJ77y`C9TEHg_)s|1r?jZiUyKv;y7oGUs3Zf#M9Zi%PUE$*>6@kp^lVPZqnWCAe^*T zWwP}vy?at#01^+j5i{i7V=j9yyv#A!PP4^gMM*k3U{{vB^?M04<&R6X`ls}+JJ~mt z5H{|l0;j32LPZ0(TB~PIjA`MXEqmSH5#MTT(AmxXFxc{vU+J8VtUH)$#E}Uk*F#fd z2%cYYmNpVaDIV93J7cKZe%stzb^6J-qTDPkKwi2FQiPpAXQqSGRi~YCFLK^HCw8!S zHyOHe&6_M{k_F-l1duHUgL4L{%;PVu=Nh}CXYt24kA0?=-FDyVIi{unZ&FuUmnOdr zcfk zz8AfRybHKN9cZs@!U-Y*nq_dS6zn(zSk>qSSnIw0~TX9on1vQge$iA=`c^ZI&xa&*jR+g=CR{utiLWwr>uUe0ST>P%}KB5(n3 z4@p-a{tPp4^wP9_eupin+Upke`e~zeLA=#e+8EkOvrTOviW)a4myu6^Z!$!mL6L*d z!FjV?^~@4nEQ8dJ@bv)y0GMVyp8j}=xLbE6jL=UdyaqKx)`~lth6gGTKx6H3ug;Xj z4gN{6(8)p_HyyD}B$cS8Eq@}T366I5q-btKbp&<%gqim2Ne5=^xFDOGO};(AJ8m~g zDd|^HfwMk5M4UhEh8`HmUhmg?Jn<#9lfbVpNFcahOCMH3g*pEK)MYvF!@3_TZtwDY ze0OW2+iPpV6<3S$^uLdGJ(94E>Qvg)lWU{C6t-fNh!IyLsW=@+yX^ZV+7ofKo+&lU zKw_U#k>K#jrfA2WsXdr~ZSULG-sRcu?e1Y!hf@OpSrSrzmXj{HWbrjr8bLL!0h|7{ zuGLuBO>2<`+CI9{m@P|Q8nR63E+J3HWRk>86eGwZiZ_!5R1gnU@3viCM5%8CM$=M) zR=h#yQgLkC{f6Ii?JfH)>5R1=m1^brW|iskB8%#$r18Z&QNO+^%W~Zatj8UuyGva) z_~C}}jvElb-;HQX5U(tZtY`3IjK5y5uXgK2xDdmpv{3CqQT#O`pi`Du$yo3EjL`Ka z_5NWo(Tyql!~;TW>DAYAYE#gbv5m)w zbyV^L(+9kbvFf_ObK)^wyvCcF!FRn|4!l6p;4>t#8lQpV zWo0y`VAszU?LRZ+9CEB0t&YcfV=o+aHkX|2)hWl18y0sE!Ce>JiAZSPSrCK#K;x?0 z-J5FMOI%vV3Z-gQ3qoA^A!1wET4LvK?mh2gL1TFHw4`YgITPs|bC?XgD%J4AKae(7 zxgNSY`))hMxvrgTHM!_)X;AzVK~??9;rA=eYu|WSkXF$9&!^X;*fz+v`-3H<_f}UF z^s>7Q>J2k&##N!H_u;F}--*{j}CiU_6<@B0<=Gn9o`Hw!N|#A(}}{ zi0CRz7ak)&N+J6heY~-({TqBuJs3dqucb`$Di;wHae(l5XUf$cV*c2?DSliGkVs&6{PTvu<`u%)*hhQ^rPF zQj1Fa2{=u=xp(;F1NtWD@BjdR@`qTDS;!*4#+m(3*uT*_cs1$col zK`_tajEOmD%N3j6@h07RJD%>-d6LQm)UjGdF0`K#@JPlpxup+^7j<&I&X-srg++ms&&?_Cht)!&B9d0!!2U%&q6>mPOO-PXuQ+w&w+?nSl4 zw$np2bQ$SpQ>Y3G^ECq#_I~`?_nU|AODScKY(9z2#8Sg^9JHZFRvHSQDtmDucbV`J zsU@t07(GXWXYLVp+U*`q$xzc#sUQ$E z)bjf=B7N($O|@aahTm=1Rs$dobzw~PdDosSAJn*|`iT5Lox?+67QSams!OQb*tRl) zOLNC9n0AK0V3N4-1RN8ds*SGmZtlCz*yaXmQ%f?a@bse&Ip#sn!xM$?ZCxVIv2W2w zbgNKRM9%*J#L(+kJ{>|x%ABy59^{;nZq{9zCg)i!a-Ej$k_ykOxn5BeRez*Uv)RdK zS$erXQ`MasFfh^nuV3x94HHRg7`2|hlwedgL;kP|(0`=o&z>CG_q&Ls341@z*%d1+ z=rl0D)+WB zzS(f{8)Y|NBy_ot{=2UV=BOHd6{w&yVtqH@a zxfa@m118Tzx+@YIuTl++wf0J9Sz(!-FKI07VvtIJI%YHC2pudoqIt@}GE9Smbjq+a z{{ZF+*UWo3j4?F!JA6G`$Y+Xk>1EcE1J5HFAP*y-J{Upy?z-!2WT7PIXGLwo)k1A6 zR@&KUkK@H#aGFxk3ZR8Oocq2bKTez*F69=KX#la8GR$Kob2(L?S0CQb-AqMI^eGGX=N77G@P_X+69w!jL)lG_PYx5_$3)p$5)p9L}oi&RT3pLqZ}II^rCRR7h*I9!p|E>XnVvD`8`y>Lm`2ILvbPpe^zC;GJIj?V zkr0T`AKul^D&_Cxio3ZtsO7ldcH8Z?0VH~g8R zoef%t$Hx@5oyFV}x`l?;YnhkQgcz98wU#+pwxjrHw5>2{xqjbqe)JJq(`l?dD-xOz z!?KDkS}gKG{Yw4FWcIbYJRm;ZmHT04F#=9{Pw3Y6vBxX*Wo>j1Qb`9fL^Wx$pa#6D z%ML$r-tH607-%i0RHGpU3}`YkvxE6hUQJqx8fS|v*LIX zHmh`oB~R;|N07;PP>}0u#au}Sx(QN9zbnMeI*%aEu6t(!`DWPKJyxbzWnt=Dq!#37 zkY-?O{uIV$TYluRl$*m1+%=(^&HC_1m*Pcs3Vd|28mpfn8^?B5H++t*t#7%@Yo#5M zQKw#x>P;MXE1D8XBix}E-Lz9=6(x!Youfu23zsh8OFg-wo2P4Wu7oF#wB~(MNJ?pF;1m^GD)pK&yNLsZro@cr7l4?I<2wekvxy3*K8AKUsrpR zX&#EnZ(#ResWshYiD!(!(Ew+FMjN|0>nnQ%cGKIY-8Wqfb(IxbK?_uRLV_p{8vC*6 zTRXd2-CgfVC9~9|1UZb#gl0=3u|5>YbK)@%W8@n(A!^fc$`Q2_tNx+4-)y&6DA;SZ zWUU=KGEH`+c8*A(Uly1wvNwy6GmfOkvqy0;x=Wjun5?HtN1>__X-d@P<6KZ*_g&tx zVz$UFRRv_0Y2+T9hHO;;pcGS29(ang@=pC^lWSj_adxb?a%GRs!Y9~;kX zZJN!Q4v$w>7Eg7=rg>Pddki|gzqX27+*w@9xH~|gNYfT%eAqPs8Jh4sIpP$Z*}6G5 zFm5nKwj^^q6oMC3WKpE6Yar9d#}T*rott`Cb~5uhAdYcWTWej#>b@5|WUGC(?+nq@ zfG3JX(ng*+^OeJanelBOD|~HZx2nfe({fCWk)TsvKd@p9`_oNiw~c)2j6rD%h5$-y z9Z^8lqyhl*&xQa?$9WWI+1PEivi?@egce(A8fm z;ia#ZzP8NTjeU!u8g{LIlu`?_&TTcIv%rxpyOoSniB-gt*+wOaEMrWj@<8quX#lM% zX{W&F`d1RuMZK@fLc$0$6>NxO%y|3ooH6Z9YMQ;rE!|nAs@p+kJJf5|(_7fphhJ=( zm(5unHZ>!)G$ZU-6}`W?Ny#ML03^J%wTUNqSpvwQqPfY6*1SbHlZGNmV}&d)uVj)K z=2tBdqq;6?8lSpPEJh*INw44PkaB%g^lSeBN7hNPp4C^|!3LAstZde---WQM(dH0V zWL!UdzE`4}YuP4>$c?2PsuhJrLumw& zPaj z<~^M8Z(#>ry0?(WZyMx_Ca$3zbt$h;O=>+rnuDDwi(uUBtJkF-jwm6TAo5?G?Qy++ z=;`a(jqh(i6Jt+lT3Qk&B$5=h4ATW3+P`ttIkL03eLIIy)r~-`v=s2sqC3^e{+FsY?Yxff zRV_gS>-82PG+9?Je1L4{IO-+Ew#fxjWtKV8N;G+p1q}rWHP6Qui+9{t(X7^U#U*0& z%0l{%TtF221}MKHa!y0THPddV{06sCYySXI2|ZgCO=znS-;Y79gsHKHQbbH1Urc8t zb$Q$SU6$=S+Qu9sngd18J{&Qg?mfqQ+U#C)EKKo@P6IV5o^-7^(|{jlK1+PF^Zx)X z=fc%zznZSrE41;l!Q$$^e#DfL)X^BD3=CplCh+b%W3Q=uU$M5WmMG>R35IlFDoqEg z_It7NFL!tT=ep}E>`{#iD;f;=Q-=)m7~^^1t@+Vx_qz{&@|VSY9qFl<8KcLy3b2uU z0LjOGy)aPvC@MJtmOP!zXiTz5Se(f`bH=gpXZG>)N6j~2tMShPvf^+U0{A~JiH{@xjg^uZJL?#ZVQmtV{T{{R>O zW=WvOr*2i<;H8OkrFik3v$QkPtlLk)H?+Iev`=L|_ z)uOGfvs5)>S1r|$P^f7_`b!ZGT8DL7*jCg)m9_CyiU_NvN_60OYr#@3(4*I?kfbm8 zvAOYuR4iqQ13i4+_V*WMrkIm+AO)F;EWmSSY{?YJ)}xWf*DG+5g+!vm9YUx9QF6~r zc_RM+%AjU^PAk`jqBV+3usnc<_alE*KVR3sPsaqZ`W3im%a4!g z?c;`x!b8G@RM78$4^qgiXgVyrsZWsnIBfQ&FwK^In?z1)p&6~*1NM`FH#3>p*A+bZl!Zu|;wk?I!6Gs9g0lmZ1Wa00JxHmNQAUd){em+Stc5T1`I6)515D zENZD|@s^ww4xecpNjs~|?6+;aesXw)Kok>iAN20qfLdB-xZDja-A)e03yjLKO|)(6Gnhk05f03Rs_`4V?@$vc;6bKUe?mC!rlA160LvZzfu8u zw9p-`d8}Ebu3vejw%H#0jwJxFVX84PK{DRv6J=%gfqi z^YbM{8La2JyR*2ukru~pf=JSag^Yw5K=YBP&Um(*@hmhp>nOKHKQeVO@oJ3EI_1ir zek~G5M@z0vzRzDIu+=plv^OE1c(+pf(O8#hZ&@raBF80?pY*l<>vBQF6T6+We450&OnTk#0{sk6!J4GFleiNN7jl zudfs@3n+iJ*$@X{o+u*S!y-=|t9q>>mcElmW}q6t;Bo+GmRv9bDHc6(G62G$H|qPb zPti#?CaX$qj>lJj`m`GRQqQQLV=lg;L0&nm>uW=ETdtnUwEqChkb8`?vaki0xqkSq zwA!r^mMG0VUl6DV)#7va@WZyTO)a{$$p)gNa2!v*nA0VarDoVuC@UJzEq`JY?lm}N zh9Jhu$_!@lGM{dK!DK7j>DFP@9?#?d07)=KQDKG%rb!}{mz^feuVRWujpkU4j)E&To}qu3r-}08{&-m? zev+2-wSQ03{Bf9VS5Y3W)5`?(<<>RZm29NYc}TGs;nt*bL{u~^{@U690O=pMe*IWm z3C-FnuDwF6GNJuB_~KhsLNwBp%NZZbJWg+vzBS}}9USRGea9SXbu54##@@WuEiGEa z$r+~vw)EZxQp;g8}CY1o`FRTMlPDd=UlJ5PP zJA=0Gc1Q}vHOw>)ITdA)XT(&-7Nb1zA*Xs3HFWh-Z)w3boo=o@jcD|#wz(F@v@xvl zyR`2j)`Inj>A6KK8?le=D#NI^QOxtS^1wtrM+!@X028SQ^OZq!&nniK(ZxJwG>p1+ zm=eHoVih`so<4^k{IQl02%_I5POFCVWI#^k2cJ`8f0>_cug21?lp zDMcCbU{T|s9LPy!!PfmC2R=p1`qKUQKdG z&B=QynM3siOpu}?hZLz;!h_&yys^A%wc5+osigk^(d^Vg2)?#0yt4b!LW_b0zdmp4jTR;5`@eZD`h*@fsq=>(pcG^RABYIpC%!mLdd zR!4=Wu(oYU1a($zRL_`$cm7xRQ$reK7%{O)+et z9=A_Uh3g6C0RQFR`R!G;{j(ZORsh#J5kf*zN_B}OuUVwvCdd&eM zwLCq(7@(d;XX(_R_+r_~o?U`$ZA2Mt*_G_YQbt=T;Tpn>CtCzHC@xoo6jBI`sBkhf z(!hWUadE>5Zt=#NTD*AqXY9sbV^gf2kBO}v80R_5F(?c+v~7 zReKYAq!>zh7V$p4T2aU3zF_W3*DbEq^o?DgC3Gf+yyd_mhp0dhpy}hKK zHTF=`+g@7}#)&a&RiU6Ic@`(hW8jVBg5N^qpj>OyNpuR(xJ;`~JpG>jSa3-2!XuFZ zHN)E#ZF^HRG3_1WxR$m>wP#-qI3zyZSz>FGwWLX3=FR9e0<)<&93 zbN)ng*M?SzPYsJ~@YsS@G7OeaF$g%oIWexJ>k!W6=blkxw(w!S%Q|8hJO~KSDiR;10FTrA4Y%joytwd9qRhl-gnm| zAgja;0LnF0bq1B8ZX}*~`yt<))HKtto>xyyTnyt`}kMb^4ppQci8lK*k z&yc>_vqNRPB&oL4){f<}AG4Xg?{+ds>^k%v)3|#U+U2(mw#MbRBTY#0#-Y8j%cw4N z%|JY>O5@5lPRaV2d2BY#=XBd)*(qM6QcBL5@|N8-oQcVZQ|+cKc0MEHyGj=!*>9`O zu!2|@U%lCCcYKaJdl^}xu{7GnGY0Db-7D4pZ{px8tZhq>c_h@xGr)P*$Gn*hIT#?$2Eh+JO2QA z*jy;J+O`|L*5HuFTj?Y*x^f9d);WJMK&a!5uV{7_>1S~FeaGFF+cuG)+HDq=(KKd< zH#B9;R=PTe_=b4OHva$^e{U&;LJ zoWGD?wMWo(sB_jn?mdn4F}GsV zcQ)_b6NyP{SgihHd0RT8bb{zw@pdt;ssh!ZJ4eTl%Gw>qhKCvX5996?UbTB%dgm$H zaai_x$SVVCN_ze`TT8InTQ}{oW??0n!-NIK2~0-e(SwEeqgtXX`^O8 ziKjCpYK!}{h)`&39mJw_TUE;E!Foy121fVvaFZjw^PA$O8<$4=ljc zYST<;6YDs>?xBL#gK1jk!fP>Tu5I?R$ILfYBy%*CH=6i$%$k`)IFchEf#ioH1GiN6 zmmSHsTnS*76Kfk*K#?O`M%iT%5(O_nQd}lDF^) zhI8sZp0Tp`$8`LgM8&SI1hfS#3e``q78{+gZ7RkTaDZ6Ip`ZPlc5 z{3@}m8Mb^DME2!OUbH_C@C^=vuFFqPkMcdWYH1ZqFRbSK&5bsHveK}7wrIg(6?5P} z6=ZziV>s(Oxpyyj-d`2GxSH14ej+A;C^?2uy+Apd$Uq+$d#`UF-KFCvIx4wqTMJ=Um#h`^-lyJu#vZ@1CndTv52T^iO1V6|8A5C9(dwsdx+_^sO z+i4{GzDiqRwz4oFsas9PW*d$}$7(7C31Z!<-YeNpexB|<;`&>7>}`5c!36>&R_!9K zGY4JB5yJWWLqQyCh~1yG?RLA1U+xKaHT~3vO;X&VG_AvhvKO8_sH-%tg=j#b#?{O? z=8a`}Hv0;n)oNO;6@7N2OzC>v8JHHauazS9Rxcm8BQnT@c#unVjo5b`#Q=T1r)Zh- zF2sO&3X@tNhJb;e3~u|kXxT4Zo!Z?N`=}K3)GIPnR1l#t-;b!Wt8n>1`k_gM zyaYx7$-!>1C96`;5vE!>of_unbHit+Vu!|jN*b0U_gDINFw#r9y)2&CT6MMB87|Fy zLfQA2Dtlg~yY-*4uwB_68|}v7ig?8%0nVD`F(h8X&5d35`){z!mtDWJ+FL?+sx)!V z{Hqc|(>$Zaw2bSDX3LZBXy2OOH|BIAn|QCIla29R?%UjZv&A%4n$5kHBqwiHsSIGE z{{ZxzrU153Swq|QQpT}%^^+Efgu+XOfV!%XNAj7#0P(5eihumiaI}%Gd!qOxcM8y~ zHuqDA+1*c8jO(s;P8txYhl6UyZwJHLYaCU$9!1Qw_cXO9yAHy& zSSQm=<7EcIJ0`rv>&ZAS9#;i`>qPtJ>lWyD8;fxzxu;p}V1`6?14@VL0Y)57k~}HT z7+Chs*|_cX+GDyf%u5*lW_y_4BrQ@_i$+H@L#S%?d{}j*_~`K~SGOFJ=f%8tWv^X> zUcDV%-!*t^8dF6!={7RKvDs9qELB$2e~%qeQ%-4FkSlmSRql1u_`YZ1z?=M!n+VO^!R{EX=V+_cBH_jZ!qTGdyAQI%Co5t8>P4 z@!vD!yyI)T(D5!4ermt>G#0LM%a_wz$+mDkiGAtliR@OBS6o84SRU0=;ezNGk=BQ} zwr$_HV~YO(a@?)bR<{Zw6ll^)ap9%SDN`ayYh3YUCGQ@O&mppWDIg$9yea_>9?0LS^X-8j9I-`z343S8-EXVG}2lWe9{{W`f z)w5;Mgs>pV!w)4sWwYE{ZZbt@yrqxIm(0$(DbBP)m2N=f$A+O?doK64?t4YFo40B% z=r6Q<5X{b^rj*ri(hVZDAo@TRp)|#Ng>hbW%s3|VSZ|I zw06IxY^+wQe?R((mOpZOk!$0TkMh$QJx$*?{gYzf7Vl)WN%rWX0IadJgEmmkiBe(+ zGYan^B8H@>PJ@amD-?#BCst|(k~NHKpa^SRWPdAa zK1&}baGDlBrRsR!7U8<@!TBQ9yY_9q*5#&M&6<)yV{v}I{#eT55S6879%fWh4_bcR z+&g++-@ka{xw+l$ucg&yv4L2@0y1N&4v7FAb*Rl~NX9q2_D=AJzBct~Altis({6)K z9$S4EC`%Xzd)`WW5pApAB zI;WuZZlba=;>xJaEM)%x7q7(OT~{jD-nq&4Tr-B>>P6fH8cR}Wj`?_xDW0EzugScl)UArjTJ|R=Y3gwZ?z7F8~q~*JwYq(o{_hEMRxG(-T(kS(u ze|t3cB)2`7D>V&eg7Uim04ZzB_^zzLF&H}z^xd@WFl;um#kX3dUX?NR8c2u$0109| zb!!#<(T^|sVY6!P3y$W!ie2JaCU8$zLP2nnRzfs{T+IfZ6dpNetaIOvbUcfa$H+HR zajqfAZ9x=pZ{1#}gVmY*tnAJ|dhn_PY-3k^N5!5wheJ!D3c9Ml@opCK*v@g4}Z=3UaC*(LZ^yyaA zaLy%beQQOblCzlWR&A^p(uk#*3BrsAqDX$aEar4I4w=R2z>sH-1-836$O=)p;xj!Sn%;w#? zSJl(om~3$~1Xd(nd`Yr~4VBu~riQz^pjC?u75s=jZ`WnpJNk9oYy@^O#41`nLRM}h zXZd7%O?}kIk{;pTev{eDyY8~hxLn^hlot#nvy4+QLairMamZ=XSDkRT6!|B0@|}pZ zoDw}$c5KZpzCl);2ggAZl47?LNmd=j#ay;**H{)W5Ik|y*WIhM_MC0GZ;d#KC=*pR zNC4v6PM;nJhAQ@s{@**=b+PT0g)Uf=DyZ~8qyD67=sD-`k7th|fA>1$b!2Gnb2gGF z<1&*LhkdS<*T=L`#jw<(Nn!qgkUwu;x;OpEwumiUKOjoy>;Tl`=HL8tY`4@dcL)qB zc%s~W#K)j}%`rb0#$OoRrySINZR0TAmH_QTe+K7QJ!wkdSF-J;o)2;s>`J~5)2jJ9 zmwtwAGwiob7&$ayO;5dnryO3x*}buIY-P6J>{8~Lq}tR|$myXq<;NA-emBz?FynWsPUx`gbvJ5WK*#vr)k*eMwh*`&$O``e zzo%Ea6vWRZr19O3DIzwIe}sU-p3FLXE-^Sr_X|mE+=! zg2Tbcb=E%}M6wa6-vQ(2fMlM&vfWq*m(`?E{?46)xuTVnbQ?=IAIR0i@S$+be1OAO z9iu!@w1VVhwaN+9apxe7l|7}0hCN&3&CQn!N0jiHi6e41JY(Jq5M?(m@&Px>(A9TGX?2BG4(f^{FmSma<2JtmDp4Jbw&>pAZ{*GVmQ*z<(5 z5+8Q7G07!lK)w#r*N6G46=PrKqc5*c&$aCnFHw@%A>c~|Q|v83eb|Q{=fA{FyPMG} z4Al~54H|mJ=)lD<4PlY^9d1H0a{H+F;h-vt(>S_4j`wtvbAgoG0u@52T_%;O0GjdR#~a@hEpaBTMHEv{vb6izJ(z)c^%5Ja8;!o!#9P}G zqPsIaO?j~;%}+9~mp)jQr}Jin-IH{5kR_06Y|TpCp0>w~YxN(D(7_Zbdu6Vs3ZpJEP4L@K_r4J>7{w%^LOvq?k&-_ znQX6bWTOOIa!Fd|xvc>PhNZ~M1cJrL#f_%kzMAF9XGspTh}hQEeRS8+WLj2a8(TK* zemC)2l)7WfEgJfl?h@V^g`6vM(@eF#xit^pQ>LMLaN-UcOS_wZ_mhi%m^tW85eUsb z1_h{Jo<_7I6>c-~j1wDIHe7#@&q@}ESEol|UfpTx+MVE`Yjbk7R;gaC>5+wTV#tzE zKEQsKH~qHl62)mWG0yF!S&3HFN|jV2T$*cFWL8uk8C+FuUF9cH<-Uq{w23tsl7Ve6|nS05cP4X$OcS*f((kzIIJ{NyT)YYJ%%RV@k z+46o7$!%w4s;O{FV1~4jQ>kBPtXQm8o@k-BuaC|}ETM@ivKDp-at~2$Hf`%~k5n`0 zP__7oiL1nvAO=MqnGI2@%%FY+kx4Y?o^>Y`y_}p*@q)h| zk8#JEv)q#1O>Xk#i*lcGDI=0c_iYHh=2!kxhcOffK17bKEFs>bJ#EB8EKQhDx(Bo` z0s0|ZO<((mJw@;MEYVhu#e1$K{g_NKG$3&PV{ zdbMV&QYnyyRWhJJOSoL-qVikau0!&c@#txNK(f2Nl@qjjr>X(X0AI@n~fXKPZeX0n!}T{PBhSb+&5DBZouSOAEi zP`_YE#{alO1LT)%}W3)=UP(~HdhhaR9@d*S=pI1i4#|>1CpHvq!t4sT*t%A zYPBuf)udj|`b6AY0qic@SQ75ew6VovFLF9FCA}^21f$6&MwQfInE0G$j4<9YhFC+u zE07=nM=??f1Ba%#--+(+7v>h_*6vyoWLlE6ps!6b1ZV5dJo2U^w;LLkQp8(+ImwMN zPC9dK_>R>jwP0IfZ8gfTT1)AvqNFs9B)-&y_{Zc&U1L{I>auA5MdTb)QksFJi%GiUyUFRz zG%`gLcO^A;HWC>NMTv)sI-b}kw^mj#PORy0H|UP;kns$ zp#Gh_UTwB%ZPHGyyv1C5V|QwKfr))i_m*qF`(sOxe0#dv#UP0xkAH7fdvy~TOt8;S zl4*6qs4>ppaXv~$Q`5*pzOvdbNwvPT+^yk!y-`IZYvx)h%ee9&FFqh*M%}q@n`W8z z-N$UZkQ#y2k~f&2!0RozD7^J+CZGyZrwqojroktdcgAcs+jYE;aj}Zm664krT83x* zm#fY+`+ZHg=)7JL$ne{h-LlDChVLLtEuyS@ZPG2Byc$D%-0M+Nbo{f1MXi1iq<ettzgjrlC`s_YUl(kSp+~u?vizV#?VHd6oqQM5T4$DC{5>|q8g3t)QEb)p zM?y&8Js`0yP<%~%>4yO|99GV|eQ#@iEi7^vB#17-5~sQ(wMY}LXPQV_%pxF-U3{6a zdw1!ElIwDUOFMX?Yt~8{bKz$SMSn3rHr^O*(o&F_?`$Do_$@KrvyU{A|Uo zj?DLTJKNLRDZA0!d)rARuCYAH4YZ6>mp%crg#a@BNX#pR+)xrkGuf$7$lir*Uj~58 zNC$>zjd@cKLvvt~q)FDZyK|?j1zJGklaQfVyhs$!jx2U5aZ8Om>@VE7uSyvpl{PWa zf5h_kU@dI~_2x;epDaX$nHb;^o}$A(;R*q2kt@X}mIVs{-?~L8a`$3w)xC_)>3=Me zqoq&>3d$?-gT|g>ylKxB8(MBNr?(ut4Hl=6yA*irSmct&CA!EwzXIYzStMtoqc#5k zfG`*>p50u>e|vWWBo}g9p%f^QXcgu`9DD%x^2TOs9h%N`n&#Fkq8le^dX3L260|() z%Z458`H#mM`!u%Ks{a7lRXn7NXAMe!l>^bIRL-}L;#k^Tswkqgvq>7Z5NE`m-9xw9 zdy474RvB9Ixs7s|&aO%;ksRtzJXlS`LjFo0K>jl!d zxHC;0GFMwmGcgJQCn{#E!Yuw0YmB|!{jBw{wSp^|5RjrcKs8c67Lc=sVrwY`62MTA zTv+SqIgZ-m1I76aaM%2Fsl4Qy>a`6SVv()L8dB5EJsNVNALRRP0rxu<9Yc~`w{D1q zk{Hugrj7u_ICV5;^!!bUR{MW&?s5x@n_H(^ptB_fi?R|ZSb!@q-62#|YTJ_!K%GBBI)|bZsJeFbpES4E+HNQ4W@T9ORgCu(N z=Tb&g_44Gvd+|E)womFhF6Xzplo1@Ng{rgw=30n&@hVT9G70bbWE4`~w}tR62-<75 zI_kz=L1wCJscNn{x3<{|lv#fd`W*;lilhW1$uN)p9_5(!$tDSLyWSSInhA;N>eLx& z(o?MJt2IEW<-`hOw=U?8+9!{=xopD3g-`$N2 z$a$|NeSGz=uD5Th75E)DJ3ACD>ducvuc>EGu5Dd5mE)Rtp(#9asvO7|XrzYOuVZ0r z3eJsLV|4kDpnma@x}1OQy+O}_rZO>KZUV`Sx3^CNQ>5tP->Fs_6(T{>gu=Rm7g7#m ziKuf#!DD~Dp~&s+V%S=-uNup8a$Sqr-fO8+tkX)mShxPwiVJo~>6~ES*UF7Z}nAc$zaQ<6`GP;t+M>~+O?KRB1r0gLZC1& zQT)YPaIJ`OZa;RtYWD23)uE$qlbAIX^;*xsxMPJi%TAmP1?u&}2+Wgr@?W>WoONEi zh1I--^wU=|S)QkxYBeUNq!M@^EL^>XrNz2IJg#9QfI%2R$xI3YxlurPa5#;vOG{&G zW_W8`YPH$*iRWJ8Y_EPiiTLwVu=1^Xx~XADh=+g)3}BJiWnO!PjblbuH0Q(L_Fp=_b0kUWL`nBo)n;xhTvj%Z+&Q!dpRU1cvqtS=Q!LQyT$Yd@3`g zbky0@+wXpm)w3evH1O=6GDT>dw$?dUaTIe?k zt^>U61f&%n!NQ*0O}N@3isA(b&2Fz&qLWJTtq1AH8YaGkS9VH9hhcu5*){OMAQF44 z084+=_69ATw0m&YhA7%BWo58{F$b*l_cL0+b<7fQa;Q1^)B-)3<3Vk=ZSq_pFcycA z;g)=B!`Rft<3$X0PzzrlLvY=ON7sbh>NO1q<1wGxl)i^$AopuXB$i)wNRf^@rQBXw zQD5hoBOGfC^3(qS!I_jlvrzG_Sk!Ie+iuh(+RL%qo#X>J=;ICr$k zTD=-NO|K-b)RB=E<#jdyjzDq0(iBR0C6Y6rY##znId6 zp4}(-X`U+WtSnLblEZ3Cn$|wO0O6fPX1Q`+9P#V7`0lbe)LpGwy3CANM|S9F@rH&I zTHH>;B*%Q?qf1-ah>O(HedpVqFx}_$t53>^s=`n40qpfu{iNfZeq8?Pv^*DKTa_2OR+q>d~wzv*!Kq4{E_|0@d`8X{YLMP z@fv$>XSSif*HpQz8qGZuUbHjOmc(#LC7s2}@x?l%qA3^xox1Ul?kBiE@qeW^_c6Ok@^?=Rqb@{&#hZ>PXrR}mX`My6NzCHjWEZd z9H}7bX&q5mYB4@*8O-DKJr&zE>fHQ81q#;umFqy(BCS>${tmSDu_f5+QCh)BiDQhA zdi<%LK|R9UOk^{I#PBD?n&b9r3v@;3=sHa@6&sEhYzwgWnxk+g#sBl1CB{uH1aNpSKYn%Gxs=vM|&E%g>G= z?b?RE!FC%7?ImBxScbNX2_?NCB_V_H?8zyw8E*2)98$;uzzRlsyNFJf-!8GElf{l& ze*PG$o+w&lai|3}8hm{6+8JXUupEvm+|t3`p))I_NxdIakF00EQQCO$M?`>2f>r zBMQ>}(?**5^*mj_F4d7*oMOC|6^w=O36*i!=cS8lyxes>Y>5icsSBv&c_Gpce2oTv z%r|p=2HdM0>KbOKJn2zP>0D)79Y*r>ki)K%PeR1&J!tDu)mGU1G^E%=b*+1}Uc9xI z1coV@qIsS?f*3I!XsvEwiCSCZJE?HQiF#m2e=H7|1Psju2_EcI&1hyshSNd-x@e~| zl?+Wd(xcnXnA>IcH+*&tme28|)-*Fue*Gu44uUt;;ciD1R*O89Dc7z5k^Jz(*r-6R;@sJd^^{_xes5wLu_XThj?|-jEFIobs>i@CTPh{VeFoDTLdn*Z z@?-|ONhAPI42U|jpyqL3>YhcKHtECwD(CS7m?NDt@WkGttsPCPvR#Q%)bLiRWv7S0 z(W4Ll0MqON3@p$kh?B)(n<|1_1KT}CxSmVEBT@`&#e6{FPj8+jgYwb!l=|D>`V3m` z+k159sY0blDKlG1_Xb!jm>uFUR{Uzxe>?f0n8&(A5fv&y1a%c+jTp*E$kYQ$gHih` zGs_W&T3IR%l6d*~97Mi~j<-igO+uuM(L}oFVQ4+r_P?0%Je6g%^1@LpM;Ewc_Zn1G zGI+60{Vej`-n%O&Op!((7|3wo4~VA>@h~KI>(nb#hC16TPj?%@)7OdEYwPOkR+hfH zL9eWn8q!E5YOu#jxdj46BjdZV1P+?JMtf(95V9{8X5vSSf0a!siBN^Oq>=)!Pe|wb za>c`EG*3aNNvlOAsT#G*5wbLX?9v(#n)W0B%xcKK;8_XALC5J&8=-a*`gyH+n$s$M zx#Gb?K`BBinG@xT-z^Vr%+(NzvRbQF%U-uKK~}vDZNI|z7Fm7CBbI-4-^m$Amv7nB z+e?_@lvQ;yNu>V(3DVsB{HupbGf_w|;F(CSLb>_UzkUSUl7^ttyz!M>+3u%i)!o?FuYT3J z>Oz!wydhqnkrr6XV`k9F1sKtiLx_UMIT$$WO%hoLSuNwPmGvLqKeLrRha8sA93<9` z+z09RoMzRz7Uy!Z>uOu4xra^3bXqF)wR~=tt_yFmv+nNgegqp;+Xit^ip(2hwNnY_+CGwY1z?Jgv} z5ls}GFoCE^r9i05E@$;)PR!6qVnx=>K^bzTEB50t=bwREwb-oao;Ic79YmkP#Bvua{I6jqiHR2dzyLN_H?S5)n zG-+C?;KYHUU;hA<9*-wIE0uAd{4qo)9f4xk!5<#kL#5e0`%>A0?3pGZ(P&_Q^QB?|Y~Y;Ut1q{-qg`HKt(_H!lD_)nThFn!JT^Q`iw+L9;^y zh^cETM($Vnl1lNYocjc^QGbB1o*I0S^1h3NUXFFv9lp0k$GI;c<}~U}JxMjxc>Q>+ z`wMc~n)6S-y>2aiI0#Z+)4PU96?(AkUeUeoJ8BtvGu+(A6}#4@jD&*A9|(kThn1KD z3Z|NM7?WAv9qAWs^=8s0u(q?Fd!?uv4Wb&O$bXvmTBCwE&Si)uf(&%Lw>12#e9uVltqQA{xMeZw_U*sG39{VZT|qH@3%Hm zhgdD{Wl{+gU=EE+sz{7Uqo@%{1V{R+l0gdq$KgW$P)KESOvHY)KUv66t$UtB3Z0i^m^cnv%o`4AbW1Q7F3AvTQ0$($kl7b608PeT7Y__pL>0co<~c znTZxENrI{Z48}C6J`Nk*<4wfORWwk!|PsQo&+5S2}%!d2twJAXuVkQo3o!+x{4@ z>U3IN)}o!;(D>bIjWM-G?aH=mTS$K%e>s#TSgAt>J<{GmfxsQ|G;=aHra0&sC|;t3 zdk+j}8uM_rzEZ9l6+9|DDbAQXMH4*MaS5Xn$P&eR&_h17LX9tprS2H4#5@}YF3zLK z5>HJ*5I>b3WD4@(fqTD7^*tJat$F5gTDhmUJ4<(7V6_}<&m6T?gs{$~fDJ;+iyx3( z8@TdvdjLi{kYrK>60j5$!0S7ICHXLtN|p4E9P)BJsGMWUZ$1aliDz1i)< z?ad7C2=QZvP<=X#EYS}}c*?On4~MiISV19|^IDIc9GUR=gulQm@N1swRbV2b298Ztg zLGHudRmv8mdht}bMXp&(GuVzPpp|dEVG7$OLRM6mR)kBI%%cGH66q%q1-NA@f{LnZ zkp$)T;q+w;WsMv;;>1$E+Hu3!Yi$-gmRTxoBC)Zuve}_tRIhH4_LNpIGRsOF2xLN~ zRG&|%Jv4f8PK?U&6^ez26>stI`|$XZCWltP%W+DB$Ht!QvCp3_d{4OBiaVc(XV7VP zvRhBesmkANCmyk0SD9^D)xCM%U2Xc(qK{+SXo*HWo5!zW>|d$2J4+ir_eUR+U7y^9lWcLHFOmCLV0TO*pAJoPYf>4k>@4{{{Tn^35U1$ z#>YIJDWTmL^GgS9GlU*%>0duc`|)$SeHiX2w7ge)9FlZ&tST-bd0Y5qc4%VuIv;K` zjh`6#3g`5#mg9tIW6|o}{r(-JucqX?UQ1xjUPyM5SzCJ4nNm31Lkto^BQ4nvTI+7~ z?6hB%u-qm$w*-@SFrFCU2mXt%sY&*Nqa#{@j1>O>Nj{?u8=cXqW59}3VwtkvbE2!U_ogm9xDK)Ts#IS<2=p?Hct`)k{N-L zM(i>P>ekKsJ)>()%YL=#DFJD4ZV9azn!USe8E~dYD&mIkY5I!FE_R;RzK-mY%!vzH z6F@~7667qaQVnQWni}!M9}VApox0U>5xe61UNN)Pq>)y!KgJ6$yE&K5qDz|&drrKL zraup|vZ99{abEpdZf@-r`-` zX!#raW+eocAejzFNNKMXN%PW2@p2Nic+WiKCZ)}din_{M6p~5x-}at^Q@zp1quoVH zTF7^r%L{(gYRum8k|E#7=c?1)TL#?iZEBKDF={DWn}&v7b&$D6BvzTI;frzf`?+@# zli##9@JPDZR?^vSVdbR}YP_rImBxH)kl1y+Lbo1fmt)BJB_yX_rMkCe-!7kVF5Oxd z_9|$#`q^cUCM)*Zvay`t#xdCDZg<)5(M_eLqcpykLky3R<5`+Pqc6on;Y{(du zP-%+Wy9-|L+-;@Z?ssW>f2KoQyv+r(NTjfLNWhll5JKqGBB1^1<2l{cmscMmsmG1f0nV&Y*Fn1x8t9F^$|>>dG6-O_t&voLtIErM0|v(x?=K197HDlChHHvm;X| z^qP}DTbIkB*Xg)u+fA*ns;3lNE=jcHk?kkFVw^Giu+!4$Xi09(h~&(REsKURpCWJ% zP=BMX?ZmshQ5K$AL0F=Rsj5X&N^`CyH*h7Ty}xfuD2@wTdUd9iWF@%i zRJTn`$AA*Pky@S@1I#u1`W$M-+Z=;UPL;bUHyln&zrT9rapE=BqqnQqu92qLPYW5~ z0?WjXNB;m!CtKL2+cf1ZzHT=e$OeQ%%oK85u>J5ta-~Sc72e=?$RV5O&fO#|X%%{s z6POZfjY5PYE}aWhf=)*kO~=T5eYl>=uFsBX5Ik|}FK;;yC$*+(6;|6VTan9Fc9&xu zamawhG_y)vGO{W^YWsb*@@>W!+Y2kHE~y+nK*xa^i2yYz>G02y@8IWk_O~_$mV%DS`D{8(ZoiIcRtKr6 zpf&X<>zbUi{{S_jff{1JY?8@>y=Zr9d7#?jv6jq3Y>s4M^6S-iCp})HM)sOghbrSS zvhOx;yiI>?e79FOB)}#U1h~r$^OVnOuWGp>KGun_+5w&c|g>ky_L^ zzr>*3-`ZIC(xv;$Bm=^|S}|I&bVUo8&xkJa5$1;(&RA}@7SVi_ye|Y&-ATv-1hc-UaqpYB)tnpB26gd+gh7Tm1$Qo$sARe@ggwXQtOB)w#MrvfPa| zj$K0CKx&x`P_h@0WlFOGb0C93Q!jArdv((7vrRk*LG|0LD?2?1=`6A<1dI39Bt&0L z0FtEPTz7x3;Cl%+lhCUC` zsP_Te-EF&;^$d2=NR73!#IGcp1fxR|NI@FJinXGJ1*yfVa`T?KN9%afYQR zUuCO~A$+1kB1<+Qf*4{<85Ukf?I~}>HJS`TI-5qwm zg?kfOw_PHJ!GR{%Soec0CSvO=5CKw1iM4hO)z#6K_SbC|gNIdQ*5By?PJY^AR{8Z) zXtA~s+g@(>8H?(N*HF+pnV;?LTzR~`+dO-LOUZ35 z<>{I~NIIO)2U2V8$Ee$O6jE);d$n8NU2V+Z$qq{K!Kx zG2=m(47t<89+zdb-`MOD+-$bjuWX7#!7`u`SJU}yWk#5q<_Zu6T85aY>V6@iLXN(9 z`G)ItuG-T!_S_a5w0N>mmf)A$s3zm-5B2SNEMt;MpYlVH3$l(+|Aa8mx4d2KB%+sz>O z8)4i2b8wBLoVe-gu4c5T0BWXm;mr#wjro|;oSs}rflUlyA3rdYgA-!xSyg&HD{@+jm8w<`Rng7}o5g*rlk%akuoV zn)qPYyF()+gusxf_ka5_`gNeO?A@|!7$*M!U_nYCtz;x0`r4yaAPW8=nB$B^@6=7& z+i{*S`=c~+(nkJ7AkgI!Be^7+QmSe*%N9*O+vILjR+hmlY4y6fE6WudT(g;KwVN24 zNn@J4*7To|1($gxjf2AwRFm8pZmaICyI*d)k_g^;ZdJi4Zv$x{jU)$9RDoU<^Tpk! z;osZL33Sog#{r6g=iDPkS`fgHB~w#Rgog3cl|_j1iae7;UyXCK!Y$}-*v|bc+Y(;C zYgUqkuqR$qE=@RHyk2;!v#uF?o}eb#F4=MYOSgsU-h>?kBy15g)YYtd^Qjpcc~?AI z%iIgUZOO8Ck=x&EEKKPPv6gnGl{&t2rbqx9va3@%Qx#8*xZei&mzivAaZYUp`VE{1 zSzZfVlTkvBq3jbSdlq&YZ_bMRaibI~JSFSrET{O5hjVTl{{VIEu)(?78(E`ZON5e2 zkSI=v848N##=mwcyEf0azMgK=+-z6T?kysasn&)u5UxsONf)`&SRQr(v;&|FfKsY25j;&XBzS|@+e^S1N#PE=q zE@Jk!qLLp9E_Lz;7^pTayLO0LCeOCdy9CtnFU;Fcwf(}2BxE1^i>)cnxXbo@E8?Ag z+Sa$7d}s2H#^)YW&!@he(uFoB#6rt@mX_2mNb>Pkk(F_uQbvy3dG1+lh2G1!ZI|&e zrkAa}o;j5=RQ~`80CTQX#zOCC?7K_Tw|5rZyX}`W$)jevjFM;tBuI+Xng;~X(P=|a z%U|%9#5{_2kB5BMqqR0Ak~(~*wVo|Gjbm3tlk*JH385|G#WD%V1Gaj8PW0|=r50W1 zX1Pd@7J@@6k;1;5#&yWh(>h=+yA!iFM=|W%{iu-qD{`U|9-jppjW`oZR-hcPOW)f6 z06W!KAvsUQS7Bw2Xk79dYvzs+nAI<9!~XyzNVzz}7VXkS^%r8hh_^#fykVpBzr;emA{Fw5eZ=@E%*SfC#QqkC^;r zau|xU6YbJFUOBn0JdcTEG@Zxk)GPkw+pgPR%wAdBvB{R!?LS&fzFE_bF1Fs)xwWk< zw#&=H+8QUl+t}B~LbbHZ{{X^#>6Rl;#XM^K`#YSEiu{$KtrDYKi-k7;Eue-Q|(Gp7&*aK+bTZKh|Nd9>W^ zLJv~fwT$tud_tR-aw+?To6C+V7I@e8{{ULcQ=gpto2_scGTY!<*<*>1++(>=>~+_x zx_x{@ujo%#_WO@}NeO7|wz=1imAPas_QfaO%k1WIH#<+$NT=x?!*zs{@f$Qcf7G35 z+P=kXsh=UH@o$B=WvG{J#J{+~q82IFfhD5i++q67~N)dBYB_hN5L!N0stHnTKbTZmh4$Wd~{e6voEJ&EL1 zQ0pAZ7xJZ$l~}w(vm9ji>MieaeH*{8kbx?qp`Cw3CTey^rR$k1oSV%&Q$@hDHjf2&t zo!`=E)h=weN#Wu^26y3JA&IZpY0nj#mecjb%q;iasws;_LK~u>gZxVL02*;Q;sW~r z0C1XQ%Uvk*O$VEx{lrH>Zf^DQTP;Ro^ck<;A|N|jmqFINFv5N{{W}5>6N$k z5z9~nj3X8B^{E8;R2pYmV>a6t)cbifLEB~JfKsrbn2+KeH#8n}BD56Yihl3qn<*q3 z{{WPJGTG3Y7Ba^Cqeo)AHSHsT6{%vARYL8M8NI>;fm^?lu)ylt+qPBN?>kp@QspR2 z6A~FldRQckx`;e-G$SA>iVe%TuHt01?){9V^&his;VRQMm^{OO)lN@yY(3LIk8RFk)+AU`JZOQ|tqRJM zvhmj~BvMEQF`CW8Zrs~&lH+e#W`&S+qMAls3OLG6v|6H63J(PQ`liicT2_|2-jN(@a`8RQ z&4fDoI{Akh-t1$Fdon{o?Qb=ofvAMUXYR zjO(PvQe91^jX>N8JVh|%R@;?}EIaMEwY_OTQ2hyJL?)Fp(k5UYs6!|jH!@)K66d zQZv4m_-Uw&k5Y7-IU>|>j%B*1yp=W2@W)0L@pUROCm4>2)R=V20kZX&d3+3EnlyRseNg|g+Q{U0Z*A=3w zvOz*C_o&~V($O)?ua-x9H!Nk|LRjWJF{cWu*0u~ZLQKbvh+n*EL)PaiE{M{4v~tGvKq4y zVWN_=s{2l3Umpf6qg4l)z&(+g08Tapi`Ym08`4puNO_fLA3r;TlyrBsaBjI z%|{?f;m;A2HySv#)_B&nDY8(C88#HJ-`L%~THV>6``(v#YAVslvrA>Z^_4*wP@}Nw zMa`wznRi*_kj4P@ga{2XuSj~&55Ne-OFh!lJg-h5t$&4 z6vN$Kwivb}Qv7&DUMM2J{c@(#Yf-fbByTF_y<3kY`#BcC3g8v&a@{PKf#DZvA!k3A z(-D%ypCdp(^EJX+hIxKTp$M8x+V$iI4K)=y^W-V#f!oPm9hF!$Ry915U36m96}G$G zjcYY1NoFK=I%lOdl@rh8J;jm)NQ*HldOIgbt=+B_;kDPK$rNcuYE&x_+&PiPqY$?k zC28rkyf;#W))HxmWHkVgtOlHk0gV*bPZBX*eYeP5TEgEt8`NQ+V%oiAFniUt)wQ=Q zdxrhZ&XQT~-TW|KD$ok`plDSYm5UZLBemJLI2P5Uic5gH+f-{K7X*Mb$W$rP24I|3 z%{O&zGmXMX3{f#LprHe%;B^^_IAKFw3Rgdhpd3wc{{WKtovp_uqo}X1)z#M5mcFZR zvXnIqs_arqcj~omrozHcu$~zh7@o4a)>1=x9GG{T9>^^%?so$3G_J_;0&0#wlubBB zyi0r{v;@-=c8=ig32$eH+2KoAq179|O%;gCCDhEP#<`PI&l%0Gb6QGzXg{Lr?b5eq zw;#~U#4Fgk)gyU~^sCem)^V@VqE&wa?1>&fXzNa!Oq0yr8Kew~Ws_cjE5m>!n%0~# zkGtLySRpb(l0X}!9FP`$DaWO%fqG!(S&eexhU>|-RPF9Ir*jl7tv}KBZ*-Zoy0)nq zmdE8@R*5TKqZIA#5$-C?5+((mK_Ovw@IxMgUO-)A02egNmRt!uX+egUcDGxJZkVVl zy)z*+jaMQGEuBdLauun^xaQuKRBM+jTZ?Ba-qXE^(xuIn>NJuUtgS+W(Wgk>sbam! zo-q)PA0K}b4$HXNYD9+Flqh60HAODWR+@+vr6@o(Jb}U3ULaX6t`YjR(@{sFkx+E0 zCYje!6sHqh4-@1%-YLlC+3apL{c>!C^<&gqo>H7cZ}~9VzdppX(A;ex-ANjxay$`|9k#+zBoxel*eF&CiNHu_B-me#I>duOMzhx%8L zxh#t^&ak(*Rg^eB9eLf;?r#}8(#m#-T*e$}39W$$uTlut#1TR(m=vxjv^@Wsa)A|Sw}K`8iq0MOR(is_@$ZWn`g~t&}{a{kyYYt4ZRg9>|bF* zoMTl3$-cN2NTw7cM~)?uQ)Pm$hgz+zcFT*%qSF~haPl?P^p>*7^7I$09D0Z$HAh;>$bs-2pGlxEscSgwG%wuTUEJ&TR`+&c z-ASah*XZi)YZ9BZw<%VC$(<(_VwT79WU)859DYhahCJ7o(v>zvCbu@?Siv9`jI#r# zv=s~vM2``cc#tjZViFsnG&3ySH!2*Crj_K38L9|0RbmGkaKpXwY_yAFymw>TBW>ZQ zZq|yZdX=Ph5Usi4v#_TuR@TT7x`R249AtocV$yqU#^6UV=z29Ox|%TZD^N52;yiKJ zw%6NqWl@%74W*qLx=8@%sOoHp;i{Q~m?IGnzSHX3(7g5S)Tg+ssM$?s%f)6aQn7iq z$qrppUtW|ZPVwYKRH~GfSjm>!Nnlc%gys_>(2ZuFgqqV);l`eLh%RHbX%jVIFT0U>Ij2XF>!sen3aYh0;?TV2BIYPvRCd&pW1 zOCuEkfW(wWC*#tjfM_Uq*8>Lrg!g#PuBAPeu3NRFiXm?1=88NpY$ey;v$*$?3e)Rm zxmn>^jOt}BuCaiMWD#vNqG`*djIJ4&qOcWEz$s!0^pRRrS1Q)H2<}oFn@e7s$MY3P z#!>I(y;-K%UNZbRRhuyxUiNI&Iy1fr;R{aSn#A`x(6(a3|xy{+8LryqB#t`B$3#( zasJ_zsjan|g%h4)|x8q6dF4w>?NWvVWMInYgQ(#N-Bj}v-fAW zeye9)xH#!WI>*d8TK&v%XAHZsS{ti(bHJ@>UwYT>ICbo8?aQr{=ks;bM_^c!S6NlI z(?#t>HJB*eCppN+OEi1oj5Jr1Ja3R~VW@c4jR>YgjwijxY`~hYHtQ&)T$+ntwd0wT z{kV_hKP>UiHC*1^@$DU5GR9`tTB#npTVh`+kGO7Y-`}?a`5zD+nfynf80qc5x3}%x z#0f0za2l0hGyee6qwg4ld)?i?vc=Y#3s~$*>Q0&BYDG?_J{&9V$IoAzKfG9Ov+Hi_-13*3w;svLunMRQ4i8d^Caxp*ThH2e|Lox!PJ=*xRkG zvW10sWtsNl=3UEkxZN&V{_TI=HyRV9djZ4*vqvxUO_|XV9ak482o)G2tdThkjo&%J z>^hu)rg>&DTFzKd(+uo9CM8IvX`RMrWVa;Iua9!flGaBaC^F5T6k z^?Eya6;jpJFE7hcR;7Ov1z!Sj_5H@}Y_q+cqjfJM_`>F~f35x+`2tTq6~#I`&$nA& z)0t+5y!Ip7@@XqI4OClKMU7}`Xiq(azink7bNMt7u*()~M%q7=gKq%djU?tG6fOtv zxdbR)UlD4NkQw5rT*e1G(qogTAt&YlTW^ISJYVDn+rNxPuES1qPvB+=?$Y!>&U?sP< zl1Cubi7eDK2O&UX%%}v`nbQ$u`K$W6O*}F1U;xsm!nOSg!@1+r+@`Kw%8OKgp&uAC6?uoy2c8G2uGo$YJdaK zm0aJ_Nf{hRxR%-k5Q)@48%xMRCs*#E0Fr#^r_U2~bTZ5+?Bv$msl$X4ITmf$rMu)W zv4$zF-q}5wtWKJm>0rEZV4HG6STZ0B(-T}cm0?Pr;v^W+DM-LIsuBn?AB5FP=qb0x|(Y)YP)+AQMqsPgQ$7&vE@ima^P`9)4v#W~Ms&`#QT^ zgIN52tP8i6X)VJY?FBu%$}7hNFjiXVY#(vu^6Rdl8%Ea@H_|BH%Jm!ygo;Bmxr#DL zc*#Pn$1+^xRYeR-8SXbLxh|q#{^bto9eybzF{;#x0sO$!Y5-P*YT|Dkp1l|})nS4y zjhY%Jpwd%r5Bd?^HSM-IX|?_)7RAQ8vlla~HoT8Cs8Mn{lKP$p z>j(b;sxop1@hHrJJ8;m5hDD+xfK_*4LgCX*nQy(-nBk(l<= zFS8bFHR$Uhf}F~qo%l<7SR}s?iUlttB(cU3R&u6dVU9vpPXnK!>Yg-tE37pumSUOs zd%w(K(24@G&<$Uw--_=gp|`s|J%HIktV$~*+m77r38hGnduMr6E+*J)lDLX2fgBMA z#!rFjO^mki^RYFjW=FQ@Ba%6C^4N$-(sl~a5gt&RyHOm@OBlqZWG8vJ>hQoOj~$V(#`WICIMUf(O&n^bF zq4=xq6vd=56-AW0F)dm(Dm;cUetk*}!pR+HWvw(~Q54nXCRu4%OBEI;S75)C739Gl zDiHZ(kiA}Pa<1BF;*O+@v&i$#l)~KsDwv#BGo21IeO~1>T59^;PO0`5A=y%?t$5_M z4QmQgYZq=c7pf5`!0w_(E}jwPhy%A*w^nPqUp&`W1yPibEpJ&vhF-r?R=K?8n~ovHbrtLWTWmIbn&&CiZ8cHGvW2Zi zvgvgXG#*kwU4p5ROplLv`dt;x#`_#Imrb_H38$5goe{+yypc%R8n>=ZH37aB%hD_J zx7Q8NZ`-?Nt}P=HZaaWyX>B1=)ySssLmRm5(vp;VE)6`9e9$z#{eyTsNnx!s+%V=a)Hu(7CS zjjBWWf<{@?R+Pumb}xAb*9Y||!fs`2GA98hLF`22G|k1Z zWFi%pT^G3rxhRQVq!QZpklJSpmS44r2e2Je+gQhP;4{#L@cl>pu{!SI;!P*+@uno{ z*R5(zos04rEZUGuJaz7qMuin~dffI}2-YDjrAXAM{ctnX#&H4#jF6FJ1#=@a<}plS zk(j#?r2hcJ78%55fUBe3KBnHXYGGpbN%Jy9b^Di|gA3#cWK zs)i>kjELVW37f1cE5f`-?8EJ7%DrR6nt5SeS1O30u#RnOX95MRRwl6-WmHRkYVp-r z-SWu9D*Hu1B!kdSW>x`)oQAEZ4rP$)&3Z(!90-oQn4)1$zR=uH!Tv$8#Hc{ zK|JAPo@(Gm6nWs1-MU&jxOJ^pmoj`j{_H-ftxtw4b5F9-M{j4RyL3~6D>|#uYG!;@ zfz&}XR%*l*Y*M_I8EhHh#KWy{CQ6qojPlCHVoS!il1 zNTJU$=frqtiZ>(VQ*E|7*)LB6U)@`KdkH-KwT^@|-`-MUi4ARLs)7Ql!z!$(o<{?% zG!P=09OR%P)bVDJl|^6m5kXpKin&KjMG`4}WvP(#Dk*nk{3-=aDs#gLdB&6`mv1HQ zh0QIPs+MXpBi7cx^SDEZik;@!R%GRMj#D~?WEuZEeZ+eS}$x~7AmCS?e zH4JH%9Fp2etUh+gujVSU7AA#Q0tlcyMLygqHztQ<_M%FMbr7{~r;SR|17eoGb4~6= zS>bVNNTrC%PJG%#a65RCZ)~>Ub*1S`m35rQ0s#WNc>D1kAi22JBuQA6wA6F+9$c{- zuhT(ctW7n?L>m{KLVGBxg;T|BMI`ezBNKxdNg0W8*kcE#@3$rNkgCoGLAd3Xs*myK ziwiBbcpoCl>^XRO;g+6(r#zbG*@mpUTQc|+qZE@HQP-2k+}2ylIO4Mx^88d`PFn!= z2XIHZiEbi@2Y7#q{{7eA-Qo$4=l6Fneg-R#Z-$5sEHOm zBY_pKy0pTU`3{%z65Q}aZbGkC*RyWSb*fV`hJwU0J%1RjqOmMWeX3i#9{n{9yvn^h za7r(!Yf6^kL!C6!@1{8|q+zI%s5p7~e%uE4Tcy~nTKcUmnJ+{x!y`}SHF}FNYVP|t zTJucP#~ToQLinx+ani$gxm%&Vm=rxgrCTt0`f1CSbk7I!(OgQf$fSxA#AQ|B2e!HY z0G>Gaal`gUd%4wYqrdoduIz2q*hdYkuvDXB80=BKS8T!IhBxpM849za#&QQ?*U&pP z^f&uV8;!Kkg5W7a$fU>)l9XaI)kPrF)WbS(`Oml-?%RC0*luEwqE1}63`)m9LkiO^ zB(_B4r=BXiyLx^j9lf6{pKo7R{Ww=`jS5mqFH?o<#oWyg6qdv1mOJr==onAFx zFArtd`@d-I1#Co%1oom-wVg;wXDb{|pqj90LKWvvPISoEEKmNVVxI2S>8)Dw23C^V z-NntqGk_2>TcMyNX(fr$b7l)nTr}3XR0(rw&u!Y^8f$vkUQJ!vy2=Sgc7JY2wznYK z)2pqwJC#PBc_i=Xpmr744YJ81T6X^cPjSCTKBNv>N@R46Ah@kSDhSIgSz0#h^0VIe z9H(vDOkWE;dQ}#D`6nB#yPmd=K1K3E?<~fexhZXQ-g_4Z7bA;p z5}MOiS=2<5Ew2=lF{vjbtG&l;?g=b9mn{y~Vjq|aGjz}HNfiUv!+@_mWwuV^?Krna zwzHD+b)J19Ib$*FxKMmr(Y}VamN?{Rn#p4f`OwUf$)iW&pe7L*#bBMKUWmVbUWzxaOf+*4idSN7{+GecJ}lvbBm z0o0YMv*`m%tdy=sl&&B&v3!4`Y0Nc7hj+zj!Dh!0y3TH0g2Q`JTG;F+Noif!&Zx}l zw!3(q_{UT4uX~p2pPKSoUCBk1EdhVsRH<|TP*sMWb;Ny#YwY_uFL~%U*B>St+mNI+4dcz&++4keWEQ0ClViUdoEE?V0E0P9BW)Yq>m<_l(bd^6l&0=QSNG7)+tk4G|{J>x>XbTfu$ZO zzi51s)(>#r;)8XOZUxP>d245p!cwC#rl!8(k5Sq?c6oL68a&M71-JWZpr=4|8!P71Mt$Xmzw$&^ouER%e2}DVi$EV{ppt+p3-OwzmG>++Szhq>$Z9Z>*|O%vt;dAv#GOstrRtYpL+6XS%6tq`m zf<-6uQHEet;|kyud1ktJ_|~g}aa~^^Icx$ ziwg416gr)q{{ZV-RFf_3&l)#|G7dX+xb6eAT*h}ByX&bpDI?Tjgu?V*0G3qH4r3yD zhh1+iusj#jx8yPCJWrD^}L?7{bTB>U5axN&;C#!b9C8_-zc}l&i zwI|#x+ZFzyUG1c>)SA4ms*OrN{>I1KA5weV?VIqpRz$XSzlqAQ0BI@@4OO8z<00HV zmnPpJaeEB5Q%BTN@_@kdIt>|W05l*TbjLqj;~QVeZMM&qZ>`;(C62T_b!kxI@zMw8Z zu3qLseKCGrtVfe1K;`5B=ZCOg-D|X#C~x>~r<&7Ia^ACVUui83uD-Jv&4rxUl4X`T zCY4o0viq%^1tYgjyf)WY3ohGw_7X7s$jYxx-^EGHwJVhdS>Wwt-FEvIk9V?N!X67S zkR*yZY78l)4}EFN4~DmnYT~ELX5`w68t=uj^U$d+jjqdIG}c{f$+M*tRMvfeysTMa z3Ym=im}tk8IVIh0D`C)*TZNM+eIPP`Gg1l5+&JP|T5UFHyNh2#5;P>3;&U{J)j2Y( zYDX^+KYNhR`F`RH9Byc}4}X$u_EzmawPw2(&s|C=tl_NA?;=G!CYfLr!%G9>wmbEG zwAslX;3T|Mw2m+XQ{rPzBO(vmjJErHkF%89q>}FDN1zSsMgAg;KvnSqx#JD2X-ze0 zB-qMqBw;Q-=KXDTdE|NIK_ayJO{k1S$J5A25yl344YkM3glNjRP!67&NbEg{)Llo& zV+UzHl#?Wpy7gFk^+_ChpTsbQ=sZmcrc}nus@d{{j>e}&RuzJ>MOrHQ9d_o$C_IO_ z)@9wcx)02jc!6lhKmZ;`0CnfPm8Q^={Kn#4E&;72Xu}$E=#onNOJ&2Iaq9bK>ArLt z$7qf??3p-66t5URz1C>sR)67D;7Q;xnsMaXSiGAXTQP2=wB_8#KEB*Jr#M#@W13cG zde+Hg1~`4@$j%3(qrA^)3Wx%HyCKjPL_=RNwG{)2Ccf-L8%?d~WW14@RDW8uE)}_w z2z4|*&+>}1dtJvbHBEKf+Nk2QPI_9cZoa*DGL_>=-{@v z-6KZ1g(hMRb;@bwLLzGYxq0FYyPcNFGex$|HLMC~1ZcGb*(20cl5-^IiFA)oC6t-= zBaQ9WzlCXRrzLwjmXP?EQvR=P{X(rYB}a-D@loh|_099K#%<$^=WP_!g^mp;+9X{+ zZeAJUrZ=&WB=X2DXDg)xy}>GZ5MyBafB9hO=S;Dq@ehzbSK=FCO2^HdH;~7$St{#w zoZn$*Z>UMV4Q7JcO9kNa;N1%byt8If}|NATyC`VxyqFU5^*KW=<;38zDs<& z;65d}lFX8nO$=KZg`LdhTmO zOCH}v#qkBQ$#r~ecPpsc z?UuRPhR>LNOyabs1~|>yZGFvSw=U!3e3D2+%z%vq7sro)9A*o?SiMWxQI z)1bBaKN~luv}M?9cKW}PJ}j}flAEGRV7V^CQv^4aWF>;l0_P+ZJ!dX z_1)Iu`rCSY6MIrqxxxMu-%9TUp;OvjM$?baHN%7VA}^51B=u~&98U?exV)8b0Mra~ z?r@I)2z7MlS^|BP#$H|dq`ZB~#>O+Zv80iFrp)C302LusDQD)-FXuP{{ZS)+{_y~=H9MU(@LYh(EKMQ zSS6Q>Ti_eI#U5!m{{SfD+M8<;0J*QI=Db~PGr~Kc1Dqf8m$zppNEky?NVFPSErEn`WQ`FczLTIy-nA8G0`gJz$^7?c|+-%G*`^XC@_Nh$AmZ6!& z2Hm%95HynQ*XDRg_+=`reT=V>{{WQxF?`pN2oh`dOx9s(WL4Jg>1|RgNg_Nm7+6SR zoj`UZ1Ki~GS0_qBRpMq}9SZVGQ1}o=A1XGrHTE@M9DRvDV znC&ZoZ_$#aOA?BnKoc&P@QukFSo_{Z^JiQf`ksxW3DBqHob-}gl`=1=k6<+N#Ccs$&gP1 z$M%e27~~H9G$F8!i1}+)URt4vzS35w+D&mZ-EML&cXz7X^ju7%!y&GKc?>HPZ2iaz za-LiyuO#9rzwQgNP8IAJEKXiY0a&GWLE;Me2071ejHQT%jcaOSYJv=EMGu!hEC9IO zB4jaN-zzGB4_T|0b*Zfn?8M%qZ@r^-*4BpCZChiojSj}uiDpX{qM*_>crM+L`}4BM zU&OXTtb{2C9YDFXv7Xf}WR5nsjj9()=?8^Cr7J^9_+oXw?Yh`b_i)|ZEyRM1`p&i$ z2T5T+dYQLY2=dEk$_1&(#iQNRyhMA`2-GosU5mY zD|>CYYp^W^Se6Pv%79lOGbb$T!wg;D-tOe4=mhG+jGCFK2{Z+mnpU}R&xRv+{{S6u zi*;tPbAv%r!od%o!mjgaPQzO&5)l&6)i$||w$&p*8v)zD*QvHU-s^2}7w5GH0!90z@RbDiZ%UT--I4v|bU{PWPSCQgFf;?E6+q1^AMRI;kN-!j(F^c~H%m%NpgNpr` zB!W3D5w96pX-OuLlvnp-C#I*^xYoFh4Tm87J-vPG);SLxp!DKlB>KCR?9E%pUABs> zG%FUY>luwiGCU$b;|-p(Th;KfGFq6mT3tAK8GaT6F&{j&dc0~l<43dEo0pE^u2A3G zS3>8hE9ovyUaB2A5HsP6C5}1BCf7$+zb%JXP8!Wp%R#cSxJ$B2d1w5IDehr?Yu2?J z$O=aQET`{c!y>6STO&J4)_rList3XVpdW;Seib>IdRO0nCe?o|DwfwN1ZpT)lFWTY zt46AiiGZSyi1}h>{{R}%Y_$80P3sr6(oIfXd|Zc*Te{L}HP0P&o+~=7gtnGcKE!x2 z%kL^p;v;1W1bFYSpubC~36%rtHq(lkiQ-p5K|*|d@h;BXU8xsmHZ&RI5vQ$z!oC&MUI1BsQO2vaay!rn^@A&3&bg zwV4__CPGL;tA~1txo-n*Se{$Snnp;}Ew#!r8UX(QnWV0dNeHUc13oo|*060G6JEmX|N>BjF6@rFk+v~I;mOEcVUcj*a+Cqhb_Z3?VO1XRkdSe{2QTJhzA z`D;z@ZI!af(qIjv%L)%H(Dg{>`$J5Bl6 z)Y@FJ5f_fJ7GsNEUb{mR%p9}h0;~FryA|*M0CdQSb1IZ%QPk-vKB$|i zs*c>_XhG0^*Joe)RRJ_ zew9ea1dJN=fi*9qNpeYYaUXE)zTR4Gu-&vw@pTKx&cx16bF(Q1St&rBT}v1MBCRnz zco)XBquOkD@ty6u`g#%8u`eN#c&lvTjsv^5B%737MAdg?(Ov8*m<*?rFOQ51z2~_u zS#5Tg(k7p%LPQ6r;accjVdDqT5RV-un3|g}YQ-DRx<*}=EhN08kC><}H>~KSl%wnP zkZF~1Lyv=Soz}LeD&`!=<|`X}y9Squ@!ka|zog@LHQvOtK8`)yFjln;>Zr1{m0D0D zm4KMoxX@c~d)C!B+V*=*wc=E7n7O%AE6T^xOx-ffrE8g1RwNFht59PtF3GWP5FOij zyWPdZI2QJ{Vv874sYEK~Bw%Tlx}XH~-Ip5$TbAr^tXkze-aWNQwU#H>Xt!KHSyz?u znTvi@TU*?Zja7PilUwGp!izggDZ%+i zl}VY?ftWOxs&8z zm2Ki^dXLw(HJ~ICtpxIv1da(B4=R#zTiiSEYumE!GDS7T)J>ujZ*nLP9W0j?(5#dv zjE^DY4FCgdlY?q!uPCcY=Z(FQYjIPMYno~sy0QqYYPMA6YLG6@vr5Kc8ajP}RhXRh zh?jBQ4CWhvMDF_57lD;zj05?ht3^+4b*5t;jJrO;6ikpcVx<~%nl|Z4{{Ud4P%|HB z9(Bb#O~Z9p>`t2vhP#MBl&e8nKhau|rRVSXI`B&tTf`XK0kgWz$9-Sj4Ru9NK8I zk6-TSE-OQ?k)&H)=8}bdHy-A4a;`AD4YTV{Ag<$gdU~%dl(Q<&et&MZ!glekV5w1A z3jzEI)%yIM)ze;X7E5conAV~v4;>FMMq`yhB-c8DOk}T{a@(w-w%Ru~xZ0Lh)7MfS zLCl)^h^|ZIC@}^tUfaz=vdXP@ZKuC}wP{NlR^fQ6#_%m=hCRHs=_Jz>yX~e)Tp{kg zS{1d0Bx9+qBFU-&deWeSOvZl$ReZ5UOWCDFQwh11b*G?cBBW7?^-`j|YhHLsC6htC z8oPD2F>1CnE?w5cO2v9|YAEXLM^cm))oB}2>^~+cOGz)a81O){7A(C3tUINUyh9() zMd@<-hOx`xAQM_wl`DrLN%q^}ZEz*|2~4blEh-S912qFp2qvI|ohgFU*v8xI6}C3@ zmUYmvmbQv5g@`4&Qq`EON4Vs)TA7V!l4(Ea{{R^ewcyT4d=TubD{awTTgJ!>KtsUZDi63*QHKo;G ztFnfFIku8rk~Ynqe8R*rjT~n4q^!`!uF`n9W+3#@3f9c9K;g`&@i+=&I%r5LK?TcH zoit*mqa-zxCA{M8R%^K05VVyGH&lM<45U&$Bnl8z5ke~Bnok$_zRmq@Eq1PWW2XA} zMxG86=d9sa7&|2Xx=Gv<;FL&FM4sy(IV7D^BAi1t{Knmp5!q_ZGOU#q zu8>#~fm(%hk)#5vMI;-D?)JT^56F2wN(t69iUu){UQEsh^9u@wXQ^UCF(dM%%~L$~ml%w(=3jWAWoL*OLZ?Dl$C-La4? z*=ZyI!Bhnl;TROiWm=QR72Ah#UOb4~atnC$ve1f>f<~(na}twUxFM-Q@PIK>u>~EK zm^M#aWFd~i+tbZPov31^BFSka69k48-KDD5kAltQkgBUAEBO;-k=#QYS}|9sD*Aw< zcxE#c8G1;sJW@=M%wxY&;HfPc28Db<9}8zwm^gI1U9{lO9SAEyvr6+chB{(%Ef3w5=NUIc=8qiHQm zH8YD<<5IB&@>zlE0x;4N$H{Pfiz~A(o}zUO z`oET_7<+4}Y3$F3o+ZC=Txk~f2@=}@l#Jv*vVmAr?9UAcInq&rZnNX)k& zr8JS0@QtK~#L~%HdAx~9NFFRa$Oo`=?AO;3mP>h*4iySM>Yvte6Z-9qw1-^w+S`E> z08U)PC^h#CRCy2097~15ES^bHOJ3Zt)ioZIc}85b#Vmi9I~e269prENfPU2-UD)=n z^SreriP8YRqUg*6_!cDqAMzY$w;u1>_IS*&NfQtOuFa_0X4`?`zW zk_}y3drdu=BwGb6SJlUqW00#=n%mMx7)3AJJ&#_AVf4<-La!l-W;q&odk>yG&iCrw z#8)j1zNu|kQNR=woQK^k8WKVP0a(|Yckjp3Rv&5qK)32%N?u2{_1Z&n$KRER@PMwR?q`G?+; zQz3sTe5Hypj9?HCSE}w0sMpBjH}f4fCK05b29-Z)!`XHcT2&Sj7}2Hw0HtquM2TKw zg)GK2`pkySXG5Vqj;Vlq2=dHO8Lm#bjqTWm07f?^DIFCdq#XJD^Yv+v8Has=2U5-)rp`d8=lJgQS}q*O~AM94X)zq*b*Axr%Kor1hHwD z=|rHWpkx4$Yxqyl&yK&c&yKhn>vn%CS)1fuTxl)aoJn^uXuc}r(v}X1%{f{_G}S1G zV{;$mEOA_T%EqT7ub4Zd`-ASTYK3-B2u5zhYr%L|X8H2Fup#%SpD zUxUN=2D+4RYcplLL>_IIjk^)bP7XZRNHQrFSi($sOCW}8zN5 z6WrXkLq!!(d4WKxI07gn_=ZCp#-CBgIJ!qt!#$hQQ?s$#$E>3+zg%`r3<(WOk_Suo z*V&!Y7n!A8i5ZYc#~CTE?ymm;IUEZjPLSHQ6{bK?k4|Ti%wlb|q;av0lnK=5#DQOL zKOAJ+SOtzxUyRd|U3R8EIr$qHS6ix-TG(x_hlZHi?cP}_*w*QzYc*trmS|b9fx@Z{ z1%j=;k-3^AlJLv|>(m0prj-CN%*aCL%Dl#PxIA)l$0J%KC|Y$v+XTPdrvG*N#~|$ShcvMTE*f>Zh*EGIGbOizk-% zZMxgHX>>fQWoJ@UmQpmBt z70scm!!BJ%1JYP2tp#$S73Ya}^uAMTaLUTS7K~I1a;X&ON`XMbBTz`i{@sdt^^;Yr zYSu1Or1W<0SuC|!Nsdy{MwSxK9;#h_W=U@^i@ejn<*QPx#C%Ud z_}fH7~j<;?;;*Ol(|7A9V5Rk;0*?E}sww5#gOqfAFRrFb4FY zKK@^)EGJ-oMO}`@DJ$DlTNAp?0iLAuM`pUmsfm08+D4MNiEu*3_{Im2E=6{cOrDY= zVr!AhDvn-Mz&tXlg(PwD`%V&Lt+fkNy=7eqhAx4 z@%!^0MrJ=XY@e1~)Q$jfr7|S&Ibqn{km-6cVD_NC1z-g^LHn9Z5tNSAu2WDN+RkRB<)W%Z^x|WfQXvYz~o6eNWwr zv%^+;*V=7+wV7vv9cw*&Abp*sS*5bR^B=^o8I{&XYy<0_jaiycO9eyZ21m}EF=KJ9 zK@nzY&kf^?Rj21IX4a$g;W|dKtEW=LmFe2M1$#RBvflD6ll!+}5170_Sil3h$jd2` z!1SsJdRBsjP>j6lN4Gpjjb29z#XzYi$Ws!V?TxxHt)B}T*^7xJtrFUMa1j(&CW670 zBaUkI6eyI&xM`dPzyx*Hi7L*}N$PO41%MfI8B_G}!z{7R1FQP;9H~KyS1RWg^qT!m zT6E>Vyyn{p9#3yu`4Q_Dj7|>dwP$j(HwQony1K^}P)l zn~a^c3U}U-dl3(;@Z!B zm&8dn#>`U5N)N`Fl-GkX#Ry)*s*S?m`jJbh*&~G%C|cycEHkdEWyYEC#OUmr6bM0O z0Oo0**?^ysTfH2y>^0jN8pP61M$OAq1d&vNcUaHzorPJvv6NBAgjDuwqE}exJ82N-)aesJej4qMx@JMq01i~tl-@WZ6ccj;&&{v8} zH3XgkV~r=7WK;wRoP+A8txnvK%^-xh>PgZ=T=ew`tvm=B0(f&6t-h7*Au_VmM6x|R zN&!H8jyP|VQQCZs%`ALR8V)@}LCW}VJm%bjNaC}9O;c~D_jOCh>CDj;dFyB-yK>Ki zM7CsxyisCDbM!XbJ*RGV{C(Sa#^vX=xwN#19V*3TCg4p$QbSB5jyn7)BbFyfA2jcy zaqoWUo3O2VP+QtvSl(aUFgoGa3z!lST{R1D)SBP`rP?SKHYCV?rt!VpJDp6sn!lJV zJxeirR*Jxr%{oE<0NT>9Nr~lx3sJPuqP&W)h6;N5O8UUoeeH=I&8mi#WTh*}$|`vzPz-Buu1Iu9(V$Moff?uSyK5z~Z4K)2?we|{;=Z7LDjNI7M@BNrk z8;~uRm)wo4Mxjr`+}!`cOg z22}bUg_WSVN03$;a9ru1x0Nu=sLe9X7~p8bm)VGooN_8PiKL!7zGAekGD_1($?dgr zO?Z6XK`cz9kb?)mez{p0z|=q|k3YZc#DO!$bdU*e3eyaAlY!>S(SS+}{QsXa)UV-byIx`84dN>PkN zc45|sW9eOP1Y9ur%c+SB)z4E6T8}E!*0~YqhPN4#-)%u;56jzIxGDyJlAtJ2%uzeetvvrPR0rFd}{zS$zB!|>?>pi^1HU8&# z@%rse=h_wv@`DUC=EM_XO6Py6dUp{&2`PLaN=nk459EkD#nPV*! zmme}#MfI_$VO)m_VmE5A+MiVnWv^`ZHjGv4r9db4s>5Q;p%%lhwkg36x@PfS*-`ZA zt3fj~vK=BA(!BEW{kXHcUXMh!W!i`I@x;Ql`rgH9tyg48V)B(`nf;&4U*$?5h{g*kHN`mth`sH6LXony;DjvnP#}4AR9yH8NSN{K6z_GMBFL zq-*ydXb`y>&rPhcxgen`J>TK_a>0ou_yc9izS>g`tL!Ukt50&mBr?rY@vUrOjqIW& zCzMeWh{HT-?p*s?H6X{>j@jrQ)@#%juo^}iQ3U<8KJOd@%xyrpkdn31bmnW}opSvv zj&A$o<;I{OW*GDrEExftKCew`Y%;B#7add}1NfTeJH z_79~uwlS^OZtk|$EiB)gZue_cjE}^+N|vjD;<7CW6%@yVeR$fp0QOzqv)^vebjY`w z-pW84;h!YeBdpQG60KFifsT?$Ae!QlsWq@s1TlAP>A8H(IpV@3-sM-*wtS9-6Y5AV|;wLJ*eJ&-_Ilh^2TP7U>B>q>T$Ek&)Aup-bhTB;V5SD(qq7d*6GC z$F7k$KN*^amt`EbYBV-3Y;<(C6YRGaw#IKi$+Rsimd_viPfw@mQtZX)JPXRi>9)WxuI4jb9nl z>GUZ=hKot5itMbr2B28F`H&bAbKULS*4@3g%iHEvzTGYuM|)3CYo1vk)I*K z!uewJ>BnbW_g3v6akZmZ?KYvMMxN>vjMAh-6j7=o#}KJpwVd@c99;RY_n*M7QsfKA z_@<*>@{XPM`ko=n_Z&{wIHS3hZ$(vZ>Ni%Snh2(=BqgGpR`%t<^3HH*Hjkwp%MInb z-pea?-O1`p9Cu$T`bZ{@p_PjGuBz6Cxnp76Us^jCaJ9Q_y$SBCe?_FzS+(>sGWrX| zbd#lX%&5+Q0uCT}rzQCdZ?C0ql=Hq@%5QIWKbvkE+)(N%TD@i|iV1D(_}05!2AvT+ zL{Zne#4#kV+C!VIme*-`(e3tD_V(85LNvDl@~IpJ%#Qrdtw<}DoT_E^{^h#dZE;7r zZnu|LH%;)zYVaFrdb71-+d$N6(K_FL7YC%;-LdyBR{ME2KbJ@~dUkj>JG zC7Fq-*Cg7d)BF+XUj-TCIc3=WH6BbF_hHUMbU6B^7SXF$xXz;%DmVj7Yxj-+0JGy(i(rb@IVPh{A&hk8Vf*3rF-raoK`Tb3 zK*eVN0L>SwTaQ~``e*djhPbu=0NOhDkSuYe@1P}^V#!Hb2m#SSKqE@}yn1U&8nHAu&9U^*i5@DVu9rGc2iIDI%;E8jT`kD|YfE^{uk)x3Xlmie--B z#R2$$Pux1ImlLbv&yGCTbMGU#yWQQ!^V=d8)0GR<`ogFKz-ahIGZm@CDCaF@WoURs z>pKXS@%2-!nvvS09qA*l0HvlC~KIjLhTmYR;C8DIUJ6n za<7;JDt|v#R`>d zNFkPevseupz}^k-#+CfZGZjw}k<=xJwqs3Kccr9_suncVPbyM}$BD}p2IIM=p0*ok z{MhuFWqkk|f_a7IzzXBrP2V$u3h*tCDHO?81!{V$Q(W13q|Y4LzZsg$_LiY@BC$Rw z{{TiEC9FFnsVuWB{TU8IRnlq5ftFS078zl@$v8mGHewcl2;SswpbRJ($i^MhYntLqc{cbS@m7k|^@4IAil25j!)4ue z>nJxkx2e|4RZ1&p1P)q?ntM(pwtC)Ku!653y|s0kzx2x_TnSBT+U9o??sa7Od7&$~x( z?Oka*AP4~!4k?jpWVAkX#Yb(ROY1h{kV<#=78oImYr37S*q-!H_(J3DEvwj`3JGRF zvHNCXP)Fw8CpLDMFAXg=$c4NtGwC9tlstd}i(laY;)d?gZi`*-b3MfBz=JEZF_3U9 zNvn~_n&~w>@hivn+{Ox0Eh{>oWqcZ~S~`ur$>NT@j6LaMo|JWx{ObZdO$<{gCmqg5 zRU4IuZ?(WcjEtw_X`)}gt1T=0Rlbpu>O-ur{NCfXluj{TsDSv8pl z)Ys9|o-3`dwV^$@ofTe#kBw>G4Q#>|_zJ@|FHhl0DtCiYCJ78eRZz%E=p%(tz% zT+I}a)D1S!#}p_(?X>}N-Yx1rSZXJdzaV3QASPA{?7+2lG(n~_7rSG^TorEWy}h(T9^z3cJA44UbzRaX!pfO~L) zrO#v3)J^8z;8|`xCSgIS$I>imnOK1(hb)`+;;QO?-MCNcJ1W0HY92jHHi-FBQlKdu zwW-RPaK%x!$r9J68%ohveSC945`Jn5ve=$V$}Nc{nmI&sMl8S`a%4{Pea@CkVk8eR zWl}~>;qLpfQ~hQ{MUG&_BbJl`rj#_}?)P9|P1GBGeR^~#T)4KcS>0>R31$fmVHim) zLiQKIbgouOq>6MY86HQo9-I%o3h8Qtk{{T>5kc3>`k*$zL zuS`QSz)0ak13^)qXDU|^+lgC}RjFc@{{YSwu(404-n}hNh-aE&FV>c|VFgE_V(^+c zq*w|ODI_`mVY1uck8cbf5ge_Vkx9~OGO0B>fTeTcK}=Qd*9Ul#Ic1sS+gRk11xl#P zO(8k@>ODr8aOa8^`jncjq%py&kBT2twH#5UG$PQ2YFFg=$*&u>{w))*;tcu?&{q zU9>4&ph87~Law&^%j~#TY-PNZV;wm$AzC|oc-mGJUrQ5Tb1y3J#5m26l_j{mltzZE z5%htVBc-WdVf~_5*w)>?u}tZ$uNkbh=hf~vTN@KaZUHQNJ2k7p37Y+uKXPIfg~9SU z0Cf!8&0>Y!T2~;~sS*GO5;Z=csyt43uv?M2N}%hC4M9}LCB%lOC4QI*Q&Z~94K?=Q zn=TQ$t8O|wD|@YzPAy5MiC)wN&b)}`o=70S6jdXx^TtHBfRWKi$-wETH?60p(%Y;d zlP4Mw(YX3rlzNV8G}kH&biKE^wc5ce-8pysy7ekmNm5uxGX$#!(y|cxXh@+1w%UAq zdA6pUMzdeoRHr2>?-J9V&3Ws4Q`q)q_8Ab&bMHzbPa;V3$ms36p437vSzDk94Uiev zfB*sZSH}-r_9pE6h}+c)-N{V|=8qt!6aGhLDsBDKtGG8^9fHKNW;px zjdtbPcN=+*Np9o0vUVBUg{t|eoWmhCr73X{{w_tI48O_t*Y^BIS^hKRi&+c7rum zemC50HR&mqj}!S5YsGdlMv^F=T~3!}B{}X&(Y6vWS=bNa$6*S4Y3_FP+#~KS(%uK> zJ(#wwd>i-&aVt^V=@jvC?J}O*0e7n z)K=C+H#*9HIs79l$@x|Gbhi7gryq(kuApqGN4&f3JW@BbTso=$0GFfNu1wM!DJ9r< zs6f)_Vpyj3M<#{TJZdTpM=VC(ZBo$}b+onaZrUt$31hgG<5R%(V-iSI*Y{~rL(djI z4f3DK(@;|yqZE@L$B#~+@13REw)2~N zM!edXkaWk?nh6a*0aXoJXU2!a6ZQ`K@2PE)=IyMv%XpWhT2_V|nEC!-X;0iM?Bk0J z-0y~7cZZpLNvev)+H$tG#l8i`_L}SO8-|d_xz)P3T&X1aX9LrysoQ&uNR6^?>|s{* zQtotg6!?r%P;tnN_>4_{@YiMAt01?J$4atya1W#X%I2?%_Zz4(@cVGX%FV&r`5U$j=VVz)iM z5w@!(nDC6GTGMOpMx;y+vSg5)cIqUyuN@v+ZN5uDI0U?n^WmmMmC;X|8dENKmlo-_ zTrq2Vz1l0a;9cyckN$Yx6?Yy=IMDD14K2Z|nn?cuuU~^cwJ zB;oJ#{{SpO`Axbw+o5)=Er04}ygB+;?9bbWm265SrC#+-e9wMS?Cfe!bJ&{8yePsr zNr`M;E9lA+f86=(}<3x4P+(Gm6{{Som2!wRq!PtC4of=MK>vOKnb9$2LEhRm^(C$?N7c}CdB zW7T3_#^i;{MKmMr#F;Fv5(tcl2xKi@b*@$SVVE0g=@>QRctpZ^Woy$T*I0e1rjZG( zk>x-E;~|PG<2m${XSI+J**O|W(;Eb^E@G@$kf+io}$pgIgU9hQ41n*vW2< zPt6xvXubIDU#=(oi_%3g`x^=XQQPa(OSslVH)Z0HS1k-PPb!KZw47Pl+&-nX(=2S` z`HD}k__>O5$PO4wV{T1#FUYyOiUcz>YgM49TJ^+6jzcYdbabmrI5M#^x<)^U=L?>m zvRI~?i3$W>1k|WB=Td(BM84`Jw^?o#nwg=XmBAoU2poC)0mI*8kZUVdu_517SB7QO z-!RrlWR5uHl1L+USt6TV39zhI7d}2Cxb)}}eYSZzG=++_8AWpCUM83(vfS-0fs{!c zY$_Pg6JAxNeb^WmeERJtXPjR*{+a9V!xV4_L7XlA9x_a zv5xU4c$c9aLk#FwkU9A0fd_Huh#;B6%4j%o8I!|_8F*sZF6zv6YuA@pj|hgJn#&Yc ze=Y@ZJ2<|W=XWe;fOUuZi9b_LU zMLe69V}Z`Nwd(oRwAO5R<(HNnO_WF2>*TcQqO|md5m4CI*Zg{+>sc%9GeqP`5`V(V z-BsOeHq%{2xIz$L)wDStr7iJ#zAX8g<3(ZJH?derwd-ZGaTt*+NZ3V`VU$s5mCG#o z*AsL(B~QfIU5izGbku#7^TqDpxkN45gcl7e4MBn#V_e2*2q9g))unUAv2>h^ccf*nvDjRe zispw!BiS5_Ga5AE+6tT}<9Q zso(}QOSfNcTXW9OB&|6lv!_XhLWm;#0CCe!Wb?!Q4-VUF;7IFg7R9>y={45(JG&I4 zvecQ$DF>WY95yya_^1_|BZ;EQ}H&DYoap^(DLezNHzC_gd;>}flK1H1yXML$bZb(yeCA zjz9SY?JN=zW5zQ6B?ns$)>-zrw>vq)S?>#DrYY#4D%6q`aP`;nsy-^#xWRWnPkY>U z%lk0*`!TuICAt!1X5b8!HL4L=s7I$wDUG>#CaZx^jxGR`Ky1HJ$TeE}_LR%3r&{zI zE89!(k9NwztAs(a*GErfWJd#8j$xm+PaK2RQb?|^ncBkMSt#KdnaI+dBL#^%M4uU_ zF_kgDdy8F}g}&o+6f-nshLi=GLOpea0Apy466SIkr{!fz$jn#adjx>dk)?X(3lC&!xRB;nc2_$d68+J|_-palPZ-l-!*+Uxn;z z>Cmla1l#QB!6cS!)?KxW0d_VPc?7=PaU@vB-|9LEZ|u?*NWh8P`HcSn2qVMGh9pB_ ze6oDS+3GA}i5f6=WjW@+0COjWKI|?vH0t@PK${$(R{pB#@~o1iVbZ zw4+f2R|CWk4-7t|#J1Y5V}E_f5{8$G&w8l*djh;sb2+7jSZwa@6vMEv`q;A&jcZ3< zIFrnRTmZt|CDzRz+hR%G(lQj({#13V5I!8u1xP0oS7eqQ;rAWKp$5dxqy`3;Rp7@~ znFE7LX{3C3nqt=se;RPEN4(kTXFQ9R?rdDSypFEIKN^|~(p63`rIl<-YEjf{h{agy zu##IcNi?2eMi_7FTdvy;h1#XQ+JLM~DhZTkWXgw82ATPRN}O0EJ*V5-yxW%E&v(5` zN0~^d=^skQ0n11tyfZYf0Y_ZBo?5kQS86I7#nI?(TZ58u&6P^?>$wHFNLsOMJ-e+u zsjI&lOsvdM2#FxD&rNOHPK$XUcZn~q5VTMEq^%B|y)3-BWt}{*yVrBd*Kp0yl-k?A zhl7I32n;Js`SK&g=ZY-psE2beBe`Nd#f!Srr`!8iZN|s&WcMYoBC4sXODzS0@xP0# zs)dN`dY=p2t%GeOtV`C`wWgI?a6IYfTvFYwwaxPGlN6TWVG+!UP)Xtl3P7kdu2_FJ zAg&@c;isu)5Oud|N)%T`Z>Oph_11iZlMjU;IK9!KuW1pc=* zuljbaEOo3{A~%-g%2A;tTQNeGtVtwllYNKU3|AzR(6TBZTGYp#C_m%&;zUu&H>KiG z?Lk_;Ud=T=JOMb7r>nYs?=eV7is*>Xy}a(QscmXgO0grD=SF5K#E&80>D6t<>u!tr zrGlxbC?lx$>ryG~&c0aESazP{d2&K%Qd)wmaQsIF13?FdWS(OR>v(?o9BARGHv({D-&WQ8NCEIrF%~lHNK@JloiOK1!zUbLX8=H%w%(04?`g-eA$3lgzJVy_9 zB-;Hq?xR1+TUiYTQ|gsuL^%)pjO33n0MCtaCojf7C>bNWUN4Sm>zc%8 ze&lec<30Ujfnp{tHdEXCvJQG+ckgE-6)m|uxls<9K3q?xzFvHBHU5qF@O78}0J>tg z9~(bYN@u`+aQ!~&_REdg(82j!kLKTosaQ(s9la#leWtv}UMU5L+O?@UAogTJ4}?Jv zW8>(0u($4nzob?>4)D-^2kRlJ^HC75+lrfyrt|Ge(r$g%+tEq|UMGdsso<~HB~P6W zBIoDd0PD5s9@FJ5PU2x*{OM_A+0-&i3oF*TzqDYkC63M4hFUgg2 z*^XEY_v_UAU$iazde@`XxVx0Lrg>eTKN47+c+YnCqW4YlcrEQLtry{n7^93=%Sw;e zjILqGEJu$8kxz-jrF1H*kiTk>>*9Z2+3RAIi0VZZr7?q%;YKT<9M9-HeYj&SU8@9Z zGfJJpDx*ZX3^14_fF1t;W_lMrLrowy5KM%6LWSqU_KXcJJ-e4+p-!!>mfHNuPL{Tx zo$J@9auzsg)2S7UHmu0N{gJPyTRO*@?-(=9KPH=ZjxPHLvLvdO?Nx! zjU%M2$BkJ41xVpceHQqa{{WBw0FyV>q22u7x~cIm42Rp3`efH=?0LSzrZABEC2i}t z;^BxA+h&vw!nBM=K6CFM?pL+;eS2qP!u!VcsHl-^@_~(L%Og@rXmcVY2|=5vsUKT* z7xshRJIGDL>MY5y>?MY%pG)18Bn>P;=|W9t9#&^L0SgiaKBn(>l=z<>;lCH~U9P{6 zY@yQ7(tK;cHfZte?D4${cwgllhPtBK)S-e_mY=>n9>kH02=YiGPmOHgzuxyN-s|pk zp6b=5X>YFLWiYIy5SG@*T>xt7lSvJuSdNQUKcG@cYuo!xk7M?uL1%W5tUGm#k`VGm z8BsOO%@fl@>x`9X+4PAOn5qh$4JMb1Z5K~&?!)D8k*i4!+xoeTS7p^*u@HDRT!5Bs zex=qU{Ig)qWLNQy8B#F5GiJWr_iedlwvOLv?RQ-|#-&+QF{($XE<@oVXodALT}0K3 zX!f0_b8Bf{<9P0seN2oLyiyQ7Ql_TTX+}n75-JtbAx$7^+HN(w*;!5RFP4-uw35#? zgpkV)p?r%Vqh7)osYz!A4UmRe6ETA8mN|XHbFsFJ*lkTAj4%YYQZT3EZY577Cq*gg z#=gqN>ToYNH9>NtEjg;^#R14Si_=&&I*%MrCHU=l>G=FMR!bHIo3?40En5{#hui+7 z&KQ10sGXKLTgb;5^OLiI)mlLz0(;U-V<3lzxNro1_!aZS>F#6ev^K3q2Bn26eW#fI z6IDJK)hJ6(iRiZ5YVuZXl&xB}##w^E_BK{yMT1WA*k|urt24;4D3SXC=rL1w9NUG* z$~UesGExN;j|%hgZY1$F;M8vwv`t#09O?LX4QkbCUOjfhb*|Ow>B1zj8E9s*-am53+2+_KwUm!+utzQ4nzXXlqi-MZ zih^Y<2rZb2NOA}`gEapDFz|ydz=Kvx7M)W+GxupM-fWWyz?iK%RdY@(_Px~eUYD7v1>FRld`K1AboKDqi@-d@U}bd zF%Q~h8AybmJtbeQl{mX;Qjg&K-BmRKq4I5hfuErS0(Vg zklStR>0iV-bFUwEF0-z`hG-(w@yeC!?OY9Jxy-3^V`klp61;bIb|Mlz*1K<@rhNJ9*GoZ9X79W|49oHfL8f+36_ zRFayF5!dkn>TW)oaKnu_2rVF?+^1hoO;u6E{uI>Ni1k0j4N#6OxYe2MQ=qVJ*xRce zdQD-VsFF2!Yd*Cmc%vTD-b7Sk9bmDbBf**cx^nI@4DBF|K#=NDofHw66(ssiL8;;m zFfhmH0x3>};(awF9(qQagOR3H2Ns)FueE(%*Nxu%7)yIsT3u}RB!;9ZWnjIl*Ib?@ zmuGIwfn$!aOi`j9;R|z%n$hTIFf6g`?dT8v^l4va~ zRpl;=8^$J`!7ZNM3&-;1CAC%;75-ar3tCih@i+(~Y22iM^uJ#^{kW#T;EQ2rYIbI) zM^g*}F9p`via6ifVPo7a@6}KJ*oiI*_ax^oT+GdE%M*TMQiM=`t`zoXiz{d(91sKJ z%>JKlAygB#&6}Bmt@pQP8Ema+XO6XZlCr?<365B7+L8UWDp%RZZ1?Exb=)a|R4cnG z*UM0^9}&Y3T}o0mWlV(!K7W24LA2A&u;m*IRewKYXG5shapt`DC^#Rxv!LqLd+9NDbluH2_oFh#xQcy=HQ;l%}6;J^U+N zHrgdSFvla!dh1-+!Aiv)-{nUnacga}tLv&pOG){$I=arP-s?6WkF??c03oGT-lt1$o5NkSw^gaZ90nzhV@aXA4ZF+~ z-j$Zp5QJyTIqD1y!KRCdmOgywd7o`DX%bPoRP|P)I?&VZ#A;6+=`AZsMwC^d{4nx+ z;(4w6QQ1f&bNrEr+zgSEjD30pjKZKdz}YCn^2o@+kHJjFSgY%;+Oa;)ocH9j@5}iJ zpUtflVdO`O2#iuj{@cj`I8U^m`08YVBhex#PynxirV=AqN;kz?gXKg1IB~NLUX__H zhniaRQI4ak+$bQLVD;yfCUEGy4{w>+!0o@KesQp=Bwc!hnJ>rGtYI});+NZjdzfM^G^^A6Z7Fw0Tnc$|TXl+a4qs;>lu7v%d_2V7K8BNku zv}2|=rlFY!FhZR2=l*#0izz325puu_sUwYm$O;uTVg^+?aK--sk!z%y&3e@kD7J4u z^FJ|6TA2h@Y1x)EXre9ee<-nRx3`>k>J^O0E&6kku`O3ui*W$^YvqRLF3hXJ^wjhA z;=4TvwwrjW7^m^3Y1U~!nIV>AW(zQ_aN$I8LXaqb6OR$~IqH42#J09#Sv@3-#~Nps zpAXlFFB{0^fjvH4F{JBiNgS{>dr-}7e58oQ;!Nhudb)q=+fB8KFG{QqyDg>f$hmv+QKPjq zw#4{g?91OE40S5v?pZ*RW3G^d41aZU3zawwhdc$Pou!nICAung4O=p5c-Jz1>_Tt0 zPe)@U%Lxqx%!=ypt%<|NjRY|)lN1p;Fa)=!MP+UtG=!2Dkn$(>VpGV73yN{W4Nk>v z)7IP()P}^>)+T7CN#y=$b;F2VtJy2$!`qMfgY@ZdEs_ZgW&J8?<-@~|JRC0zN31a# zvm&^*ZT7nZ4a><=811DKZska8Nm3Tp=2S~DLXg+@8D1}RladB{hY*RJMI9a7jOoMK zOf=BOkugVVQ|-lOuF)++T&+rP5~YYDxR6H#Gtccnr5?@6Vv@wtlxY!ykTQC;nDpd$ zPynh%Uhh2kjB==9n-*_B^22$gU&*h1Hd0k-)Yp++pb^0-{#ki~RCbzHk=G0|I}U<5 z(Nm_`$WC5E!|lUx+T66HJYirTuPpQO#5Ud)+19gO`^`N`1eL8vZ(nN3wvqn;F71aY z?8adwGlCO6yLKHr4A(G`BsC5jP@&GgBL*$40{&$*X<2V_E$8qCAn!FZSMjCTS!P^`_6e0yiVPK%jkI!yzUk@Le(&{3;hPqPYI znjvKDDO8}5OB{w8wW^t5h%90^k{BmIS)_iP%vgi^ewpIBM_!pQvDP!? z!`q5=tL?Im)eUT7E$+I1$e}Edc%Y*oSJ=f?{6s>*gLt%T%k4 zfN7G1Y80&-j$l_m9zFzPp1x7|(~xt0?0k=lZ*+oa>F~=AlPMhfp_xT9;u&kpF`tL`_tUNa z0Dj*;u6Fh9yjz>KOm_i=y1fVu7fo7SS<_UpuobC#1CC7J>v^t+ZDUu-Xi(VgtF>#F zB;8-yS<}cb*qvZ~d9k6buiFSCgs-_@-K?bezlbD{aoKM+d)p+x+8S7GSkMI#th_%F zNg3#Q^)$66lm0-88@hmFx9@} zd}6N^4W`COuFqCl`tzVzWUn8SeigYVts29xk|Z9`kHsT+`*)K)S;)3laWsxmJvy~G zlV2KEsNU+bvwo~)W4zrrMPHQ+@`(&(QD6u_&qxglkh$x+D8+Uwlf=?1M<`!&$33yrXL^cPnj1@oq>+Qw270HG z9T^O`EimeAbH**MF0E}=NZ6}DWVVbwNi>o-DII+EH;sHG_1_nBd)tr1ROOb`BG$qOk8LeP78qscfX3|`h~B@N=cXs_9^JRIS@#=>R`*$W<#;Cb zDEtg)psznscRZg+CiqhOUw7)6SK{_J2parBde7`5=I^Rwrp$-COXbBP*v_^qCtZ1e{LP{@bf* z#*<;mxddE?X988DwAR+!-?EQ2-+iybm$v)J_3%ehS6E|`Nm^+bO5zfXkJJf!`EJ%o zEa6CP&!|xl9Up}HAusA4v#Zme#fg^x084IcI!`_0T*#xQ!K7vZiPXpgTxkl7N`p}& zfEXn(BY|ihUVJSD?s}p#kBM)OdK~QFF9!dmQ4@I0Nm{S5-q5T>u$^ip?tP zQUhy5k1UvR#%Hwr{bcloekZBgPOmM-qWpen_ZO+u@w2f?ux;d}B{>XaK#wC&D4IXz zsf!QQjlSDsd>&b^ZWTz#rPWYoIQmO}j|^2!+*z%JDV!5^E`lH7?NFbz>!W;8SF(a9`65qQ`v{k%d9`2@1x zcD0;X%{|rH#(1<7LO>KB9)r{#VwK~D@Aj?P?NfG3O}lOqu7-H7;JAo5_4=dgyGJVq zMa`%wO*!K_m*PK`=5w)=ip{YRv)i#=N)+eVTQ4P_#jqjO?0+tLb_8yFVHFg=RPy&` z#MlB1r_u84wJH4UV&W zhj~pjq9vZnKx3&96Qt+PwLf9T-)H)CjSJk13*{X`I+NQ_pruKwv>`Bs zoi*_k<%_onlYws5zRO>CnQdabG)Y%^#x;`nA-RdSTZ>r@Be=JQcr6_~ z+Gw;8O>FL(gNk?^I=|dfw)-KSkym?jGf0&k>MMBuX%xxGQho@eD zZ)Lh&-ka{M210m3SPG6uiTgY$k7B&M*tUJWHanoz()&nD*YqSt9*u^xk4D#Z;=&a!KQ^V7U3xx0DekRKS)6=6SVVsJY3J%??& zytkUp!q{9&@+o<}Wur8vqpd*7w9ChaJRiEZi!HMDJ;QLl7WPrZ%LFw+^9fyErHzd! zM}YR@D4&z)xxT8i==i<6Vx+Gm){P0OTZ+Q8k;H2I^2W2)l*X(JDV8QBz;bccz74YX zV!M(n>zMRXfMu8da{%^3R6@oonyF*|oopjmT!& zQjWyX>;0P3UXIq%IV#wN=!>3FEqb#_M>6}8D&__`QgC{97q(f|l?y_(%m7sJ%vPt4 zR2YXM?grji?j#0U(uhcve4L63`>@V^?z>>o(AY^{)%2%gwJna`p2ptNl{+-QHo8`5 z4JFtzya{Hy$^7jpJTGCG*{%HwEfs-w(@LjB=MhQ z#^1|QqC%b{z_(FhvMir6B@X;{Fo~pf($4WP(zGVN zxg=BS11%%R4_BM(4;!0}>~-*5nPZlmmMUF_J$=emUF5azYegDwWW;8XOol{UAOTc@ zOE25^k?!BsETsvasvOF(6f~`CQBFT@9fP`T4$CInaca{^)5xr;7%{|4Fz8d&TGLw6 zqtYouie){eZY{K1oN69fuU(2&hSeH&^oaXf*5!m$p<<0jD3J)sb0m?~%M(;SKj9B^lx*qpi#kfy zb$bf(%x<$@k+vw;_SdyGtiv2t#oLlbM2H-Syt3%NIINd`-=j-wd9CBPkVqPu3JNc! zLkf~e0-hWzQ;D&5?`$JqO>4LdTUlV~x|+L2uG-p2^$`zq~m*el>`rjtMPS(zU?a{{U{nT8?PI62_%VpAtHWao$fp;3U0s z8jOv!W28YGYa?+vW^x(R7rR%}cr3OvX>V+kIeBFllDM5#5TO-bBvK?jMiLI06pSBP zp#tNt_zQcYiIyHeq2}_^u~xp-xWmJz-MuZmFL=_esO9kMG*?p1V9N}!Pir0nA#hmI z&-Dr$y$9xIu@Wf=vW~JTj*84=wyOZd)wP8Kk>!nTztRCX3uwH zT@xGYcV;6qWfm|MhEN04+q)~R{jFi`sXEd*RgzgHoNH=oX(5P`p(qITR8@fEO4V&! zmdDzoay{*DCAG9Vv_%b#vq=O;(x~@Nih7L2L75b&%vPrnd?%idmuhV^+oh|=m`D9T zPq5HyA7^3+8gzm;4FPMtN}yIJVWiy=Cbe2vVE^`b=%pQ5(c+dmRQ!NpD`=ENMw;H7ez^@xJGHX z=A%op<*ms+PSEn6H%H0q>3%t>wcB&+yXrUF@LzjQEo)uIu>IC1IF3Ppk^nlNeYsv; z+CZCT*EOc##)3dY*!Oqyupg7 zx<&-7X;1eav*H*G@gu*{=szcEu-NHnNor^qTi#NaVXxQPo=~z^dh*qq`h|pU#aJV& z`UCY9)))879Cr5eFt%386Q--n)GLtpj2`K2WvWZ7xFRyRA*D4{V?&bap<+1D1H&23 zE8G2Ez8hR?XU4e=FL^Gd{f%ln9hecyM3t=T?rbYxrBW{vi6n6eNI!cLdeU4)wcZw8 z$~(9m0162@ORL35SpyUMhM8wvsf@j>`-~PzF4H}gp&LW)(WL*_~;#n@M)(qYH=@dz3pAbNH05sVY5V$w7tx7-k~%V)zYJ&&mjFp z9JJ+AA+F@QijPuF7XJXARMpL2&OL1(lIicEt4J}Dyms}Rnx@Pct4^rr_=xl!hf!{J z+qreYxZBvZ*li`+(nt%n0Y1B8wLGiOiO&yPZ<|~}E_RuBRNLOVV@=H`2mv4s7ZFIK zg=iV6T30Fwa@q}!<#szBPq3$LM0S&IIBy$@?8e1!Y2dSKSFomxhDOBR>`fkh7dRps zozBMFp#`iGTGvjMo_5fG(>fZD1FJ4Pu`Jwd`?d1VeR(_=bf}nFTSYX3I&~z5K&m`R zRwQN56uV#4V%@y@>3IFBu{_Y*eSVv9$HUDOh7?mySq&|niSkRy2nbwcWOwU95=HWY zJBZ~=lb(i|Cmz)*p_C2*PD9&_UHdw2n(ZdGc-FbY4A6o+SxXq1&o)&LO8y$+YR1VW zxBV)+%5OC(-Ws*yYc3iK2^=XT(X77TngCC}VDVnwco-2<+DOQ_n!Oc})SRi186$~L1B~`PGLoORQX~-f?*cBxL=|uE6Tnf@Wk|74mqjUw>)JkSP3k3 z>q8{+%BA6CF39EJAg_^x;jpLc(+j)EkJ60Rde9uj51l~4Hp(6$a9DH?EQxAz6t4q@ z_H-JWu`H2mtWut7man-c%p@_xEtQU~nz0C`_U2g;uo$ijVBq%XZ6pn+nB#1&z)?bv?-HA-<$15fyo z*`|^QMzH{tw0=Kn&VO8UUEVNhAue>B^2~d3{aBF=rHpz~Mo`3MLMVNlu;R9dZj)KB z{{U{y1h6EtQT*D1+Rsgj)*jefGuW#dQ^7AHGP36#B%7VFM3za^sp2dCUO0GddzhTX z6|{l>009G5fAW%eR}QkS@pA|gmO67$%JWefr zL9(m2mG#b&OfJb|Ybk=#AguP~jz~;(($$#UI3&m9`2a6ZrtGs$VU`t3ojewV_}56O z_tKtq!d!OW$=ZDRna#MP66(qZbf6>vPG1Q1c~c9n-$fMltJscvKGKsUXIW2aVp`If zr>gH4zpX}EYa`7kfj%-cdGu@vf_H_cx0Pbl#8jSQnHpxNz%?t%xRDFnMJlZ8)lDLl zw-3jF4_Yztp(Jwy6^oX3I~&yKfA=@sZ(!KX?#(WThiu^9X*3~HtX1`1-J6>I^p~x8 zyk<#Ws;Fd(*-%foYL z+QWC+B9Cj7Exdo19kttZWPy0FB1AQ9Kx8>rK3L2*oHFK>HV2UIw48FSH>#1FGv2ig zg|Q^H;u^-StCnlKRhDTrfww~{)$VZ^5@zT=PfKZc=`!R*w zJ3f87Mvry9vb8|p5Ryh_AG)SE)obOMua+BYG@K3?g z!6iLJmZ zi}I(EooQw&gn(ojz!~X>xbAU!Dz;G}BrKg~lhhQPkj4X?z7oUsVrR*AIkFcDcS){D z2S9`6K?Q)!EQ|opjXk*0X-mbl^K7qhoj&)BY&9Q=uG3Q7@`<5?YdmW#;`&1|lKWED zs7AH?xr0KnFN*!ZRlJ*n#|rN<+ucVvFDYAMNKkasg+b4qD~%1czTIUc*B!eR)wI^+ zBx^0u3d}~Tua6E@%DDCa0GhYbO+!(8VW*#Q_&=3*U#Huv+IzxSsUg2DSR+kHxg4)x z`OPDRC&6YQs>fd3+s9XMiDX*<)KbVJ1A!q$YQsF5oN75@RNe1*G}>Ir0^cyJqDow` zttw?&9GC%_?MeccmZnnBAS}V)A+)*WYFB{rE&V+fntbKpGQ{J_*O`g8Ju@l0+ z+$${jZ*fC-tf;oXlZt7tm7}$iIz=J~>Id%7sVLlkI;E+VGR1ZF@;57pqp~R^@k^>` z+pDMfEV_YK3hPn_NKr}kb2zGP^p>r|R>N`~j~v!K&v$mZ>iR3Zh3WgYVD_3yy7jeU zq4o%o>;5H&Uvs!{p`}^h{JqPmwu0hAM25XhD(4|yp(#)aAg~~{IARU%*7q>4`>E}% z_3M#;D^`FB`~hBsfDV=oLU9$X8ryVrI|;Sii&v|mF3;J~Zv$hJ)ShzNiEP@}?2~a? z3Sz;Mj8c0MBypq4q=w9irn`i7*J!BGAo$Tvt z#}pC8vaesw13J1*=IlH{1jM)r9gVHA{I-pWmbv=;a{d~4;rl6i*EbhR(oV9cI|+m&M6+WdNMYuSL`mF`__Udl+7pp1vFAs=DE#a!?U zdwW~CrI;!Sx=NaY24X3xq5%LaQ<{G@>IYc2MrB4RrMjNGR0c zLGZ31w#meojx|nM$Tr-5)gDZfZ#be#yWO#;NnX&_>~?znoqKwkdz%&i04c*f6Qafr zG3xS3xlgz(yL4+Zv^9=$I#Hw40{RB7sRE-=sn5p{u439(X)C&1Ndv_=>RKWTg5gxM z#%>S5uD}LEOta;PzA?x34RUQ~#M~#8)Z#mSL!sR4&m-km6G@}Bub$iOQh26WEpi)@ zpXJR`D9v*2tTGgrx7;@?i-Zz)1W4Bgz1xAo1uBAGO05DUPX`UeM`&GP` z4{6#~H?Ol@+(R_KH*oPo7&*L!DNBb3;)=Q|Dj3v^Y<6Yg)vhHqtNmK-A8&DDma-^q zP^&(#V_;9Gj`h29POv=kLe`-3YY`+&^Z6vc9c0oi-QhB=BUuQJvV2--Gj9r-fKMI* zxZBD75*dsSTc<{6JuM-1)Qu~hD@qcINl`*T!#cZLQ9&IVoL60|y{e%cwZm)WydE7} zNdj4^yS+{g8dTN`QI&L-Pv(1uAOO!#&t|d{aA#(T+d*^i>Zb$G%Z4MxxI9KXSS(_W zM2Uz|rbqM;8%&Z7Dpt9Y50)Xd`Uqv%Z8qGeU9xS>sO&(y9gf>$Vkj$NoWZPS64!xi zMFDAHkL;dQQ|80cOWfQ;XBCaB6|;#;GKvFU8nYszhk&W_rYeP%z18K#?%@!7xu}ZF z80E%*1_@lbC_d~$YwJA{4B|Dbdm9$`yyv3=*V$3s399tVRs;}YMSe!!n zQb8R^k8}{|lHS@!x{&Em$i=h6vwWv})dEXri9eG>uG$omm-+JAsl=btN}Qu0>-> zbr|VIr8NR_9>ZGs;BGdl?LR7ZEU~_$S`(yzLmGJ2zRVQuG&;)_;eVLqE+udw(5F-~C5}raST7$-+2p?`ddAA?ZMTF!$Q;uyZ+C+wz zB$xUI-pmtCE*5FwCJxdKuJk?K@SgT+D=)NeXksYr#O`Metm9GaJIcGJPg+{SN{Nki*WGI8M~jXy{?R2^7U>RGyec@41|C2fT!Mk z@tiOBYw^$Zvd_W!6dLGjJasm4?PQ;2c1WEZ%3_qSoKP%ll{S!!zK_U+d5WbBUK*cDPcWw^RgPNblgPJfeHntM+gR)+xWRjP@nj2?B`EcolWIz1*6b((69X8Re!cb$DCzYs8;YN z>(jBa*NFQ@BlIpR2AxFm%Lg}gQ7LmBn+iLuVkrC*7*Y?qNoMlNz&Xd$r)oU-(}BQ& zI+BV4l@%hQzS?p71|!b;1(z|>%xjid%-$+l#vAR7U|kwQU}mp}Mnu-$Euy}@7-7_KCU5KaK`Dm;9O z`3wV|{{XkC3oN<eU1`NGz}lk=!{Umg5M zVJEj^mD`6|4)c1kM(YJmDW%!if?18L1V+~7K?Et5Uv-zmuLAm?_3ySj64q_MYALw) zYUC}D$)asH-uq znWm3IW>%+<(m1t$+aLB(cUPv+aW=d1KI>It)orAeY;yj5XejoL>lR^!u4-u8o=1)| zuYwrmD14-eai5ta-9D;)a4u$mIX`Ej1czJ0&2yBgm{^Kf@!Nk zc6EfG-I{g=NfN&jK#?J(H4sQP{{YoKrg!bauE}Pb2F^~ly}c_vz+;xHTO`#C5?6y< zPdhDjXsE`o#<<_dKMjXEWZCjRk-0I7?%$H_c4@u&GoM{%@`}?~wPH(B>()y$4Ax|! zQaH+mLZJ>*cielYydz(pHuhb=YP3iaGZlm>T7#ujBxZ((U*@?wjYUp28#d9~J&|_S zyLg`Kx^I0`&hq@l{p_PQ3p9tQ<0=Tj5k^Q<3&R%eF3Np2iq^m5-Y0iyxkSCP^6HvxW8sHOsz;GYpFd`3%l6}jTu;t zOAwY!sDo8hX`1hf@7ol2Unla4*5JSRmn{5w#c6&Q402jlXt`CNdu_?NJw%n(KrP$X z#_WFjL31BfbMMwRnxgHdQ z-U7DfnR?_Qrn>^17{eLk&|_NKYV3Iay7lPwdU+&D8A!PHx*EK9jK>s1!7I1pqusY& zMfPX%j|MlGLa5m4j`G)WC=KL@s>X{WOY>JJg-a7aPa06)b;%}g`ipu6k zwJ^!tT0*qJflFw>p?h6r<1P+INFJa?GQ|z;&DP`*ZWW@j7lDHl`_U*aiylwnPFwSBCM{Hds7`3^%&N)2HdYKhg@Sw z{31ak8K)rl`60yAa{WmVkq{sw5OXIg07Y`~;fb=U#xrV>%DlXBo?GP+ST2;%&00Cm zvZ5rbjg^SnO#c8=h9n9k#de9%7DxeA^7X~A+h@0N8?_}08%g9(EV9gJi1E#C!HsK` z59o2Dal3VB>9zW;O{zB58B9$zcpxc0&aIiOSa-6qy31l9>*513@IlpH=W5My^EZZ3 zB`c&-lpOftMS`O*O4H!xc?>{qHujB9MPk#3g4|G;llqdf3iaMcUo=>v@E>6QNb!p} z?VM&T2#oQ=8j(Yh_SU|9E8&Z=1Qy6!CPfvX&-LfW5)ZFv^p+ESVubfL)gZI)?H6}? zJ1+`y95FJQ&23INm*IQQep}IhQqo$4m}qJ)JG?T*v4+}~x$K0NL@}|BSujp9h*viP zIRr;nPcR#i^$js<$>CX^Xo>>K2HBz;!ccX=?!!3#Z z`u;A(JjyDB{BT1vH;U!EXQw_`Ta9v&qc2h6?V#t0k;+RQI>T_QaX#EYasel?vke4w z1uGR(X*GwEGLXdpiY7A0JcWM$04Xw{g|J(=AE^(n&~+X*455x&h{J37iuR>YUDM=n`|2*=}z&zIZ?!NBUlBN91R%txJn zb?8QQ_MAcnIUh=$0P#Pw4|$E5c?G%>YPK+O`}H>xE^I}5^*gC{ubbFsmPEKLLvdHY zhAAJmS#mmww4z!x&ACQyB9bFQI4f#75@>5o{rGP3862cmQnXSp5;!u~JWJ28mNwgJ zq<~htNp!Jn?V55=M$z6Z)}y&XX>H~vt*e4hel=ecId1vR8#`=^9lgYdToOAKL7M=d z5X*raeEDI;yov7QwuBvGAT=C`rynoVJVMVEk+j%Ds-Iesq?IDM1obURByxz{Bg&>m zEi9>FeEh&nk>4Yy9Tp`{pw%TsJ+%ERi3>PnW!37Z>HbF%b)|z_aw%i08(dAB!91SS zlLuH8)r2a{5+fX}rAau?*RC+jDiGq4fK5CO9*$s(`D``Qhco0cB{j>^i*+n5Z*)rn z*NR$^GBdnFW8m}U&wvEKj#M~38bpCn0UQVG#93HM+T=<%1MTp~I((0<*=+eGJzny~ z3p92WwVNJ0sx~F7ZLHI~Nw<5~ilc^DWAYUvk?{c&I0MPBeHXSbR>y0S=E(_`4zQkH zMO+;)*O_mMgTsiS#w&fYZNqnt(sTaRj3xy9N>J8$Tb6l84txtK0FVrRwvAq8y5)TO z+WvNeuF}Szf!B&Fbu_I*icJ=Uw;F1e;t&(H+eL8}R|H8~7BLJ0dUpP4wr#T0WQ~Q8ioUHSU1a^!?_t4?JIcJ)&hqmwfu*52ma;4+|r;P zl`+-2U3_bC>eG7eEh|AgPV?9_(AitH5; za~wH;k;kOT(ujeY$(QQI#>J{uHdm`4i0p6Ct507F$m=4~*P=%2FS7pJD?Q5+7~G#C z`BRK^0@CHJ6@>&qRjbLXk@KjgD&Uu0(}q5({n)K)*I^C8W;cd-;PR4CViCy{b^xlc zURPF?U1<*{J^uiI)2FTpkOY58EB5|_2cZ%+B>J4<-J`!|ys)y?h2w?e_NA;+IqbW8 zlb9f$*WReo$X6rR>Fb`L+(4($#4Ki+{rEQcNowh)A#cX=%mvA;Rf1tQ#Gh(2UNxRM z78vA-m6~%OzNGniH-B7br&P=atwoTi9>H4u*5 zR7!qwMf{lx#SUS3E(HOL43IxebnV5gM&+)SK)Q(2=0G3t&XvKes-Uilsp5S908iJ3 zG3k;x*0!qsr`P+(@)DHhHl)!fx$VIeFdqkA{{Xyq=^9&wlq~8x&7C>@#PY+S!KWzV z_nhegCB8Tdh$pQ=EY)0$n$K1e`i5%UO7mU zKhXWSjVz9+T8BveIbt%}{ygLPUg?%;l}bAmXl87x84*8|BQejK=f@y*HUti9_>F2S zPt)6oO(Ph=`#(<{P&V*14K%v%Yt7|#uTo3z;)NC&rk2I1o5RjEoZN#qNcYnfS){)lKa{Hsam^!{e3`svvjmD|2t#C; zTm$5A4m)S5D{G%gtJD1lw-1|$+B#|(W_bR*L|NEKv(>RyCyoeNFG^N+qhraYjwz>( z+WA;p7bBRg0lX`DqWg{N1=igZayhheLN}!G;00=VQn`8KH@g{Pw`M{C>G*+=UFwb~OHiW1?@as~!~L&Q+{8fS`oiT0O?cKyr;X=MO`Kz_f_<1j*iwPR7h79Or1 zcx$x$YgbzJ?U4MrXP8rWj=I*G>@g!%lAUM-KHOC$L+-^Izm#O-_33RUm^l&JmW@qa zNT8?j9vo@!<$}J1LvA8VnG^R-E1%!X5K&v&OAey77%Og|h1SN$Z!Cs=o#`ya1ae%G zHoIA1@pu`lBy_PCjGkl5#mvi?_SKE1VLRqt; z8Wvy;Xe;ao60EJ8TU$=uSzFZ9T{&f)I1IcoBdXBqqK1Vwv$?lZ`q5e9o_P|o%^{k- z9fVc=qbiDV7}4WWKn>(ikA9(DZdVeS8a0Vrrc}zj&)c47j}ADsx7rrngP&3ZQ%@@X znPE-DTI!m)HMT6)+0c$BG1AyjjS=F4+zqg;4T+$Y;Ay0)jL+LAyn^K< zgpoBt$=O1&&1dcXURPKkJ^`KUM+pJ+a?beI6H(lP&@usY8 zCC;c)CK{3#f!SCXg;QK|Y0|1R)Mw6IkNb80;9%MBAmW_Af6Oa!%QdU+A4SOT?CnLd zu}kx#u$+4N*6jpwmT0U=1a`fLZtdR#)VANMA5LYC*zT}Lx65{gqDdg2ATuceg+R<7 zh=O?2hCX`VeuDi|+paFIc8iDHENq-4l3UEv5Ls1)V3SLah*T;|PGn{=fbAstdq=ze zoZP3EUD?qmK_JuD*zB!Rg#ffEdDKfy3&%b@p(ISF)kj`~3--PJr(dCM^0Fsa*2)x` z(0o}_%!*^lXSMG;Ezjj3p7wi{kirZI@;D=i9WY3BIWkvRu3&IC{xm*ZiWEDY*Y^dq z)lX)%tCcmHZed;{Qbs8(^|p2mn)Ic^WI2qdh-Jn|>XP>7v>C*f>#{A^s3m8&CaP%F zL?S{5l`F{88m+3szu+~yZs?N2qfmw$kScjJwP?WPLDWIWs36h4-(~ZaZ^*Bq<)0R(7b>RhI7Ij{%tlG_SE}xmJ~~D>gaL_W&9Kzb*1@lTQqD zNEhTu=uVFA(6vM5cBR8*LJx6JkGCE`j;<~CU#Gw_$F@Mz%b_ka+|osL#i- z{XLH5rk>KqDdqJ8G}BK`BPeD3wWTSjApq8d<6Hj#ko{MH4K*30(~zZ497a{; z+}diFbvx}}$CoMH*6Z|0Uz6)OB#>FxTXl|2zLxbRt31tKMrq=8`^qDxS#i|o?fs4! zmvY&p-4Nj9DK(_@;}P$93)#dW38wG~)rR9E5+ z2>=|%cz-uK=9Fkj6%UK8S*|>PqHc72vq?NP3@}0@@Y39uSuFCru+8rGV-J>M!Ri}! z=Wfk(rt@^^+%lJ%IpCd%uQMWzCzl!?RLc{e>KAoc+8b+qn9pt10x2!-t*fK}E7KW) zP(T1sa23lF7q?#_SfK{$#}MQc`1}Gt$fwBd>7|~XYZH}eMUTy?37x&ch#o|f?kCV5 zs;z80X42@{3)@!QiQ@pcD*0D|1bgXBTW(v|b#Hb{xl6WQ#j_0QIJWeP=4ny?0Obt+ z%yUm8&~dG=E!c7ml-r#(`gLH2Ehhf}Mg31muN0zZ*~2Y+MW9L6Fv2)qLd>V{BeC_( zr*+*d_Q0nxZZE2y0N$}ni5-e(6n_X zQKwx-RLEysK_?sKTT(1?o%YNA(AQbtOQqUys`U8c?JV1y$6jI5y)Vg1wjNf&vl&Pa zlCS*6Wya%SX{tT0-WT0w(k4rnE{F#f)GO)~$PP3IEJ3i@Zf=wR0NP8th1u=alFk*tTtl zY}zibnk)Hs`+HDkYnfKgCYn03B8eqw3mSp`-XfLeF!zUZnKr-4t?}I3dh=S>O1F4~ zl2oN0i58@7##d*xs|ERgr`pJ|XiljQ+_53a9WlLaHr8Mpjle?r)hm~wyQ-%$d1wqBG?S5GgyRz4C zO+9GhySI7dv&x{Q`1RHVy4v)XeN)v)X{VYQ9h=^NL!5P44d%~q40kt@zLgn8Zpe`AX$FvTucU^{j}eIdCp6bZD$fz( zB7LEsT-(hqw{6HaaLox&v!vEM0yRoAG(c83X2}Y3)UC^Ayk*fp&Qc}Rs_zxL5yrGb zLthrF4hIo7-r?Hq!`)jgib*nv`u6E9)bPky)sdJSm{1i@Pda9Cci-!`S{dr;_BtIB z)wW`}TW@byvemGLbP=6`#|Ey%&nHZTZeJVacsGb z?KB_Nl1VDluyjrn!M{{Tw4v$ak{giRb?0uec7RzC0Dj-p?0o6h5M)>{;FiD5sO z(x@yKgEFCDSgmS2@h5NXp55AQMelS=W7D0qD#Ip~*Gj4xGXa|*R=S8KX%ZDWM^2#;+uJXN$=~fz@pL z_Vr^hj@%hy(^X)EE}D>YH0NG4Jn?mF*?q0JKyELX+saOz0_d?XOqPl&T9l{(s3>@0 zJ3MoQ=waDtcDp-NFMc7k_UNTMHSB7ctJ#I^Lo5_(#X+q^QYfrQ3WCBvHh&P}Z=2=u zit-rZbgevnT)-+$q5!K?;rvv@XYB6T+t%l8yO!qOvp?{sPY72HEOv#+vjGSQaMsb0zd0NFB; zkks~f8=w|q=ajLb_w+T$@Jw_tMX-B1T$#A{3Ah_E1UCz&Um9-ADl&a<` z_L44Pfgx64fvOp5064bVy}#bjzsK)ZYxUsKinJ(f`0xF@ZvLKThE0i?D$NA-p-XeT zm81)4i&UfH{vPT7?r zyS!#~I-x{xpa&?^Dh4UWAzJDtqX}2$9GZ*Smuc};i_oLQ_F>g>dKRfxfY_DdePvCG zUrIM-nUoQkBY3hxCs8KaHu_?Vv+m8xf^ zyv)VHkU?~&i@=DXluW4E)6-mu#5Vr`lYAk{Y)fZ%@$boeM&(E(mK%DTI;mP<6WL1j zu|^7wE6QB2koLo<$?iIrVYYYn&u)gtbK5Usb`{i;A+H`Kq&jJpC5ddAk^q67c{0yrw|TAG!m z2o=i>TJAlQylqo<`)?9$R`JKCADgv~Y1#PbV*o;tkU-<{>NUhP94Cs`r34129@uVZ zMPpwB@a?|uQL&D|LMrWfEv=oa`uDFqq2LiK2_+5oA;(rSZyU=oFD=wo4BbMvN|U0m z?#8i*=}I3Cc+MW**cLQ^MP&D}Hh|WS@JQVCNbY3}O=?K58f8ji{{ROF;nxwGUQTJP zc#3-0Gw%4 zV(r_5u1n&fBcWFy2BG0mP&{f##AhnwQ)nzveNQP#wS0jqYopjtve3U6w$T`*hgQ=o zTD@ZTOGdB-SGZA;4sx78? zn`pj&mAX)YmRL+hj(Q0Nx;0LL&tWS=&KvsEncF(6VarR zJ&0@6Xp=*~w%W_qJiWTf?WB?Uv2SqarY~Bz?}6v71Pg#qTX1n?Vz5f(`fphJ-LQTan^lx z9Xx`>J1;8ZZ?&4sje9H=pldLg3<6dW5*d|;QmtMqi)j90;UsMJw6tCah#=*{nbSXR zB5r$orO`Wmr0S`p!XX8fo=^VKkpYMYIKTwy2A~=OHR;orZK~tjes4~e+i4XB)SIzv zwHn(HzrS$F{X*@DW2+5&5Xl=Yl!8l=6h%Sh<_yUxw3lPQEa=O;33>D8AL`^XyY|M8x~R13&YkHq|jEQ7M;e0H9J`Kvs;UEX4I2O zR^4h8Bx`WZRhB89v>QpJrBWqdZ6THtRg|AH4^`G%kImS8%t02~HP0rcNhg5-lTI|@ z!;Nued)vvj-Y{#-Lt ziR)HHVqiYttdQAbMW9W-M-*#wcFiXNojfqr9cj>d@^8od5ld{`5%_lzS|x> zXOippGeII>wZ|?&t{ZAP?SFBwFRl;bFP-_lJ#7aC`U;^kk`c)D@^SFY7^ zn|p2W+v=-pXrvssU9fO!rH8+!mFMJA-AG}~X&2!_j^*SmG1E62WOrBJJ+jR$s>2se z_~8ikP)ZuZ_zfAAan` zU`#4ki2cSBY<5;FuXm0kyU8Imj*1Vkh>HW}7w#t$Kk~c%!bP{(WR&c1!=wk+r4R3- z$0DSS=O&c`zn4%jq@O5OI(4G^=c%xxU8C6F(cHT%*DOHP#U!N-YdXr?5&rE5d<^7VDAjmaq^_UOCXtd~Z)IwpIybXlt*UE)dD- z)tc&(Iht8YMwtkZH4AfW*c7P9Re+!eMGZ|O&W2=$Br;DYsU?w+FdQgKhE^37G*Zrzvp{WD9*t6RL=YgRu$Sv6`?UrS_7ER7q=RK*J+ZyX%-HZO0v$o5`{)HbbB zB%o8s=%q&@X`M6A3wZ_B+KIY9T4|+C45@IgDt~~HP<%MkF zu`cy?74%qljw*T*vPV~AG|IwB?O9oi66GUo1Jf}yi*qs(UedG#F;g-B0Ot@g9sz6O zaQnj>MGBVb+_Kc_0lFXk5O|*w)aC{xW|r*=3l^tuLYBd{FrA*z*Qc$MXpFR7tZi(q zLt|%rt+i;{CV`<6uvbJa8%9VYdD(8Fnn((1RM)5@RFDw04vq&gTGy5*OL=u|Ytyij z2<}0nNu(i=Q{rF|{{Sl%QmaeG@w^^SgcZ5 z>z{AigTb()#Ng(8)gsjyx+p2rrF7+50&v_*XdP#T*xX7gU5e&-RMMUtlx2lkYr%V7 zlH9E%HS4n7r!;bGFJEnoui?P67NXVl-thNKYX0j_FW=(1>NFvwx1UUHM>?ZrqY8}2 zscHoeiKY&5A6^NiexgPxBAr7}u5>~Jwnu_t+B z%H-e6v2HzP!ri~gw>4y|5oM3TUKhbqRn3j87k9SiC_n{U;uR-Ir2(g&thi=9(C)5m zEN&}2tjg(>Wt1pmTDMKeEHs4_U**u%~va?6#J*vR$pc(Neo^v!tTN z-mtb}l?s)Tninh|$x0`QfVLZS`+d~6HZ#Q{)-=@x7H3u>iV>U>;B_CiqZcz=?s4u` zmbQ2CN|GRzf;%LUY5<2XGKG<8#iLF+Q!1KT!_2gQA=>0zR`eevajr?R*HGmfCgZzm z*Jx^|*apLSl!pedk%9aS_QoA`TJ~byR>b#-P@y>w9FZ#kg3wE z6O?B);wg};P|}#r{J(J6cPI5NqF3EE>w<|m`B@V}YXO_98oH)nfKHl`OoIc7E-lJ< z-nVTIvg2%Yg4WA@Fy>spiO)T$>&0Or{+GwK5hlW}njj-ZlJ3qoo_ACcL<<~8x!JF- zYz4&oQ6Y`BJlcYFnYeCDq2esbE%Ofq_&= zqiGGYul?!OoRAa>F~x^{^QCS@xRZu_Rmphm?R8hJLQR$Hc68e-5m}C&zQuYkdJTO! zWuD#H8YWeQ!Q#e6nUz6{XWCbGmOs@yj?!4wXv!n$wv)?LakDrXW>~TFpuz4xQ7!jv z!0dgwe;e8^OeEI2&2yxz6$zz1ATRoSY&>^GtgT+9$E|N!UZu^Jve37$f{Q~ws=_mF z1n~PK-P}pKbYD1)OKyY#7zLIU#r5okvW=2h_0=jtN`EDV0T~K|O;OOYf-zxhx9#Ih z?GwgoL^fl&O^R>D0U&V^|l|>C|RFJQaZYQ zo!il@Ed(%Mvm}xRSmR6vSi>HY(`jwaRU37)$n3tRT7=i)x~O<%!nhmV-7Fw!FK*Q% zgsDJC)KKLrwJVt<5lW1+rZ8RK_d~_BcQ%#y|+(`h`BSn9eOIICz~RUeDu z2iP%?-~QsNZ$`d-hYHng7g@8DbZe#UjeU0Skys`;HoS#uPx)M*@KXXWe3+t<0qy8C zHobu@pUiZ(JCtjPL}ja~)hbC?%TuCBCajet8d8|XU;Rq7yD;_kyJ?mgjG`v=#?L?l zOv_fdGy;M^pip5+f4R-lrG-38j<@A6vn-b$)WKK?)odcnK#E0pP={Ro(S`KM=@;pi z(q%#OS114g0HHzgAd(c4b0)cxPdr(Vt^2$|obC228^@$nu?wFH>8(5kG8u5gSU-$vwxgmG>SV|bSDm^X(JQoBh>rAt}##Dz1evq>%F@C!dj~# zja2iZ#@s1d3eyrAs{a5PZ(6t8U+&%5}OA@+IsrdWiPE&hu$|DmNjP0Hcb!w%% z2l19bz=F6PXJqeRs1m^}HeI-u(*>@(yVyiS%CPEe`1}jU8;dWdUq_%3+-^PTJ>{H- z)eVNxbtK+JMZ}8|`w3k6b2S~$9r!A~`|&m0@8o^WQF2%{m1}%C>}{ot$f;hli~P2V z$!s${mj3|W_ZA|1-LGhhatBbI#hyJpY7B53vhf}@#TMz>e@X4PQ*X6z zoBh?RNDNAwIwZPCpae~MLTW(+O9RU~V|LX40AznFbB!*uamA_D;~K4ma!vmL`*P;9 zkM7zTrEg+!#7yDo7#RIyJ^0Z z^6ETDJ%lKf{+uzevi{5ap;b=fyV^v@Gtq{5z4ay`QOI!TURb=<{{Z7Jn#$%TyLVNp*D3xm zWS?1~y)wIj;uTSp76&8LRb78_-PNy9vD=_PI4a6V{;4D}ueGxG(-xNh0NK}TG;FDR zy3aBAOR7c({{VuHElrhpF!9AtDrNlGuCy+nPU+*NPiK>mdNI!~DIjn3dq zqP-yPt+~)DjX)7x+Je06KzNtu4rTqY>~#9QN5LN!-s4*pzP2{JpL?~xa?G^jgvT9S zd=_s=A`-|;yRzr$`#SdS%G*AtTHZ@}-&>S(MA3m9P@qs7#f=3=E+qM5=bxzi$I)Aj zwi_R&dtA|6bqh;9!#1)wX+T)`2H*yKamtTjP~>}Sj4$yaK7mxppHD3M_v_RECA6r^ zE*aOz0hu-Bj}B;*`sH)2k29Z^s$>N@oUy+ALH)G+*Yl3lYxqYCy%w&#)&Bsh^1bnw zQN=Y7*su9XCC#+)0W^(R`+^$cS;`PXfI;ieyVL4_WcC%G%=Z=SLRP3qP>Cjx@&YhH z0GzckRUFPeZ?L|F{YCnbfAV_<-tpQX23x7YOK6dWLo}2+syHlRnDYQ*>=(oz*{{NX z+x<$MgPdK1)~Tey+WUb)MA*KK|A{qCp+2gY6P^~b+{ zqsrS~ZN_XYWXq)nsjeAGpb|(F1uQ=Th5+zlazCP9O+U8JryojfqTaXZmvi0V8op+I zDQ6o}q{Rc)HYu3uNiZQvIysF>@AoNl(XCH=Ya+kY!>sEFuqxs0}B)ch&&h47EvIANTF>6+|t4fpCz)O$wU3q*IQ){;)&bSIx40B(jr#-k~hB-75%odqu53I_c4t;3zuBLMa&h0Ez>Re}H^D zHkyq~{POOvo%2cNxhC6`)6=e+I}y!2tFXbYp|Y1~)ph!ar}pEqD;pQf86A+S#xPyU z-*H}DJ+Ey=EtbPdM+>t~>OcXRsv`y7lpunT)6lF*Cx6<#oYp&RQ};C1+oy8zdDcFZ zOboq6NWf_sBZn}I4^nUXjDsO5%9~}eo%r7e+eEhuNE`Afn;M3)@&IT)+6fumR-#Dn z95J(51H{U??OnA?6}_kRo$A~hQ1qyfb!Y)KRcbJS25ssdo&d*OR zJ&uoxRfjERwz9=Wo5nchnF|uyICqI|tk(Bvj@fNd{{Sgwo2vrQAI@PSvd<~5l`|m= zsL>jj%--yUWPP^s;&-_|ndOEqox=huAV!UWf+6wgiPh+|XU|Z$Q{%Df>gXfc^1c55 z09VEJI+*pfH@d1{o5!u#*xa7gXtp~40P4$d>*ZlAY{>fuSsi7yGKC#iPrWqlG!}NT z+TTwh6T0<1OQaB1DGDmJe-vUgr@!hi0KC z`G!erT~d)iHMiJ{HzU^9*llCe+=feAMN1oc+Y9R>wVicWg|+ivN>Y(D%mk4YY!4uS zV<{D(HqUn968a)mH|fSiBBards%K3^o+Rc;%-@M(mIgXrXsesFk}QYVC_wPz%g&fQ z7O8EnY`+^~V!N<)h6;16Y?Nh~eiBz(a?HlTwXA?iVbk4?A8@M>*y#JouiqgNus zjeLIp04^9Z$ckYqRj31b`#;Yf+wQoZ8es)Bt8?)KEgc+kHpOXNf*E3ZTEtI&<)yBc zQaPhOX&C@|9)=4o%XErXoUjDZ+!_Up`Q$i(!=DZq38b{KaPbF5Oo5=)sEo=Q)kzfu z@u4|kjSr6Zd%e|eQOJyP?vrf|-47YHwYv_Rk83sQV8yc9$4y4B`pveHEdEr`yVMXQ zQ73Zd-c8!qXtRFb+8Dh9d2>1E#OKF`Sg7x} zQ6{mYZbv?XD+0Rguj~Dr7xeY#MA>a9;^6j-^0GuMSTY8RDR5k89X(|g-^{d)Zj)A; zBaodAPa{B0K=pH}031HWO}!(NMaSc1{3FLd9v=K+*Z%;kUxsVVul|L^tX>ydYhRgn znR58xk>#y!4GOUSnXR`hX%t3DJl+)}3KgBTYPR;Qt1JA*?Ca@lmfj^a8VeE{qPco$ zS^!BTVzK^VNpuvlOu%ZH-MD0`3Y6!@qnMy45BQ}S_A(8|$m`;Gqpf3Isnf%pm5?2H7#9jR=Zp#t6gze+_6@J!QlfZ;`vlM;~GIeEKKYSqBcx} zlh#+OEzITI>pBY4m_9W$@#TxS(%#lGu#xV?Ut&_E8daIKjT6wnx86>ZRk9$Sywd(W zSvIGQi;EdpP z0hm5C#94RQ%pz+3mC2e9Bx>Gd|azqVnni(lkzBIr#~#eWpP#HmNri;V^dzd zTM1q|)S$M-WSVO+Q>_rQG(-OY>6NXd@;c|s+E73w)4N-Zt+?!0(e0tVxSH4h0Bd#j`5nmMdAB?BFS8cLnp#wb zy>#+Iz7eVvLnGf?td~)}BRReVrigi=f)~gLahM8$< z^ZQ3C;?}`xs)XfSiRb!p!`)rfk7|AUL;7`FjTT2`V;)QU3?hM5Xy zii`V7#~_ADW9tfKK*!B|y|g@X#Fn0WdX0Udwf6PY*2&f6FUs z7W}CqwlHR5j#D08x`Tbvp6^AFVQda{;s+7Jx$ym-IC>?P-q~70tuQ}t+m9LHI~X=| z)RSdyRQKZ4K(ow|S4zmqv~gWM-^V`Vv$Uv+tAb8PNgEksFwp1(RPYqxoqe@9;8r=7 zLn7;L13o-y?aL6Gec^?F>dmMnmT9AJ!-+%16dp0TsBDQ&2d_GsSK8X z9#z%WHEx(cr9t5&Z(?fcB9Iug(gx0A1FM9F^xA(UdEv(k$-D?z5>dP90`Qdy}zi4EV=Zk z*@danS@Yu(_^K1rin8C}8PyxblOI7D^|0ng*p!h@A-<~U-~(9LIHiFGSI(IhsmZNwGlKr+u7hMQZ& zbsEupHM{#8){Tpz)qGWnQj*0|FzV7fERsml6^qE0QqBQAQ(i6Q%#4tbEa8kL4n&Pa z)cBnId0?SkA)`_2Z&st>;5qWfdt%kCZ2J0gG)4A}Z}TICY$WnXWRZWTR7I1)v}QOL}6nQ!W|y8p-bZ)B#!>QAco@SOod9ZIRHoa z;EDo;Q}AX__+nJgM&*fQqGP`mC$n}RXbQ1UG=@KRqcyp!Gs{;i6AVbXa#RuDu44A% zT#caWpss(Yp9~06R1zvr4|XZmIZnET+j^@r*A|^2lCn;)*;G$*yfMK3EU?-uB*rio zuqfU0>uR>rJR<2dv~tnFqh zRuT!VEq^NFX_jdd$hdGkL0mL}XqWI_c4{kFKYTF8Xom#%S{hIdn+;`7Nb~h{9ucF$;eyyF2 zMFtqG=VL%e?a0I_LH6Z_bUO{zli1EwsD%nYH^)z;tDXut($vR&f{yd)?YsL zxgH^4!A>edCMf|SyxY^JcMZlFHi2(yM0c%p@fSL@6iAXmlINuAEm{*oG8}OyZP}VV z$)>-p>`Py@wl)-H}snpDXlGJ6lIaN7GxD^ zSy}>05~Bhn1=Ydy&NHCj8*>mb7*za77&BKf@jVSFMQA{#G<_RJXytVX;QCd(Y0j0z zU1=buWZBo(UWUp&)YI6!E$sN+ds^Zovjp1BZHX^6M6YfK^OmqlmT%>TIUQMuuI7kA zJfq~CQGy@MAdH5lqUPCrRa3_-Q@qyE^*S)>x>Y$nI!#=tNF}MyA&1nb<)dfK`BeAq zO{wG%>Uh;&HLbj~wUxNIf$VR1-uqhz;7?|sDBIUrC6NOJ_K_1MIvFL~ZLDneyC{ru zMXE_=B$*^~$3p_O6bKfINFahw5rmB-zTB=i9nM7GEEKjBeTt2)d$KA+;P&EEI?!to0W{v>kIpE) z+N$i#Jdr^{3NA}i+H0PKdX$1!IubLbMqh0+#0YMUv~5%9u9H#+j{ry~&lTG`ZbFnz zc(28@s*8I4y}T1vvuUpvr#{Bibri!V<-B_Zh0#QiImC;FMk3)ZZ56uZ1bUrC4;=ER z6OiM^wDZLr(am!kM1+6`E_v4~<3HMQiS@f)Nn%b(ua7~luGr``*S34R)uDR&m|}xn zwKC04FUej=)N4?uddtF!!8}Lf$&Yi^PaL#&7gs%4w;~|gmDqKh_0d9_epTIwH1;S zZ;dNLI&$P&GE{-2Qn<`N)9saa!N1wVBp2OfnbIXhjpR(x**+JRAyrvT8Nnu9Oa&?& zr~7yKznf}o&eZq+0332CuFJjKU*H>lO{%{Xn;H<%*jSZdI!t%)$8 z1A}?A{Y~zU-@aH}T3>DG5)ij51EB!vjiMqIkd#tGYGYK?#8d-}w)^x`v-_^m+9>AR zH#eGVjdpJ|EM3l~5~4}cQzKBWkwG8;e=yUJ{z&***T*;EURk{U>v;B}XmyK6fByh= z>UVk_jT=jvRuaUUDwlQZbJiFoj7Z1rK*zUU)7w4qA9BJD(Fbi$c$&4u@XH*kMtLtq zRg#1C1Md*pGd^@0cuz8ZJI!3yXRjvu>~D(9{%?gb+tOR;uxiIR>_r z%l*TAwXLr$sSSFZn~Q8+A+uP6XiH@^yQ;uMWmNasSQq_+wX~bI?KR6qFK%s8wt&FH zENiH6$T3{uGRVFc*=KS6N02I?HNnPwk1S4<5^-@Ul#UPbKOP@bbFbRuq-Pi4K-9Fo#+k?em znZTxBhUM$-2NP%dd$ujOQ{DFE`SosXt@RH8CbvfSQxH(_FT{;5X+B@2v9ywj+7#x0 z72Ii~tl=pIqc+Q2g{Ds2e{Y{E;1ozpeQ%ki~N|OJ<}A@&493 zGev3}(7_}$xy+EwRx(vpeTMM~f!iH)eb3wKOml6~G2^P2aeW<4LBZNh~K#T9v*S?}G3HB822Kp{67?{3GXWH9;>Q`D2&rBAH!`bbc?W78xaf zdeWuJn>~!ofJfwoT$A6>bpq$PI}+jgH~T$_2^!-=5Aldxqgb2YwR0Wm9?~Z zgtbDXY^)?{OCqVjBdb_0J9ke@YuaOLBVYc@JTkZfyfs`@o>TzhqDXtOBo`Z={^IdX zNV~VVf)mb#VznTTYc6!pmMj#s@6GnHS>#_NYBaYkMX-XD{7;c_bFHx(Bt|biHzCyO zFI$dlRpOFwIU|?b$WG@XJ8ny}TNpOIuI^|7)WT>bXG+&KXv-?`pgy2HF==hJuXAoo zF7dnC+g%mV8s2*|3z3=$E#->ZXI(%s4=pmtYM~d7MXcqVQ7JWkFSPkBYU|^Qk09W> zE*YpbD^m9=dva?nSi3!)lNK)+Xy$UHuw&{omRH+e>D7Oli*06l81Ce~H8clUY9g*) zk?INxpGPyc-1dIp*&~T9?5=mqm5(Xxp|DhrwbZ2+Sy&Qk!ho6_-;l;O+*6tFE!DBZ z{wd!=B8l474pF6thH?tKxGdPcWBOg1ky_Q+O|46K3LQ(ZI8l!KYhCwXvPQSwcS~1} zM-=GDw+iuqpmhiHRDuZ2X-aX&n(jTT-51WX_U_AevaB?9xkj|Oj#9+8MUb>|E@0NR zu32L>=A66bUI{ET`9BW%D~eSyO-&Z>A>=h{S)yD#G-A67%dW8$6_|p6u<>$n>DHTK zvh7XvOxrE)-Fo%)bmNSXPY@Yf-Z6*Y_phjZrJ~cg?7M=>Dpf?6R{$URlvDozhrNYg7Zx+Is|)FysXd0b`_(PN0}MC;|>^rS00(GNVa4hEwbv` zcEMc@RJe%!t?~nva%55`E6#7m8`&S>}W>&7oy| zG%c!tu8~}ZFMDs5{{XlR_OJR!$T|)5)&1YhtF!+Ax3*R+S=v@IwSUi!J-s+A)ysYB zhlzrKP~)n5F52uXOOCf~T|~_%#DZnhN&skC8{3(!NzWQf&hz@Qd$*fz^0T>1SdUUE zR@J|o$jYlKf}S9wp8y6kYaI8H@-5w&XQ4o8l6`fn+(y0a_ZrX|x@gpz3$NGSqbw_Z zpc2m{d7Q|5FaRF43)|aP+hn$YxV+Lr&dQTa3v<-<2Al7h0e@F)-)sdK=-s99hrXY%8ZFRmmwB!))DCxdJkAz82{)%ecJw=NG zH_Y!Q+QgE@N?{>bg{qJiRA0T-Ks_^c9_4GbwS<>DY2I~ugIo##Xec8CJi*D0e5p)M z+b{Ne-Pt!&Wx1zrl^O(gx)_j7eQkAD%zk8HswgX!F{pBFrmBS6E7y3o(|5(M)t1b> zcEnZU-0Suc#{$>d!El&$+eBYz_^Y&bqjDvU{IEL9ZC2Man~QiaAcuL0$L65|CSTnE zW;6JJsyGy78JuprhjZJb=-f|bJ=bkZ7f``H5_n~;I>E`(!ioSIgs9(|q_6`K91G;D zTx;aMQSyTA@2vcVtzFpE<_WyFy4=eR23-w3cOaq1kXWe=xkQzG9;B^2QKZi#G2yMZ zeW2X-{jY5#5%le-ifvXTiZ#{hc8JX3UC+nqlr2w8DJGcS-R>Ffd(QK_jpT+~l1W+K zR-RW1bfQWvor<8ZPLCTf{J9G%hQhl}X552ir=OAT{#VwwAg2`#bljb{dXYh6v;9H! z>pe@ng5>FLe;F&J^Hqj#EW3!uk6i}HHrSp$zTa&k)TtpATBMCS!#_kT0Z_$J$mG27 zD(|@4b(^cbzVeaYsU1lgXpul5gpeti%B?{_WQ#o}xoJ6V{{WP@mYYqtu;v@t?dJg&f#eQnyCz4qa6xnEt`#kWN! zvZB>Qt&pHgjaN?_%NP<|yLlI4E7m0k zm$Xzn92f7^Aezbv+D?@EpET6Pk~QJ**ZH1CqsuHvxBjIyiX%-86jDtqqDf!Lg$R$G zMH|lw>-Sr|d&2~pmz(lE>8==d?^b#W@4~I#oaG#h>N823e)+6)BHfmsBp`HG&R6%YJPQeyJLpf*vJG8YS^X5 zH?YYRW+wOl038i`7B2}G#9~%e3x>-AdRuvgyO`s=i4-v)>XaX4D8Q{fhaGns&Z2W- z&nsj_E#^`<>(5S?uP`_Ph;QgTT9lBZas7an!v0j2El|_IV`pN9Ca+fQc6%kC&18+k zD}cG|M^l#jb(7Z}#5xM;0JcC$zZ48bJhczjF#)#ikpME=-5E9NIoQACm?R}=PuAYRIiJ4qOCT4aSovncV$ew5o>T-Bq#SWKBv z8UalB)kynB9gh0a%owgV=C}w6$W)$Q3=bOoEtYgA7FL(xy`0q+PAjq2!wk??zhYi4 z@>#Bs2ATKvt3$`;r&h90DGH4=vrPs(m3#FOKl00B?`?J^B;?(2fd2pvPQ;35Pab(- z<&(5#5s57YvT5}z!PKR5uAZ6zPbSWywN>GYR_BNOH8Qcrw1%Zukj6MBl^xAk~=0+&$!+gPv9^T2Rg6hDI{?o zu3qd|lFu3W2~rB*GHq=`7P8;dBg5j>ACw53{CYd^m5UHZ69)X{#fkzsVQgK{+Pk7m+jxDEX@k80ax9gTzRHWiopn&_$7{Pj0pW{3XV zqa5y!vb6r_mEx%!kazBSmg9-)3H*)c(~nIcDr!)ZzzT!?A(;RnJD8St*mZZOIP`L zSW=EZEu3ZWCXjvL=Z3dineXk9UI^|k16R^DNT_qDl1)sewctSV#Aec?EjqfGV$X;mg(+asWs$pM0~U^S(aWW z*bjypyM|@6irzCEHc~BK8hWG^_(9+^q0hqsdfh!$-8FUAS!o)Tbg!_AQ=_e`(lujY z#ZBFrO~`G^^M*B)zFcD%?mE$4>M7=V&}h#~X3Rn4nIjG~tvCW31AD5~p|xvvl)V6Q z$J5MyU{+zmnsqAEBjJfP&`%Vxa_g1YU(|uE1_9`PWF#YOvDMO_)h3wBxH%6~8quhuElvW{K0)W(=7qniUMlrr^r9AyIM^Kd zNl4bD{$ZeIsHJL5jh(%ncAhxbQLn8Nd-}g(DeSeu6~i^6QYW0r?^E|uNG>Zz&?IjC z*C57%*(SNlS&BC%08*K7rA8&senp&*S)Nw2FqP*V)uTs(41 z9m88B=;(?hkfA3@GG|6oREhus<(WBQ%Kj5sYSlIzYIv*bE!VVnJflshn*AEh3>IFb zmp#er+qB*hmPT|dNNxa05lkHPTq~{t-rzks*zcm6t7rqZO^K&W$LwSu~*bnx{AEm z={o61lEA9XL`9cM6d;X7RDjgu;Axh0#GR*a39Q`5xu|G07HI0o^%*OWT}K@2P&k|~ zpw{wRe8&F(Bj0Fsmh~`xbq#+RJi}R{vUQLe)wK}rcaT!Eu(NP8EQznD5*M=ThAIgS z+{?2r%r^bHd6H=kr~Y9Hr);Y0HQW*i_B!o_YdY>n&Tq`rT6u2ETvXXfu+#ZN zU8ImCmAv8dtCs|lqJZu~D}{TbxlJO-j*SJlsn9ak5hMbnW(f^XDq~nSsFvDS+oRf| zGD6i`i-JO{ni?09GDzj5Y4_I>utlvqeJrr=c!sX@H0wYn<2p$>L^~5DFrU*usqD9q z(XTGCD!gLkCLk>`ksOhk95W+a6`!kbcREPrlua;*#>{J|N1<6CJ`4|yF!+iwcWo8D z&ff%zfeew`3zU=rPJor&!11hQSL`?@-;Pw0%WNvy)!s|S%&BN5b?H%a4!M|Tu|DbQ{{V1!O$=;5ndRTD&u{%XSgaMN zn{l6fkW!P=%m&v(QaRIhRVaXOx3FQEQet zkC6Pk$@keHoz5D7-S+a5R;Wux2TdDt?-hf zgA~=|%5wWXw3``=D#>8aVQf5csEQ>?z4&1*?UFO$*-wbTz!uTlMHML;Mr)B3TAw;5 zE861Xd3D@KU5656Q%_*kL+|m!DY=a=;H|HQA)FU7qe$U?)yaq?$mjJ|Z2p}#%4$jv zypi|m{W)SYX$MStRw8RbxZ>X!ap@gxhi+uKVSTC>kH#uch^3XsZ3r44lsG^adj_D#RD zXN1q)H~WM#hoZx2YZT1Mq#b5i?rqTxYBZH|L0)tgttTe_+_ifcC*A2jYvol?2b*4Z z{4l>=4^BNhUG;=ps@2j<8pD-`pnN;Vmw9Ezoc>JSN;Pn;>eD?5;gh#`F6--EGSgb9d3V;+-D)FeN zEb&UaxBk;Kx8t9RC-(tq>PW9z<(oeo(uzPyCP^#pblb!3q-+&b$Kl({)Sk39_WuA@ zudSLL-1hK@jMYWy3zrW>iVb{f54#yljmP_b+HR75+#TN|reTb`bYoCrb$)HUhgSiT zk;9#F+ngePPx9Xh*YCJD2l*SB*3!i_Jq6F3xgQGSIzrIN{MdAxtwel%cN7*Wd}fL| zMGy=Lkb~EWZ{O1UM}IKy_uFlxmp{z@n+4311{@5rzg7)soQWb=zGl#Xc$PzMx8!3`!H$FqaJg{1N~T@y<=eRkEFfTX5G1Kc?`uPJxFf) zi8T)$U1dPu{tU4kcw^^|1gT`;2vMiIW=J{fA?+bTTU}x;>t|b#kel&Dr(kB(Pcvb8k{iF34`+&dN~sPY&uE4=ey{oou@D=rITW4iC@l`^9 z__Fq6&pWHT_uFMDW#8N8?|D!(qF%y;9t24&${MDb1U^8Vi0FT|U+zQYn)7mq_@^Y= z6Ejs^hcnv^Ue5H;h}vNUJdVseDQiHo26-J4KhcjtxqV6cUD=W@(Q$WgZ6zzxwTr5% zX_l^zO2>wgsPXnu1zhj`l2XC6MGA_G1jLwfK|f3KJLuQE~#)oioMDl>Y!{ z^!N`IUQ^9}UE>l|T~ci%P8F}0k?PzT1ai{Va=q5ait*l2vaKYDuMVnf(g%D1Lb(;Y zPu0)-gK~YRXW4I-<5^WVE+KrVb;)jvG|%q@&wg!qTl}jx0LNYm~Xw&+!mtL zN2!gZe=z`|AjJ*j(^|uIFmOSR)K5YhtwkpmFYRZ0{jBkd7OnIC6S?^h==h%J<6rI9h1ZDJr^gJGIX@<&Q_Z7kcTwrIS2e4#Wnjj*F?nk@YC)h4_KG5yB z%@PQNcQ;YSb1cgQCOpjpB6Ptu)mm2)G=H&lagp_EQNJy z01!VdmZyj`BG%vNKX2}H3$Ll$uIb%7@{sy&=8-Luf`mnAjHni;@kl5#q2Z3Gr?S)V z-A1d6@l7tiv=k{ynqD)-D8)}-QoP-oUv7Wal2Wqvmdz5+qQe#yXLpsA-J04E~cbHW(X+8MiJ@s4myj*0Igq8(qitr{k4UFzuxa{ zpoNZ=CQh2Pm7t5MEdhBCr8;6l8zQEl;)hl)ZDKpoZ8?`LgOS{=9=5L+_@;@_YPj7% zBmAh-kn+AgbCqo;j!9mvjlzv4x!ka*wg4xsB=GF90Bx)+Ud4S+ak#QeCBqE$^kI-& zqN$-wKbPZ5^k&S9rjw2eU~B$MJA zhZ5rSbjbt~Yww+CnKxIo>9CW0L^Y;VUAH0G?duE@*4j9vq;Y+ z*PA<#q|gDDG_FqD9kfrX;X_qhU?IOg>u0@PX{^9ZZ3BNNNy+o-bPCe7{*S`kCQ0D6+LU4+KJ({hR~nOV9xUeJT*9AqN6%0jUdp}f=twD)tS1t z5=u|2(u%d`K*~q}_pyScItwOwj0dhttb zL5|#NWR@_2Rhu4VEN9#9?yZv6-JD$Y1wacy9Y?7CVIr0D9#{iA!z)iTY%M^^jVqT7 zy|m@S7XAarq~q&bMLny_jay=_|~Q1!uiZn;DkUFb_F1IhIo1U6oN8 z-#0=5*mhbAC}^_E*~u%@JtPpNEBrMC0bV#_!)=>%llqPOQHz?!GF7Jv1M19kB;oGE zWwe7=T6h9-4ZhoFvc0lO^A*}hRwSu4g`rl0Lo5-?S|*Llv}qWBAgoV8wOWq8tB}Z@ zKTR~}&b1(%_+{mm8{97=dxy1yD3sIKe7S$a4K{Mcds8~ZY-?=ntiw*Rks8b1d8Pb~ zg@`U%&AR^piR7syp}p2s?4V<(qMX~xppwh0R$x%^^58wy!!cXD#6}xTV~q_6{eIkM z9HPuN5Y(yoqKr2p_wFro{XQCbsYPX%*^1?jjPlv40SJV!iA#N0S?$qXCr)`8>mm}1 zl~nkO`2){~*@tc#&K79aniu0^_{LNj9~vAewRTObbw`5Ti*r}kYbnc2LVd8lKb1A< zZ`!x`P{#7gAoGnK-HGumK|ynFE;=D)TX0J|njGoEhO3#O%pB-N2pA}0Hw-QvmDq{_ zn8+N6Ak=%0mSE!FR)WPmFi&dCm7#$dtVLc5F}Rl3{w!u!lM_C!Dph4^aWtSRpH77D~rpig~TAtkNYVF7L7D}EDHvFiRL_K6yyW!9exb)SzL5lMUAVPro_sRMVoX-nu_$?+KqG-1 zFv5npu4$y(Y-?AbuLSL5USnA%nt_^8P7AU^WTrM~Bn==6JK>R-1Jl)0~l!Wpb)Oca4J5$sM)`+QE{ph2;ZLLE%sa*|+x3x(Fc}`U< zP2}N8jLul(AOYzG%=75EmVslc*WqX2pwq^_{7mRtTS9Iv&0`A$lXqf}?W3PDC*(vS)4@^*{8m{_ zmBg(p4{jAN{9T$|nU3PB&Z+2DE1d}ix|+HASEfh$jdG?Px|UHHL{=~!1XJ#=Sk5eQ zG)quiRcmqVH|FfAKF0Us&t|fk)vNn<2$E03yIMCyF@fhWAH&tlZntS0z@!973V^f$ zG=fW1*MO-t;spS$G1l9D-*Ki{3)H@%H0n75NL3Uh&`@W`J{7}yx0=Vw8_pV%X=`gZ z#|YPQt5&vKE7mr}PwQrToVdve8&<9i0xX7`ci2&r0C&2k!i>&J+o z8DXKNv=lVSzxLZ}%V#!CX#!T&aoKG6?xKzu)fz|t0JdUQUCsvsmZ$(HBh>wpn$t-FVi2HfAYYuYSihHq#qf`jMJc`gID5@~9NA zK7M$3q>l|8j-sw-nDE7F*Cp6#Qv2~bk!zZI5^FX4z16w*n_60%hJAIWlCHWs=R58)(C3%u+d19%u;<{M5{ga5_+~(V>QA;x1BlYOXsbXj zN|wtdD^W`E&a~%(i=%O++N^=J`nc*G{hsc4(RMS*uB!wq3P!aBI>@3k;r{?v3{gVQ zBoZ^nQr)BNxndtOkO=x!!(?Wi!!~9xXvZp4@TD`aiRbLWvx3Ztn^27Sf5#brF|9VQ zQ4ND7ndQ}P35#X;4Xt}M+A9~V%N!=m%8ESpNX+ zkGC!9(-e{!ge#?KCXr8PI^t+fq-TgZVciFU#VHvlklu%BX0F3tmSwLaR)r&R9W-w< z3c&=*e3bdJ$BcqW>K)`#iC?HaI(28lwHc4oh8;-)CY>Rv=}53Og&5T}o;= z{g_syw59%~RqfdRWQ%=;I89W7Fin^YHXbmVLQWAW}XIx}l5LM-Y^^WsM; z{+{d#&Y-?W(sAnijkNab(w@H0buS>>YIv@;9VJWK8SK8^TYlY{^)yGkHP9@c?Dl48 zAgChyyokdTdrI6}G}h%{SYeuC^1n?2Lcv%G4o>V?XbJ^=`9Qwi;Z}{CYc<(4{ z;A>OajV;mlm`559=KlaJ$L*|s-GuKLAbDiIkJ#Bq?c0X1hvIx@gokenvL1xOM_F=PYHL9rI`dZDc(rlRz6J(adreTUZ+`I23c&bUXjWR{^-=oP@INjui9u% z0%jKdIUz+Zv{71`C~aDJ@YDhKWrS!{*+s3l7PhrZGYx#On^E?Y+=r3uc?`8t?f{D+ zHpvnN1d)+}(>F3(HN<^F`MF&@MsTD$vK8Q!rE(TuJUIQQ40#=cG}=p-b?{Yf zPPRP+D@wX+tJ{XXREt*?wR)<5sU%KSCie}Oa&p9s^(N6IiYGD9>S9>1sj1A;gCWf2 zOjhU#C|Ls}l&JpzKk(&-`$~l?Yn}`82&<}D)0fv>xm#VbonVUXYu6!IAlTnD_5LN) zB1YH@Tf2v2XrbcHQO2jCQ9?Wc9>e=E>`yeMl29YNh|wf^kVlB2uR3wWWEE$g-Ff8D zvOcC-mi2-ilrCQ1ved3x04kTEv!!|Ej05lgoYd>&!hqy60;e%T z05mo8<%cdT<(fe){0ibG)~*SycxC~iN-uW z4p7%De@3ZGVaF1tyInfkJ1H*DR;=?aDWaO37HjLwwrs~wdeeJBP)3mZShAG zvqFZolMIfTWVVvPTe$xKaLh}w$S@*+ zA7Re5@bkp@p6BL%Vkait{l0YJ`n+)AWo^a#+>CMy)Go#NmZY19zSZ#C&$GJ1mmc3N_Obd1ce=_$_uG_22um4CnrOiHzS@MhR)vRN4jT_MXg{3?a()+K6cBgxczNY4Q!n{ju!r=tr^8Pj_$mI}LWa__1DE+W!E| z*hyh&`72eCotdP=fFlOpOQgpplX9aYf}g8+q-Qnop(2uIq|l z5y`5o^`(KY$4*f+*WgPLUi^Q>kSDs>_8STS^#0ZQhjVx#vF@c4PFGZOs?pf~5cEEn z=|j{xaRgSU9wptsNOp^9X1?tiO|`U+y=z8(q)HV2XG{@YQW~t0M${k;1PWuFcRwFo zmK4;>u++zPd$LxFmd$s%Q|`?SYYlp8mTWo!5Ogk?jeWeX4}QH0&$=LD*Fr0&jTWWQ z$8dmnvo?@D=bs#Tp6m3|=b$WJ>esB&X#(mg?aAlIQ|aN!PqUcIFMM;yC)?SpXM=J5 z>&GRyr?i~2b1ae=CyK>}vtHJ=SmtESa6AX) zyEc4t^ySAG3*V-el1yVeU4`WU1jltJ5Px<^)oJXh^21Hn#-AS0oGiZ|{uH+4F_Bwm zq}WADIGyB@>LsIF^1m$+QV649;{>v{M^Y?%w|~2dwC+Md8tSV?@oGQ2QJ!2$$arF( za_kP?u$DHTX?QLrG%B)0$_MW&NWC(7bn|n>3K52p{Bg!0S&p7tdOH?g!XdW>+7fH* zJ)BpRPp*!?yb$6uX2J|lyOt4zB##OKGJasdn;>(GX;dwK{T>b zk|9P~e*%P6K0!b{X`OKX-^Tog?I|MGe35_gEvlH z(l(WgbtzQk@K zD*;+&Xe&WloI*>esZzA>4&UVJ#%ZaWHkzJ-wMi{|21NWzH+XFsJ*X?U^4d1bDIb5_ z!>bm*o_P>U9@OBiQAC>oZFql zB8A(wsog~gM_|LkqvhV7Ls9$jRR+&svYD53-t6ndIxk6&I_SAwM0lKgW5; zPsa#kT>e@|HARY49z^5E)cSQ2^Sb*s__eO*u}ajNgp2V zvjsYP2_%vk5k9~OQlS{t6<{I*xtMB&m{RO#M=_1{;1p+cta%TB9JxXK=f z;u`*8Ys)33SZ}j`?hd`!Pa1wb9kiw+lib=&TF1PKUfb5#>a`HOs}mIky#2WH2U2Zc zuzE#rQt##bqEV!IG;&Hu+nL0B!S!|tqP>p=#{6$P}EnEJZXYQ@z>AG6%%4!1-B}pqM@>fjO^}5 z6ml6NSrK(cTT#D}U_97h;Pm0{Zp1F>2lY6sktl8>_t3xJPiKZ3PR#nZ^5LgDTkPs>)5NsE6~_FMRKK2>5}VeQQq2Ykf|JWmzru__p_ODM&h0@d#N+1Hyw0Hs1l= zw=2&dG2+qNF-;`(q10|Qv6YA^GC>iF!-a5vkHHf-`W~fPeL}WTp)BX=R)B{`W96om zC&(TZ@WdU{=`{1n^APS9I{AYW+mErB;;~=gUzBIH5YU}|$XQm2WY_X-TvE*v#-_>` zzc3X_@!&`s1y6Fly0e$R`%Vx(e9Zx+eQ-&~jRuurpO~S~6tVp&@0XlMwVQe8bEO1# z5r&YT!n)Z&Bv*+Z+*A}0O{w8rt5)nopqYyYpnTSi#pkY-Fr5^LpNwt_I=2{Rm^2b1LcZVw4lh3I_E%ftlc{!ySBNbk8-l# z>{(r18Lt*q1ZN|aWgrz4(zF1I61=fq-Ph;*l8uP>{{Sicfo8mRtI~&8w&j+0az#QF zYYNcQvs#I;By*U=VIDsc85=!XSlsPamkQf%+h`>yPPB(WulnlcSH$O2kft-6rJr){ zR!t7^yY52OrJ;^lM8J+Y#sY^vM2{X=uyOB=Z)|m<)}NZ%zSoOYr#-!PnrW$6kHRl@ zdaJRAVFmiIAw+Zd@~5h|j#Sp}9oHR{pj~azh@;KI%HdodMu|qu)|sh1ai!V&4&wUJ zX4`j3T4!XACwpiE#U`coqXrKdRjnCFZdIWm&nF)Fe^A!;&C0lcDLWchqqBQw#_H`Y z*hb9uG3D_#=MAY=xx6B&fn!CW5j$#>FWl$aR*Y(xuC3=fe=R^)T~SdO8Z4%J--%RI@D$ zUm)%2Nv)1pqLHDkYi~Nxs?j%`W8QCU#rB{X9azo0osJ`My2$dwD5~`m&NmK40BHmx zS)iq9&ohc^ZrpzBljSy;V1nstk`$A0o)?a}(OPB};F|hNHg#@zo!#=wTy-P2x>~wA z>?}iG#PH1wQ&C$8mHz+=NfP8z)U^{Fs~iLM$muM0)!Zd$Y@Ez`n%cj;ok`)C@ELhy zDY;+XZOI+x=!WaivH>2m!BUzRiXJ$QMPG}9O@{n*Q(bdrFjt|xoVt}OAIxx z8c7rrhHoV-$_N&MxZ@QO%8?99achc z`6WQfCD*dOc?4!z?G4=xxrjs1PZ(9*B5tF)dH)}y6k zPolW-$t^)%YL}@+Ygb_v(R1e;sj)j@agaJ+>B7=6EUPpjxvR_w&b1npua zDebyZEBMgNQNJWGK1Gy)m$&7k!EVrA3f|N2K0x&7-2OUYrbzBo+O0MHgv(@dO*`>+0`-)b!QSx3p0KY3m zsoR?KrpjA1sswaJk_z+27z~2_d0yvtz3ol%_p2m57F`Hw(U9o_sETs+d_bCup<$+14=9zAU; zHKvF`Zk<;YX4%}bBlCDt-Jd2@c{1t&*3YqQtzxgd%!$>8D(P)5S-vBxv=ubvL6}+s zagK|*_s^X$Z1GBAig~p=Q>0ZgQ4k}I4Gl>o8k(A6VPlm^M`dGcJ!rSPhKAKTLswq5 zrjD@3Zp5O+Nh51}B(EYQiyKBJW;jv*02fi1?Xg_N1(F|;w#k^uuUj043ULIA@XN-S zK8EQ%w6_=4k8rvgqKq01HSzfAP!Hx&tH2SSDwH)gsZTT8+*#Rgt;cRzEZWwg)_A<8 zb*Zha(aM!gcY%t-;sGpCNdw5)++RgJ0ytnquv0(*KNWb^wXY6->{VIV-PugiPdmxE zK5tygic?6gRLZ6**4Z@neW?#e@L-Am}x82p{S!8Nj|$}UO8j7n(G)2hsD+w zo=l;`bw#*di%4}UDJ=9A=OM^Gc~lAy46&!$w)wB7)mBjJL7gbEdZZap`m3KlLltAn z`M)rcxb)i2Kc~{#*4CDW>dhTZc`j%faG&E4zF2nx-YXcVl041{R zu#4E;q`ng!aj#Of0Mr3Z1fEs&pFC0j08-v}IhMg=irZ^3QaPXDa!=zjX^;WO&@~Ep zV%G%?maeUxO=-mM73ybm$F5ac6FqkSx1pwD%HNhY`6_pgg2%4H;q& z%76%J656!+oL+dO5Z%%4b#XyXrCk+@Ly*qu(L zGkcILBbi_X$Qhq5x`L8 zscFNK)4)=P5t}_$vf6Gpcez&2XL+f@w{()zgHkL|s`RC&3d;pEm{Lq+m1SuFe?WS5 zFSiJcP<*IMTAecboaUq-Nn#qgic_6&4t=|6yEERK!!7%PSiLAJq#ubu)0nM%yzrZG zpO5r_t!_J`_J2NJ|%(ePb6_CwmehI1EgEs+V4_H zaXq%)ssWWDjZ9%p7b!kEpH7qo^R8eMj(xwktPy8|+TQbdXJ+WhB#s=g_2!=e=c)Y} zQ;8Uuj(YW_Cy4w*4AI4_DS1Z?lYMc+HER$yw{=;qS7w$;nluw6legHdD=@%|C~0Hq z?;EL%v(Qp@jFHGRZlIxInE;W@Vs*Tzpto-9v9O5=KkbrH#Fi@RO1%jqQ30~205Mv% z@`YUzQQ2-Mt;b}sQpN3tuEd)vR~_b=TSXx((Vc56He>Q*EujWn0{QdCF>m{U z+*g)UrPf-Sox<|$4ZWtuq&C(^fLN@`WM+?DAtN!!#zn_$E=OBif2Y=tfo>TU!sK+W zLx|JITae(nVK5s&z>?KMe>&*-f{uRt=Z$XWT#>&brfFX>>!~f zb03t|i>9hMxfN(s7b8{@U0h}F^S!KmvP*8 z0eBT-SPdgm#435H6a~D^O)H4q-^-i*#2?f49I9Eh;p4EisYfE_cuSa4DFZ~Y`AH)J zr?-!TH-$EjE6Zn9pd%gZHy?Zeh5+A1mb z;P!>T+^1_;?`3)hep;31y<$%y(;C!FaW`}1PI|&V_1#N%ESqlKx9xif_+;EBXr*&rP}{vD z;l-qC_+!;$?VqMAx5T&GzVqB2)W=)Jv)QbWK^ebX?%Kch{uj&7QP3?bW3zt z)c*ixpEmrXa>^K?sm^U}HTno)1q$6q<9tJp!1jxxf+Ti~D>rg*dd~L_`MX@LE<4v_ z*}ygb0Ba0VN=*pT&2e=3P?J?a)dPUb8s5(B-q_m6{+IOMx_gFpI%&C0EKq5vV9K`E z$Tflhqd83_vaJp`oBN-Yb^7>d>i+=v;o#IM#_*#4e;a+*-4X1j+(}-;yLR#~BNO!` zb>`66_T|j&CD+v3_LZwplB`v)5~{_&_o&I z+EPBi7`L*xcHevYrY_W5{VmwwLfQ3R07(A;RX`rnj69AfReo%bX>Rtn;xFwth;L_> zb#&%@pNj1^v^}VrU@KGOT1`}@B9W2-S>%%$J^G5t*`FyK6K?(2b8qnugmR#6TA0l8 z04QmZOwS>U8D#IlaV)mm2V?EGgaM-R;u&X3fKHUNiakqS3hL*?SA>Ox{_c_qB!iHD zZai8mb>MGvk9qe#N77j&(C~K^&C326@6Z%srp7wVmVt0MwrH zNtF4Riwd767^dC6mG_T(qTGE%?iSp(xa&wDuz~>?{nVVH=ni^88JhFN9*_Gc{@yk> z?ADug@?=))#arLwyA9_R*Waf&rya?i%IM>N7b@6p*y}9+09n4M?h`A)c^oj- zx?r)X^VikXH2(mmhP0+t#^TreYWgj{qg;tP(cq1SBjDX6BMamW#0o@1EhiyKd)J&mxmTbFOz&j_~lSLPOCqP#`BMJvvp zAUe3uMOvd9EEKofHA!f4_^;0iYW3iLH@9lU)r75PNvk)xu8hjd_R10Ckxl~ji$Bx$ z=hWMDh|I+5>nLj1Gfn{Up{;35@w`~Ko9aal?-2?GRUm$u96$_d(Ew7Y<0D#%;;9EB zx30ZauWb1Z4Ww6RskYEXvx53hPuR628@@ZeilkG^G;JAXr*^Gpc<`#8Wf|_DYqYvX zOIvs(vJn1TylE7PEk$9TG73oE>Xy~`;~>HtD%m;-fdm1!lDGTX*_lM^M^7Y zc4AZbOlZl2W!wJ%NxPGNaQ0Sq*4AxJQ~VLokx@mVAb4=DGd zL>df}InIhnK(^z{TUWy$FTP*?<9Vmo@BmFpV*9W|J(LB~{rlA3B(v+Ql0HTh8G zurPq0!?#~g_J`A6-0bp~7O^CoxLO&)@vj{o3-;&F9}j&=`sLoAQDT#8x}D(dmU^YD zdPM=q$bagv@vSlfl?NQ{B|jO+}O%)!M0w}hg`c}pNUoUzlNCD#7(eoy&V zX~+02oe#vH4QMx-rH|x&hPO{H^M77CwXAGy#BH0K{zU|qUE`9ybgxcu0?Q*IE!UNH znEET)y`v82zb(%3-Pdp(cB<2SyiKdptxYh-SBPmDoD)<{dTH++_&>Pr@cMysw04u* z>>p1pu3;^D>j9R3%dC!KZBpC-OCW_JjST=|7uAi!;{O1IemeNp_V1l?jjUfS^L>gy zvwV~CMM@X9I!$#tQ$-%1gmLd;O(zP~N?XWBSxXob*jYq)M#Xnu)E?*VOGvwWXOH?e z#I5MIwKK-Ekl+3>a!*oMr3o!e$Rt$baoT@JyDPQ#8?No&CH}kJQY|FhcM%Mw1t>mJ z-B&~lnN^HbrAlfe7VbI6_+Jp)N&f(3{BgnlIiGE-k{NDrUL&cY$!|1q_)8k!FkQU> zp+H{0r2O#YpL5e7u!Vl%UAS($?&W67yl$8KjB0)htEnV_X%xzg6~N#L1m#TeeYW<` zYwULhU6*RH+U0taCAFk5T#!vcEE7^!h*cm^ju^JYG&=ELY0D*DCdFg$rNpXSl{Xt< z;Rp{7+MGKb-TM;xd&yd@Iii6XWO)c+7O5e=yE-wc+%vr&*(M(tr-L@c34d(~CAo z3`^EvK4(-GpjDKJi7Vp7o{;|lQ!$X92&W@W+x(x#Db@T94RdC39CKHuHCtHf?-s4- zDNl8^Ui{q8n88j)`B$+AKY`?QU~aFYjIxoXK3ot$QbSfpg6O&R?ngf^`7dj) z<8>FE?HP?bsrAGL(ehRNsH|$xtWSA-vsj#y@^&7U!TG_{t zzCF~)$`x{Oa0rsmaSN(-O8}Y`R8@1LC{gGD(48O}15z_M^l2X2($Y(pn4nQo%*27_ zbvAwiwa+RZ1!- z@FbOHk-Tgdu|jU|K2+P0L|A26wB`veWAv+qsH0K1)DMMfEH~R-!MNo~fy+)Lx` zI$#`q#;bBGGAGJ16+~2E#N_#~G_5J0k?=UTfo>r#s3auRl7I>VC`D;p>B70;@5ubO zM}DrycwcK4y$xG0X2n+*H#Lc266uuE>q3?xq|^70^O05;u@>86g(%tY5R zJ!%0F#=J3f-Jt%3BPm!JSf zPqfgC%?2P@S?(7t74G#qCY2;X9#-+wg0q^Ni8=K_Rqz@ubE(Rh zv6FL_;^fD-vNWXnwDAB6SKLiK_$?iJ=<83)rCL(g0h=4UY>Jpr$_xIOLW%p<4BZ7Behf)o)?t3*vy6mM~bZ0mVF! zy4z?uqneRkIGJg16~azyLzfS;E?AJ**hpzFvr;{kugZ|z$G>v)rW5V7?_nZHp+=3q zHf z9a_H1W)HajnPD#O7pLi`N|g8F`Ky2GHRP7fJF;8YS*coCEWA<&K&X!tl11U|wUjuK zS0Xs@0|w7f=hJT{lxX^T0)X79!j$DqRH-FKtp5PR47nGxdi*m;mBbo-*PRNU^_dp_ z)~yRV>a-!A3q}Yi>zZ3On0b#W5;H06I+eCF#T10;lI`JbLV}4KP&CO-WGETeATb|t zCb5PkZI$Q^Pp#-bDEV{baGxuz_XJ8W%U%jYUA1_sOD%Zs-LpW)cU`n(uMF@dH-p{` zQXwlGgXz%N%@U;37}iFW3g$nT%A=MDbG$GPd*V45mfnpYtS6Hh;z99oMlAybFp-9bY(dVTRRElu`k}wG~y}iZM(ni*TN755qOa`JUu1w7jIu8NE6Z=j{sMqUk zZ}|r91gYnu)bafSwdywZy9@Bwp`*DXTxd4;_E+lD^MZ>jEQS1J3Z(TO#>VDrq}#1w z>$yqgk>BBoBRqdDsYM*iX{WmZd3|GJZnu}W326gPu>eM?C3(m&s1j*%Yw2Aeoa#Zv zSBLDZ&B*o?qM;_cZtzdE+v_HcHrHuWmv?JTR%Di?dp^zE7a*CI7L-9+7xQOe{jE34 zAqBj0EXyspkjE2%6v-e(cdm5FTnZTXQ7#Yu{cQ;Ock6Dx}NXoUP0#inOb+Zi%SNK;C?j6MiwYy7g6T1mIUbYCD zs0j7&CqLy399EuB|xK|LKKwD+T!Em`)4diwg>y7HpAooT=2TK565 z8_H7);sB}K_i)mr5P|(Y1o=i)owS7usg|nxO?_%;!#Zb&tSx1YOxKPc@x^IM0bKH5 z!^C8G9IdbUl;}Sh86Ws!FIxW0?`rhZOtl4VgD9K%pOZ9g72T(_BbE^q*Jl|+{KiDj zpz2d8s=;rbp+W2(qvf4FxMDStRi0t$2P5zD@x`X*-o038)Toi9D^`n1?UOD0+da0< z)Rb@8{HF>j>*`f@MIFH?anuB~H)``SD0TWN$wdaAv=f7O5z4B$DQ0NJQ@58n3k_hPNawp%ya)76BbEqm>H8Q>9362i5VEqNBlx?}cX ziXf|j=su^TytRdur(UkGYo7}9C-ln`+0{_#6d+~xdE?f0JDn!ycQ&e36vpAy%RUdZ z^%j+sjSR(|+7oIuo4N92U_l+alx^Ua);_PMvDf`ZqwV%$EDU4>xvSQnel!iG8{DT~ zM{A|Bv~MIeWRp#9HT-LS+SnGUL1{nziF`H=Q@?cs>(v#!>t!^8;;g!TC--xvUdmJ{ z<${r9)S7A+Q3jmy#&=5g(mjN_8KQZ8k+C*scWK-#8!2k)&oJPp3cO9%K`aOP1>~ zWeS8)k(Z{t4JlA4C=EdH#D^&4+iUwM_E$eH&Di#`iEUY+$!FcyOqLo8Qbr@OJQCZe z1kDU+9b>>?anqZA*%h_BbQv_$(u!J&+J#P%Xfp5v&kfv7B-$1b3Kyw9BT4q*wN1IZ zTE~d@1U6)=U`DARkilX~kd`Sds@~(U%dhc~pInZcys{}PMH#751%27m?Zc2QL}VZ&`Jls5cpN_gd3;(@E%+1T<8 z=Nj1f#c4}h*~Ml`=~73M2qB17xMGX);abcTIxJ+5QRUp|w>wy2u(#Z8N95|LuOB-3 zlU!2mms3x9b7MOGa2)(c`BM^B(m%(sW+>rH6%i@ksT(5;H50|fxhqKv%QdRy4kd|} zDWC{*?gkx4jTPWS_}aPG$ocd8v1Qek8-pC4nEZS^$M_sWC4_bx&2QnyLI#4=;(t2y zOwU!Jr7e>rX3900rjBMS;tR|CUY$GglPpY-x#a>QMmGSSu8+%-tw$&C8-7YfS-y5UyTx0Xon!Wn;-br%ysP_akdhDykwq@G8}uVK;dQ;4BRnHDK( z6%+yLkN);mt!e7y2P`$WK+78yEb$2lt!hA_;h&Bv{DYA0_|3f@qMseVv7dWyW>;}7 z+HlQIf5V#Ed#f!8M6=qGs>2LEB#9kc$y5{7=FexgZc$xa++D_z!5W<)8Z}rc861EF zu{8%O4D!W(^>w?!b!TU1x5;pB*^#B|EG9ogG;9k38&j&Lns93J!wV^5wMh9kwQtz1 zxSCC^9ge|dxemI+*piyi*i}eOl_8~G%#%rABC(Wxxx+A#71g}cHrH@fZXg zQEHPyPs2))N_k?V`gOuv$GO`quWdOp2a}335(+Mw0;ooiO4lkAjUz{X=8|)`k~Z8^ zuW}XJTB%iS3)5U!(g5(sUfj!OOO?@T8jP~ZpKK>^-BaDg75goDQpVRb8Zo>`hW- zPdOD=s|hV0XrWn}G7Jvd#%#J&(@^86dnrakmUw2{bc?AXsay9RQD>iZv~k=TzE)xl2u!(xh?)eR6v1| zgl-=?uqrA|GBwVlG0L2=dWClgUQ+pnkW-CwBD^Xxpvs&9&Vvzl^^$C?T_!t;y=_e+ z{{V1LVoCKAOIok99}_- zHC`Y9F`Sy$T+>TW_og5W|AMpa-K|k6M#<1V%nuLZ0_id7pYZ<(nMKYX07;HOJ!V=0PLe1Eamw=W{YKl9Sd)cV*WBVeRKK&-?{qir$*P78 zWU;=(Q@EP$zDX$Uwi_!BioWs{c!`lb21l$W`8BrGpZNmIZ@VKbaz!X!sniJ$nm!~7 zt3#v#uZgI~jGooocTL85yGm$e*rWznZelV#MMDMY>UE%*<3m4yzSeB3AWj_A#qWW z8pcCgHz81R^2}7?r}`G*vRoa@dW}ul8Id4C7?0F#;!+4Qlp*CNxwRLDB56+h9z#W~ z)tM>lsm-^Ncq64&pS?7{nGE)}A8ETaCn2OkAy~V6m_90I&W~-iw?T)^%P3KqCV)_Y zI4C@_{{T-sGiDO&b_;m|n@Fwtl#Y!arX;H?(xinT9R4c!3~IAVkZYu|b6=>tMPjow z742Tq&vMb0g1XCLu-7;4{`%DW{ik5l1}Ya?~xNQJ0x4e%gDnvzKYJ zOAnZtEXYt;D@d-RnIsTNQN)Vm0i`jDr#a-8IR%b0t=fD`Q%$vrR7<&%O=3kzMHjzb z&c|CEkzPv`)z+9P7+-G;fia!g*>;$A)!gr6-HrT2nnnzYNvI8^kVP1R*`EQK%gWnw z-}f!)_Km9Rw-af&P|DIClZ8i8@vA7z$OT|i;Zs^+enrOShh=AZQ*6LSX>NZCku^StXp-*D=Q%H&#Op8Osk(P?sbT zl>jO@)K`n!*K5!HM&o&k_R8YwWLLLFxFr!F{%mo26*Zj0Yhra*fTlCn`3srN%i_>~ z_dVQ5Hog}$H0r!lm9N}KDc&njN@-+Bi@K{qv6l9lGEREZf8+ZsTPeSN#y*TS61mB$ zbNElFP!K7dX@lSrOK!xmDWRXKft(}*={R9D9v+#ANzjv z+S(Q*T|H0E*XwS$o#IMb4T#v;j;TZC7qjj-WFNjQov%>57W9XQnr&(G{HRPTuLXEAKnveC9Y_Ibf7C6f~WWPuAZBS zB>(_3q%7fDnQ3}A14l_Sr?EwS;x z#V>D2kbF~5MHb$Yy%}3+xQ@lE=5NQC)ta@+b#BQ1VVw|2AaFn>KKaYW~F=uP-%MI#HkGJeEw+o2rtzo&jWLlihS~*vuY5xF7w1*pGd_ho6}fu&Va@;jm;R^L}MHNg|4$8r$cqk<%vNt(}$Jp zKbt+P4S*VP__cM^fMk}_oIJ`17(H%=<#`lBOPFj$X_<*Ypd4rk^%F`c;4$UbUAwc- zaq|0R*5=WU0NyoKxw{4x5d-P1D^Y{frzW>y1v(p^W3t&=9^SKEQ*&Q&u>oX7lKk4O zhNot0>m6{#=SuLEA8MR}3gY1|ZA_POSwn7$OS{6!4KtvQRCQ-+{^2AZcw!xnYg@r> zx7}ad?h{BBIFfkgm?l+~;*lMrpySs8X~Q~WP`ko8#B{$7?;fMEib&&n*2n#=87U-l zJ<78~2jD^EvUo@qQl8+-H>m3)XWU)9@`-KkUOH7sCgU?vMq27RX;IIJHOA|5><;op zduyv$=Y*&wwOgmAmD1TFvx7oGWf>gurYNyP$>>c4+OU;utac%&Yil<#G;GqvD$6zP z9?N4=xus;O?3y_?_}MNM zN|W;PDyXTZNGAZ7V#YCjh&Hn+<*T8FbX(*1pnsV&UH+H+o06NQ>TZq;W?Iwpv1 zT&eq{WSk=)#s*8tv{~PUTNHR>13gyoGM;%l$|}BKQ;ryud);;+A-$3riPRO6?&hqn z0CYu?+@j1+5iXO$i_Df!mo-)4t>eAsHkqQDOS;$Q)!iYMvW0{rZn%TVEgNcqk|^gu zSyw&t(#P5J$s~j2>=i{cxV5E8v<%#fK@4?eg?wg~6>FOKtCH$SRmeH}y3s+iTi98f zea_!*cvui=1cIZ8sVMdPylaefy~lC8ZvOz(HY>f}8`U9&ZmrZ0U?wH4Y0R2(#Nn5J zZmhC$3qK}qwU*w?S9%-XAZ)J6+@@Klc&XjFX2QzRyC1oIKW9)!^w{JBZjWn*bOYj! zegppi!LOGiPaIk3-bJpR`S-hxvDksqytOT@j-oUxxiu!W)Hu^mJUFZI_<}n2>QniP zk2I7KA+bkYueK~lAevNbZK04#M75-E6C!!!oRiXBcM}t)>Gny0ZVvRJ9t$ALJpTMY zYuLpRXS9pCtdY`;RU(m?8sy0X^*R1AUv)9ub$`0E$Nh3njf2x<_p%&Sm?@Pn8> z8ROhn>!#@~kM!O8)(y*T7Nz=&@fEH`C>VTH;toL6Qyk5(*>V0sQnjnxJ6(3ryJqHw zw0aIdM$KzpX$HQf{l=aOX+FL(#getCMA9%h7{Tk(;I+Kl=4FEDq((3tw9`0Y#FdId zKqvRthGU*Qj`se`f47czuz{PZOno>Y5`#nNdEnBl03_&j2BM_pLp7tVv8JN&((86G zm?u`fx)5BFyf+z;UWTG<7hOn-t{y1NCBZod1a%7T;?j2cVJyhitq?HP#-^nWdhlu&+vjKp?Ep>yjGs*plRp_!7Kc z)+d;&$ry>xv;N+mwHDA51;0{u0=lHBL=^F$`-k6%_jcDZ!Y(gSVPI%FLsNUZ;l{c_dj>Rjt)Xg<{ z-tXpX>#eGGpztC%^_E4Zn!Ci{3FRt`>>Ww*>RguB5^0_|NCAPUkhm&&o&bI4k){IB zZI-dL7Z(GqE@c|s4IE@L&Fe~^QxWf`CMHQYi=;Z$*Yf*%`J|#^uT?8trFP;bB)0^I z`W5;0)nI=T%zfak5L`%4P#}@)B%N5vXVy?d9u5UT0FP4YKW7@`F>gJ+o!mChZ5_Vg z&`F_?E{2U{$=HI+5el>a=YX!!&?J|#`vC#f*qendKLbhZ|Bsa@Ip zsadN6!ZOoI8$hhC2ig>vw)b1jjr_C;qBwuBh#k{kO^cPoh z-)%B&8@xI;206&Y3#{|>(3RqRcwx(3zT0iyVBWS%rsBmzi7Z&ewN>T|Rh$IsU9F_o zn&q^-UZX~2k}HVRK!Io(%c3hLfttpxMr|z20In-H9m?NtRkqx=y(p5bQOjj4i!6oy z71HkN?&s3dvg$=7AZDOCFBtg0f6KLJlW;y~V{Zzzxiyt9tG^Af{yNjTy6J1# z)QbrKiKLR;ilLv`Qqit^cJ7FFE2P`E`!tGBLl;850gdEskJM1rje$y%ODcyUE1*k{hxxqPtJRjqiTArHrvCu# zw$AN$N>NCn7Lv?$uSqc2P&L(~4c?w4~ZshbPnQtubJ=%|0~ZuJCI7S|W6L83Kzm{v4W!%8$7mWM$OJz!@-aYlpX--~OtIR5}Eo^2^tYhLwA zdfqjwiv5>Zf>?>B+TQjqtny7Sy3jPfSX)*1pzvwxRHPcf}|!y z_$^nSG7)#TXc-a>d!+W_QU^^TRW$(S8bWoN)%bd=KscE#56d3}wcS)ZjlU(8hcrKIPJU6;ImmbLU&`;+b#)@>%HG7pD3dbC41t$ib+RXRnwnvPhT z*K+>=jyX2!?QT2G;=gX)ugKBrbe{?@Am6kowhUSktCAjHGB-+AOOq)6b>Go^7Y$KpuNp` zXZ=>scDl9P+|{9!TiP<@Xk1yW#fJ|=Gn(de7|gaG+Q&ZMTaEcI&eB+(!`Sw#PiK^G z?0a#CwCNLVx0Jp4BV4gik>qy^lh%gY>sM~=@afvSc!-mWDYt=Z!lhC-40sJh*Mid_ zjO_ma+Rt)s^8Ci}-RSou(?n@J+H?3zH1QB~;h{w+dEvI(`%2a6b&IW%x6hovn47Y# z?Y|GuaY{T|y?LT}HFhjk4eESr_9ZNH&PJ-lzZ2N~6FqjKIkw_j8L0CLujKQFJFb!QjX?%a|S4aA6V z_@0zg%Ml;^rEzRn`4t{Ku|+rbmEAu#)U$%^cB8;t-Pyr7{{ZSOx?Ld^^EkI^Kd|fX z6fy5-sZR8htZ5Y=kSgtL%>hP|Nk6B-!lIddq`_rJZr|o8ZvOzdJ2>TYYL6@`mGxS5 z)MhxyZd?yx0QuuXW&NMs8*%+YSd!|s)GxZNq}S51Eu2M~w51DsIfsycWgI}-v0icV zl#=U&&`57b$2hL1XKJgtl2|qyaboLKoGA(I)=*V*a_3NSws2~{3VeB7YIGbc zh0Vz{(neY>M-1BhyUt^=D!;oujioJ4>Y7-@gWFFyvGoJ2UjG1d-hIr!HM(ElF4;FX znk}}>gO{jC@wft<0dE|7k8Rm~JnV!UUe~tlt-IUEDj>9s%E_k13`gJj&LjGxVUEk@d`I8cd!0259*eb~@7 zd!L-I)YuLEJ!cG>NYZUJcsB!?yT)Q)dA2o#I(kvZ0x2r1Wxe7sR374*`rqm8oy

    @0k<$Nh~r- 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�}hj>JAIT4`1= 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�GYGC-F|$D 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 z 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

    jHmbm=sv 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 diff --git a/laravel/tests/storage/logs/.gitignore b/laravel/tests/storage/logs/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/laravel/tests/storage/sessions/.gitignore b/laravel/tests/storage/sessions/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/laravel/tests/storage/views/.gitignore b/laravel/tests/storage/views/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/laravel/uri.php b/laravel/uri.php deleted file mode 100644 index 3e89ea4b..00000000 --- a/laravel/uri.php +++ /dev/null @@ -1,105 +0,0 @@ - - * // Get the first segment of the request URI - * $segment = URI::segment(1); - * - * // Get the second segment of the URI, or return a default value - * $segment = URI::segment(2, 'Taylor'); - * - * - * @param int $index - * @param mixed $default - * @return string - */ - public static function segment($index, $default = null) - { - static::current(); - - return array_get(static::$segments, $index - 1, $default); - } - - /** - * Set the URI segments for the request. - * - * @param string $uri - * @return void - */ - protected static function segments($uri) - { - $segments = explode('/', trim($uri, '/')); - - static::$segments = array_diff($segments, array('')); - } - -} \ No newline at end of file diff --git a/laravel/url.php b/laravel/url.php deleted file mode 100644 index b8fb1f46..00000000 --- a/laravel/url.php +++ /dev/null @@ -1,361 +0,0 @@ -getRootUrl(); - } - - return static::$base = $base; - } - - /** - * Generate an application URL. - * - * - * // Create a URL to a location within the application - * $url = URL::to('user/profile'); - * - * // Create a HTTPS URL to a location within the application - * $url = URL::to('user/profile', true); - * - * - * @param string $url - * @param bool $https - * @param bool $asset - * @param bool $locale - * @return string - */ - public static function to($url = '', $https = null, $asset = false, $locale = true) - { - // If the given URL is already valid or begins with a hash, we'll just return - // the URL unchanged since it is already well formed. Otherwise we will add - // the base URL of the application and return the full URL. - if (static::valid($url) or starts_with($url, '#')) - { - return $url; - } - - // Unless $https is specified (true or false), we maintain the current request - // security for any new links generated. So https for all secure links. - if (is_null($https)) $https = Request::secure(); - - $root = static::base(); - - if ( ! $asset) - { - $root .= '/'.Config::get('application.index'); - } - - $languages = Config::get('application.languages'); - - if ( ! $asset and $locale and count($languages) > 0) - { - if (in_array($default = Config::get('application.language'), $languages)) - { - $root = rtrim($root, '/').'/'.$default; - } - } - - // Since SSL is not often used while developing the application, we allow the - // developer to disable SSL on all framework generated links to make it more - // convenient to work with the site while developing locally. - if ($https and Config::get('application.ssl')) - { - $root = preg_replace('~http://~', 'https://', $root, 1); - } - else - { - $root = preg_replace('~https://~', 'http://', $root, 1); - } - - return rtrim($root, '/').'/'.ltrim($url, '/'); - } - - /** - * Generate an application URL with HTTPS. - * - * @param string $url - * @return string - */ - public static function to_secure($url = '') - { - return static::to($url, true); - } - - /** - * Generate a URL to a controller action. - * - * - * // Generate a URL to the "index" method of the "user" controller - * $url = URL::to_action('user@index'); - * - * // Generate a URL to http://example.com/user/profile/taylor - * $url = URL::to_action('user@profile', array('taylor')); - * - * - * @param string $action - * @param array $parameters - * @return string - */ - public static function to_action($action, $parameters = array()) - { - // This allows us to use true reverse routing to controllers, since - // URIs may be setup to handle the action that do not follow the - // typical Laravel controller URI conventions. - $route = Router::uses($action); - - if ( ! is_null($route)) - { - return static::explicit($route, $action, $parameters); - } - // If no route was found that handled the given action, we'll just - // generate the URL using the typical controller routing setup - // for URIs and turn SSL to false by default. - else - { - return static::convention($action, $parameters); - } - } - - /** - * Generate an action URL from a route definition - * - * @param array $route - * @param string $action - * @param array $parameters - * @return string - */ - protected static function explicit($route, $action, $parameters) - { - $https = array_get(current($route), 'https', null); - - return static::to(static::transpose(key($route), $parameters), $https); - } - - /** - * Generate an action URI by convention. - * - * @param string $action - * @param array $parameters - * @return string - */ - protected static function convention($action, $parameters) - { - list($bundle, $action) = Bundle::parse($action); - - $bundle = Bundle::get($bundle); - - // If a bundle exists for the action, we will attempt to use its "handles" - // clause as the root of the generated URL, as the bundle can only handle - // URIs that begin with that string and no others. - $root = $bundle['handles'] ?: ''; - - $parameters = implode('/', $parameters); - - // We'll replace both dots and @ signs in the URI since both are used - // to specify the controller and action, and by convention should be - // translated into URI slashes for the URL. - $uri = $root.'/'.str_replace(array('.', '@'), '/', $action); - - $uri = static::to(str_finish($uri, '/').$parameters); - - return trim($uri, '/'); - } - - /** - * Generate an application URL to an asset. - * - * @param string $url - * @param bool $https - * @return string - */ - public static function to_asset($url, $https = null) - { - if (static::valid($url) or static::valid('http:'.$url)) return $url; - - // If a base asset URL is defined in the configuration, use that and don't - // try and change the HTTP protocol. This allows the delivery of assets - // through a different server or third-party content delivery network. - if ($root = Config::get('application.asset_url', false)) - { - return rtrim($root, '/').'/'.ltrim($url, '/'); - } - - $url = static::to($url, $https, true); - - // Since assets are not served by Laravel, we do not need to come through - // the front controller. So, we'll remove the application index specified - // in the application config from the generated URL. - if (($index = Config::get('application.index')) !== '') - { - $url = str_replace($index.'/', '', $url); - } - - return $url; - } - - /** - * Generate a URL from a route name. - * - * - * // Create a URL to the "profile" named route - * $url = URL::to_route('profile'); - * - * // Create a URL to the "profile" named route with wildcard parameters - * $url = URL::to_route('profile', array($username)); - * - * - * @param string $name - * @param array $parameters - * @return string - */ - public static function to_route($name, $parameters = array()) - { - if (is_null($route = Routing\Router::find($name))) - { - throw new \Exception("Error creating URL for undefined route [$name]."); - } - - // To determine whether the URL should be HTTPS or not, we look for the "https" - // value on the route action array. The route has control over whether the URL - // should be generated with an HTTPS protocol string or just HTTP. - $https = array_get(current($route), 'https', null); - - $uri = trim(static::transpose(key($route), $parameters), '/'); - - return static::to($uri, $https); - } - - /** - * Get the URL to switch language, keeping the current page or not - * - * @param string $language The new language - * @param boolean $reset Whether navigation should be reset - * @return string An URL - */ - public static function to_language($language, $reset = false) - { - // Get the url to use as base - $url = $reset ? URL::home() : URL::to(URI::current()); - - // Validate the language - if (!in_array($language, Config::get('application.languages'))) - { - return $url; - } - - // Get the language we're switching from and the one we're going to - $from = '/'.Config::get('application.language').'/'; - $to = '/'.$language.'/'; - - return str_replace($from, $to, $url); - } - - /** - * Substitute the parameters in a given URI. - * - * @param string $uri - * @param array $parameters - * @return string - */ - public static function transpose($uri, $parameters) - { - // Spin through each route parameter and replace the route wildcard segment - // with the corresponding parameter passed to the method. Afterwards, we'll - // replace all of the remaining optional URI segments. - foreach ((array) $parameters as $parameter) - { - if ( ! is_null($parameter)) - { - $uri = preg_replace('/\(.+?\)/', $parameter, $uri, 1); - } - } - - // If there are any remaining optional place-holders, we'll just replace - // them with empty strings since not every optional parameter has to be - // in the array of parameters that were passed to us. - $uri = preg_replace('/\(.+?\)/', '', $uri); - - return trim($uri, '/'); - } - - /** - * Determine if the given URL is valid. - * - * @param string $url - * @return bool - */ - public static function valid($url) - { - return filter_var($url, FILTER_VALIDATE_URL) !== false; - } - -} diff --git a/laravel/validator.php b/laravel/validator.php deleted file mode 100644 index 9e15b3ee..00000000 --- a/laravel/validator.php +++ /dev/null @@ -1,1239 +0,0 @@ - &$rule) - { - $rule = (is_string($rule)) ? explode('|', $rule) : $rule; - } - - $this->rules = $rules; - $this->messages = $messages; - $this->attributes = (is_object($attributes)) ? get_object_vars($attributes) : $attributes; - } - - /** - * Create a new validator instance. - * - * @param array $attributes - * @param array $rules - * @param array $messages - * @return Validator - */ - public static function make($attributes, $rules, $messages = array()) - { - return new static($attributes, $rules, $messages); - } - - /** - * Register a custom validator. - * - * @param string $name - * @param Closure $validator - * @return void - */ - public static function register($name, $validator) - { - static::$validators[$name] = $validator; - } - - /** - * Validate the target array using the specified validation rules. - * - * @return bool - */ - public function passes() - { - return $this->valid(); - } - - /** - * Validate the target array using the specified validation rules. - * - * @return bool - */ - public function fails() - { - return $this->invalid(); - } - - /** - * Validate the target array using the specified validation rules. - * - * @return bool - */ - public function invalid() - { - return ! $this->valid(); - } - - /** - * Validate the target array using the specified validation rules. - * - * @return bool - */ - public function valid() - { - $this->errors = new Messages; - - foreach ($this->rules as $attribute => $rules) - { - foreach ($rules as $rule) $this->check($attribute, $rule); - } - - return count($this->errors->messages) == 0; - } - - /** - * Evaluate an attribute against a validation rule. - * - * @param string $attribute - * @param string $rule - * @return void - */ - protected function check($attribute, $rule) - { - list($rule, $parameters) = $this->parse($rule); - - $value = array_get($this->attributes, $attribute); - - // Before running the validator, we need to verify that the attribute and rule - // combination is actually validatable. Only the "accepted" rule implies that - // the attribute is "required", so if the attribute does not exist, the other - // rules will not be run for the attribute. - $validatable = $this->validatable($rule, $attribute, $value); - - if ($validatable and ! $this->{'validate_'.$rule}($attribute, $value, $parameters, $this)) - { - $this->error($attribute, $rule, $parameters); - } - } - - /** - * Determine if an attribute is validatable. - * - * To be considered validatable, the attribute must either exist, or the rule - * being checked must implicitly validate "required", such as the "required" - * rule or the "accepted" rule. - * - * @param string $rule - * @param string $attribute - * @param mixed $value - * @return bool - */ - protected function validatable($rule, $attribute, $value) - { - return $this->validate_required($attribute, $value) or $this->implicit($rule); - } - - /** - * Determine if a given rule implies that the attribute is required. - * - * @param string $rule - * @return bool - */ - protected function implicit($rule) - { - return $rule == 'required' or $rule == 'accepted' or $rule == 'required_with'; - } - - /** - * Add an error message to the validator's collection of messages. - * - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return void - */ - protected function error($attribute, $rule, $parameters) - { - $message = $this->replace($this->message($attribute, $rule), $attribute, $rule, $parameters); - - $this->errors->add($attribute, $message); - } - - /** - * Validate that a required attribute exists in the attributes array. - * - * @param string $attribute - * @param mixed $value - * @return bool - */ - protected function validate_required($attribute, $value) - { - if (is_null($value)) - { - return false; - } - elseif (is_string($value) and trim($value) === '') - { - return false; - } - elseif ( ! is_null(Input::file($attribute)) and is_array($value) and $value['tmp_name'] == '') - { - return false; - } - - return true; - } - - /** - * Validate that an attribute exists in the attributes array, if another - * attribute exists in the attributes array. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_required_with($attribute, $value, $parameters) - { - $other = $parameters[0]; - $other_value = array_get($this->attributes, $other); - - if ($this->validate_required($other, $other_value)) - { - return $this->validate_required($attribute, $value); - } - - return true; - } - - /** - * Validate that an attribute has a matching confirmation attribute. - * - * @param string $attribute - * @param mixed $value - * @return bool - */ - protected function validate_confirmed($attribute, $value) - { - return $this->validate_same($attribute, $value, array($attribute.'_confirmation')); - } - - /** - * Validate that an attribute was "accepted". - * - * This validation rule implies the attribute is "required". - * - * @param string $attribute - * @param mixed $value - * @return bool - */ - protected function validate_accepted($attribute, $value) - { - return $this->validate_required($attribute, $value) and ($value == 'yes' or $value == '1' or $value == 'on'); - } - - /** - * Validate that an attribute is the same as another attribute. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_same($attribute, $value, $parameters) - { - $other = $parameters[0]; - - return array_key_exists($other, $this->attributes) and $value == $this->attributes[$other]; - } - - /** - * Validate that an attribute is different from another attribute. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_different($attribute, $value, $parameters) - { - $other = $parameters[0]; - - return array_key_exists($other, $this->attributes) and $value != $this->attributes[$other]; - } - - /** - * Validate that an attribute is numeric. - * - * @param string $attribute - * @param mixed $value - * @return bool - */ - protected function validate_numeric($attribute, $value) - { - return is_numeric($value); - } - - /** - * Validate that an attribute is an integer. - * - * @param string $attribute - * @param mixed $value - * @return bool - */ - protected function validate_integer($attribute, $value) - { - return filter_var($value, FILTER_VALIDATE_INT) !== false; - } - - /** - * Validate the size of an attribute. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_size($attribute, $value, $parameters) - { - return $this->size($attribute, $value) == $parameters[0]; - } - - /** - * Validate the size of an attribute is between a set of values. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_between($attribute, $value, $parameters) - { - $size = $this->size($attribute, $value); - - return $size >= $parameters[0] and $size <= $parameters[1]; - } - - /** - * Validate the size of an attribute is greater than a minimum value. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_min($attribute, $value, $parameters) - { - return $this->size($attribute, $value) >= $parameters[0]; - } - - /** - * Validate the size of an attribute is less than a maximum value. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_max($attribute, $value, $parameters) - { - return $this->size($attribute, $value) <= $parameters[0]; - } - - /** - * Get the size of an attribute. - * - * @param string $attribute - * @param mixed $value - * @return mixed - */ - protected function size($attribute, $value) - { - // This method will determine if the attribute is a number, string, or file and - // return the proper size accordingly. If it is a number, the number itself is - // the size; if it is a file, the kilobytes is the size; if it is a - // string, the length is the size. - if (is_numeric($value) and $this->has_rule($attribute, $this->numeric_rules)) - { - return $this->attributes[$attribute]; - } - elseif (array_key_exists($attribute, Input::file())) - { - return $value['size'] / 1024; - } - else - { - return Str::length(trim($value)); - } - } - - /** - * Validate an attribute is contained within a list of values. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_in($attribute, $value, $parameters) - { - return in_array($value, $parameters); - } - - /** - * Validate an attribute is not contained within a list of values. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_not_in($attribute, $value, $parameters) - { - return ! in_array($value, $parameters); - } - - /** - * Validate the uniqueness of an attribute value on a given database table. - * - * If a database column is not specified, the attribute will be used. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_unique($attribute, $value, $parameters) - { - // We allow the table column to be specified just in case the column does - // not have the same name as the attribute. It must be within the second - // parameter position, right after the database table name. - if (isset($parameters[1])) - { - $attribute = $parameters[1]; - } - - $query = $this->db()->table($parameters[0])->where($attribute, '=', $value); - - // We also allow an ID to be specified that will not be included in the - // uniqueness check. This makes updating columns easier since it is - // fine for the given ID to exist in the table. - if (isset($parameters[2])) - { - $id = (isset($parameters[3])) ? $parameters[3] : 'id'; - - $query->where($id, '<>', $parameters[2]); - } - - return $query->count() == 0; - } - - /** - * Validate the existence of an attribute value in a database table. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_exists($attribute, $value, $parameters) - { - if (isset($parameters[1])) $attribute = $parameters[1]; - - // Grab the number of elements we are looking for. If the given value is - // in array, we'll count all of the values in the array, otherwise we - // can just make sure the count is greater or equal to one. - $count = (is_array($value)) ? count($value) : 1; - - $query = $this->db()->table($parameters[0]); - - // If the given value is an array, we will check for the existence of - // all the values in the database, otherwise we'll check for the - // presence of the single given value in the database. - if (is_array($value)) - { - $query = $query->where_in($attribute, $value); - } - else - { - $query = $query->where($attribute, '=', $value); - } - - return $query->count() >= $count; - } - - /** - * Validate that an attribute is a valid IP. - * - * @param string $attribute - * @param mixed $value - * @return bool - */ - protected function validate_ip($attribute, $value) - { - return filter_var($value, FILTER_VALIDATE_IP) !== false; - } - - /** - * Validate that an attribute is a valid e-mail address. - * - * @param string $attribute - * @param mixed $value - * @return bool - */ - protected function validate_email($attribute, $value) - { - return filter_var($value, FILTER_VALIDATE_EMAIL) !== false; - } - - /** - * Validate that an attribute is a valid URL. - * - * @param string $attribute - * @param mixed $value - * @return bool - */ - protected function validate_url($attribute, $value) - { - return filter_var($value, FILTER_VALIDATE_URL) !== false; - } - - /** - * Validate that an attribute is an active URL. - * - * @param string $attribute - * @param mixed $value - * @return bool - */ - protected function validate_active_url($attribute, $value) - { - $url = str_replace(array('http://', 'https://', 'ftp://'), '', Str::lower($value)); - - return (trim($url) !== '') ? checkdnsrr($url) : false; - } - - /** - * Validate the MIME type of a file is an image MIME type. - * - * @param string $attribute - * @param mixed $value - * @return bool - */ - protected function validate_image($attribute, $value) - { - return $this->validate_mimes($attribute, $value, array('jpg', 'png', 'gif', 'bmp')); - } - - /** - * Validate that an attribute contains only alphabetic characters. - * - * @param string $attribute - * @param mixed $value - * @return bool - */ - protected function validate_alpha($attribute, $value) - { - return preg_match('/^([a-z])+$/i', $value); - } - - /** - * Validate that an attribute contains only alpha-numeric characters. - * - * @param string $attribute - * @param mixed $value - * @return bool - */ - protected function validate_alpha_num($attribute, $value) - { - return preg_match('/^([a-z0-9])+$/i', $value); - } - - /** - * Validate that an attribute contains only alpha-numeric characters, dashes, and underscores. - * - * @param string $attribute - * @param mixed $value - * @return bool - */ - protected function validate_alpha_dash($attribute, $value) - { - return preg_match('/^([-a-z0-9_-])+$/i', $value); - } - - /** - * Validate that an attribute passes a regular expression check. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_match($attribute, $value, $parameters) - { - return preg_match($parameters[0], $value); - } - - /** - * Validate the MIME type of a file upload attribute is in a set of MIME types. - * - * @param string $attribute - * @param array $value - * @param array $parameters - * @return bool - */ - protected function validate_mimes($attribute, $value, $parameters) - { - if ( ! is_array($value) or array_get($value, 'tmp_name', '') == '') return true; - - foreach ($parameters as $extension) - { - if (File::is($extension, $value['tmp_name'])) - { - return true; - } - } - - return false; - } - - /** - * Validate that an attribute is an array - * - * @param string $attribute - * @param mixed $value - * @return bool - */ - protected function validate_array($attribute, $value) - { - return is_array($value); - } - - /** - * Validate that an attribute of type array has a specific count - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_count($attribute, $value, $parameters) - { - return (is_array($value) && count($value) == $parameters[0]); - } - - /** - * Validate that an attribute of type array has a minimum of elements. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_countmin($attribute, $value, $parameters) - { - return (is_array($value) && count($value) >= $parameters[0]); - } - - /** - * Validate that an attribute of type array has a maximum of elements. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_countmax($attribute, $value, $parameters) - { - return (is_array($value) && count($value) <= $parameters[0]); - } - - /** - * Validate that an attribute of type array has elements between max and min. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_countbetween($attribute, $value, $parameters) - { - return (is_array($value) && count($value) >= $parameters[0] && count($value) <= $parameters[1] ); - } - - /** - * Validate the date is before a given date. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_before($attribute, $value, $parameters) - { - return (strtotime($value) < strtotime($parameters[0])); - } - - /** - * Validate the date is after a given date. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_after($attribute, $value, $parameters) - { - return (strtotime($value) > strtotime($parameters[0])); - } - - /** - * Validate the date conforms to a given format. - * - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validate_date_format($attribute, $value, $parameters) - { - return date_create_from_format($parameters[0], $value) !== false; - } - - /** - * Get the proper error message for an attribute and rule. - * - * @param string $attribute - * @param string $rule - * @return string - */ - protected function message($attribute, $rule) - { - $bundle = Bundle::prefix($this->bundle); - - // First we'll check for developer specified, attribute specific messages. - // These messages take first priority. They allow the fine-grained tuning - // of error messages for each rule. - $custom = $attribute.'_'.$rule; - - if (array_key_exists($custom, $this->messages)) - { - return $this->messages[$custom]; - } - elseif (Lang::has($custom = "{$bundle}validation.custom.{$custom}", $this->language)) - { - return Lang::line($custom)->get($this->language); - } - - // Next we'll check for developer specified, rule specific error messages. - // These allow the developer to override the error message for an entire - // rule, regardless of the attribute being validated by that rule. - elseif (array_key_exists($rule, $this->messages)) - { - return $this->messages[$rule]; - } - - // If the rule being validated is a "size" rule, we will need to gather - // the specific size message for the type of attribute being validated, - // either a number, file, or string. - elseif (in_array($rule, $this->size_rules)) - { - return $this->size_message($bundle, $attribute, $rule); - } - - // If no developer specified messages have been set, and no other special - // messages apply to the rule, we will just pull the default validation - // message from the validation language file. - else - { - $line = "{$bundle}validation.{$rule}"; - - return Lang::line($line)->get($this->language); - } - } - - /** - * Get the proper error message for an attribute and size rule. - * - * @param string $bundle - * @param string $attribute - * @param string $rule - * @return string - */ - protected function size_message($bundle, $attribute, $rule) - { - // There are three different types of size validations. The attribute - // may be either a number, file, or a string, so we'll check a few - // things to figure out which one it is. - if ($this->has_rule($attribute, $this->numeric_rules)) - { - $line = 'numeric'; - } - // We assume that attributes present in the $_FILES array are files, - // which makes sense. If the attribute doesn't have numeric rules - // and isn't a file, it's a string. - elseif (array_key_exists($attribute, Input::file())) - { - $line = 'file'; - } - else - { - $line = 'string'; - } - - return Lang::line("{$bundle}validation.{$rule}.{$line}")->get($this->language); - } - - /** - * Replace all error message place-holders with actual values. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace($message, $attribute, $rule, $parameters) - { - $message = str_replace(':attribute', $this->attribute($attribute), $message); - - if (method_exists($this, $replacer = 'replace_'.$rule)) - { - $message = $this->$replacer($message, $attribute, $rule, $parameters); - } - - return $message; - } - - /** - * Replace all place-holders for the required_with rule. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace_required_with($message, $attribute, $rule, $parameters) - { - return str_replace(':field', $this->attribute($parameters[0]), $message); - } - - /** - * Replace all place-holders for the between rule. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace_between($message, $attribute, $rule, $parameters) - { - return str_replace(array(':min', ':max'), $parameters, $message); - } - - /** - * Replace all place-holders for the size rule. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace_size($message, $attribute, $rule, $parameters) - { - return str_replace(':size', $parameters[0], $message); - } - - /** - * Replace all place-holders for the min rule. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace_min($message, $attribute, $rule, $parameters) - { - return str_replace(':min', $parameters[0], $message); - } - - /** - * Replace all place-holders for the max rule. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace_max($message, $attribute, $rule, $parameters) - { - return str_replace(':max', $parameters[0], $message); - } - - /** - * Replace all place-holders for the in rule. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace_in($message, $attribute, $rule, $parameters) - { - return str_replace(':values', implode(', ', $parameters), $message); - } - - /** - * Replace all place-holders for the not_in rule. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace_not_in($message, $attribute, $rule, $parameters) - { - return str_replace(':values', implode(', ', $parameters), $message); - } - - /** - * Replace all place-holders for the mimes rule. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace_mimes($message, $attribute, $rule, $parameters) - { - return str_replace(':values', implode(', ', $parameters), $message); - } - - /** - * Replace all place-holders for the same rule. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace_same($message, $attribute, $rule, $parameters) - { - return str_replace(':other', $this->attribute($parameters[0]), $message); - } - - /** - * Replace all place-holders for the different rule. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace_different($message, $attribute, $rule, $parameters) - { - return str_replace(':other', $this->attribute($parameters[0]), $message); - } - - /** - * Replace all place-holders for the before rule. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace_before($message, $attribute, $rule, $parameters) - { - return str_replace(':date', $parameters[0], $message); - } - - /** - * Replace all place-holders for the after rule. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace_after($message, $attribute, $rule, $parameters) - { - return str_replace(':date', $parameters[0], $message); - } - - /** - * Replace all place-holders for the count rule. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace_count($message, $attribute, $rule, $parameters) - { - return str_replace(':count', $parameters[0], $message); - } - - /** - * Replace all place-holders for the countmin rule. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace_countmin($message, $attribute, $rule, $parameters) - { - return str_replace(':min', $parameters[0], $message); - } - - /** - * Replace all place-holders for the countmax rule. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace_countmax($message, $attribute, $rule, $parameters) - { - return str_replace(':max', $parameters[0], $message); - } - - /** - * Replace all place-holders for the between rule. - * - * @param string $message - * @param string $attribute - * @param string $rule - * @param array $parameters - * @return string - */ - protected function replace_countbetween($message, $attribute, $rule, $parameters) - { - return str_replace(array(':min', ':max'), $parameters, $message); - } - - /** - * Get the displayable name for a given attribute. - * - * @param string $attribute - * @return string - */ - protected function attribute($attribute) - { - $bundle = Bundle::prefix($this->bundle); - - // More reader friendly versions of the attribute names may be stored - // in the validation language file, allowing a more readable version - // of the attribute name in the message. - $line = "{$bundle}validation.attributes.{$attribute}"; - - if (Lang::has($line, $this->language)) - { - return Lang::line($line)->get($this->language); - } - - // If no language line has been specified for the attribute, all of - // the underscores are removed from the attribute name and that - // will be used as the attribute name. - else - { - return str_replace('_', ' ', $attribute); - } - } - - /** - * Determine if an attribute has a rule assigned to it. - * - * @param string $attribute - * @param array $rules - * @return bool - */ - protected function has_rule($attribute, $rules) - { - foreach ($this->rules[$attribute] as $rule) - { - list($rule, $parameters) = $this->parse($rule); - - if (in_array($rule, $rules)) return true; - } - - return false; - } - - /** - * Extract the rule name and parameters from a rule. - * - * @param string $rule - * @return array - */ - protected function parse($rule) - { - $parameters = array(); - - // The format for specifying validation rules and parameters follows a - // {rule}:{parameters} formatting convention. For instance, the rule - // "max:3" specifies that the value may only be 3 characters long. - if (($colon = strpos($rule, ':')) !== false) - { - $parameters = str_getcsv(substr($rule, $colon + 1)); - } - - return array(is_numeric($colon) ? substr($rule, 0, $colon) : $rule, $parameters); - } - - /** - * Set the bundle that the validator is running for. - * - * The bundle determines which bundle the language lines will be loaded from. - * - * @param string $bundle - * @return Validator - */ - public function bundle($bundle) - { - $this->bundle = $bundle; - return $this; - } - - /** - * Set the language that should be used when retrieving error messages. - * - * @param string $language - * @return Validator - */ - public function speaks($language) - { - $this->language = $language; - return $this; - } - - /** - * Set the database connection that should be used by the validator. - * - * @param Database\Connection $connection - * @return Validator - */ - public function connection(Database\Connection $connection) - { - $this->db = $connection; - return $this; - } - - /** - * Get the database connection for the Validator. - * - * @return Database\Connection - */ - protected function db() - { - if ( ! is_null($this->db)) return $this->db; - - return $this->db = Database::connection(); - } - - /** - * Dynamically handle calls to custom registered validators. - */ - public function __call($method, $parameters) - { - // First we will slice the "validate_" prefix off of the validator since - // custom validators aren't registered with such a prefix, then we can - // just call the method with the given parameters. - if (isset(static::$validators[$method = substr($method, 9)])) - { - return call_user_func_array(static::$validators[$method], $parameters); - } - - throw new \Exception("Method [$method] does not exist."); - } - -} diff --git a/laravel/vendor/Symfony/Component/Console/Application.php b/laravel/vendor/Symfony/Component/Console/Application.php deleted file mode 100644 index e04940ab..00000000 --- a/laravel/vendor/Symfony/Component/Console/Application.php +++ /dev/null @@ -1,1007 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console; - -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\ArgvInput; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\Output; -use Symfony\Component\Console\Output\ConsoleOutput; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Command\HelpCommand; -use Symfony\Component\Console\Command\ListCommand; -use Symfony\Component\Console\Helper\HelperSet; -use Symfony\Component\Console\Helper\FormatterHelper; -use Symfony\Component\Console\Helper\DialogHelper; - -/** - * An Application is the container for a collection of commands. - * - * It is the main entry point of a Console application. - * - * This class is optimized for a standard CLI environment. - * - * Usage: - * - * $app = new Application('myapp', '1.0 (stable)'); - * $app->add(new SimpleCommand()); - * $app->run(); - * - * @author Fabien Potencier - * - * @api - */ -class Application -{ - private $commands; - private $wantHelps = false; - private $runningCommand; - private $name; - private $version; - private $catchExceptions; - private $autoExit; - private $definition; - private $helperSet; - - /** - * Constructor. - * - * @param string $name The name of the application - * @param string $version The version of the application - * - * @api - */ - public function __construct($name = 'UNKNOWN', $version = 'UNKNOWN') - { - $this->name = $name; - $this->version = $version; - $this->catchExceptions = true; - $this->autoExit = true; - $this->commands = array(); - $this->helperSet = $this->getDefaultHelperSet(); - $this->definition = $this->getDefaultInputDefinition(); - - foreach ($this->getDefaultCommands() as $command) { - $this->add($command); - } - } - - /** - * Runs the current application. - * - * @param InputInterface $input An Input instance - * @param OutputInterface $output An Output instance - * - * @return integer 0 if everything went fine, or an error code - * - * @throws \Exception When doRun returns Exception - * - * @api - */ - public function run(InputInterface $input = null, OutputInterface $output = null) - { - if (null === $input) { - $input = new ArgvInput(); - } - - if (null === $output) { - $output = new ConsoleOutput(); - } - - try { - $statusCode = $this->doRun($input, $output); - } catch (\Exception $e) { - if (!$this->catchExceptions) { - throw $e; - } - - if ($output instanceof ConsoleOutputInterface) { - $this->renderException($e, $output->getErrorOutput()); - } else { - $this->renderException($e, $output); - } - $statusCode = $e->getCode(); - - $statusCode = is_numeric($statusCode) && $statusCode ? $statusCode : 1; - } - - if ($this->autoExit) { - if ($statusCode > 255) { - $statusCode = 255; - } - // @codeCoverageIgnoreStart - exit($statusCode); - // @codeCoverageIgnoreEnd - } - - return $statusCode; - } - - /** - * Runs the current application. - * - * @param InputInterface $input An Input instance - * @param OutputInterface $output An Output instance - * - * @return integer 0 if everything went fine, or an error code - */ - public function doRun(InputInterface $input, OutputInterface $output) - { - $name = $this->getCommandName($input); - - if (true === $input->hasParameterOption(array('--ansi'))) { - $output->setDecorated(true); - } elseif (true === $input->hasParameterOption(array('--no-ansi'))) { - $output->setDecorated(false); - } - - if (true === $input->hasParameterOption(array('--help', '-h'))) { - if (!$name) { - $name = 'help'; - $input = new ArrayInput(array('command' => 'help')); - } else { - $this->wantHelps = true; - } - } - - if (true === $input->hasParameterOption(array('--no-interaction', '-n'))) { - $input->setInteractive(false); - } - - if (function_exists('posix_isatty') && $this->getHelperSet()->has('dialog')) { - $inputStream = $this->getHelperSet()->get('dialog')->getInputStream(); - if (!posix_isatty($inputStream)) { - $input->setInteractive(false); - } - } - - if (true === $input->hasParameterOption(array('--quiet', '-q'))) { - $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); - } elseif (true === $input->hasParameterOption(array('--verbose', '-v'))) { - $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); - } - - if (true === $input->hasParameterOption(array('--version', '-V'))) { - $output->writeln($this->getLongVersion()); - - return 0; - } - - if (!$name) { - $name = 'list'; - $input = new ArrayInput(array('command' => 'list')); - } - - // the command name MUST be the first element of the input - $command = $this->find($name); - - $this->runningCommand = $command; - $statusCode = $command->run($input, $output); - $this->runningCommand = null; - - return is_numeric($statusCode) ? $statusCode : 0; - } - - /** - * Set a helper set to be used with the command. - * - * @param HelperSet $helperSet The helper set - * - * @api - */ - public function setHelperSet(HelperSet $helperSet) - { - $this->helperSet = $helperSet; - } - - /** - * Get the helper set associated with the command. - * - * @return HelperSet The HelperSet instance associated with this command - * - * @api - */ - public function getHelperSet() - { - return $this->helperSet; - } - - /** - * Gets the InputDefinition related to this Application. - * - * @return InputDefinition The InputDefinition instance - */ - public function getDefinition() - { - return $this->definition; - } - - /** - * Gets the help message. - * - * @return string A help message. - */ - public function getHelp() - { - $messages = array( - $this->getLongVersion(), - '', - 'Usage:', - sprintf(" [options] command [arguments]\n"), - 'Options:', - ); - - foreach ($this->getDefinition()->getOptions() as $option) { - $messages[] = sprintf(' %-29s %s %s', - '--'.$option->getName().'', - $option->getShortcut() ? '-'.$option->getShortcut().'' : ' ', - $option->getDescription() - ); - } - - return implode(PHP_EOL, $messages); - } - - /** - * Sets whether to catch exceptions or not during commands execution. - * - * @param Boolean $boolean Whether to catch exceptions or not during commands execution - * - * @api - */ - public function setCatchExceptions($boolean) - { - $this->catchExceptions = (Boolean) $boolean; - } - - /** - * Sets whether to automatically exit after a command execution or not. - * - * @param Boolean $boolean Whether to automatically exit after a command execution or not - * - * @api - */ - public function setAutoExit($boolean) - { - $this->autoExit = (Boolean) $boolean; - } - - /** - * Gets the name of the application. - * - * @return string The application name - * - * @api - */ - public function getName() - { - return $this->name; - } - - /** - * Sets the application name. - * - * @param string $name The application name - * - * @api - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * Gets the application version. - * - * @return string The application version - * - * @api - */ - public function getVersion() - { - return $this->version; - } - - /** - * Sets the application version. - * - * @param string $version The application version - * - * @api - */ - public function setVersion($version) - { - $this->version = $version; - } - - /** - * Returns the long version of the application. - * - * @return string The long application version - * - * @api - */ - public function getLongVersion() - { - if ('UNKNOWN' !== $this->getName() && 'UNKNOWN' !== $this->getVersion()) { - return sprintf('%s version %s', $this->getName(), $this->getVersion()); - } - - return 'Console Tool'; - } - - /** - * Registers a new command. - * - * @param string $name The command name - * - * @return Command The newly created command - * - * @api - */ - public function register($name) - { - return $this->add(new Command($name)); - } - - /** - * Adds an array of command objects. - * - * @param Command[] $commands An array of commands - * - * @api - */ - public function addCommands(array $commands) - { - foreach ($commands as $command) { - $this->add($command); - } - } - - /** - * Adds a command object. - * - * If a command with the same name already exists, it will be overridden. - * - * @param Command $command A Command object - * - * @return Command The registered command - * - * @api - */ - public function add(Command $command) - { - $command->setApplication($this); - - if (!$command->isEnabled()) { - $command->setApplication(null); - - return; - } - - $this->commands[$command->getName()] = $command; - - foreach ($command->getAliases() as $alias) { - $this->commands[$alias] = $command; - } - - return $command; - } - - /** - * Returns a registered command by name or alias. - * - * @param string $name The command name or alias - * - * @return Command A Command object - * - * @throws \InvalidArgumentException When command name given does not exist - * - * @api - */ - public function get($name) - { - if (!isset($this->commands[$name])) { - throw new \InvalidArgumentException(sprintf('The command "%s" does not exist.', $name)); - } - - $command = $this->commands[$name]; - - if ($this->wantHelps) { - $this->wantHelps = false; - - $helpCommand = $this->get('help'); - $helpCommand->setCommand($command); - - return $helpCommand; - } - - return $command; - } - - /** - * Returns true if the command exists, false otherwise. - * - * @param string $name The command name or alias - * - * @return Boolean true if the command exists, false otherwise - * - * @api - */ - public function has($name) - { - return isset($this->commands[$name]); - } - - /** - * Returns an array of all unique namespaces used by currently registered commands. - * - * It does not returns the global namespace which always exists. - * - * @return array An array of namespaces - */ - public function getNamespaces() - { - $namespaces = array(); - foreach ($this->commands as $command) { - $namespaces[] = $this->extractNamespace($command->getName()); - - foreach ($command->getAliases() as $alias) { - $namespaces[] = $this->extractNamespace($alias); - } - } - - return array_values(array_unique(array_filter($namespaces))); - } - - /** - * Finds a registered namespace by a name or an abbreviation. - * - * @param string $namespace A namespace or abbreviation to search for - * - * @return string A registered namespace - * - * @throws \InvalidArgumentException When namespace is incorrect or ambiguous - */ - public function findNamespace($namespace) - { - $allNamespaces = array(); - foreach ($this->getNamespaces() as $n) { - $allNamespaces[$n] = explode(':', $n); - } - - $found = array(); - foreach (explode(':', $namespace) as $i => $part) { - $abbrevs = static::getAbbreviations(array_unique(array_values(array_filter(array_map(function ($p) use ($i) { return isset($p[$i]) ? $p[$i] : ''; }, $allNamespaces))))); - - if (!isset($abbrevs[$part])) { - $message = sprintf('There are no commands defined in the "%s" namespace.', $namespace); - - if (1 <= $i) { - $part = implode(':', $found).':'.$part; - } - - if ($alternatives = $this->findAlternativeNamespace($part, $abbrevs)) { - $message .= "\n\nDid you mean one of these?\n "; - $message .= implode("\n ", $alternatives); - } - - throw new \InvalidArgumentException($message); - } - - if (count($abbrevs[$part]) > 1) { - throw new \InvalidArgumentException(sprintf('The namespace "%s" is ambiguous (%s).', $namespace, $this->getAbbreviationSuggestions($abbrevs[$part]))); - } - - $found[] = $abbrevs[$part][0]; - } - - return implode(':', $found); - } - - /** - * Finds a command by name or alias. - * - * Contrary to get, this command tries to find the best - * match if you give it an abbreviation of a name or alias. - * - * @param string $name A command name or a command alias - * - * @return Command A Command instance - * - * @throws \InvalidArgumentException When command name is incorrect or ambiguous - * - * @api - */ - public function find($name) - { - // namespace - $namespace = ''; - $searchName = $name; - if (false !== $pos = strrpos($name, ':')) { - $namespace = $this->findNamespace(substr($name, 0, $pos)); - $searchName = $namespace.substr($name, $pos); - } - - // name - $commands = array(); - foreach ($this->commands as $command) { - if ($this->extractNamespace($command->getName()) == $namespace) { - $commands[] = $command->getName(); - } - } - - $abbrevs = static::getAbbreviations(array_unique($commands)); - if (isset($abbrevs[$searchName]) && 1 == count($abbrevs[$searchName])) { - return $this->get($abbrevs[$searchName][0]); - } - - if (isset($abbrevs[$searchName]) && count($abbrevs[$searchName]) > 1) { - $suggestions = $this->getAbbreviationSuggestions($abbrevs[$searchName]); - - throw new \InvalidArgumentException(sprintf('Command "%s" is ambiguous (%s).', $name, $suggestions)); - } - - // aliases - $aliases = array(); - foreach ($this->commands as $command) { - foreach ($command->getAliases() as $alias) { - if ($this->extractNamespace($alias) == $namespace) { - $aliases[] = $alias; - } - } - } - - $aliases = static::getAbbreviations(array_unique($aliases)); - if (!isset($aliases[$searchName])) { - $message = sprintf('Command "%s" is not defined.', $name); - - if ($alternatives = $this->findAlternativeCommands($searchName, $abbrevs)) { - $message .= "\n\nDid you mean one of these?\n "; - $message .= implode("\n ", $alternatives); - } - - throw new \InvalidArgumentException($message); - } - - if (count($aliases[$searchName]) > 1) { - throw new \InvalidArgumentException(sprintf('Command "%s" is ambiguous (%s).', $name, $this->getAbbreviationSuggestions($aliases[$searchName]))); - } - - return $this->get($aliases[$searchName][0]); - } - - /** - * Gets the commands (registered in the given namespace if provided). - * - * The array keys are the full names and the values the command instances. - * - * @param string $namespace A namespace name - * - * @return array An array of Command instances - * - * @api - */ - public function all($namespace = null) - { - if (null === $namespace) { - return $this->commands; - } - - $commands = array(); - foreach ($this->commands as $name => $command) { - if ($namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1)) { - $commands[$name] = $command; - } - } - - return $commands; - } - - /** - * Returns an array of possible abbreviations given a set of names. - * - * @param array $names An array of names - * - * @return array An array of abbreviations - */ - static public function getAbbreviations($names) - { - $abbrevs = array(); - foreach ($names as $name) { - for ($len = strlen($name) - 1; $len > 0; --$len) { - $abbrev = substr($name, 0, $len); - if (!isset($abbrevs[$abbrev])) { - $abbrevs[$abbrev] = array($name); - } else { - $abbrevs[$abbrev][] = $name; - } - } - } - - // Non-abbreviations always get entered, even if they aren't unique - foreach ($names as $name) { - $abbrevs[$name] = array($name); - } - - return $abbrevs; - } - - /** - * Returns a text representation of the Application. - * - * @param string $namespace An optional namespace name - * @param boolean $raw Whether to return raw command list - * - * @return string A string representing the Application - */ - public function asText($namespace = null, $raw = false) - { - $commands = $namespace ? $this->all($this->findNamespace($namespace)) : $this->commands; - - $width = 0; - foreach ($commands as $command) { - $width = strlen($command->getName()) > $width ? strlen($command->getName()) : $width; - } - $width += 2; - - if ($raw) { - $messages = array(); - foreach ($this->sortCommands($commands) as $space => $commands) { - foreach ($commands as $name => $command) { - $messages[] = sprintf("%-${width}s %s", $name, $command->getDescription()); - } - } - - return implode(PHP_EOL, $messages); - } - - $messages = array($this->getHelp(), ''); - if ($namespace) { - $messages[] = sprintf("Available commands for the \"%s\" namespace:", $namespace); - } else { - $messages[] = 'Available commands:'; - } - - // add commands by namespace - foreach ($this->sortCommands($commands) as $space => $commands) { - if (!$namespace && '_global' !== $space) { - $messages[] = ''.$space.''; - } - - foreach ($commands as $name => $command) { - $messages[] = sprintf(" %-${width}s %s", $name, $command->getDescription()); - } - } - - return implode(PHP_EOL, $messages); - } - - /** - * Returns an XML representation of the Application. - * - * @param string $namespace An optional namespace name - * @param Boolean $asDom Whether to return a DOM or an XML string - * - * @return string|DOMDocument An XML string representing the Application - */ - public function asXml($namespace = null, $asDom = false) - { - $commands = $namespace ? $this->all($this->findNamespace($namespace)) : $this->commands; - - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->formatOutput = true; - $dom->appendChild($xml = $dom->createElement('symfony')); - - $xml->appendChild($commandsXML = $dom->createElement('commands')); - - if ($namespace) { - $commandsXML->setAttribute('namespace', $namespace); - } else { - $namespacesXML = $dom->createElement('namespaces'); - $xml->appendChild($namespacesXML); - } - - // add commands by namespace - foreach ($this->sortCommands($commands) as $space => $commands) { - if (!$namespace) { - $namespaceArrayXML = $dom->createElement('namespace'); - $namespacesXML->appendChild($namespaceArrayXML); - $namespaceArrayXML->setAttribute('id', $space); - } - - foreach ($commands as $name => $command) { - if ($name !== $command->getName()) { - continue; - } - - if (!$namespace) { - $commandXML = $dom->createElement('command'); - $namespaceArrayXML->appendChild($commandXML); - $commandXML->appendChild($dom->createTextNode($name)); - } - - $node = $command->asXml(true)->getElementsByTagName('command')->item(0); - $node = $dom->importNode($node, true); - - $commandsXML->appendChild($node); - } - } - - return $asDom ? $dom : $dom->saveXml(); - } - - /** - * Renders a catched exception. - * - * @param Exception $e An exception instance - * @param OutputInterface $output An OutputInterface instance - */ - public function renderException($e, $output) - { - $strlen = function ($string) { - if (!function_exists('mb_strlen')) { - return strlen($string); - } - - if (false === $encoding = mb_detect_encoding($string)) { - return strlen($string); - } - - return mb_strlen($string, $encoding); - }; - - do { - $title = sprintf(' [%s] ', get_class($e)); - $len = $strlen($title); - $lines = array(); - foreach (explode("\n", $e->getMessage()) as $line) { - $lines[] = sprintf(' %s ', $line); - $len = max($strlen($line) + 4, $len); - } - - $messages = array(str_repeat(' ', $len), $title.str_repeat(' ', $len - $strlen($title))); - - foreach ($lines as $line) { - $messages[] = $line.str_repeat(' ', $len - $strlen($line)); - } - - $messages[] = str_repeat(' ', $len); - - $output->writeln(""); - $output->writeln(""); - foreach ($messages as $message) { - $output->writeln(''.$message.''); - } - $output->writeln(""); - $output->writeln(""); - - if (OutputInterface::VERBOSITY_VERBOSE === $output->getVerbosity()) { - $output->writeln('Exception trace:'); - - // exception related properties - $trace = $e->getTrace(); - array_unshift($trace, array( - 'function' => '', - 'file' => $e->getFile() != null ? $e->getFile() : 'n/a', - 'line' => $e->getLine() != null ? $e->getLine() : 'n/a', - 'args' => array(), - )); - - for ($i = 0, $count = count($trace); $i < $count; $i++) { - $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : ''; - $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : ''; - $function = $trace[$i]['function']; - $file = isset($trace[$i]['file']) ? $trace[$i]['file'] : 'n/a'; - $line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a'; - - $output->writeln(sprintf(' %s%s%s() at %s:%s', $class, $type, $function, $file, $line)); - } - - $output->writeln(""); - $output->writeln(""); - } - } while ($e = $e->getPrevious()); - - if (null !== $this->runningCommand) { - $output->writeln(sprintf('%s', sprintf($this->runningCommand->getSynopsis(), $this->getName()))); - $output->writeln(""); - $output->writeln(""); - } - } - - /** - * Gets the name of the command based on input. - * - * @param InputInterface $input The input interface - * - * @return string The command name - */ - protected function getCommandName(InputInterface $input) - { - return $input->getFirstArgument('command'); - } - - /** - * Gets the default input definition. - * - * @return InputDefinition An InputDefinition instance - */ - protected function getDefaultInputDefinition() - { - return new InputDefinition(array( - new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'), - - new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display this help message.'), - new InputOption('--quiet', '-q', InputOption::VALUE_NONE, 'Do not output any message.'), - new InputOption('--verbose', '-v', InputOption::VALUE_NONE, 'Increase verbosity of messages.'), - new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display this application version.'), - new InputOption('--ansi', '', InputOption::VALUE_NONE, 'Force ANSI output.'), - new InputOption('--no-ansi', '', InputOption::VALUE_NONE, 'Disable ANSI output.'), - new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question.'), - )); - } - - /** - * Gets the default commands that should always be available. - * - * @return array An array of default Command instances - */ - protected function getDefaultCommands() - { - return array(new HelpCommand(), new ListCommand()); - } - - /** - * Gets the default helper set with the helpers that should always be available. - * - * @return HelperSet A HelperSet instance - */ - protected function getDefaultHelperSet() - { - return new HelperSet(array( - new FormatterHelper(), - new DialogHelper(), - )); - } - - /** - * Sorts commands in alphabetical order. - * - * @param array $commands An associative array of commands to sort - * - * @return array A sorted array of commands - */ - private function sortCommands($commands) - { - $namespacedCommands = array(); - foreach ($commands as $name => $command) { - $key = $this->extractNamespace($name, 1); - if (!$key) { - $key = '_global'; - } - - $namespacedCommands[$key][$name] = $command; - } - ksort($namespacedCommands); - - foreach ($namespacedCommands as &$commands) { - ksort($commands); - } - - return $namespacedCommands; - } - - /** - * Returns abbreviated suggestions in string format. - * - * @param array $abbrevs Abbreviated suggestions to convert - * - * @return string A formatted string of abbreviated suggestions - */ - private function getAbbreviationSuggestions($abbrevs) - { - return sprintf('%s, %s%s', $abbrevs[0], $abbrevs[1], count($abbrevs) > 2 ? sprintf(' and %d more', count($abbrevs) - 2) : ''); - } - - /** - * Returns the namespace part of the command name. - * - * @param string $name The full name of the command - * @param string $limit The maximum number of parts of the namespace - * - * @return string The namespace of the command - */ - private function extractNamespace($name, $limit = null) - { - $parts = explode(':', $name); - array_pop($parts); - - return implode(':', null === $limit ? $parts : array_slice($parts, 0, $limit)); - } - - /** - * Finds alternative commands of $name - * - * @param string $name The full name of the command - * @param array $abbrevs The abbreviations - * - * @return array A sorted array of similar commands - */ - private function findAlternativeCommands($name, $abbrevs) - { - $callback = function($item) { - return $item->getName(); - }; - - return $this->findAlternatives($name, $this->commands, $abbrevs, $callback); - } - - /** - * Finds alternative namespace of $name - * - * @param string $name The full name of the namespace - * @param array $abbrevs The abbreviations - * - * @return array A sorted array of similar namespace - */ - private function findAlternativeNamespace($name, $abbrevs) - { - return $this->findAlternatives($name, $this->getNamespaces(), $abbrevs); - } - - /** - * Finds alternative of $name among $collection, - * if nothing is found in $collection, try in $abbrevs - * - * @param string $name The string - * @param array|Traversable $collection The collecion - * @param array $abbrevs The abbreviations - * @param Closure|string|array $callback The callable to transform collection item before comparison - * - * @return array A sorted array of similar string - */ - private function findAlternatives($name, $collection, $abbrevs, $callback = null) { - $alternatives = array(); - - foreach ($collection as $item) { - if (null !== $callback) { - $item = call_user_func($callback, $item); - } - - $lev = levenshtein($name, $item); - if ($lev <= strlen($name) / 3 || false !== strpos($item, $name)) { - $alternatives[$item] = $lev; - } - } - - if (!$alternatives) { - foreach ($abbrevs as $key => $values) { - $lev = levenshtein($name, $key); - if ($lev <= strlen($name) / 3 || false !== strpos($key, $name)) { - foreach ($values as $value) { - $alternatives[$value] = $lev; - } - } - } - } - - asort($alternatives); - - return array_keys($alternatives); - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Command/Command.php b/laravel/vendor/Symfony/Component/Console/Command/Command.php deleted file mode 100644 index 033a95c7..00000000 --- a/laravel/vendor/Symfony/Component/Console/Command/Command.php +++ /dev/null @@ -1,612 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Helper\HelperSet; - -/** - * Base class for all commands. - * - * @author Fabien Potencier - * - * @api - */ -class Command -{ - private $application; - private $name; - private $aliases; - private $definition; - private $help; - private $description; - private $ignoreValidationErrors; - private $applicationDefinitionMerged; - private $code; - private $synopsis; - private $helperSet; - - /** - * Constructor. - * - * @param string $name The name of the command - * - * @throws \LogicException When the command name is empty - * - * @api - */ - public function __construct($name = null) - { - $this->definition = new InputDefinition(); - $this->ignoreValidationErrors = false; - $this->applicationDefinitionMerged = false; - $this->aliases = array(); - - if (null !== $name) { - $this->setName($name); - } - - $this->configure(); - - if (!$this->name) { - throw new \LogicException('The command name cannot be empty.'); - } - } - - /** - * Ignores validation errors. - * - * This is mainly useful for the help command. - */ - public function ignoreValidationErrors() - { - $this->ignoreValidationErrors = true; - } - - /** - * Sets the application instance for this command. - * - * @param Application $application An Application instance - * - * @api - */ - public function setApplication(Application $application = null) - { - $this->application = $application; - if ($application) { - $this->setHelperSet($application->getHelperSet()); - } else { - $this->helperSet = null; - } - } - - /** - * Sets the helper set. - * - * @param HelperSet $helperSet A HelperSet instance - */ - public function setHelperSet(HelperSet $helperSet) - { - $this->helperSet = $helperSet; - } - - /** - * Gets the helper set. - * - * @return HelperSet A HelperSet instance - */ - public function getHelperSet() - { - return $this->helperSet; - } - - /** - * Gets the application instance for this command. - * - * @return Application An Application instance - * - * @api - */ - public function getApplication() - { - return $this->application; - } - - /** - * Checks whether the command is enabled or not in the current environment - * - * Override this to check for x or y and return false if the command can not - * run properly under the current conditions. - * - * @return Boolean - */ - public function isEnabled() - { - return true; - } - - /** - * Configures the current command. - */ - protected function configure() - { - } - - /** - * Executes the current command. - * - * This method is not abstract because you can use this class - * as a concrete class. In this case, instead of defining the - * execute() method, you set the code to execute by passing - * a Closure to the setCode() method. - * - * @param InputInterface $input An InputInterface instance - * @param OutputInterface $output An OutputInterface instance - * - * @return integer 0 if everything went fine, or an error code - * - * @throws \LogicException When this abstract method is not implemented - * @see setCode() - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - throw new \LogicException('You must override the execute() method in the concrete command class.'); - } - - /** - * Interacts with the user. - * - * @param InputInterface $input An InputInterface instance - * @param OutputInterface $output An OutputInterface instance - */ - protected function interact(InputInterface $input, OutputInterface $output) - { - } - - /** - * Initializes the command just after the input has been validated. - * - * This is mainly useful when a lot of commands extends one main command - * where some things need to be initialized based on the input arguments and options. - * - * @param InputInterface $input An InputInterface instance - * @param OutputInterface $output An OutputInterface instance - */ - protected function initialize(InputInterface $input, OutputInterface $output) - { - } - - /** - * Runs the command. - * - * The code to execute is either defined directly with the - * setCode() method or by overriding the execute() method - * in a sub-class. - * - * @param InputInterface $input An InputInterface instance - * @param OutputInterface $output An OutputInterface instance - * - * @see setCode() - * @see execute() - * - * @api - */ - public function run(InputInterface $input, OutputInterface $output) - { - // force the creation of the synopsis before the merge with the app definition - $this->getSynopsis(); - - // add the application arguments and options - $this->mergeApplicationDefinition(); - - // bind the input against the command specific arguments/options - try { - $input->bind($this->definition); - } catch (\Exception $e) { - if (!$this->ignoreValidationErrors) { - throw $e; - } - } - - $this->initialize($input, $output); - - if ($input->isInteractive()) { - $this->interact($input, $output); - } - - $input->validate(); - - if ($this->code) { - return call_user_func($this->code, $input, $output); - } - - return $this->execute($input, $output); - } - - /** - * Sets the code to execute when running this command. - * - * If this method is used, it overrides the code defined - * in the execute() method. - * - * @param \Closure $code A \Closure - * - * @return Command The current instance - * - * @see execute() - * - * @api - */ - public function setCode(\Closure $code) - { - $this->code = $code; - - return $this; - } - - /** - * Merges the application definition with the command definition. - */ - private function mergeApplicationDefinition() - { - if (null === $this->application || true === $this->applicationDefinitionMerged) { - return; - } - - $currentArguments = $this->definition->getArguments(); - $this->definition->setArguments($this->application->getDefinition()->getArguments()); - $this->definition->addArguments($currentArguments); - - $this->definition->addOptions($this->application->getDefinition()->getOptions()); - - $this->applicationDefinitionMerged = true; - } - - /** - * Sets an array of argument and option instances. - * - * @param array|InputDefinition $definition An array of argument and option instances or a definition instance - * - * @return Command The current instance - * - * @api - */ - public function setDefinition($definition) - { - if ($definition instanceof InputDefinition) { - $this->definition = $definition; - } else { - $this->definition->setDefinition($definition); - } - - $this->applicationDefinitionMerged = false; - - return $this; - } - - /** - * Gets the InputDefinition attached to this Command. - * - * @return InputDefinition An InputDefinition instance - * - * @api - */ - public function getDefinition() - { - return $this->definition; - } - - /** - * Gets the InputDefinition to be used to create XML and Text representations of this Command. - * - * Can be overridden to provide the original command representation when it would otherwise - * be changed by merging with the application InputDefinition. - * - * @return InputDefinition An InputDefinition instance - */ - protected function getNativeDefinition() - { - return $this->getDefinition(); - } - - /** - * Adds an argument. - * - * @param string $name The argument name - * @param integer $mode The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL - * @param string $description A description text - * @param mixed $default The default value (for InputArgument::OPTIONAL mode only) - * - * @return Command The current instance - * - * @api - */ - public function addArgument($name, $mode = null, $description = '', $default = null) - { - $this->definition->addArgument(new InputArgument($name, $mode, $description, $default)); - - return $this; - } - - /** - * Adds an option. - * - * @param string $name The option name - * @param string $shortcut The shortcut (can be null) - * @param integer $mode The option mode: One of the InputOption::VALUE_* constants - * @param string $description A description text - * @param mixed $default The default value (must be null for InputOption::VALUE_REQUIRED or InputOption::VALUE_NONE) - * - * @return Command The current instance - * - * @api - */ - public function addOption($name, $shortcut = null, $mode = null, $description = '', $default = null) - { - $this->definition->addOption(new InputOption($name, $shortcut, $mode, $description, $default)); - - return $this; - } - - /** - * Sets the name of the command. - * - * This method can set both the namespace and the name if - * you separate them by a colon (:) - * - * $command->setName('foo:bar'); - * - * @param string $name The command name - * - * @return Command The current instance - * - * @throws \InvalidArgumentException When command name given is empty - * - * @api - */ - public function setName($name) - { - $this->validateName($name); - - $this->name = $name; - - return $this; - } - - /** - * Returns the command name. - * - * @return string The command name - * - * @api - */ - public function getName() - { - return $this->name; - } - - /** - * Sets the description for the command. - * - * @param string $description The description for the command - * - * @return Command The current instance - * - * @api - */ - public function setDescription($description) - { - $this->description = $description; - - return $this; - } - - /** - * Returns the description for the command. - * - * @return string The description for the command - * - * @api - */ - public function getDescription() - { - return $this->description; - } - - /** - * Sets the help for the command. - * - * @param string $help The help for the command - * - * @return Command The current instance - * - * @api - */ - public function setHelp($help) - { - $this->help = $help; - - return $this; - } - - /** - * Returns the help for the command. - * - * @return string The help for the command - * - * @api - */ - public function getHelp() - { - return $this->help; - } - - /** - * Returns the processed help for the command replacing the %command.name% and - * %command.full_name% patterns with the real values dynamically. - * - * @return string The processed help for the command - */ - public function getProcessedHelp() - { - $name = $this->name; - - $placeholders = array( - '%command.name%', - '%command.full_name%' - ); - $replacements = array( - $name, - $_SERVER['PHP_SELF'].' '.$name - ); - - return str_replace($placeholders, $replacements, $this->getHelp()); - } - - /** - * Sets the aliases for the command. - * - * @param array $aliases An array of aliases for the command - * - * @return Command The current instance - * - * @api - */ - public function setAliases($aliases) - { - foreach ($aliases as $alias) { - $this->validateName($alias); - } - - $this->aliases = $aliases; - - return $this; - } - - /** - * Returns the aliases for the command. - * - * @return array An array of aliases for the command - * - * @api - */ - public function getAliases() - { - return $this->aliases; - } - - /** - * Returns the synopsis for the command. - * - * @return string The synopsis - */ - public function getSynopsis() - { - if (null === $this->synopsis) { - $this->synopsis = trim(sprintf('%s %s', $this->name, $this->definition->getSynopsis())); - } - - return $this->synopsis; - } - - /** - * Gets a helper instance by name. - * - * @param string $name The helper name - * - * @return mixed The helper value - * - * @throws \InvalidArgumentException if the helper is not defined - * - * @api - */ - public function getHelper($name) - { - return $this->helperSet->get($name); - } - - /** - * Returns a text representation of the command. - * - * @return string A string representing the command - */ - public function asText() - { - $messages = array( - 'Usage:', - ' '.$this->getSynopsis(), - '', - ); - - if ($this->getAliases()) { - $messages[] = 'Aliases: '.implode(', ', $this->getAliases()).''; - } - - $messages[] = $this->getNativeDefinition()->asText(); - - if ($help = $this->getProcessedHelp()) { - $messages[] = 'Help:'; - $messages[] = ' '.str_replace("\n", "\n ", $help)."\n"; - } - - return implode("\n", $messages); - } - - /** - * Returns an XML representation of the command. - * - * @param Boolean $asDom Whether to return a DOM or an XML string - * - * @return string|DOMDocument An XML string representing the command - */ - public function asXml($asDom = false) - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->formatOutput = true; - $dom->appendChild($commandXML = $dom->createElement('command')); - $commandXML->setAttribute('id', $this->name); - $commandXML->setAttribute('name', $this->name); - - $commandXML->appendChild($usageXML = $dom->createElement('usage')); - $usageXML->appendChild($dom->createTextNode(sprintf($this->getSynopsis(), ''))); - - $commandXML->appendChild($descriptionXML = $dom->createElement('description')); - $descriptionXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $this->getDescription()))); - - $commandXML->appendChild($helpXML = $dom->createElement('help')); - $helpXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $this->getProcessedHelp()))); - - $commandXML->appendChild($aliasesXML = $dom->createElement('aliases')); - foreach ($this->getAliases() as $alias) { - $aliasesXML->appendChild($aliasXML = $dom->createElement('alias')); - $aliasXML->appendChild($dom->createTextNode($alias)); - } - - $definition = $this->getNativeDefinition()->asXml(true); - $commandXML->appendChild($dom->importNode($definition->getElementsByTagName('arguments')->item(0), true)); - $commandXML->appendChild($dom->importNode($definition->getElementsByTagName('options')->item(0), true)); - - return $asDom ? $dom : $dom->saveXml(); - } - - private function validateName($name) - { - if (!preg_match('/^[^\:]+(\:[^\:]+)*$/', $name)) { - throw new \InvalidArgumentException(sprintf('Command name "%s" is invalid.', $name)); - } - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Command/HelpCommand.php b/laravel/vendor/Symfony/Component/Console/Command/HelpCommand.php deleted file mode 100644 index 93c81045..00000000 --- a/laravel/vendor/Symfony/Component/Console/Command/HelpCommand.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\Output; -use Symfony\Component\Console\Command\Command; - -/** - * HelpCommand displays the help for a given command. - * - * @author Fabien Potencier - */ -class HelpCommand extends Command -{ - private $command; - - /** - * {@inheritdoc} - */ - protected function configure() - { - $this->ignoreValidationErrors(); - - $this - ->setName('help') - ->setDefinition(array( - new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help'), - new InputOption('xml', null, InputOption::VALUE_NONE, 'To output help as XML'), - )) - ->setDescription('Displays help for a command') - ->setHelp(<<%command.name% command displays help for a given command: - - php %command.full_name% list - -You can also output the help as XML by using the --xml option: - - php %command.full_name% --xml list -EOF - ) - ; - } - - /** - * Sets the command - * - * @param Command $command The command to set - */ - public function setCommand(Command $command) - { - $this->command = $command; - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - if (null === $this->command) { - $this->command = $this->getApplication()->get($input->getArgument('command_name')); - } - - if ($input->getOption('xml')) { - $output->writeln($this->command->asXml(), OutputInterface::OUTPUT_RAW); - } else { - $output->writeln($this->command->asText()); - } - - $this->command = null; - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Command/ListCommand.php b/laravel/vendor/Symfony/Component/Console/Command/ListCommand.php deleted file mode 100644 index 032de16c..00000000 --- a/laravel/vendor/Symfony/Component/Console/Command/ListCommand.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\Output; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputDefinition; - -/** - * ListCommand displays the list of all available commands for the application. - * - * @author Fabien Potencier - */ -class ListCommand extends Command -{ - /** - * {@inheritdoc} - */ - protected function configure() - { - $this - ->setName('list') - ->setDefinition($this->createDefinition()) - ->setDescription('Lists commands') - ->setHelp(<<%command.name% command lists all commands: - - php %command.full_name% - -You can also display the commands for a specific namespace: - - php %command.full_name% test - -You can also output the information as XML by using the --xml option: - - php %command.full_name% --xml - -It's also possible to get raw list of commands (useful for embedding command runner): - - php %command.full_name% --raw -EOF - ) - ; - } - - /** - * {@inheritdoc} - */ - protected function getNativeDefinition() - { - return $this->createDefinition(); - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - if ($input->getOption('xml')) { - $output->writeln($this->getApplication()->asXml($input->getArgument('namespace')), OutputInterface::OUTPUT_RAW); - } else { - $output->writeln($this->getApplication()->asText($input->getArgument('namespace'), $input->getOption('raw'))); - } - } - - private function createDefinition() - { - return new InputDefinition(array( - new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name'), - new InputOption('xml', null, InputOption::VALUE_NONE, 'To output help as XML'), - new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'), - )); - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Formatter/OutputFormatter.php b/laravel/vendor/Symfony/Component/Console/Formatter/OutputFormatter.php deleted file mode 100644 index 8d60c74f..00000000 --- a/laravel/vendor/Symfony/Component/Console/Formatter/OutputFormatter.php +++ /dev/null @@ -1,192 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter class for console output. - * - * @author Konstantin Kudryashov - * - * @api - */ -class OutputFormatter implements OutputFormatterInterface -{ - /** - * The pattern to phrase the format. - */ - const FORMAT_PATTERN = '#<([a-z][a-z0-9_=;-]+)>(.*?)#is'; - - private $decorated; - private $styles = array(); - - /** - * Initializes console output formatter. - * - * @param Boolean $decorated Whether this formatter should actually decorate strings - * @param array $styles Array of "name => FormatterStyle" instances - * - * @api - */ - public function __construct($decorated = null, array $styles = array()) - { - $this->decorated = (Boolean) $decorated; - - $this->setStyle('error', new OutputFormatterStyle('white', 'red')); - $this->setStyle('info', new OutputFormatterStyle('green')); - $this->setStyle('comment', new OutputFormatterStyle('yellow')); - $this->setStyle('question', new OutputFormatterStyle('black', 'cyan')); - - foreach ($styles as $name => $style) { - $this->setStyle($name, $style); - } - } - - /** - * Sets the decorated flag. - * - * @param Boolean $decorated Whether to decorate the messages or not - * - * @api - */ - public function setDecorated($decorated) - { - $this->decorated = (Boolean) $decorated; - } - - /** - * Gets the decorated flag. - * - * @return Boolean true if the output will decorate messages, false otherwise - * - * @api - */ - public function isDecorated() - { - return $this->decorated; - } - - /** - * Sets a new style. - * - * @param string $name The style name - * @param OutputFormatterStyleInterface $style The style instance - * - * @api - */ - public function setStyle($name, OutputFormatterStyleInterface $style) - { - $this->styles[strtolower($name)] = $style; - } - - /** - * Checks if output formatter has style with specified name. - * - * @param string $name - * - * @return Boolean - * - * @api - */ - public function hasStyle($name) - { - return isset($this->styles[strtolower($name)]); - } - - /** - * Gets style options from style with specified name. - * - * @param string $name - * - * @return OutputFormatterStyleInterface - * - * @throws \InvalidArgumentException When style isn't defined - * - * @api - */ - public function getStyle($name) - { - if (!$this->hasStyle($name)) { - throw new \InvalidArgumentException('Undefined style: '.$name); - } - - return $this->styles[strtolower($name)]; - } - - /** - * Formats a message according to the given styles. - * - * @param string $message The message to style - * - * @return string The styled message - * - * @api - */ - public function format($message) - { - return preg_replace_callback(self::FORMAT_PATTERN, array($this, 'replaceStyle'), $message); - } - - /** - * Replaces style of the output. - * - * @param array $match - * - * @return string The replaced style - */ - private function replaceStyle($match) - { - if (!$this->isDecorated()) { - return $match[2]; - } - - if (isset($this->styles[strtolower($match[1])])) { - $style = $this->styles[strtolower($match[1])]; - } else { - $style = $this->createStyleFromString($match[1]); - - if (false === $style) { - return $match[0]; - } - } - - return $style->apply($this->format($match[2])); - } - - /** - * Tries to create new style instance from string. - * - * @param string $string - * - * @return Symfony\Component\Console\Format\FormatterStyle|Boolean false if string is not format string - */ - private function createStyleFromString($string) - { - if (!preg_match_all('/([^=]+)=([^;]+)(;|$)/', strtolower($string), $matches, PREG_SET_ORDER)) { - return false; - } - - $style = new OutputFormatterStyle(); - foreach ($matches as $match) { - array_shift($match); - - if ('fg' == $match[0]) { - $style->setForeground($match[1]); - } elseif ('bg' == $match[0]) { - $style->setBackground($match[1]); - } else { - $style->setOption($match[1]); - } - } - - return $style; - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Formatter/OutputFormatterInterface.php b/laravel/vendor/Symfony/Component/Console/Formatter/OutputFormatterInterface.php deleted file mode 100644 index f14657ce..00000000 --- a/laravel/vendor/Symfony/Component/Console/Formatter/OutputFormatterInterface.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter interface for console output. - * - * @author Konstantin Kudryashov - * - * @api - */ -interface OutputFormatterInterface -{ - /** - * Sets the decorated flag. - * - * @param Boolean $decorated Whether to decorate the messages or not - * - * @api - */ - function setDecorated($decorated); - - /** - * Gets the decorated flag. - * - * @return Boolean true if the output will decorate messages, false otherwise - * - * @api - */ - function isDecorated(); - - /** - * Sets a new style. - * - * @param string $name The style name - * @param OutputFormatterStyleInterface $style The style instance - * - * @api - */ - function setStyle($name, OutputFormatterStyleInterface $style); - - /** - * Checks if output formatter has style with specified name. - * - * @param string $name - * - * @return Boolean - * - * @api - */ - function hasStyle($name); - - /** - * Gets style options from style with specified name. - * - * @param string $name - * - * @return OutputFormatterStyleInterface - * - * @api - */ - function getStyle($name); - - /** - * Formats a message according to the given styles. - * - * @param string $message The message to style - * - * @return string The styled message - * - * @api - */ - function format($message); -} diff --git a/laravel/vendor/Symfony/Component/Console/Formatter/OutputFormatterStyle.php b/laravel/vendor/Symfony/Component/Console/Formatter/OutputFormatterStyle.php deleted file mode 100644 index dc88f2a8..00000000 --- a/laravel/vendor/Symfony/Component/Console/Formatter/OutputFormatterStyle.php +++ /dev/null @@ -1,218 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter style class for defining styles. - * - * @author Konstantin Kudryashov - * - * @api - */ -class OutputFormatterStyle implements OutputFormatterStyleInterface -{ - static private $availableForegroundColors = array( - 'black' => 30, - 'red' => 31, - 'green' => 32, - 'yellow' => 33, - 'blue' => 34, - 'magenta' => 35, - 'cyan' => 36, - 'white' => 37 - ); - static private $availableBackgroundColors = array( - 'black' => 40, - 'red' => 41, - 'green' => 42, - 'yellow' => 43, - 'blue' => 44, - 'magenta' => 45, - 'cyan' => 46, - 'white' => 47 - ); - static private $availableOptions = array( - 'bold' => 1, - 'underscore' => 4, - 'blink' => 5, - 'reverse' => 7, - 'conceal' => 8 - ); - - private $foreground; - private $background; - private $options = array(); - - /** - * Initializes output formatter style. - * - * @param string $foreground style foreground color name - * @param string $background style background color name - * @param array $options style options - * - * @api - */ - public function __construct($foreground = null, $background = null, array $options = array()) - { - if (null !== $foreground) { - $this->setForeground($foreground); - } - if (null !== $background) { - $this->setBackground($background); - } - if (count($options)) { - $this->setOptions($options); - } - } - - /** - * Sets style foreground color. - * - * @param string $color color name - * - * @throws \InvalidArgumentException When the color name isn't defined - * - * @api - */ - public function setForeground($color = null) - { - if (null === $color) { - $this->foreground = null; - - return; - } - - if (!isset(static::$availableForegroundColors[$color])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid foreground color specified: "%s". Expected one of (%s)', - $color, - implode(', ', array_keys(static::$availableForegroundColors)) - )); - } - - $this->foreground = static::$availableForegroundColors[$color]; - } - - /** - * Sets style background color. - * - * @param string $color color name - * - * @throws \InvalidArgumentException When the color name isn't defined - * - * @api - */ - public function setBackground($color = null) - { - if (null === $color) { - $this->background = null; - - return; - } - - if (!isset(static::$availableBackgroundColors[$color])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid background color specified: "%s". Expected one of (%s)', - $color, - implode(', ', array_keys(static::$availableBackgroundColors)) - )); - } - - $this->background = static::$availableBackgroundColors[$color]; - } - - /** - * Sets some specific style option. - * - * @param string $option option name - * - * @throws \InvalidArgumentException When the option name isn't defined - * - * @api - */ - public function setOption($option) - { - if (!isset(static::$availableOptions[$option])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid option specified: "%s". Expected one of (%s)', - $option, - implode(', ', array_keys(static::$availableOptions)) - )); - } - - if (false === array_search(static::$availableOptions[$option], $this->options)) { - $this->options[] = static::$availableOptions[$option]; - } - } - - /** - * Unsets some specific style option. - * - * @param string $option option name - * - * @throws \InvalidArgumentException When the option name isn't defined - * - */ - public function unsetOption($option) - { - if (!isset(static::$availableOptions[$option])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid option specified: "%s". Expected one of (%s)', - $option, - implode(', ', array_keys(static::$availableOptions)) - )); - } - - $pos = array_search(static::$availableOptions[$option], $this->options); - if (false !== $pos) { - unset($this->options[$pos]); - } - } - - /** - * Sets multiple style options at once. - * - * @param array $options - */ - public function setOptions(array $options) - { - $this->options = array(); - - foreach ($options as $option) { - $this->setOption($option); - } - } - - /** - * Applies the style to a given text. - * - * @param string $text The text to style - * - * @return string - */ - public function apply($text) - { - $codes = array(); - - if (null !== $this->foreground) { - $codes[] = $this->foreground; - } - if (null !== $this->background) { - $codes[] = $this->background; - } - if (count($this->options)) { - $codes = array_merge($codes, $this->options); - } - - return sprintf("\033[%sm%s\033[0m", implode(';', $codes), $text); - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php b/laravel/vendor/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php deleted file mode 100644 index 212cb86f..00000000 --- a/laravel/vendor/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter style interface for defining styles. - * - * @author Konstantin Kudryashov - * - * @api - */ -interface OutputFormatterStyleInterface -{ - /** - * Sets style foreground color. - * - * @param string $color color name - * - * @api - */ - function setForeground($color = null); - - /** - * Sets style background color. - * - * @param string $color color name - * - * @api - */ - function setBackground($color = null); - - /** - * Sets some specific style option. - * - * @param string $option option name - * - * @api - */ - function setOption($option); - - /** - * Unsets some specific style option. - * - * @param string $option option name - */ - function unsetOption($option); - - /** - * Sets multiple style options at once. - * - * @param array $options - */ - function setOptions(array $options); - - /** - * Applies the style to a given text. - * - * @param string $text The text to style - * - * @return string - */ - function apply($text); -} diff --git a/laravel/vendor/Symfony/Component/Console/Helper/DialogHelper.php b/laravel/vendor/Symfony/Component/Console/Helper/DialogHelper.php deleted file mode 100644 index e15fdd18..00000000 --- a/laravel/vendor/Symfony/Component/Console/Helper/DialogHelper.php +++ /dev/null @@ -1,139 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Output\OutputInterface; - -/** - * The Dialog class provides helpers to interact with the user. - * - * @author Fabien Potencier - */ -class DialogHelper extends Helper -{ - private $inputStream; - - /** - * Asks a question to the user. - * - * @param OutputInterface $output An Output instance - * @param string|array $question The question to ask - * @param string $default The default answer if none is given by the user - * - * @return string The user answer - * - * @throws \RuntimeException If there is no data to read in the input stream - */ - public function ask(OutputInterface $output, $question, $default = null) - { - $output->write($question); - - $ret = fgets($this->inputStream ?: STDIN, 4096); - if (false === $ret) { - throw new \RuntimeException('Aborted'); - } - $ret = trim($ret); - - return strlen($ret) > 0 ? $ret : $default; - } - - /** - * Asks a confirmation to the user. - * - * The question will be asked until the user answers by nothing, yes, or no. - * - * @param OutputInterface $output An Output instance - * @param string|array $question The question to ask - * @param Boolean $default The default answer if the user enters nothing - * - * @return Boolean true if the user has confirmed, false otherwise - */ - public function askConfirmation(OutputInterface $output, $question, $default = true) - { - $answer = 'z'; - while ($answer && !in_array(strtolower($answer[0]), array('y', 'n'))) { - $answer = $this->ask($output, $question); - } - - if (false === $default) { - return $answer && 'y' == strtolower($answer[0]); - } - - return !$answer || 'y' == strtolower($answer[0]); - } - - /** - * Asks for a value and validates the response. - * - * The validator receives the data to validate. It must return the - * validated data when the data is valid and throw an exception - * otherwise. - * - * @param OutputInterface $output An Output instance - * @param string|array $question The question to ask - * @param callback $validator A PHP callback - * @param integer $attempts Max number of times to ask before giving up (false by default, which means infinite) - * @param string $default The default answer if none is given by the user - * - * @return mixed - * - * @throws \Exception When any of the validators return an error - */ - public function askAndValidate(OutputInterface $output, $question, $validator, $attempts = false, $default = null) - { - $error = null; - while (false === $attempts || $attempts--) { - if (null !== $error) { - $output->writeln($this->getHelperSet()->get('formatter')->formatBlock($error->getMessage(), 'error')); - } - - $value = $this->ask($output, $question, $default); - - try { - return call_user_func($validator, $value); - } catch (\Exception $error) { - } - } - - throw $error; - } - - /** - * Sets the input stream to read from when interacting with the user. - * - * This is mainly useful for testing purpose. - * - * @param resource $stream The input stream - */ - public function setInputStream($stream) - { - $this->inputStream = $stream; - } - - /** - * Returns the helper's input stream - * - * @return string - */ - public function getInputStream() - { - return $this->inputStream; - } - - /** - * Returns the helper's canonical name. - */ - public function getName() - { - return 'dialog'; - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Helper/FormatterHelper.php b/laravel/vendor/Symfony/Component/Console/Helper/FormatterHelper.php deleted file mode 100644 index d3f613bb..00000000 --- a/laravel/vendor/Symfony/Component/Console/Helper/FormatterHelper.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * The Formatter class provides helpers to format messages. - * - * @author Fabien Potencier - */ -class FormatterHelper extends Helper -{ - /** - * Formats a message within a section. - * - * @param string $section The section name - * @param string $message The message - * @param string $style The style to apply to the section - */ - public function formatSection($section, $message, $style = 'info') - { - return sprintf('<%s>[%s] %s', $style, $section, $style, $message); - } - - /** - * Formats a message as a block of text. - * - * @param string|array $messages The message to write in the block - * @param string $style The style to apply to the whole block - * @param Boolean $large Whether to return a large block - * - * @return string The formatter message - */ - public function formatBlock($messages, $style, $large = false) - { - $messages = (array) $messages; - - $len = 0; - $lines = array(); - foreach ($messages as $message) { - $lines[] = sprintf($large ? ' %s ' : ' %s ', $message); - $len = max($this->strlen($message) + ($large ? 4 : 2), $len); - } - - $messages = $large ? array(str_repeat(' ', $len)) : array(); - foreach ($lines as $line) { - $messages[] = $line.str_repeat(' ', $len - $this->strlen($line)); - } - if ($large) { - $messages[] = str_repeat(' ', $len); - } - - foreach ($messages as &$message) { - $message = sprintf('<%s>%s', $style, $message, $style); - } - - return implode("\n", $messages); - } - - /** - * Returns the length of a string, using mb_strlen if it is available. - * - * @param string $string The string to check its length - * - * @return integer The length of the string - */ - private function strlen($string) - { - if (!function_exists('mb_strlen')) { - return strlen($string); - } - - if (false === $encoding = mb_detect_encoding($string)) { - return strlen($string); - } - - return mb_strlen($string, $encoding); - } - - /** - * Returns the helper's canonical name. - * - * @return string The canonical name of the helper - */ - public function getName() - { - return 'formatter'; - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Helper/Helper.php b/laravel/vendor/Symfony/Component/Console/Helper/Helper.php deleted file mode 100644 index 28488caf..00000000 --- a/laravel/vendor/Symfony/Component/Console/Helper/Helper.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * Helper is the base class for all helper classes. - * - * @author Fabien Potencier - */ -abstract class Helper implements HelperInterface -{ - protected $helperSet = null; - - /** - * Sets the helper set associated with this helper. - * - * @param HelperSet $helperSet A HelperSet instance - */ - public function setHelperSet(HelperSet $helperSet = null) - { - $this->helperSet = $helperSet; - } - - /** - * Gets the helper set associated with this helper. - * - * @return HelperSet A HelperSet instance - */ - public function getHelperSet() - { - return $this->helperSet; - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Helper/HelperInterface.php b/laravel/vendor/Symfony/Component/Console/Helper/HelperInterface.php deleted file mode 100644 index 25ee5139..00000000 --- a/laravel/vendor/Symfony/Component/Console/Helper/HelperInterface.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * HelperInterface is the interface all helpers must implement. - * - * @author Fabien Potencier - * - * @api - */ -interface HelperInterface -{ - /** - * Sets the helper set associated with this helper. - * - * @param HelperSet $helperSet A HelperSet instance - * - * @api - */ - function setHelperSet(HelperSet $helperSet = null); - - /** - * Gets the helper set associated with this helper. - * - * @return HelperSet A HelperSet instance - * - * @api - */ - function getHelperSet(); - - /** - * Returns the canonical name of this helper. - * - * @return string The canonical name - * - * @api - */ - function getName(); -} diff --git a/laravel/vendor/Symfony/Component/Console/Helper/HelperSet.php b/laravel/vendor/Symfony/Component/Console/Helper/HelperSet.php deleted file mode 100644 index 0092c4c3..00000000 --- a/laravel/vendor/Symfony/Component/Console/Helper/HelperSet.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Command\Command; - -/** - * HelperSet represents a set of helpers to be used with a command. - * - * @author Fabien Potencier - */ -class HelperSet -{ - private $helpers; - private $command; - - /** - * Constructor. - * - * @param Helper[] $helpers An array of helper. - */ - public function __construct(array $helpers = array()) - { - $this->helpers = array(); - foreach ($helpers as $alias => $helper) { - $this->set($helper, is_int($alias) ? null : $alias); - } - } - - /** - * Sets a helper. - * - * @param HelperInterface $helper The helper instance - * @param string $alias An alias - */ - public function set(HelperInterface $helper, $alias = null) - { - $this->helpers[$helper->getName()] = $helper; - if (null !== $alias) { - $this->helpers[$alias] = $helper; - } - - $helper->setHelperSet($this); - } - - /** - * Returns true if the helper if defined. - * - * @param string $name The helper name - * - * @return Boolean true if the helper is defined, false otherwise - */ - public function has($name) - { - return isset($this->helpers[$name]); - } - - /** - * Gets a helper value. - * - * @param string $name The helper name - * - * @return HelperInterface The helper instance - * - * @throws \InvalidArgumentException if the helper is not defined - */ - public function get($name) - { - if (!$this->has($name)) { - throw new \InvalidArgumentException(sprintf('The helper "%s" is not defined.', $name)); - } - - return $this->helpers[$name]; - } - - /** - * Sets the command associated with this helper set. - * - * @param Command $command A Command instance - */ - public function setCommand(Command $command = null) - { - $this->command = $command; - } - - /** - * Gets the command associated with this helper set. - * - * @return Command A Command instance - */ - public function getCommand() - { - return $this->command; - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Input/ArgvInput.php b/laravel/vendor/Symfony/Component/Console/Input/ArgvInput.php deleted file mode 100644 index f0cfb141..00000000 --- a/laravel/vendor/Symfony/Component/Console/Input/ArgvInput.php +++ /dev/null @@ -1,311 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * ArgvInput represents an input coming from the CLI arguments. - * - * Usage: - * - * $input = new ArgvInput(); - * - * By default, the `$_SERVER['argv']` array is used for the input values. - * - * This can be overridden by explicitly passing the input values in the constructor: - * - * $input = new ArgvInput($_SERVER['argv']); - * - * If you pass it yourself, don't forget that the first element of the array - * is the name of the running application. - * - * When passing an argument to the constructor, be sure that it respects - * the same rules as the argv one. It's almost always better to use the - * `StringInput` when you want to provide your own input. - * - * @author Fabien Potencier - * - * @see http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html - * @see http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02 - * - * @api - */ -class ArgvInput extends Input -{ - private $tokens; - private $parsed; - - /** - * Constructor. - * - * @param array $argv An array of parameters from the CLI (in the argv format) - * @param InputDefinition $definition A InputDefinition instance - * - * @api - */ - public function __construct(array $argv = null, InputDefinition $definition = null) - { - if (null === $argv) { - $argv = $_SERVER['argv']; - } - - // strip the application name - array_shift($argv); - - $this->tokens = $argv; - - parent::__construct($definition); - } - - protected function setTokens(array $tokens) - { - $this->tokens = $tokens; - } - - /** - * Processes command line arguments. - */ - protected function parse() - { - $parseOptions = true; - $this->parsed = $this->tokens; - while (null !== $token = array_shift($this->parsed)) { - if ($parseOptions && '--' == $token) { - $parseOptions = false; - } elseif ($parseOptions && 0 === strpos($token, '--')) { - $this->parseLongOption($token); - } elseif ($parseOptions && '-' === $token[0]) { - $this->parseShortOption($token); - } else { - $this->parseArgument($token); - } - } - } - - /** - * Parses a short option. - * - * @param string $token The current token. - */ - private function parseShortOption($token) - { - $name = substr($token, 1); - - if (strlen($name) > 1) { - if ($this->definition->hasShortcut($name[0]) && $this->definition->getOptionForShortcut($name[0])->acceptValue()) { - // an option with a value (with no space) - $this->addShortOption($name[0], substr($name, 1)); - } else { - $this->parseShortOptionSet($name); - } - } else { - $this->addShortOption($name, null); - } - } - - /** - * Parses a short option set. - * - * @param string $name The current token - * - * @throws \RuntimeException When option given doesn't exist - */ - private function parseShortOptionSet($name) - { - $len = strlen($name); - for ($i = 0; $i < $len; $i++) { - if (!$this->definition->hasShortcut($name[$i])) { - throw new \RuntimeException(sprintf('The "-%s" option does not exist.', $name[$i])); - } - - $option = $this->definition->getOptionForShortcut($name[$i]); - if ($option->acceptValue()) { - $this->addLongOption($option->getName(), $i === $len - 1 ? null : substr($name, $i + 1)); - - break; - } else { - $this->addLongOption($option->getName(), true); - } - } - } - - /** - * Parses a long option. - * - * @param string $token The current token - */ - private function parseLongOption($token) - { - $name = substr($token, 2); - - if (false !== $pos = strpos($name, '=')) { - $this->addLongOption(substr($name, 0, $pos), substr($name, $pos + 1)); - } else { - $this->addLongOption($name, null); - } - } - - /** - * Parses an argument. - * - * @param string $token The current token - * - * @throws \RuntimeException When too many arguments are given - */ - private function parseArgument($token) - { - $c = count($this->arguments); - - // if input is expecting another argument, add it - if ($this->definition->hasArgument($c)) { - $arg = $this->definition->getArgument($c); - $this->arguments[$arg->getName()] = $arg->isArray()? array($token) : $token; - - // if last argument isArray(), append token to last argument - } elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) { - $arg = $this->definition->getArgument($c - 1); - $this->arguments[$arg->getName()][] = $token; - - // unexpected argument - } else { - throw new \RuntimeException('Too many arguments.'); - } - } - - /** - * Adds a short option value. - * - * @param string $shortcut The short option key - * @param mixed $value The value for the option - * - * @throws \RuntimeException When option given doesn't exist - */ - private function addShortOption($shortcut, $value) - { - if (!$this->definition->hasShortcut($shortcut)) { - throw new \RuntimeException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); - } - - /** - * Adds a long option value. - * - * @param string $name The long option key - * @param mixed $value The value for the option - * - * @throws \RuntimeException When option given doesn't exist - */ - private function addLongOption($name, $value) - { - if (!$this->definition->hasOption($name)) { - throw new \RuntimeException(sprintf('The "--%s" option does not exist.', $name)); - } - - $option = $this->definition->getOption($name); - - if (null === $value && $option->acceptValue()) { - // if option accepts an optional or mandatory argument - // let's see if there is one provided - $next = array_shift($this->parsed); - if ('-' !== $next[0]) { - $value = $next; - } else { - array_unshift($this->parsed, $next); - } - } - - if (null === $value) { - if ($option->isValueRequired()) { - throw new \RuntimeException(sprintf('The "--%s" option requires a value.', $name)); - } - - $value = $option->isValueOptional() ? $option->getDefault() : true; - } - - if ($option->isArray()) { - $this->options[$name][] = $value; - } else { - $this->options[$name] = $value; - } - } - - /** - * Returns the first argument from the raw parameters (not parsed). - * - * @return string The value of the first argument or null otherwise - */ - public function getFirstArgument() - { - foreach ($this->tokens as $token) { - if ($token && '-' === $token[0]) { - continue; - } - - return $token; - } - } - - /** - * Returns true if the raw parameters (not parsed) contain a value. - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The value(s) to look for in the raw parameters (can be an array) - * - * @return Boolean true if the value is contained in the raw parameters - */ - public function hasParameterOption($values) - { - $values = (array) $values; - - foreach ($this->tokens as $v) { - if (in_array($v, $values)) { - return true; - } - } - - return false; - } - - /** - * Returns the value of a raw option (not parsed). - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The value(s) to look for in the raw parameters (can be an array) - * @param mixed $default The default value to return if no result is found - * - * @return mixed The option value - */ - public function getParameterOption($values, $default = false) - { - $values = (array) $values; - - $tokens = $this->tokens; - while ($token = array_shift($tokens)) { - foreach ($values as $value) { - if (0 === strpos($token, $value)) { - if (false !== $pos = strpos($token, '=')) { - return substr($token, $pos + 1); - } - - return array_shift($tokens); - } - } - } - - return $default; - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Input/ArrayInput.php b/laravel/vendor/Symfony/Component/Console/Input/ArrayInput.php deleted file mode 100644 index c9d8ee98..00000000 --- a/laravel/vendor/Symfony/Component/Console/Input/ArrayInput.php +++ /dev/null @@ -1,190 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * ArrayInput represents an input provided as an array. - * - * Usage: - * - * $input = new ArrayInput(array('name' => 'foo', '--bar' => 'foobar')); - * - * @author Fabien Potencier - * - * @api - */ -class ArrayInput extends Input -{ - private $parameters; - - /** - * Constructor. - * - * @param array $parameters An array of parameters - * @param InputDefinition $definition A InputDefinition instance - * - * @api - */ - public function __construct(array $parameters, InputDefinition $definition = null) - { - $this->parameters = $parameters; - - parent::__construct($definition); - } - - /** - * Returns the first argument from the raw parameters (not parsed). - * - * @return string The value of the first argument or null otherwise - */ - public function getFirstArgument() - { - foreach ($this->parameters as $key => $value) { - if ($key && '-' === $key[0]) { - continue; - } - - return $value; - } - } - - /** - * Returns true if the raw parameters (not parsed) contain a value. - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The values to look for in the raw parameters (can be an array) - * - * @return Boolean true if the value is contained in the raw parameters - */ - public function hasParameterOption($values) - { - $values = (array) $values; - - foreach ($this->parameters as $k => $v) { - if (!is_int($k)) { - $v = $k; - } - - if (in_array($v, $values)) { - return true; - } - } - - return false; - } - - /** - * Returns the value of a raw option (not parsed). - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The value(s) to look for in the raw parameters (can be an array) - * @param mixed $default The default value to return if no result is found - * - * @return mixed The option value - */ - public function getParameterOption($values, $default = false) - { - $values = (array) $values; - - foreach ($this->parameters as $k => $v) { - if (is_int($k) && in_array($v, $values)) { - return true; - } elseif (in_array($k, $values)) { - return $v; - } - } - - return $default; - } - - /** - * Processes command line arguments. - */ - protected function parse() - { - foreach ($this->parameters as $key => $value) { - if (0 === strpos($key, '--')) { - $this->addLongOption(substr($key, 2), $value); - } elseif ('-' === $key[0]) { - $this->addShortOption(substr($key, 1), $value); - } else { - $this->addArgument($key, $value); - } - } - } - - /** - * Adds a short option value. - * - * @param string $shortcut The short option key - * @param mixed $value The value for the option - * - * @throws \InvalidArgumentException When option given doesn't exist - */ - private function addShortOption($shortcut, $value) - { - if (!$this->definition->hasShortcut($shortcut)) { - throw new \InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); - } - - /** - * Adds a long option value. - * - * @param string $name The long option key - * @param mixed $value The value for the option - * - * @throws \InvalidArgumentException When option given doesn't exist - * @throws \InvalidArgumentException When a required value is missing - */ - private function addLongOption($name, $value) - { - if (!$this->definition->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name)); - } - - $option = $this->definition->getOption($name); - - if (null === $value) { - if ($option->isValueRequired()) { - throw new \InvalidArgumentException(sprintf('The "--%s" option requires a value.', $name)); - } - - $value = $option->isValueOptional() ? $option->getDefault() : true; - } - - $this->options[$name] = $value; - } - - /** - * Adds an argument value. - * - * @param string $name The argument name - * @param mixed $value The value for the argument - * - * @throws \InvalidArgumentException When argument given doesn't exist - */ - private function addArgument($name, $value) - { - if (!$this->definition->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $this->arguments[$name] = $value; - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Input/Input.php b/laravel/vendor/Symfony/Component/Console/Input/Input.php deleted file mode 100644 index 70291be7..00000000 --- a/laravel/vendor/Symfony/Component/Console/Input/Input.php +++ /dev/null @@ -1,211 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * Input is the base class for all concrete Input classes. - * - * Three concrete classes are provided by default: - * - * * `ArgvInput`: The input comes from the CLI arguments (argv) - * * `StringInput`: The input is provided as a string - * * `ArrayInput`: The input is provided as an array - * - * @author Fabien Potencier - */ -abstract class Input implements InputInterface -{ - protected $definition; - protected $options; - protected $arguments; - protected $interactive = true; - - /** - * Constructor. - * - * @param InputDefinition $definition A InputDefinition instance - */ - public function __construct(InputDefinition $definition = null) - { - if (null === $definition) { - $this->definition = new InputDefinition(); - } else { - $this->bind($definition); - $this->validate(); - } - } - - /** - * Binds the current Input instance with the given arguments and options. - * - * @param InputDefinition $definition A InputDefinition instance - */ - public function bind(InputDefinition $definition) - { - $this->arguments = array(); - $this->options = array(); - $this->definition = $definition; - - $this->parse(); - } - - /** - * Processes command line arguments. - */ - abstract protected function parse(); - - /** - * Validates the input. - * - * @throws \RuntimeException When not enough arguments are given - */ - public function validate() - { - if (count($this->arguments) < $this->definition->getArgumentRequiredCount()) { - throw new \RuntimeException('Not enough arguments.'); - } - } - - /** - * Checks if the input is interactive. - * - * @return Boolean Returns true if the input is interactive - */ - public function isInteractive() - { - return $this->interactive; - } - - /** - * Sets the input interactivity. - * - * @param Boolean $interactive If the input should be interactive - */ - public function setInteractive($interactive) - { - $this->interactive = (Boolean) $interactive; - } - - /** - * Returns the argument values. - * - * @return array An array of argument values - */ - public function getArguments() - { - return array_merge($this->definition->getArgumentDefaults(), $this->arguments); - } - - /** - * Returns the argument value for a given argument name. - * - * @param string $name The argument name - * - * @return mixed The argument value - * - * @throws \InvalidArgumentException When argument given doesn't exist - */ - public function getArgument($name) - { - if (!$this->definition->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - return isset($this->arguments[$name]) ? $this->arguments[$name] : $this->definition->getArgument($name)->getDefault(); - } - - /** - * Sets an argument value by name. - * - * @param string $name The argument name - * @param string $value The argument value - * - * @throws \InvalidArgumentException When argument given doesn't exist - */ - public function setArgument($name, $value) - { - if (!$this->definition->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $this->arguments[$name] = $value; - } - - /** - * Returns true if an InputArgument object exists by name or position. - * - * @param string|integer $name The InputArgument name or position - * - * @return Boolean true if the InputArgument object exists, false otherwise - */ - public function hasArgument($name) - { - return $this->definition->hasArgument($name); - } - - /** - * Returns the options values. - * - * @return array An array of option values - */ - public function getOptions() - { - return array_merge($this->definition->getOptionDefaults(), $this->options); - } - - /** - * Returns the option value for a given option name. - * - * @param string $name The option name - * - * @return mixed The option value - * - * @throws \InvalidArgumentException When option given doesn't exist - */ - public function getOption($name) - { - if (!$this->definition->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" option does not exist.', $name)); - } - - return isset($this->options[$name]) ? $this->options[$name] : $this->definition->getOption($name)->getDefault(); - } - - /** - * Sets an option value by name. - * - * @param string $name The option name - * @param string $value The option value - * - * @throws \InvalidArgumentException When option given doesn't exist - */ - public function setOption($name, $value) - { - if (!$this->definition->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" option does not exist.', $name)); - } - - $this->options[$name] = $value; - } - - /** - * Returns true if an InputOption object exists by name. - * - * @param string $name The InputOption name - * - * @return Boolean true if the InputOption object exists, false otherwise - */ - public function hasOption($name) - { - return $this->definition->hasOption($name); - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Input/InputArgument.php b/laravel/vendor/Symfony/Component/Console/Input/InputArgument.php deleted file mode 100644 index e7cc9353..00000000 --- a/laravel/vendor/Symfony/Component/Console/Input/InputArgument.php +++ /dev/null @@ -1,132 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * Represents a command line argument. - * - * @author Fabien Potencier - * - * @api - */ -class InputArgument -{ - const REQUIRED = 1; - const OPTIONAL = 2; - const IS_ARRAY = 4; - - private $name; - private $mode; - private $default; - private $description; - - /** - * Constructor. - * - * @param string $name The argument name - * @param integer $mode The argument mode: self::REQUIRED or self::OPTIONAL - * @param string $description A description text - * @param mixed $default The default value (for self::OPTIONAL mode only) - * - * @throws \InvalidArgumentException When argument mode is not valid - * - * @api - */ - public function __construct($name, $mode = null, $description = '', $default = null) - { - if (null === $mode) { - $mode = self::OPTIONAL; - } elseif (!is_int($mode) || $mode > 7 || $mode < 1) { - throw new \InvalidArgumentException(sprintf('Argument mode "%s" is not valid.', $mode)); - } - - $this->name = $name; - $this->mode = $mode; - $this->description = $description; - - $this->setDefault($default); - } - - /** - * Returns the argument name. - * - * @return string The argument name - */ - public function getName() - { - return $this->name; - } - - /** - * Returns true if the argument is required. - * - * @return Boolean true if parameter mode is self::REQUIRED, false otherwise - */ - public function isRequired() - { - return self::REQUIRED === (self::REQUIRED & $this->mode); - } - - /** - * Returns true if the argument can take multiple values. - * - * @return Boolean true if mode is self::IS_ARRAY, false otherwise - */ - public function isArray() - { - return self::IS_ARRAY === (self::IS_ARRAY & $this->mode); - } - - /** - * Sets the default value. - * - * @param mixed $default The default value - * - * @throws \LogicException When incorrect default value is given - */ - public function setDefault($default = null) - { - if (self::REQUIRED === $this->mode && null !== $default) { - throw new \LogicException('Cannot set a default value except for Parameter::OPTIONAL mode.'); - } - - if ($this->isArray()) { - if (null === $default) { - $default = array(); - } elseif (!is_array($default)) { - throw new \LogicException('A default value for an array argument must be an array.'); - } - } - - $this->default = $default; - } - - /** - * Returns the default value. - * - * @return mixed The default value - */ - public function getDefault() - { - return $this->default; - } - - /** - * Returns the description text. - * - * @return string The description text - */ - public function getDescription() - { - return $this->description; - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Input/InputDefinition.php b/laravel/vendor/Symfony/Component/Console/Input/InputDefinition.php deleted file mode 100644 index ffae4fe9..00000000 --- a/laravel/vendor/Symfony/Component/Console/Input/InputDefinition.php +++ /dev/null @@ -1,533 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * A InputDefinition represents a set of valid command line arguments and options. - * - * Usage: - * - * $definition = new InputDefinition(array( - * new InputArgument('name', InputArgument::REQUIRED), - * new InputOption('foo', 'f', InputOption::VALUE_REQUIRED), - * )); - * - * @author Fabien Potencier - * - * @api - */ -class InputDefinition -{ - private $arguments; - private $requiredCount; - private $hasAnArrayArgument = false; - private $hasOptional; - private $options; - private $shortcuts; - - /** - * Constructor. - * - * @param array $definition An array of InputArgument and InputOption instance - * - * @api - */ - public function __construct(array $definition = array()) - { - $this->setDefinition($definition); - } - - /** - * Sets the definition of the input. - * - * @param array $definition The definition array - * - * @api - */ - public function setDefinition(array $definition) - { - $arguments = array(); - $options = array(); - foreach ($definition as $item) { - if ($item instanceof InputOption) { - $options[] = $item; - } else { - $arguments[] = $item; - } - } - - $this->setArguments($arguments); - $this->setOptions($options); - } - - /** - * Sets the InputArgument objects. - * - * @param array $arguments An array of InputArgument objects - * - * @api - */ - public function setArguments($arguments = array()) - { - $this->arguments = array(); - $this->requiredCount = 0; - $this->hasOptional = false; - $this->hasAnArrayArgument = false; - $this->addArguments($arguments); - } - - /** - * Adds an array of InputArgument objects. - * - * @param InputArgument[] $arguments An array of InputArgument objects - * - * @api - */ - public function addArguments($arguments = array()) - { - if (null !== $arguments) { - foreach ($arguments as $argument) { - $this->addArgument($argument); - } - } - } - - /** - * Adds an InputArgument object. - * - * @param InputArgument $argument An InputArgument object - * - * @throws \LogicException When incorrect argument is given - * - * @api - */ - public function addArgument(InputArgument $argument) - { - if (isset($this->arguments[$argument->getName()])) { - throw new \LogicException(sprintf('An argument with name "%s" already exist.', $argument->getName())); - } - - if ($this->hasAnArrayArgument) { - throw new \LogicException('Cannot add an argument after an array argument.'); - } - - if ($argument->isRequired() && $this->hasOptional) { - throw new \LogicException('Cannot add a required argument after an optional one.'); - } - - if ($argument->isArray()) { - $this->hasAnArrayArgument = true; - } - - if ($argument->isRequired()) { - ++$this->requiredCount; - } else { - $this->hasOptional = true; - } - - $this->arguments[$argument->getName()] = $argument; - } - - /** - * Returns an InputArgument by name or by position. - * - * @param string|integer $name The InputArgument name or position - * - * @return InputArgument An InputArgument object - * - * @throws \InvalidArgumentException When argument given doesn't exist - * - * @api - */ - public function getArgument($name) - { - $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments; - - if (!$this->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - return $arguments[$name]; - } - - /** - * Returns true if an InputArgument object exists by name or position. - * - * @param string|integer $name The InputArgument name or position - * - * @return Boolean true if the InputArgument object exists, false otherwise - * - * @api - */ - public function hasArgument($name) - { - $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments; - - return isset($arguments[$name]); - } - - /** - * Gets the array of InputArgument objects. - * - * @return array An array of InputArgument objects - * - * @api - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * Returns the number of InputArguments. - * - * @return integer The number of InputArguments - */ - public function getArgumentCount() - { - return $this->hasAnArrayArgument ? PHP_INT_MAX : count($this->arguments); - } - - /** - * Returns the number of required InputArguments. - * - * @return integer The number of required InputArguments - */ - public function getArgumentRequiredCount() - { - return $this->requiredCount; - } - - /** - * Gets the default values. - * - * @return array An array of default values - */ - public function getArgumentDefaults() - { - $values = array(); - foreach ($this->arguments as $argument) { - $values[$argument->getName()] = $argument->getDefault(); - } - - return $values; - } - - /** - * Sets the InputOption objects. - * - * @param array $options An array of InputOption objects - * - * @api - */ - public function setOptions($options = array()) - { - $this->options = array(); - $this->shortcuts = array(); - $this->addOptions($options); - } - - /** - * Adds an array of InputOption objects. - * - * @param InputOption[] $options An array of InputOption objects - * - * @api - */ - public function addOptions($options = array()) - { - foreach ($options as $option) { - $this->addOption($option); - } - } - - /** - * Adds an InputOption object. - * - * @param InputOption $option An InputOption object - * - * @throws \LogicException When option given already exist - * - * @api - */ - public function addOption(InputOption $option) - { - if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) { - throw new \LogicException(sprintf('An option named "%s" already exist.', $option->getName())); - } elseif (isset($this->shortcuts[$option->getShortcut()]) && !$option->equals($this->options[$this->shortcuts[$option->getShortcut()]])) { - throw new \LogicException(sprintf('An option with shortcut "%s" already exist.', $option->getShortcut())); - } - - $this->options[$option->getName()] = $option; - if ($option->getShortcut()) { - $this->shortcuts[$option->getShortcut()] = $option->getName(); - } - } - - /** - * Returns an InputOption by name. - * - * @param string $name The InputOption name - * - * @return InputOption A InputOption object - * - * @api - */ - public function getOption($name) - { - if (!$this->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name)); - } - - return $this->options[$name]; - } - - /** - * Returns true if an InputOption object exists by name. - * - * @param string $name The InputOption name - * - * @return Boolean true if the InputOption object exists, false otherwise - * - * @api - */ - public function hasOption($name) - { - return isset($this->options[$name]); - } - - /** - * Gets the array of InputOption objects. - * - * @return array An array of InputOption objects - * - * @api - */ - public function getOptions() - { - return $this->options; - } - - /** - * Returns true if an InputOption object exists by shortcut. - * - * @param string $name The InputOption shortcut - * - * @return Boolean true if the InputOption object exists, false otherwise - */ - public function hasShortcut($name) - { - return isset($this->shortcuts[$name]); - } - - /** - * Gets an InputOption by shortcut. - * - * @param string $shortcut the Shortcut name - * - * @return InputOption An InputOption object - */ - public function getOptionForShortcut($shortcut) - { - return $this->getOption($this->shortcutToName($shortcut)); - } - - /** - * Gets an array of default values. - * - * @return array An array of all default values - */ - public function getOptionDefaults() - { - $values = array(); - foreach ($this->options as $option) { - $values[$option->getName()] = $option->getDefault(); - } - - return $values; - } - - /** - * Returns the InputOption name given a shortcut. - * - * @param string $shortcut The shortcut - * - * @return string The InputOption name - * - * @throws \InvalidArgumentException When option given does not exist - */ - private function shortcutToName($shortcut) - { - if (!isset($this->shortcuts[$shortcut])) { - throw new \InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - return $this->shortcuts[$shortcut]; - } - - /** - * Gets the synopsis. - * - * @return string The synopsis - */ - public function getSynopsis() - { - $elements = array(); - foreach ($this->getOptions() as $option) { - $shortcut = $option->getShortcut() ? sprintf('-%s|', $option->getShortcut()) : ''; - $elements[] = sprintf('['.($option->isValueRequired() ? '%s--%s="..."' : ($option->isValueOptional() ? '%s--%s[="..."]' : '%s--%s')).']', $shortcut, $option->getName()); - } - - foreach ($this->getArguments() as $argument) { - $elements[] = sprintf($argument->isRequired() ? '%s' : '[%s]', $argument->getName().($argument->isArray() ? '1' : '')); - - if ($argument->isArray()) { - $elements[] = sprintf('... [%sN]', $argument->getName()); - } - } - - return implode(' ', $elements); - } - - /** - * Returns a textual representation of the InputDefinition. - * - * @return string A string representing the InputDefinition - */ - public function asText() - { - // find the largest option or argument name - $max = 0; - foreach ($this->getOptions() as $option) { - $nameLength = strlen($option->getName()) + 2; - if ($option->getShortcut()) { - $nameLength += strlen($option->getShortcut()) + 3; - } - - $max = max($max, $nameLength); - } - foreach ($this->getArguments() as $argument) { - $max = max($max, strlen($argument->getName())); - } - ++$max; - - $text = array(); - - if ($this->getArguments()) { - $text[] = 'Arguments:'; - foreach ($this->getArguments() as $argument) { - if (null !== $argument->getDefault() && (!is_array($argument->getDefault()) || count($argument->getDefault()))) { - $default = sprintf(' (default: %s)', $this->formatDefaultValue($argument->getDefault())); - } else { - $default = ''; - } - - $description = str_replace("\n", "\n".str_pad('', $max + 2, ' '), $argument->getDescription()); - - $text[] = sprintf(" %-${max}s %s%s", $argument->getName(), $description, $default); - } - - $text[] = ''; - } - - if ($this->getOptions()) { - $text[] = 'Options:'; - - foreach ($this->getOptions() as $option) { - if ($option->acceptValue() && null !== $option->getDefault() && (!is_array($option->getDefault()) || count($option->getDefault()))) { - $default = sprintf(' (default: %s)', $this->formatDefaultValue($option->getDefault())); - } else { - $default = ''; - } - - $multiple = $option->isArray() ? ' (multiple values allowed)' : ''; - $description = str_replace("\n", "\n".str_pad('', $max + 2, ' '), $option->getDescription()); - - $optionMax = $max - strlen($option->getName()) - 2; - $text[] = sprintf(" %s %-${optionMax}s%s%s%s", - '--'.$option->getName(), - $option->getShortcut() ? sprintf('(-%s) ', $option->getShortcut()) : '', - $description, - $default, - $multiple - ); - } - - $text[] = ''; - } - - return implode("\n", $text); - } - - /** - * Returns an XML representation of the InputDefinition. - * - * @param Boolean $asDom Whether to return a DOM or an XML string - * - * @return string|DOMDocument An XML string representing the InputDefinition - */ - public function asXml($asDom = false) - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->formatOutput = true; - $dom->appendChild($definitionXML = $dom->createElement('definition')); - - $definitionXML->appendChild($argumentsXML = $dom->createElement('arguments')); - foreach ($this->getArguments() as $argument) { - $argumentsXML->appendChild($argumentXML = $dom->createElement('argument')); - $argumentXML->setAttribute('name', $argument->getName()); - $argumentXML->setAttribute('is_required', $argument->isRequired() ? 1 : 0); - $argumentXML->setAttribute('is_array', $argument->isArray() ? 1 : 0); - $argumentXML->appendChild($descriptionXML = $dom->createElement('description')); - $descriptionXML->appendChild($dom->createTextNode($argument->getDescription())); - - $argumentXML->appendChild($defaultsXML = $dom->createElement('defaults')); - $defaults = is_array($argument->getDefault()) ? $argument->getDefault() : (is_bool($argument->getDefault()) ? array(var_export($argument->getDefault(), true)) : ($argument->getDefault() ? array($argument->getDefault()) : array())); - foreach ($defaults as $default) { - $defaultsXML->appendChild($defaultXML = $dom->createElement('default')); - $defaultXML->appendChild($dom->createTextNode($default)); - } - } - - $definitionXML->appendChild($optionsXML = $dom->createElement('options')); - foreach ($this->getOptions() as $option) { - $optionsXML->appendChild($optionXML = $dom->createElement('option')); - $optionXML->setAttribute('name', '--'.$option->getName()); - $optionXML->setAttribute('shortcut', $option->getShortcut() ? '-'.$option->getShortcut() : ''); - $optionXML->setAttribute('accept_value', $option->acceptValue() ? 1 : 0); - $optionXML->setAttribute('is_value_required', $option->isValueRequired() ? 1 : 0); - $optionXML->setAttribute('is_multiple', $option->isArray() ? 1 : 0); - $optionXML->appendChild($descriptionXML = $dom->createElement('description')); - $descriptionXML->appendChild($dom->createTextNode($option->getDescription())); - - if ($option->acceptValue()) { - $optionXML->appendChild($defaultsXML = $dom->createElement('defaults')); - $defaults = is_array($option->getDefault()) ? $option->getDefault() : (is_bool($option->getDefault()) ? array(var_export($option->getDefault(), true)) : ($option->getDefault() ? array($option->getDefault()) : array())); - foreach ($defaults as $default) { - $defaultsXML->appendChild($defaultXML = $dom->createElement('default')); - $defaultXML->appendChild($dom->createTextNode($default)); - } - } - } - - return $asDom ? $dom : $dom->saveXml(); - } - - private function formatDefaultValue($default) - { - if (is_array($default) && $default === array_values($default)) { - return sprintf("array('%s')", implode("', '", $default)); - } - - return str_replace("\n", '', var_export($default, true)); - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Input/InputInterface.php b/laravel/vendor/Symfony/Component/Console/Input/InputInterface.php deleted file mode 100644 index a4a62234..00000000 --- a/laravel/vendor/Symfony/Component/Console/Input/InputInterface.php +++ /dev/null @@ -1,152 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * InputInterface is the interface implemented by all input classes. - * - * @author Fabien Potencier - */ -interface InputInterface -{ - /** - * Returns the first argument from the raw parameters (not parsed). - * - * @return string The value of the first argument or null otherwise - */ - function getFirstArgument(); - - /** - * Returns true if the raw parameters (not parsed) contain a value. - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The values to look for in the raw parameters (can be an array) - * - * @return Boolean true if the value is contained in the raw parameters - */ - function hasParameterOption($values); - - /** - * Returns the value of a raw option (not parsed). - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The value(s) to look for in the raw parameters (can be an array) - * @param mixed $default The default value to return if no result is found - * - * @return mixed The option value - */ - function getParameterOption($values, $default = false); - - /** - * Binds the current Input instance with the given arguments and options. - * - * @param InputDefinition $definition A InputDefinition instance - */ - function bind(InputDefinition $definition); - - /** - * Validates if arguments given are correct. - * - * Throws an exception when not enough arguments are given. - * - * @throws \RuntimeException - */ - function validate(); - - /** - * Returns all the given arguments merged with the default values. - * - * @return array - */ - function getArguments(); - - /** - * Gets argument by name. - * - * @param string $name The name of the argument - * - * @return mixed - */ - function getArgument($name); - - /** - * Sets an argument value by name. - * - * @param string $name The argument name - * @param string $value The argument value - * - * @throws \InvalidArgumentException When argument given doesn't exist - */ - function setArgument($name, $value); - - /** - * Returns true if an InputArgument object exists by name or position. - * - * @param string|integer $name The InputArgument name or position - * - * @return Boolean true if the InputArgument object exists, false otherwise - */ - function hasArgument($name); - - /** - * Returns all the given options merged with the default values. - * - * @return array - */ - function getOptions(); - - /** - * Gets an option by name. - * - * @param string $name The name of the option - * - * @return mixed - */ - function getOption($name); - - /** - * Sets an option value by name. - * - * @param string $name The option name - * @param string $value The option value - * - * @throws \InvalidArgumentException When option given doesn't exist - */ - function setOption($name, $value); - - /** - * Returns true if an InputOption object exists by name. - * - * @param string $name The InputOption name - * - * @return Boolean true if the InputOption object exists, false otherwise - */ - function hasOption($name); - - /** - * Is this input means interactive? - * - * @return Boolean - */ - function isInteractive(); - - /** - * Sets the input interactivity. - * - * @param Boolean $interactive If the input should be interactive - */ - function setInteractive($interactive); -} diff --git a/laravel/vendor/Symfony/Component/Console/Input/InputOption.php b/laravel/vendor/Symfony/Component/Console/Input/InputOption.php deleted file mode 100644 index 0f260455..00000000 --- a/laravel/vendor/Symfony/Component/Console/Input/InputOption.php +++ /dev/null @@ -1,201 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * Represents a command line option. - * - * @author Fabien Potencier - * - * @api - */ -class InputOption -{ - const VALUE_NONE = 1; - const VALUE_REQUIRED = 2; - const VALUE_OPTIONAL = 4; - const VALUE_IS_ARRAY = 8; - - private $name; - private $shortcut; - private $mode; - private $default; - private $description; - - /** - * Constructor. - * - * @param string $name The option name - * @param string $shortcut The shortcut (can be null) - * @param integer $mode The option mode: One of the VALUE_* constants - * @param string $description A description text - * @param mixed $default The default value (must be null for self::VALUE_REQUIRED or self::VALUE_NONE) - * - * @throws \InvalidArgumentException If option mode is invalid or incompatible - * - * @api - */ - public function __construct($name, $shortcut = null, $mode = null, $description = '', $default = null) - { - if (0 === strpos($name, '--')) { - $name = substr($name, 2); - } - - if (empty($shortcut)) { - $shortcut = null; - } - - if (null !== $shortcut) { - if ('-' === $shortcut[0]) { - $shortcut = substr($shortcut, 1); - } - } - - if (null === $mode) { - $mode = self::VALUE_NONE; - } elseif (!is_int($mode) || $mode > 15 || $mode < 1) { - throw new \InvalidArgumentException(sprintf('Option mode "%s" is not valid.', $mode)); - } - - $this->name = $name; - $this->shortcut = $shortcut; - $this->mode = $mode; - $this->description = $description; - - if ($this->isArray() && !$this->acceptValue()) { - throw new \InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.'); - } - - $this->setDefault($default); - } - - /** - * Returns the option shortcut. - * - * @return string The shortcut - */ - public function getShortcut() - { - return $this->shortcut; - } - - /** - * Returns the option name. - * - * @return string The name - */ - public function getName() - { - return $this->name; - } - - /** - * Returns true if the option accepts a value. - * - * @return Boolean true if value mode is not self::VALUE_NONE, false otherwise - */ - public function acceptValue() - { - return $this->isValueRequired() || $this->isValueOptional(); - } - - /** - * Returns true if the option requires a value. - * - * @return Boolean true if value mode is self::VALUE_REQUIRED, false otherwise - */ - public function isValueRequired() - { - return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode); - } - - /** - * Returns true if the option takes an optional value. - * - * @return Boolean true if value mode is self::VALUE_OPTIONAL, false otherwise - */ - public function isValueOptional() - { - return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode); - } - - /** - * Returns true if the option can take multiple values. - * - * @return Boolean true if mode is self::VALUE_IS_ARRAY, false otherwise - */ - public function isArray() - { - return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode); - } - - /** - * Sets the default value. - * - * @param mixed $default The default value - * - * @throws \LogicException When incorrect default value is given - */ - public function setDefault($default = null) - { - if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) { - throw new \LogicException('Cannot set a default value when using Option::VALUE_NONE mode.'); - } - - if ($this->isArray()) { - if (null === $default) { - $default = array(); - } elseif (!is_array($default)) { - throw new \LogicException('A default value for an array option must be an array.'); - } - } - - $this->default = $this->acceptValue() ? $default : false; - } - - /** - * Returns the default value. - * - * @return mixed The default value - */ - public function getDefault() - { - return $this->default; - } - - /** - * Returns the description text. - * - * @return string The description text - */ - public function getDescription() - { - return $this->description; - } - - /** - * Checks whether the given option equals this one - * - * @param InputOption $option option to compare - * @return Boolean - */ - public function equals(InputOption $option) - { - return $option->getName() === $this->getName() - && $option->getShortcut() === $this->getShortcut() - && $option->getDefault() === $this->getDefault() - && $option->isArray() === $this->isArray() - && $option->isValueRequired() === $this->isValueRequired() - && $option->isValueOptional() === $this->isValueOptional() - ; - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Input/StringInput.php b/laravel/vendor/Symfony/Component/Console/Input/StringInput.php deleted file mode 100644 index 72b725bd..00000000 --- a/laravel/vendor/Symfony/Component/Console/Input/StringInput.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * StringInput represents an input provided as a string. - * - * Usage: - * - * $input = new StringInput('foo --bar="foobar"'); - * - * @author Fabien Potencier - * - * @api - */ -class StringInput extends ArgvInput -{ - const REGEX_STRING = '([^ ]+?)(?: |(?setTokens($this->tokenize($input)); - } - - /** - * Tokenizes a string. - * - * @param string $input The input to tokenize - * - * @throws \InvalidArgumentException When unable to parse input (should never happen) - */ - private function tokenize($input) - { - $input = preg_replace('/(\r\n|\r|\n|\t)/', ' ', $input); - - $tokens = array(); - $length = strlen($input); - $cursor = 0; - while ($cursor < $length) { - if (preg_match('/\s+/A', $input, $match, null, $cursor)) { - } elseif (preg_match('/([^="\' ]+?)(=?)('.self::REGEX_QUOTED_STRING.'+)/A', $input, $match, null, $cursor)) { - $tokens[] = $match[1].$match[2].stripcslashes(str_replace(array('"\'', '\'"', '\'\'', '""'), '', substr($match[3], 1, strlen($match[3]) - 2))); - } elseif (preg_match('/'.self::REGEX_QUOTED_STRING.'/A', $input, $match, null, $cursor)) { - $tokens[] = stripcslashes(substr($match[0], 1, strlen($match[0]) - 2)); - } elseif (preg_match('/'.self::REGEX_STRING.'/A', $input, $match, null, $cursor)) { - $tokens[] = stripcslashes($match[1]); - } else { - // should never happen - // @codeCoverageIgnoreStart - throw new \InvalidArgumentException(sprintf('Unable to parse input near "... %s ..."', substr($input, $cursor, 10))); - // @codeCoverageIgnoreEnd - } - - $cursor += strlen($match[0]); - } - - return $tokens; - } -} diff --git a/laravel/vendor/Symfony/Component/Console/LICENSE b/laravel/vendor/Symfony/Component/Console/LICENSE deleted file mode 100644 index cdffe7ae..00000000 --- a/laravel/vendor/Symfony/Component/Console/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2012 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/laravel/vendor/Symfony/Component/Console/Output/ConsoleOutput.php b/laravel/vendor/Symfony/Component/Console/Output/ConsoleOutput.php deleted file mode 100644 index 1cce3326..00000000 --- a/laravel/vendor/Symfony/Component/Console/Output/ConsoleOutput.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Formatter\OutputFormatterInterface; -use Symfony\Component\Console\Output\ConsoleOutputInterface; - -/** - * ConsoleOutput is the default class for all CLI output. It uses STDOUT. - * - * This class is a convenient wrapper around `StreamOutput`. - * - * $output = new ConsoleOutput(); - * - * This is equivalent to: - * - * $output = new StreamOutput(fopen('php://stdout', 'w')); - * - * @author Fabien Potencier - * - * @api - */ -class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface -{ - private $stderr; - - /** - * Constructor. - * - * @param integer $verbosity The verbosity level (self::VERBOSITY_QUIET, self::VERBOSITY_NORMAL, - * self::VERBOSITY_VERBOSE) - * @param Boolean $decorated Whether to decorate messages or not (null for auto-guessing) - * @param OutputFormatter $formatter Output formatter instance - * - * @api - */ - public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null) - { - parent::__construct(fopen('php://stdout', 'w'), $verbosity, $decorated, $formatter); - $this->stderr = new StreamOutput(fopen('php://stderr', 'w'), $verbosity, $decorated, $formatter); - } - - public function setDecorated($decorated) - { - parent::setDecorated($decorated); - $this->stderr->setDecorated($decorated); - } - - public function setFormatter(OutputFormatterInterface $formatter) - { - parent::setFormatter($formatter); - $this->stderr->setFormatter($formatter); - } - - public function setVerbosity($level) - { - parent::setVerbosity($level); - $this->stderr->setVerbosity($level); - } - - /** - * @return OutputInterface - */ - public function getErrorOutput() - { - return $this->stderr; - } - - public function setErrorOutput(OutputInterface $error) - { - $this->stderr = $error; - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Output/ConsoleOutputInterface.php b/laravel/vendor/Symfony/Component/Console/Output/ConsoleOutputInterface.php deleted file mode 100644 index 5006b800..00000000 --- a/laravel/vendor/Symfony/Component/Console/Output/ConsoleOutputInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Output\OutputInterface; - -/** - * ConsoleOutputInterface is the interface implemented by ConsoleOutput class. - * This adds information about stderr output stream. - * - * @author Dariusz Górecki - */ -interface ConsoleOutputInterface extends OutputInterface -{ - /** - * @return OutputInterface - */ - public function getErrorOutput(); - - public function setErrorOutput(OutputInterface $error); -} diff --git a/laravel/vendor/Symfony/Component/Console/Output/NullOutput.php b/laravel/vendor/Symfony/Component/Console/Output/NullOutput.php deleted file mode 100644 index f6c99ab0..00000000 --- a/laravel/vendor/Symfony/Component/Console/Output/NullOutput.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -/** - * NullOutput suppresses all output. - * - * $output = new NullOutput(); - * - * @author Fabien Potencier - * - * @api - */ -class NullOutput extends Output -{ - /** - * Writes a message to the output. - * - * @param string $message A message to write to the output - * @param Boolean $newline Whether to add a newline or not - */ - public function doWrite($message, $newline) - { - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Output/Output.php b/laravel/vendor/Symfony/Component/Console/Output/Output.php deleted file mode 100644 index 22278801..00000000 --- a/laravel/vendor/Symfony/Component/Console/Output/Output.php +++ /dev/null @@ -1,180 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * Base class for output classes. - * - * There are three levels of verbosity: - * - * * normal: no option passed (normal output - information) - * * verbose: -v (more output - debug) - * * quiet: -q (no output) - * - * @author Fabien Potencier - * - * @api - */ -abstract class Output implements OutputInterface -{ - private $verbosity; - private $formatter; - - /** - * Constructor. - * - * @param integer $verbosity The verbosity level (self::VERBOSITY_QUIET, self::VERBOSITY_NORMAL, self::VERBOSITY_VERBOSE) - * @param Boolean $decorated Whether to decorate messages or not (null for auto-guessing) - * @param OutputFormatterInterface $formatter Output formatter instance - * - * @api - */ - public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null) - { - $this->verbosity = null === $verbosity ? self::VERBOSITY_NORMAL : $verbosity; - $this->formatter = null === $formatter ? new OutputFormatter() : $formatter; - $this->formatter->setDecorated((Boolean) $decorated); - } - - /** - * Sets output formatter. - * - * @param OutputFormatterInterface $formatter - * - * @api - */ - public function setFormatter(OutputFormatterInterface $formatter) - { - $this->formatter = $formatter; - } - - /** - * Returns current output formatter instance. - * - * @return OutputFormatterInterface - * - * @api - */ - public function getFormatter() - { - return $this->formatter; - } - - /** - * Sets the decorated flag. - * - * @param Boolean $decorated Whether to decorate the messages or not - * - * @api - */ - public function setDecorated($decorated) - { - $this->formatter->setDecorated((Boolean) $decorated); - } - - /** - * Gets the decorated flag. - * - * @return Boolean true if the output will decorate messages, false otherwise - * - * @api - */ - public function isDecorated() - { - return $this->formatter->isDecorated(); - } - - /** - * Sets the verbosity of the output. - * - * @param integer $level The level of verbosity - * - * @api - */ - public function setVerbosity($level) - { - $this->verbosity = (int) $level; - } - - /** - * Gets the current verbosity of the output. - * - * @return integer The current level of verbosity - * - * @api - */ - public function getVerbosity() - { - return $this->verbosity; - } - - /** - * Writes a message to the output and adds a newline at the end. - * - * @param string|array $messages The message as an array of lines of a single string - * @param integer $type The type of output - * - * @api - */ - public function writeln($messages, $type = 0) - { - $this->write($messages, true, $type); - } - - /** - * Writes a message to the output. - * - * @param string|array $messages The message as an array of lines of a single string - * @param Boolean $newline Whether to add a newline or not - * @param integer $type The type of output - * - * @throws \InvalidArgumentException When unknown output type is given - * - * @api - */ - public function write($messages, $newline = false, $type = 0) - { - if (self::VERBOSITY_QUIET === $this->verbosity) { - return; - } - - $messages = (array) $messages; - - foreach ($messages as $message) { - switch ($type) { - case OutputInterface::OUTPUT_NORMAL: - $message = $this->formatter->format($message); - break; - case OutputInterface::OUTPUT_RAW: - break; - case OutputInterface::OUTPUT_PLAIN: - $message = strip_tags($this->formatter->format($message)); - break; - default: - throw new \InvalidArgumentException(sprintf('Unknown output type given (%s)', $type)); - } - - $this->doWrite($message, $newline); - } - } - - /** - * Writes a message to the output. - * - * @param string $message A message to write to the output - * @param Boolean $newline Whether to add a newline or not - */ - abstract public function doWrite($message, $newline); -} diff --git a/laravel/vendor/Symfony/Component/Console/Output/OutputInterface.php b/laravel/vendor/Symfony/Component/Console/Output/OutputInterface.php deleted file mode 100644 index 8423d48c..00000000 --- a/laravel/vendor/Symfony/Component/Console/Output/OutputInterface.php +++ /dev/null @@ -1,109 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * OutputInterface is the interface implemented by all Output classes. - * - * @author Fabien Potencier - * - * @api - */ -interface OutputInterface -{ - const VERBOSITY_QUIET = 0; - const VERBOSITY_NORMAL = 1; - const VERBOSITY_VERBOSE = 2; - - const OUTPUT_NORMAL = 0; - const OUTPUT_RAW = 1; - const OUTPUT_PLAIN = 2; - - /** - * Writes a message to the output. - * - * @param string|array $messages The message as an array of lines of a single string - * @param Boolean $newline Whether to add a newline or not - * @param integer $type The type of output - * - * @throws \InvalidArgumentException When unknown output type is given - * - * @api - */ - function write($messages, $newline = false, $type = 0); - - /** - * Writes a message to the output and adds a newline at the end. - * - * @param string|array $messages The message as an array of lines of a single string - * @param integer $type The type of output - * - * @api - */ - function writeln($messages, $type = 0); - - /** - * Sets the verbosity of the output. - * - * @param integer $level The level of verbosity - * - * @api - */ - function setVerbosity($level); - - /** - * Gets the current verbosity of the output. - * - * @return integer The current level of verbosity - * - * @api - */ - function getVerbosity(); - - /** - * Sets the decorated flag. - * - * @param Boolean $decorated Whether to decorate the messages or not - * - * @api - */ - function setDecorated($decorated); - - /** - * Gets the decorated flag. - * - * @return Boolean true if the output will decorate messages, false otherwise - * - * @api - */ - function isDecorated(); - - /** - * Sets output formatter. - * - * @param OutputFormatterInterface $formatter - * - * @api - */ - function setFormatter(OutputFormatterInterface $formatter); - - /** - * Returns current output formatter instance. - * - * @return OutputFormatterInterface - * - * @api - */ - function getFormatter(); -} diff --git a/laravel/vendor/Symfony/Component/Console/Output/StreamOutput.php b/laravel/vendor/Symfony/Component/Console/Output/StreamOutput.php deleted file mode 100644 index de1720ff..00000000 --- a/laravel/vendor/Symfony/Component/Console/Output/StreamOutput.php +++ /dev/null @@ -1,113 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * StreamOutput writes the output to a given stream. - * - * Usage: - * - * $output = new StreamOutput(fopen('php://stdout', 'w')); - * - * As `StreamOutput` can use any stream, you can also use a file: - * - * $output = new StreamOutput(fopen('/path/to/output.log', 'a', false)); - * - * @author Fabien Potencier - * - * @api - */ -class StreamOutput extends Output -{ - private $stream; - - /** - * Constructor. - * - * @param mixed $stream A stream resource - * @param integer $verbosity The verbosity level (self::VERBOSITY_QUIET, self::VERBOSITY_NORMAL, - * self::VERBOSITY_VERBOSE) - * @param Boolean $decorated Whether to decorate messages or not (null for auto-guessing) - * @param OutputFormatter $formatter Output formatter instance - * - * @throws \InvalidArgumentException When first argument is not a real stream - * - * @api - */ - public function __construct($stream, $verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null) - { - if (!is_resource($stream) || 'stream' !== get_resource_type($stream)) { - throw new \InvalidArgumentException('The StreamOutput class needs a stream as its first argument.'); - } - - $this->stream = $stream; - - if (null === $decorated) { - $decorated = $this->hasColorSupport($decorated); - } - - parent::__construct($verbosity, $decorated, $formatter); - } - - /** - * Gets the stream attached to this StreamOutput instance. - * - * @return resource A stream resource - */ - public function getStream() - { - return $this->stream; - } - - /** - * Writes a message to the output. - * - * @param string $message A message to write to the output - * @param Boolean $newline Whether to add a newline or not - * - * @throws \RuntimeException When unable to write output (should never happen) - */ - public function doWrite($message, $newline) - { - if (false === @fwrite($this->stream, $message.($newline ? PHP_EOL : ''))) { - // @codeCoverageIgnoreStart - // should never happen - throw new \RuntimeException('Unable to write output.'); - // @codeCoverageIgnoreEnd - } - - fflush($this->stream); - } - - /** - * Returns true if the stream supports colorization. - * - * Colorization is disabled if not supported by the stream: - * - * - windows without ansicon - * - non tty consoles - * - * @return Boolean true if the stream supports colorization, false otherwise - */ - protected function hasColorSupport() - { - // @codeCoverageIgnoreStart - if (DIRECTORY_SEPARATOR == '\\') { - return false !== getenv('ANSICON'); - } - - return function_exists('posix_isatty') && @posix_isatty($this->stream); - // @codeCoverageIgnoreEnd - } -} diff --git a/laravel/vendor/Symfony/Component/Console/README.md b/laravel/vendor/Symfony/Component/Console/README.md deleted file mode 100644 index d903776a..00000000 --- a/laravel/vendor/Symfony/Component/Console/README.md +++ /dev/null @@ -1,48 +0,0 @@ -Console Component -================= - -Console eases the creation of beautiful and testable command line interfaces. - -The Application object manages the CLI application: - - use Symfony\Component\Console\Application; - - $console = new Application(); - $console->run(); - -The ``run()`` method parses the arguments and options passed on the command -line and executes the right command. - -Registering a new command can easily be done via the ``register()`` method, -which returns a ``Command`` instance: - - use Symfony\Component\Console\Input\InputInterface; - use Symfony\Component\Console\Input\InputArgument; - use Symfony\Component\Console\Input\InputOption; - use Symfony\Component\Console\Output\OutputInterface; - - $console - ->register('ls') - ->setDefinition(array( - new InputArgument('dir', InputArgument::REQUIRED, 'Directory name'), - )) - ->setDescription('Displays the files in the given directory') - ->setCode(function (InputInterface $input, OutputInterface $output) { - $dir = $input->getArgument('dir'); - - $output->writeln(sprintf('Dir listing for %s', $dir)); - }) - ; - -You can also register new commands via classes. - -The component provides a lot of features like output coloring, input and -output abstractions (so that you can easily unit-test your commands), -validation, automatic help messages, ... - -Resources ---------- - -Unit tests: - -https://github.com/symfony/symfony/tree/master/tests/Symfony/Tests/Component/Console diff --git a/laravel/vendor/Symfony/Component/Console/Shell.php b/laravel/vendor/Symfony/Component/Console/Shell.php deleted file mode 100644 index 6b89b048..00000000 --- a/laravel/vendor/Symfony/Component/Console/Shell.php +++ /dev/null @@ -1,206 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Input\StringInput; -use Symfony\Component\Console\Output\ConsoleOutput; -use Symfony\Component\Process\ProcessBuilder; -use Symfony\Component\Process\PhpExecutableFinder; - -/** - * A Shell wraps an Application to add shell capabilities to it. - * - * Support for history and completion only works with a PHP compiled - * with readline support (either --with-readline or --with-libedit) - * - * @author Fabien Potencier - * @author Martin Hasoň - */ -class Shell -{ - private $application; - private $history; - private $output; - private $hasReadline; - private $prompt; - private $processIsolation; - - /** - * Constructor. - * - * If there is no readline support for the current PHP executable - * a \RuntimeException exception is thrown. - * - * @param Application $application An application instance - */ - public function __construct(Application $application) - { - $this->hasReadline = function_exists('readline'); - $this->application = $application; - $this->history = getenv('HOME').'/.history_'.$application->getName(); - $this->output = new ConsoleOutput(); - $this->prompt = $application->getName().' > '; - $this->processIsolation = false; - } - - /** - * Runs the shell. - */ - public function run() - { - $this->application->setAutoExit(false); - $this->application->setCatchExceptions(true); - - if ($this->hasReadline) { - readline_read_history($this->history); - readline_completion_function(array($this, 'autocompleter')); - } - - $this->output->writeln($this->getHeader()); - $php = null; - if ($this->processIsolation) { - $finder = new PhpExecutableFinder(); - $php = $finder->find(); - $this->output->writeln(<<Running with process isolation, you should consider this: - * each command is executed as separate process, - * commands don't support interactivity, all params must be passed explicitly, - * commands output is not colorized. - -EOF - ); - } - - while (true) { - $command = $this->readline(); - - if (false === $command) { - $this->output->writeln("\n"); - - break; - } - - if ($this->hasReadline) { - readline_add_history($command); - readline_write_history($this->history); - } - - if ($this->processIsolation) { - $pb = new ProcessBuilder(); - - $process = $pb - ->add($php) - ->add($_SERVER['argv'][0]) - ->add($command) - ->inheritEnvironmentVariables(true) - ->getProcess() - ; - - $output = $this->output; - $process->run(function($type, $data) use ($output) { - $output->writeln($data); - }); - - $ret = $process->getExitCode(); - } else { - $ret = $this->application->run(new StringInput($command), $this->output); - } - - if (0 !== $ret) { - $this->output->writeln(sprintf('The command terminated with an error status (%s)', $ret)); - } - } - } - - /** - * Returns the shell header. - * - * @return string The header string - */ - protected function getHeader() - { - return <<{$this->application->getName()} shell ({$this->application->getVersion()}). - -At the prompt, type help for some help, -or list to get a list of available commands. - -To exit the shell, type ^D. - -EOF; - } - - /** - * Tries to return autocompletion for the current entered text. - * - * @param string $text The last segment of the entered text - * @return Boolean|array A list of guessed strings or true - */ - private function autocompleter($text) - { - $info = readline_info(); - $text = substr($info['line_buffer'], 0, $info['end']); - - if ($info['point'] !== $info['end']) { - return true; - } - - // task name? - if (false === strpos($text, ' ') || !$text) { - return array_keys($this->application->all()); - } - - // options and arguments? - try { - $command = $this->application->find(substr($text, 0, strpos($text, ' '))); - } catch (\Exception $e) { - return true; - } - - $list = array('--help'); - foreach ($command->getDefinition()->getOptions() as $option) { - $list[] = '--'.$option->getName(); - } - - return $list; - } - - /** - * Reads a single line from standard input. - * - * @return string The single line from standard input - */ - private function readline() - { - if ($this->hasReadline) { - $line = readline($this->prompt); - } else { - $this->output->write($this->prompt); - $line = fgets(STDIN, 1024); - $line = (!$line && strlen($line) == 0) ? false : rtrim($line); - } - - return $line; - } - - public function getProcessIsolation() - { - return $this->processIsolation; - } - - public function setProcessIsolation($processIsolation) - { - $this->processIsolation = (Boolean) $processIsolation; - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Tester/ApplicationTester.php b/laravel/vendor/Symfony/Component/Console/Tester/ApplicationTester.php deleted file mode 100644 index 9412fbab..00000000 --- a/laravel/vendor/Symfony/Component/Console/Tester/ApplicationTester.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tester; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\StreamOutput; - -/** - * @author Fabien Potencier - */ -class ApplicationTester -{ - private $application; - private $input; - private $output; - - /** - * Constructor. - * - * @param Application $application An Application instance to test. - */ - public function __construct(Application $application) - { - $this->application = $application; - } - - /** - * Executes the application. - * - * Available options: - * - * * interactive: Sets the input interactive flag - * * decorated: Sets the output decorated flag - * * verbosity: Sets the output verbosity flag - * - * @param array $input An array of arguments and options - * @param array $options An array of options - * - * @return integer The command exit code - */ - public function run(array $input, $options = array()) - { - $this->input = new ArrayInput($input); - if (isset($options['interactive'])) { - $this->input->setInteractive($options['interactive']); - } - - $this->output = new StreamOutput(fopen('php://memory', 'w', false)); - if (isset($options['decorated'])) { - $this->output->setDecorated($options['decorated']); - } - if (isset($options['verbosity'])) { - $this->output->setVerbosity($options['verbosity']); - } - - return $this->application->run($this->input, $this->output); - } - - /** - * Gets the display returned by the last execution of the application. - * - * @return string The display - */ - public function getDisplay() - { - rewind($this->output->getStream()); - - return stream_get_contents($this->output->getStream()); - } - - /** - * Gets the input instance used by the last execution of the application. - * - * @return InputInterface The current input instance - */ - public function getInput() - { - return $this->input; - } - - /** - * Gets the output instance used by the last execution of the application. - * - * @return OutputInterface The current output instance - */ - public function getOutput() - { - return $this->output; - } -} diff --git a/laravel/vendor/Symfony/Component/Console/Tester/CommandTester.php b/laravel/vendor/Symfony/Component/Console/Tester/CommandTester.php deleted file mode 100644 index 52be2781..00000000 --- a/laravel/vendor/Symfony/Component/Console/Tester/CommandTester.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tester; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Output\StreamOutput; - -/** - * @author Fabien Potencier - */ -class CommandTester -{ - private $command; - private $input; - private $output; - - /** - * Constructor. - * - * @param Command $command A Command instance to test. - */ - public function __construct(Command $command) - { - $this->command = $command; - } - - /** - * Executes the command. - * - * Available options: - * - * * interactive: Sets the input interactive flag - * * decorated: Sets the output decorated flag - * * verbosity: Sets the output verbosity flag - * - * @param array $input An array of arguments and options - * @param array $options An array of options - * - * @return integer The command exit code - */ - public function execute(array $input, array $options = array()) - { - $this->input = new ArrayInput($input); - if (isset($options['interactive'])) { - $this->input->setInteractive($options['interactive']); - } - - $this->output = new StreamOutput(fopen('php://memory', 'w', false)); - if (isset($options['decorated'])) { - $this->output->setDecorated($options['decorated']); - } - if (isset($options['verbosity'])) { - $this->output->setVerbosity($options['verbosity']); - } - - return $this->command->run($this->input, $this->output); - } - - /** - * Gets the display returned by the last execution of the command. - * - * @return string The display - */ - public function getDisplay() - { - rewind($this->output->getStream()); - - return stream_get_contents($this->output->getStream()); - } - - /** - * Gets the input instance used by the last execution of the command. - * - * @return InputInterface The current input instance - */ - public function getInput() - { - return $this->input; - } - - /** - * Gets the output instance used by the last execution of the command. - * - * @return OutputInterface The current output instance - */ - public function getOutput() - { - return $this->output; - } -} diff --git a/laravel/vendor/Symfony/Component/Console/composer.json b/laravel/vendor/Symfony/Component/Console/composer.json deleted file mode 100644 index 961212ec..00000000 --- a/laravel/vendor/Symfony/Component/Console/composer.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "symfony/console", - "type": "library", - "description": "Symfony Console Component", - "keywords": [], - "homepage": "http://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "require": { - "php": ">=5.3.2" - }, - "autoload": { - "psr-0": { "Symfony\\Component\\Console": "" } - }, - "target-dir": "Symfony/Component/Console", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/ApacheRequest.php b/laravel/vendor/Symfony/Component/HttpFoundation/ApacheRequest.php deleted file mode 100755 index ca8f8eeb..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/ApacheRequest.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * Request represents an HTTP request from an Apache server. - * - * @author Fabien Potencier - */ -class ApacheRequest extends Request -{ - /** - * {@inheritdoc} - */ - protected function prepareRequestUri() - { - return $this->server->get('REQUEST_URI'); - } - - /** - * {@inheritdoc} - */ - protected function prepareBaseUrl() - { - $baseUrl = $this->server->get('SCRIPT_NAME'); - - if (false === strpos($this->server->get('REQUEST_URI'), $baseUrl)) { - // assume mod_rewrite - return rtrim(dirname($baseUrl), '/\\'); - } - - return $baseUrl; - } - - /** - * {@inheritdoc} - */ - protected function preparePathInfo() - { - return $this->server->get('PATH_INFO') ?: substr($this->prepareRequestUri(), strlen($this->prepareBaseUrl())) ?: '/'; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/CHANGELOG.md b/laravel/vendor/Symfony/Component/HttpFoundation/CHANGELOG.md deleted file mode 100755 index 4a00207e..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/CHANGELOG.md +++ /dev/null @@ -1,75 +0,0 @@ -CHANGELOG -========= - -2.1.0 ------ - - * added Request::getSchemeAndHttpHost() and Request::getUserInfo() - * added a fluent interface to the Response class - * added Request::isProxyTrusted() - * added JsonResponse - * added a getTargetUrl method to RedirectResponse - * added support for streamed responses - * made Response::prepare() method the place to enforce HTTP specification - * [BC BREAK] moved management of the locale from the Session class to the Request class - * added a generic access to the PHP built-in filter mechanism: ParameterBag::filter() - * made FileBinaryMimeTypeGuesser command configurable - * added Request::getUser() and Request::getPassword() - * added support for the PATCH method in Request - * removed the ContentTypeMimeTypeGuesser class as it is deprecated and never used on PHP 5.3 - * added ResponseHeaderBag::makeDisposition() (implements RFC 6266) - * made mimetype to extension conversion configurable - * [BC BREAK] Moved all session related classes and interfaces into own namespace, as - `Symfony\Component\HttpFoundation\Session` and renamed classes accordingly. - Session handlers are located in the subnamespace `Symfony\Component\HttpFoundation\Session\Handler`. - * SessionHandlers must implement `\SessionHandlerInterface` or extend from the - `Symfony\Component\HttpFoundation\Storage\Handler\NativeSessionHandler` base class. - * Added internal storage driver proxy mechanism for forward compatibility with - PHP 5.4 `\SessionHandler` class. - * Added session handlers for custom Memcache, Memcached and Null session save handlers. - * [BC BREAK] Removed `NativeSessionStorage` and replaced with `NativeFileSessionHandler`. - * [BC BREAK] `SessionStorageInterface` methods removed: `write()`, `read()` and - `remove()`. Added `getBag()`, `registerBag()`. The `NativeSessionStorage` class - is a mediator for the session storage internals including the session handlers - which do the real work of participating in the internal PHP session workflow. - * [BC BREAK] Introduced mock implementations of `SessionStorage` to enable unit - and functional testing without starting real PHP sessions. Removed - `ArraySessionStorage`, and replaced with `MockArraySessionStorage` for unit - tests; removed `FilesystemSessionStorage`, and replaced with`MockFileSessionStorage` - for functional tests. These do not interact with global session ini - configuration values, session functions or `$_SESSION` superglobal. This means - they can be configured directly allowing multiple instances to work without - conflicting in the same PHP process. - * [BC BREAK] Removed the `close()` method from the `Session` class, as this is - now redundant. - * Deprecated the following methods from the Session class: `setFlash()`, `setFlashes()` - `getFlash()`, `hasFlash()`, and `removeFlash()`. Use `getFlashBag()` instead - which returns a `FlashBagInterface`. - * `Session->clear()` now only clears session attributes as before it cleared - flash messages and attributes. `Session->getFlashBag()->all()` clears flashes now. - * Session data is now managed by `SessionBagInterface` to better encapsulate - session data. - * Refactored session attribute and flash messages system to their own - `SessionBagInterface` implementations. - * Added `FlashBag`. Flashes expire when retrieved by `get()` or `all()`. This - implementation is ESI compatible. - * Added `AutoExpireFlashBag` (default) to replicate Symfony 2.0.x auto expire - behaviour of messages auto expiring after one page page load. Messages must - be retrieved by `get()` or `all()`. - * Added `Symfony\Component\HttpFoundation\Attribute\AttributeBag` to replicate - attributes storage behaviour from 2.0.x (default). - * Added `Symfony\Component\HttpFoundation\Attribute\NamespacedAttributeBag` for - namespace session attributes. - * Flash API can stores messages in an array so there may be multiple messages - per flash type. The old `Session` class API remains without BC break as it - will allow single messages as before. - * Added basic session meta-data to the session to record session create time, - last updated time, and the lifetime of the session cookie that was provided - to the client. - * Request::getClientIp() method doesn't take a parameter anymore but bases - itself on the trustProxy parameter. - * Added isMethod() to Request object. - * [BC BREAK] The methods `getPathInfo()`, `getBaseUrl()` and `getBasePath()` of - a `Request` now all return a raw value (vs a urldecoded value before). Any call - to one of these methods must be checked and wrapped in a `rawurldecode()` if - needed. diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Cookie.php b/laravel/vendor/Symfony/Component/HttpFoundation/Cookie.php deleted file mode 100755 index fe3a4cff..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Cookie.php +++ /dev/null @@ -1,208 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * Represents a cookie - * - * @author Johannes M. Schmitt - * - * @api - */ -class Cookie -{ - protected $name; - protected $value; - protected $domain; - protected $expire; - protected $path; - protected $secure; - protected $httpOnly; - - /** - * Constructor. - * - * @param string $name The name of the cookie - * @param string $value The value of the cookie - * @param integer|string|\DateTime $expire The time the cookie expires - * @param string $path The path on the server in which the cookie will be available on - * @param string $domain The domain that the cookie is available to - * @param Boolean $secure Whether the cookie should only be transmitted over a secure HTTPS connection from the client - * @param Boolean $httpOnly Whether the cookie will be made accessible only through the HTTP protocol - * - * @api - */ - public function __construct($name, $value = null, $expire = 0, $path = '/', $domain = null, $secure = false, $httpOnly = true) - { - // from PHP source code - if (preg_match("/[=,; \t\r\n\013\014]/", $name)) { - throw new \InvalidArgumentException(sprintf('The cookie name "%s" contains invalid characters.', $name)); - } - - if (empty($name)) { - throw new \InvalidArgumentException('The cookie name cannot be empty.'); - } - - // convert expiration time to a Unix timestamp - if ($expire instanceof \DateTime) { - $expire = $expire->format('U'); - } elseif (!is_numeric($expire)) { - $expire = strtotime($expire); - - if (false === $expire || -1 === $expire) { - throw new \InvalidArgumentException('The cookie expiration time is not valid.'); - } - } - - $this->name = $name; - $this->value = $value; - $this->domain = $domain; - $this->expire = $expire; - $this->path = empty($path) ? '/' : $path; - $this->secure = (Boolean) $secure; - $this->httpOnly = (Boolean) $httpOnly; - } - - /** - * Returns the cookie as a string. - * - * @return string The cookie - */ - public function __toString() - { - $str = urlencode($this->getName()).'='; - - if ('' === (string) $this->getValue()) { - $str .= 'deleted; expires='.gmdate("D, d-M-Y H:i:s T", time() - 31536001); - } else { - $str .= urlencode($this->getValue()); - - if ($this->getExpiresTime() !== 0) { - $str .= '; expires='.gmdate("D, d-M-Y H:i:s T", $this->getExpiresTime()); - } - } - - if ('/' !== $this->path) { - $str .= '; path='.$this->path; - } - - if (null !== $this->getDomain()) { - $str .= '; domain='.$this->getDomain(); - } - - if (true === $this->isSecure()) { - $str .= '; secure'; - } - - if (true === $this->isHttpOnly()) { - $str .= '; httponly'; - } - - return $str; - } - - /** - * Gets the name of the cookie. - * - * @return string - * - * @api - */ - public function getName() - { - return $this->name; - } - - /** - * Gets the value of the cookie. - * - * @return string - * - * @api - */ - public function getValue() - { - return $this->value; - } - - /** - * Gets the domain that the cookie is available to. - * - * @return string - * - * @api - */ - public function getDomain() - { - return $this->domain; - } - - /** - * Gets the time the cookie expires. - * - * @return integer - * - * @api - */ - public function getExpiresTime() - { - return $this->expire; - } - - /** - * Gets the path on the server in which the cookie will be available on. - * - * @return string - * - * @api - */ - public function getPath() - { - return $this->path; - } - - /** - * Checks whether the cookie should only be transmitted over a secure HTTPS connection from the client. - * - * @return Boolean - * - * @api - */ - public function isSecure() - { - return $this->secure; - } - - /** - * Checks whether the cookie will be made accessible only through the HTTP protocol. - * - * @return Boolean - * - * @api - */ - public function isHttpOnly() - { - return $this->httpOnly; - } - - /** - * Whether this cookie is about to be cleared - * - * @return Boolean - * - * @api - */ - public function isCleared() - { - return $this->expire < time(); - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/AccessDeniedException.php b/laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/AccessDeniedException.php deleted file mode 100755 index 41f7a462..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/AccessDeniedException.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -/** - * Thrown when the access on a file was denied. - * - * @author Bernhard Schussek - */ -class AccessDeniedException extends FileException -{ - /** - * Constructor. - * - * @param string $path The path to the accessed file - */ - public function __construct($path) - { - parent::__construct(sprintf('The file %s could not be accessed', $path)); - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/FileException.php b/laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/FileException.php deleted file mode 100755 index 68f827bd..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/FileException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -/** - * Thrown when an error occurred in the component File - * - * @author Bernhard Schussek - */ -class FileException extends \RuntimeException -{ -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/FileNotFoundException.php b/laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/FileNotFoundException.php deleted file mode 100755 index bd70094b..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/FileNotFoundException.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -/** - * Thrown when a file was not found - * - * @author Bernhard Schussek - */ -class FileNotFoundException extends FileException -{ - /** - * Constructor. - * - * @param string $path The path to the file that was not found - */ - public function __construct($path) - { - parent::__construct(sprintf('The file "%s" does not exist', $path)); - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/UnexpectedTypeException.php b/laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/UnexpectedTypeException.php deleted file mode 100755 index 0444b877..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/UnexpectedTypeException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -class UnexpectedTypeException extends FileException -{ - public function __construct($value, $expectedType) - { - parent::__construct(sprintf('Expected argument of type %s, %s given', $expectedType, is_object($value) ? get_class($value) : gettype($value))); - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/UploadException.php b/laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/UploadException.php deleted file mode 100755 index 382282e7..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/File/Exception/UploadException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -/** - * Thrown when an error occurred during file upload - * - * @author Bernhard Schussek - */ -class UploadException extends FileException -{ -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/File/File.php b/laravel/vendor/Symfony/Component/HttpFoundation/File/File.php deleted file mode 100755 index 729d870c..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/File/File.php +++ /dev/null @@ -1,152 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File; - -use Symfony\Component\HttpFoundation\File\Exception\FileException; -use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException; -use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser; -use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser; - -/** - * A file in the file system. - * - * @author Bernhard Schussek - * - * @api - */ -class File extends \SplFileInfo -{ - /** - * Constructs a new file from the given path. - * - * @param string $path The path to the file - * @param Boolean $checkPath Whether to check the path or not - * - * @throws FileNotFoundException If the given path is not a file - * - * @api - */ - public function __construct($path, $checkPath = true) - { - if ($checkPath && !is_file($path)) { - throw new FileNotFoundException($path); - } - - parent::__construct($path); - } - - /** - * Returns the extension based on the mime type. - * - * If the mime type is unknown, returns null. - * - * @return string|null The guessed extension or null if it cannot be guessed - * - * @api - */ - public function guessExtension() - { - $type = $this->getMimeType(); - $guesser = ExtensionGuesser::getInstance(); - - return $guesser->guess($type); - } - - /** - * Returns the mime type of the file. - * - * The mime type is guessed using the functions finfo(), mime_content_type() - * and the system binary "file" (in this order), depending on which of those - * is available on the current operating system. - * - * @return string|null The guessed mime type (i.e. "application/pdf") - * - * @api - */ - public function getMimeType() - { - $guesser = MimeTypeGuesser::getInstance(); - - return $guesser->guess($this->getPathname()); - } - - /** - * Returns the extension of the file. - * - * \SplFileInfo::getExtension() is not available before PHP 5.3.6 - * - * @return string The extension - * - * @api - */ - public function getExtension() - { - return pathinfo($this->getBasename(), PATHINFO_EXTENSION); - } - - /** - * Moves the file to a new location. - * - * @param string $directory The destination folder - * @param string $name The new file name - * - * @return File A File object representing the new file - * - * @throws FileException if the target file could not be created - * - * @api - */ - public function move($directory, $name = null) - { - $target = $this->getTargetFile($directory, $name); - - if (!@rename($this->getPathname(), $target)) { - $error = error_get_last(); - throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $target, strip_tags($error['message']))); - } - - @chmod($target, 0666 & ~umask()); - - return $target; - } - - protected function getTargetFile($directory, $name = null) - { - if (!is_dir($directory)) { - if (false === @mkdir($directory, 0777, true)) { - throw new FileException(sprintf('Unable to create the "%s" directory', $directory)); - } - } elseif (!is_writable($directory)) { - throw new FileException(sprintf('Unable to write in the "%s" directory', $directory)); - } - - $target = $directory.DIRECTORY_SEPARATOR.(null === $name ? $this->getBasename() : $this->getName($name)); - - return new File($target, false); - } - - /** - * Returns locale independent base name of the given path. - * - * @param string $name The new file name - * - * @return string containing - */ - protected function getName($name) - { - $originalName = str_replace('\\', '/', $name); - $pos = strrpos($originalName, '/'); - $originalName = false === $pos ? $originalName : substr($originalName, $pos + 1); - - return $originalName; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesser.php b/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesser.php deleted file mode 100755 index d5715f6f..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesser.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\MimeType; - -/** - * A singleton mime type to file extension guesser. - * - * A default guesser is provided. - * You can register custom guessers by calling the register() - * method on the singleton instance. - * - * - * $guesser = ExtensionGuesser::getInstance(); - * $guesser->register(new MyCustomExtensionGuesser()); - * - * - * The last registered guesser is preferred over previously registered ones. - * - */ -class ExtensionGuesser implements ExtensionGuesserInterface -{ - /** - * The singleton instance - * - * @var ExtensionGuesser - */ - private static $instance = null; - - /** - * All registered ExtensionGuesserInterface instances - * - * @var array - */ - protected $guessers = array(); - - /** - * Returns the singleton instance - * - * @return ExtensionGuesser - */ - public static function getInstance() - { - if (null === self::$instance) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Registers all natively provided extension guessers - */ - private function __construct() - { - $this->register(new MimeTypeExtensionGuesser()); - } - - /** - * Registers a new extension guesser - * - * When guessing, this guesser is preferred over previously registered ones. - * - * @param ExtensionGuesserInterface $guesser - */ - public function register(ExtensionGuesserInterface $guesser) - { - array_unshift($this->guessers, $guesser); - } - - /** - * Tries to guess the extension - * - * The mime type is passed to each registered mime type guesser in reverse order - * of their registration (last registered is queried first). Once a guesser - * returns a value that is not NULL, this method terminates and returns the - * value. - * - * @param string $mimeType The mime type - * @return string The guessed extension or NULL, if none could be guessed - */ - public function guess($mimeType) - { - foreach ($this->guessers as $guesser) { - $extension = $guesser->guess($mimeType); - - if (null !== $extension) { - break; - } - } - - return $extension; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesserInterface.php b/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesserInterface.php deleted file mode 100755 index 83736969..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesserInterface.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\MimeType; - -/** - * Guesses the file extension corresponding to a given mime type - */ -interface ExtensionGuesserInterface -{ - /** - * Makes a best guess for a file extension, given a mime type - * - * @param string $mimeType The mime type - * @return string The guessed extension or NULL, if none could be guessed - */ - public function guess($mimeType); -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php b/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php deleted file mode 100755 index 3da63dd4..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\MimeType; - -use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException; -use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException; - -/** - * Guesses the mime type with the binary "file" (only available on *nix) - * - * @author Bernhard Schussek - */ -class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface -{ - private $cmd; - - /** - * Constructor. - * - * The $cmd pattern must contain a "%s" string that will be replaced - * with the file name to guess. - * - * The command output must start with the mime type of the file. - * - * @param string $cmd The command to run to get the mime type of a file - */ - public function __construct($cmd = 'file -b --mime %s 2>/dev/null') - { - $this->cmd = $cmd; - } - - /** - * Returns whether this guesser is supported on the current OS - * - * @return Boolean - */ - public static function isSupported() - { - return !defined('PHP_WINDOWS_VERSION_BUILD'); - } - - /** - * {@inheritdoc} - */ - public function guess($path) - { - if (!is_file($path)) { - throw new FileNotFoundException($path); - } - - if (!is_readable($path)) { - throw new AccessDeniedException($path); - } - - if (!self::isSupported()) { - return null; - } - - ob_start(); - - // need to use --mime instead of -i. see #6641 - passthru(sprintf($this->cmd, escapeshellarg($path)), $return); - if ($return > 0) { - ob_end_clean(); - - return null; - } - - $type = trim(ob_get_clean()); - - if (!preg_match('#^([a-z0-9\-]+/[a-z0-9\-]+)#i', $type, $match)) { - // it's not a type, but an error message - return null; - } - - return $match[1]; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php b/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php deleted file mode 100755 index 09a0d7ed..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\MimeType; - -use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException; -use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException; - -/** - * Guesses the mime type using the PECL extension FileInfo - * - * @author Bernhard Schussek - */ -class FileinfoMimeTypeGuesser implements MimeTypeGuesserInterface -{ - /** - * Returns whether this guesser is supported on the current OS/PHP setup - * - * @return Boolean - */ - public static function isSupported() - { - return function_exists('finfo_open'); - } - - /** - * {@inheritdoc} - */ - public function guess($path) - { - if (!is_file($path)) { - throw new FileNotFoundException($path); - } - - if (!is_readable($path)) { - throw new AccessDeniedException($path); - } - - if (!self::isSupported()) { - return null; - } - - if (!$finfo = new \finfo(FILEINFO_MIME_TYPE)) { - return null; - } - - return $finfo->file($path); - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeExtensionGuesser.php b/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeExtensionGuesser.php deleted file mode 100755 index 13fe4a2f..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeExtensionGuesser.php +++ /dev/null @@ -1,740 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\MimeType; - -/** - * Provides a best-guess mapping of mime type to file extension. - */ -class MimeTypeExtensionGuesser implements ExtensionGuesserInterface -{ - /** - * A map of mime types and their default extensions. - * - * This list has been placed under the public domain by the Apache HTTPD project. - * - * @see http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types - * - * @var array - */ - protected $defaultExtensions = array( - 'application/andrew-inset' => 'ez', - 'application/applixware' => 'aw', - 'application/atom+xml' => 'atom', - 'application/atomcat+xml' => 'atomcat', - 'application/atomsvc+xml' => 'atomsvc', - 'application/ccxml+xml' => 'ccxml', - 'application/cdmi-capability' => 'cdmia', - 'application/cdmi-container' => 'cdmic', - 'application/cdmi-domain' => 'cdmid', - 'application/cdmi-object' => 'cdmio', - 'application/cdmi-queue' => 'cdmiq', - 'application/cu-seeme' => 'cu', - 'application/davmount+xml' => 'davmount', - 'application/dssc+der' => 'dssc', - 'application/dssc+xml' => 'xdssc', - 'application/ecmascript' => 'ecma', - 'application/emma+xml' => 'emma', - 'application/epub+zip' => 'epub', - 'application/exi' => 'exi', - 'application/font-tdpfr' => 'pfr', - 'application/hyperstudio' => 'stk', - 'application/inkml+xml' => 'ink', - 'application/ipfix' => 'ipfix', - 'application/java-archive' => 'jar', - 'application/java-serialized-object' => 'ser', - 'application/java-vm' => 'class', - 'application/javascript' => 'js', - 'application/json' => 'json', - 'application/lost+xml' => 'lostxml', - 'application/mac-binhex40' => 'hqx', - 'application/mac-compactpro' => 'cpt', - 'application/mads+xml' => 'mads', - 'application/marc' => 'mrc', - 'application/marcxml+xml' => 'mrcx', - 'application/mathematica' => 'ma', - 'application/mathml+xml' => 'mathml', - 'application/mbox' => 'mbox', - 'application/mediaservercontrol+xml' => 'mscml', - 'application/metalink4+xml' => 'meta4', - 'application/mets+xml' => 'mets', - 'application/mods+xml' => 'mods', - 'application/mp21' => 'm21', - 'application/mp4' => 'mp4s', - 'application/msword' => 'doc', - 'application/mxf' => 'mxf', - 'application/octet-stream' => 'bin', - 'application/oda' => 'oda', - 'application/oebps-package+xml' => 'opf', - 'application/ogg' => 'ogx', - 'application/onenote' => 'onetoc', - 'application/oxps' => 'oxps', - 'application/patch-ops-error+xml' => 'xer', - 'application/pdf' => 'pdf', - 'application/pgp-encrypted' => 'pgp', - 'application/pgp-signature' => 'asc', - 'application/pics-rules' => 'prf', - 'application/pkcs10' => 'p10', - 'application/pkcs7-mime' => 'p7m', - 'application/pkcs7-signature' => 'p7s', - 'application/pkcs8' => 'p8', - 'application/pkix-attr-cert' => 'ac', - 'application/pkix-cert' => 'cer', - 'application/pkix-crl' => 'crl', - 'application/pkix-pkipath' => 'pkipath', - 'application/pkixcmp' => 'pki', - 'application/pls+xml' => 'pls', - 'application/postscript' => 'ai', - 'application/prs.cww' => 'cww', - 'application/pskc+xml' => 'pskcxml', - 'application/rdf+xml' => 'rdf', - 'application/reginfo+xml' => 'rif', - 'application/relax-ng-compact-syntax' => 'rnc', - 'application/resource-lists+xml' => 'rl', - 'application/resource-lists-diff+xml' => 'rld', - 'application/rls-services+xml' => 'rs', - 'application/rpki-ghostbusters' => 'gbr', - 'application/rpki-manifest' => 'mft', - 'application/rpki-roa' => 'roa', - 'application/rsd+xml' => 'rsd', - 'application/rss+xml' => 'rss', - 'application/rtf' => 'rtf', - 'application/sbml+xml' => 'sbml', - 'application/scvp-cv-request' => 'scq', - 'application/scvp-cv-response' => 'scs', - 'application/scvp-vp-request' => 'spq', - 'application/scvp-vp-response' => 'spp', - 'application/sdp' => 'sdp', - 'application/set-payment-initiation' => 'setpay', - 'application/set-registration-initiation' => 'setreg', - 'application/shf+xml' => 'shf', - 'application/smil+xml' => 'smi', - 'application/sparql-query' => 'rq', - 'application/sparql-results+xml' => 'srx', - 'application/srgs' => 'gram', - 'application/srgs+xml' => 'grxml', - 'application/sru+xml' => 'sru', - 'application/ssml+xml' => 'ssml', - 'application/tei+xml' => 'tei', - 'application/thraud+xml' => 'tfi', - 'application/timestamped-data' => 'tsd', - 'application/vnd.3gpp.pic-bw-large' => 'plb', - 'application/vnd.3gpp.pic-bw-small' => 'psb', - 'application/vnd.3gpp.pic-bw-var' => 'pvb', - 'application/vnd.3gpp2.tcap' => 'tcap', - 'application/vnd.3m.post-it-notes' => 'pwn', - 'application/vnd.accpac.simply.aso' => 'aso', - 'application/vnd.accpac.simply.imp' => 'imp', - 'application/vnd.acucobol' => 'acu', - 'application/vnd.acucorp' => 'atc', - 'application/vnd.adobe.air-application-installer-package+zip' => 'air', - 'application/vnd.adobe.fxp' => 'fxp', - 'application/vnd.adobe.xdp+xml' => 'xdp', - 'application/vnd.adobe.xfdf' => 'xfdf', - 'application/vnd.ahead.space' => 'ahead', - 'application/vnd.airzip.filesecure.azf' => 'azf', - 'application/vnd.airzip.filesecure.azs' => 'azs', - 'application/vnd.amazon.ebook' => 'azw', - 'application/vnd.americandynamics.acc' => 'acc', - 'application/vnd.amiga.ami' => 'ami', - 'application/vnd.android.package-archive' => 'apk', - 'application/vnd.anser-web-certificate-issue-initiation' => 'cii', - 'application/vnd.anser-web-funds-transfer-initiation' => 'fti', - 'application/vnd.antix.game-component' => 'atx', - 'application/vnd.apple.installer+xml' => 'mpkg', - 'application/vnd.apple.mpegurl' => 'm3u8', - 'application/vnd.aristanetworks.swi' => 'swi', - 'application/vnd.astraea-software.iota' => 'iota', - 'application/vnd.audiograph' => 'aep', - 'application/vnd.blueice.multipass' => 'mpm', - 'application/vnd.bmi' => 'bmi', - 'application/vnd.businessobjects' => 'rep', - 'application/vnd.chemdraw+xml' => 'cdxml', - 'application/vnd.chipnuts.karaoke-mmd' => 'mmd', - 'application/vnd.cinderella' => 'cdy', - 'application/vnd.claymore' => 'cla', - 'application/vnd.cloanto.rp9' => 'rp9', - 'application/vnd.clonk.c4group' => 'c4g', - 'application/vnd.cluetrust.cartomobile-config' => 'c11amc', - 'application/vnd.cluetrust.cartomobile-config-pkg' => 'c11amz', - 'application/vnd.commonspace' => 'csp', - 'application/vnd.contact.cmsg' => 'cdbcmsg', - 'application/vnd.cosmocaller' => 'cmc', - 'application/vnd.crick.clicker' => 'clkx', - 'application/vnd.crick.clicker.keyboard' => 'clkk', - 'application/vnd.crick.clicker.palette' => 'clkp', - 'application/vnd.crick.clicker.template' => 'clkt', - 'application/vnd.crick.clicker.wordbank' => 'clkw', - 'application/vnd.criticaltools.wbs+xml' => 'wbs', - 'application/vnd.ctc-posml' => 'pml', - 'application/vnd.cups-ppd' => 'ppd', - 'application/vnd.curl.car' => 'car', - 'application/vnd.curl.pcurl' => 'pcurl', - 'application/vnd.data-vision.rdz' => 'rdz', - 'application/vnd.dece.data' => 'uvf', - 'application/vnd.dece.ttml+xml' => 'uvt', - 'application/vnd.dece.unspecified' => 'uvx', - 'application/vnd.dece.zip' => 'uvz', - 'application/vnd.denovo.fcselayout-link' => 'fe_launch', - 'application/vnd.dna' => 'dna', - 'application/vnd.dolby.mlp' => 'mlp', - 'application/vnd.dpgraph' => 'dpg', - 'application/vnd.dreamfactory' => 'dfac', - 'application/vnd.dvb.ait' => 'ait', - 'application/vnd.dvb.service' => 'svc', - 'application/vnd.dynageo' => 'geo', - 'application/vnd.ecowin.chart' => 'mag', - 'application/vnd.enliven' => 'nml', - 'application/vnd.epson.esf' => 'esf', - 'application/vnd.epson.msf' => 'msf', - 'application/vnd.epson.quickanime' => 'qam', - 'application/vnd.epson.salt' => 'slt', - 'application/vnd.epson.ssf' => 'ssf', - 'application/vnd.eszigno3+xml' => 'es3', - 'application/vnd.ezpix-album' => 'ez2', - 'application/vnd.ezpix-package' => 'ez3', - 'application/vnd.fdf' => 'fdf', - 'application/vnd.fdsn.mseed' => 'mseed', - 'application/vnd.fdsn.seed' => 'seed', - 'application/vnd.flographit' => 'gph', - 'application/vnd.fluxtime.clip' => 'ftc', - 'application/vnd.framemaker' => 'fm', - 'application/vnd.frogans.fnc' => 'fnc', - 'application/vnd.frogans.ltf' => 'ltf', - 'application/vnd.fsc.weblaunch' => 'fsc', - 'application/vnd.fujitsu.oasys' => 'oas', - 'application/vnd.fujitsu.oasys2' => 'oa2', - 'application/vnd.fujitsu.oasys3' => 'oa3', - 'application/vnd.fujitsu.oasysgp' => 'fg5', - 'application/vnd.fujitsu.oasysprs' => 'bh2', - 'application/vnd.fujixerox.ddd' => 'ddd', - 'application/vnd.fujixerox.docuworks' => 'xdw', - 'application/vnd.fujixerox.docuworks.binder' => 'xbd', - 'application/vnd.fuzzysheet' => 'fzs', - 'application/vnd.genomatix.tuxedo' => 'txd', - 'application/vnd.geogebra.file' => 'ggb', - 'application/vnd.geogebra.tool' => 'ggt', - 'application/vnd.geometry-explorer' => 'gex', - 'application/vnd.geonext' => 'gxt', - 'application/vnd.geoplan' => 'g2w', - 'application/vnd.geospace' => 'g3w', - 'application/vnd.gmx' => 'gmx', - 'application/vnd.google-earth.kml+xml' => 'kml', - 'application/vnd.google-earth.kmz' => 'kmz', - 'application/vnd.grafeq' => 'gqf', - 'application/vnd.groove-account' => 'gac', - 'application/vnd.groove-help' => 'ghf', - 'application/vnd.groove-identity-message' => 'gim', - 'application/vnd.groove-injector' => 'grv', - 'application/vnd.groove-tool-message' => 'gtm', - 'application/vnd.groove-tool-template' => 'tpl', - 'application/vnd.groove-vcard' => 'vcg', - 'application/vnd.hal+xml' => 'hal', - 'application/vnd.handheld-entertainment+xml' => 'zmm', - 'application/vnd.hbci' => 'hbci', - 'application/vnd.hhe.lesson-player' => 'les', - 'application/vnd.hp-hpgl' => 'hpgl', - 'application/vnd.hp-hpid' => 'hpid', - 'application/vnd.hp-hps' => 'hps', - 'application/vnd.hp-jlyt' => 'jlt', - 'application/vnd.hp-pcl' => 'pcl', - 'application/vnd.hp-pclxl' => 'pclxl', - 'application/vnd.hydrostatix.sof-data' => 'sfd-hdstx', - 'application/vnd.hzn-3d-crossword' => 'x3d', - 'application/vnd.ibm.minipay' => 'mpy', - 'application/vnd.ibm.modcap' => 'afp', - 'application/vnd.ibm.rights-management' => 'irm', - 'application/vnd.ibm.secure-container' => 'sc', - 'application/vnd.iccprofile' => 'icc', - 'application/vnd.igloader' => 'igl', - 'application/vnd.immervision-ivp' => 'ivp', - 'application/vnd.immervision-ivu' => 'ivu', - 'application/vnd.insors.igm' => 'igm', - 'application/vnd.intercon.formnet' => 'xpw', - 'application/vnd.intergeo' => 'i2g', - 'application/vnd.intu.qbo' => 'qbo', - 'application/vnd.intu.qfx' => 'qfx', - 'application/vnd.ipunplugged.rcprofile' => 'rcprofile', - 'application/vnd.irepository.package+xml' => 'irp', - 'application/vnd.is-xpr' => 'xpr', - 'application/vnd.isac.fcs' => 'fcs', - 'application/vnd.jam' => 'jam', - 'application/vnd.jcp.javame.midlet-rms' => 'rms', - 'application/vnd.jisp' => 'jisp', - 'application/vnd.joost.joda-archive' => 'joda', - 'application/vnd.kahootz' => 'ktz', - 'application/vnd.kde.karbon' => 'karbon', - 'application/vnd.kde.kchart' => 'chrt', - 'application/vnd.kde.kformula' => 'kfo', - 'application/vnd.kde.kivio' => 'flw', - 'application/vnd.kde.kontour' => 'kon', - 'application/vnd.kde.kpresenter' => 'kpr', - 'application/vnd.kde.kspread' => 'ksp', - 'application/vnd.kde.kword' => 'kwd', - 'application/vnd.kenameaapp' => 'htke', - 'application/vnd.kidspiration' => 'kia', - 'application/vnd.kinar' => 'kne', - 'application/vnd.koan' => 'skp', - 'application/vnd.kodak-descriptor' => 'sse', - 'application/vnd.las.las+xml' => 'lasxml', - 'application/vnd.llamagraphics.life-balance.desktop' => 'lbd', - 'application/vnd.llamagraphics.life-balance.exchange+xml' => 'lbe', - 'application/vnd.lotus-1-2-3' => '123', - 'application/vnd.lotus-approach' => 'apr', - 'application/vnd.lotus-freelance' => 'pre', - 'application/vnd.lotus-notes' => 'nsf', - 'application/vnd.lotus-organizer' => 'org', - 'application/vnd.lotus-screencam' => 'scm', - 'application/vnd.lotus-wordpro' => 'lwp', - 'application/vnd.macports.portpkg' => 'portpkg', - 'application/vnd.mcd' => 'mcd', - 'application/vnd.medcalcdata' => 'mc1', - 'application/vnd.mediastation.cdkey' => 'cdkey', - 'application/vnd.mfer' => 'mwf', - 'application/vnd.mfmp' => 'mfm', - 'application/vnd.micrografx.flo' => 'flo', - 'application/vnd.micrografx.igx' => 'igx', - 'application/vnd.mif' => 'mif', - 'application/vnd.mobius.daf' => 'daf', - 'application/vnd.mobius.dis' => 'dis', - 'application/vnd.mobius.mbk' => 'mbk', - 'application/vnd.mobius.mqy' => 'mqy', - 'application/vnd.mobius.msl' => 'msl', - 'application/vnd.mobius.plc' => 'plc', - 'application/vnd.mobius.txf' => 'txf', - 'application/vnd.mophun.application' => 'mpn', - 'application/vnd.mophun.certificate' => 'mpc', - 'application/vnd.mozilla.xul+xml' => 'xul', - 'application/vnd.ms-artgalry' => 'cil', - 'application/vnd.ms-cab-compressed' => 'cab', - 'application/vnd.ms-excel' => 'xls', - 'application/vnd.ms-excel.addin.macroenabled.12' => 'xlam', - 'application/vnd.ms-excel.sheet.binary.macroenabled.12' => 'xlsb', - 'application/vnd.ms-excel.sheet.macroenabled.12' => 'xlsm', - 'application/vnd.ms-excel.template.macroenabled.12' => 'xltm', - 'application/vnd.ms-fontobject' => 'eot', - 'application/vnd.ms-htmlhelp' => 'chm', - 'application/vnd.ms-ims' => 'ims', - 'application/vnd.ms-lrm' => 'lrm', - 'application/vnd.ms-officetheme' => 'thmx', - 'application/vnd.ms-pki.seccat' => 'cat', - 'application/vnd.ms-pki.stl' => 'stl', - 'application/vnd.ms-powerpoint' => 'ppt', - 'application/vnd.ms-powerpoint.addin.macroenabled.12' => 'ppam', - 'application/vnd.ms-powerpoint.presentation.macroenabled.12' => 'pptm', - 'application/vnd.ms-powerpoint.slide.macroenabled.12' => 'sldm', - 'application/vnd.ms-powerpoint.slideshow.macroenabled.12' => 'ppsm', - 'application/vnd.ms-powerpoint.template.macroenabled.12' => 'potm', - 'application/vnd.ms-project' => 'mpp', - 'application/vnd.ms-word.document.macroenabled.12' => 'docm', - 'application/vnd.ms-word.template.macroenabled.12' => 'dotm', - 'application/vnd.ms-works' => 'wps', - 'application/vnd.ms-wpl' => 'wpl', - 'application/vnd.ms-xpsdocument' => 'xps', - 'application/vnd.mseq' => 'mseq', - 'application/vnd.musician' => 'mus', - 'application/vnd.muvee.style' => 'msty', - 'application/vnd.mynfc' => 'taglet', - 'application/vnd.neurolanguage.nlu' => 'nlu', - 'application/vnd.noblenet-directory' => 'nnd', - 'application/vnd.noblenet-sealer' => 'nns', - 'application/vnd.noblenet-web' => 'nnw', - 'application/vnd.nokia.n-gage.data' => 'ngdat', - 'application/vnd.nokia.n-gage.symbian.install' => 'n-gage', - 'application/vnd.nokia.radio-preset' => 'rpst', - 'application/vnd.nokia.radio-presets' => 'rpss', - 'application/vnd.novadigm.edm' => 'edm', - 'application/vnd.novadigm.edx' => 'edx', - 'application/vnd.novadigm.ext' => 'ext', - 'application/vnd.oasis.opendocument.chart' => 'odc', - 'application/vnd.oasis.opendocument.chart-template' => 'otc', - 'application/vnd.oasis.opendocument.database' => 'odb', - 'application/vnd.oasis.opendocument.formula' => 'odf', - 'application/vnd.oasis.opendocument.formula-template' => 'odft', - 'application/vnd.oasis.opendocument.graphics' => 'odg', - 'application/vnd.oasis.opendocument.graphics-template' => 'otg', - 'application/vnd.oasis.opendocument.image' => 'odi', - 'application/vnd.oasis.opendocument.image-template' => 'oti', - 'application/vnd.oasis.opendocument.presentation' => 'odp', - 'application/vnd.oasis.opendocument.presentation-template' => 'otp', - 'application/vnd.oasis.opendocument.spreadsheet' => 'ods', - 'application/vnd.oasis.opendocument.spreadsheet-template' => 'ots', - 'application/vnd.oasis.opendocument.text' => 'odt', - 'application/vnd.oasis.opendocument.text-master' => 'odm', - 'application/vnd.oasis.opendocument.text-template' => 'ott', - 'application/vnd.oasis.opendocument.text-web' => 'oth', - 'application/vnd.olpc-sugar' => 'xo', - 'application/vnd.oma.dd2+xml' => 'dd2', - 'application/vnd.openofficeorg.extension' => 'oxt', - 'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'pptx', - 'application/vnd.openxmlformats-officedocument.presentationml.slide' => 'sldx', - 'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => 'ppsx', - 'application/vnd.openxmlformats-officedocument.presentationml.template' => 'potx', - 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'xlsx', - 'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => 'xltx', - 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'docx', - 'application/vnd.openxmlformats-officedocument.wordprocessingml.template' => 'dotx', - 'application/vnd.osgeo.mapguide.package' => 'mgp', - 'application/vnd.osgi.dp' => 'dp', - 'application/vnd.palm' => 'pdb', - 'application/vnd.pawaafile' => 'paw', - 'application/vnd.pg.format' => 'str', - 'application/vnd.pg.osasli' => 'ei6', - 'application/vnd.picsel' => 'efif', - 'application/vnd.pmi.widget' => 'wg', - 'application/vnd.pocketlearn' => 'plf', - 'application/vnd.powerbuilder6' => 'pbd', - 'application/vnd.previewsystems.box' => 'box', - 'application/vnd.proteus.magazine' => 'mgz', - 'application/vnd.publishare-delta-tree' => 'qps', - 'application/vnd.pvi.ptid1' => 'ptid', - 'application/vnd.quark.quarkxpress' => 'qxd', - 'application/vnd.realvnc.bed' => 'bed', - 'application/vnd.recordare.musicxml' => 'mxl', - 'application/vnd.recordare.musicxml+xml' => 'musicxml', - 'application/vnd.rig.cryptonote' => 'cryptonote', - 'application/vnd.rim.cod' => 'cod', - 'application/vnd.rn-realmedia' => 'rm', - 'application/vnd.route66.link66+xml' => 'link66', - 'application/vnd.sailingtracker.track' => 'st', - 'application/vnd.seemail' => 'see', - 'application/vnd.sema' => 'sema', - 'application/vnd.semd' => 'semd', - 'application/vnd.semf' => 'semf', - 'application/vnd.shana.informed.formdata' => 'ifm', - 'application/vnd.shana.informed.formtemplate' => 'itp', - 'application/vnd.shana.informed.interchange' => 'iif', - 'application/vnd.shana.informed.package' => 'ipk', - 'application/vnd.simtech-mindmapper' => 'twd', - 'application/vnd.smaf' => 'mmf', - 'application/vnd.smart.teacher' => 'teacher', - 'application/vnd.solent.sdkm+xml' => 'sdkm', - 'application/vnd.spotfire.dxp' => 'dxp', - 'application/vnd.spotfire.sfs' => 'sfs', - 'application/vnd.stardivision.calc' => 'sdc', - 'application/vnd.stardivision.draw' => 'sda', - 'application/vnd.stardivision.impress' => 'sdd', - 'application/vnd.stardivision.math' => 'smf', - 'application/vnd.stardivision.writer' => 'sdw', - 'application/vnd.stardivision.writer-global' => 'sgl', - 'application/vnd.stepmania.package' => 'smzip', - 'application/vnd.stepmania.stepchart' => 'sm', - 'application/vnd.sun.xml.calc' => 'sxc', - 'application/vnd.sun.xml.calc.template' => 'stc', - 'application/vnd.sun.xml.draw' => 'sxd', - 'application/vnd.sun.xml.draw.template' => 'std', - 'application/vnd.sun.xml.impress' => 'sxi', - 'application/vnd.sun.xml.impress.template' => 'sti', - 'application/vnd.sun.xml.math' => 'sxm', - 'application/vnd.sun.xml.writer' => 'sxw', - 'application/vnd.sun.xml.writer.global' => 'sxg', - 'application/vnd.sun.xml.writer.template' => 'stw', - 'application/vnd.sus-calendar' => 'sus', - 'application/vnd.svd' => 'svd', - 'application/vnd.symbian.install' => 'sis', - 'application/vnd.syncml+xml' => 'xsm', - 'application/vnd.syncml.dm+wbxml' => 'bdm', - 'application/vnd.syncml.dm+xml' => 'xdm', - 'application/vnd.tao.intent-module-archive' => 'tao', - 'application/vnd.tcpdump.pcap' => 'pcap', - 'application/vnd.tmobile-livetv' => 'tmo', - 'application/vnd.trid.tpt' => 'tpt', - 'application/vnd.triscape.mxs' => 'mxs', - 'application/vnd.trueapp' => 'tra', - 'application/vnd.ufdl' => 'ufd', - 'application/vnd.uiq.theme' => 'utz', - 'application/vnd.umajin' => 'umj', - 'application/vnd.unity' => 'unityweb', - 'application/vnd.uoml+xml' => 'uoml', - 'application/vnd.vcx' => 'vcx', - 'application/vnd.visio' => 'vsd', - 'application/vnd.visionary' => 'vis', - 'application/vnd.vsf' => 'vsf', - 'application/vnd.wap.wbxml' => 'wbxml', - 'application/vnd.wap.wmlc' => 'wmlc', - 'application/vnd.wap.wmlscriptc' => 'wmlsc', - 'application/vnd.webturbo' => 'wtb', - 'application/vnd.wolfram.player' => 'nbp', - 'application/vnd.wordperfect' => 'wpd', - 'application/vnd.wqd' => 'wqd', - 'application/vnd.wt.stf' => 'stf', - 'application/vnd.xara' => 'xar', - 'application/vnd.xfdl' => 'xfdl', - 'application/vnd.yamaha.hv-dic' => 'hvd', - 'application/vnd.yamaha.hv-script' => 'hvs', - 'application/vnd.yamaha.hv-voice' => 'hvp', - 'application/vnd.yamaha.openscoreformat' => 'osf', - 'application/vnd.yamaha.openscoreformat.osfpvg+xml' => 'osfpvg', - 'application/vnd.yamaha.smaf-audio' => 'saf', - 'application/vnd.yamaha.smaf-phrase' => 'spf', - 'application/vnd.yellowriver-custom-menu' => 'cmp', - 'application/vnd.zul' => 'zir', - 'application/vnd.zzazz.deck+xml' => 'zaz', - 'application/voicexml+xml' => 'vxml', - 'application/widget' => 'wgt', - 'application/winhlp' => 'hlp', - 'application/wsdl+xml' => 'wsdl', - 'application/wspolicy+xml' => 'wspolicy', - 'application/x-7z-compressed' => '7z', - 'application/x-abiword' => 'abw', - 'application/x-ace-compressed' => 'ace', - 'application/x-authorware-bin' => 'aab', - 'application/x-authorware-map' => 'aam', - 'application/x-authorware-seg' => 'aas', - 'application/x-bcpio' => 'bcpio', - 'application/x-bittorrent' => 'torrent', - 'application/x-bzip' => 'bz', - 'application/x-bzip2' => 'bz2', - 'application/x-cdlink' => 'vcd', - 'application/x-chat' => 'chat', - 'application/x-chess-pgn' => 'pgn', - 'application/x-cpio' => 'cpio', - 'application/x-csh' => 'csh', - 'application/x-debian-package' => 'deb', - 'application/x-director' => 'dir', - 'application/x-doom' => 'wad', - 'application/x-dtbncx+xml' => 'ncx', - 'application/x-dtbook+xml' => 'dtb', - 'application/x-dtbresource+xml' => 'res', - 'application/x-dvi' => 'dvi', - 'application/x-font-bdf' => 'bdf', - 'application/x-font-ghostscript' => 'gsf', - 'application/x-font-linux-psf' => 'psf', - 'application/x-font-otf' => 'otf', - 'application/x-font-pcf' => 'pcf', - 'application/x-font-snf' => 'snf', - 'application/x-font-ttf' => 'ttf', - 'application/x-font-type1' => 'pfa', - 'application/x-font-woff' => 'woff', - 'application/x-futuresplash' => 'spl', - 'application/x-gnumeric' => 'gnumeric', - 'application/x-gtar' => 'gtar', - 'application/x-hdf' => 'hdf', - 'application/x-java-jnlp-file' => 'jnlp', - 'application/x-latex' => 'latex', - 'application/x-mobipocket-ebook' => 'prc', - 'application/x-ms-application' => 'application', - 'application/x-ms-wmd' => 'wmd', - 'application/x-ms-wmz' => 'wmz', - 'application/x-ms-xbap' => 'xbap', - 'application/x-msaccess' => 'mdb', - 'application/x-msbinder' => 'obd', - 'application/x-mscardfile' => 'crd', - 'application/x-msclip' => 'clp', - 'application/x-msdownload' => 'exe', - 'application/x-msmediaview' => 'mvb', - 'application/x-msmetafile' => 'wmf', - 'application/x-msmoney' => 'mny', - 'application/x-mspublisher' => 'pub', - 'application/x-msschedule' => 'scd', - 'application/x-msterminal' => 'trm', - 'application/x-mswrite' => 'wri', - 'application/x-netcdf' => 'nc', - 'application/x-pkcs12' => 'p12', - 'application/x-pkcs7-certificates' => 'p7b', - 'application/x-pkcs7-certreqresp' => 'p7r', - 'application/x-rar-compressed' => 'rar', - 'application/x-rar' => 'rar', - 'application/x-sh' => 'sh', - 'application/x-shar' => 'shar', - 'application/x-shockwave-flash' => 'swf', - 'application/x-silverlight-app' => 'xap', - 'application/x-stuffit' => 'sit', - 'application/x-stuffitx' => 'sitx', - 'application/x-sv4cpio' => 'sv4cpio', - 'application/x-sv4crc' => 'sv4crc', - 'application/x-tar' => 'tar', - 'application/x-tcl' => 'tcl', - 'application/x-tex' => 'tex', - 'application/x-tex-tfm' => 'tfm', - 'application/x-texinfo' => 'texinfo', - 'application/x-ustar' => 'ustar', - 'application/x-wais-source' => 'src', - 'application/x-x509-ca-cert' => 'der', - 'application/x-xfig' => 'fig', - 'application/x-xpinstall' => 'xpi', - 'application/xcap-diff+xml' => 'xdf', - 'application/xenc+xml' => 'xenc', - 'application/xhtml+xml' => 'xhtml', - 'application/xml' => 'xml', - 'application/xml-dtd' => 'dtd', - 'application/xop+xml' => 'xop', - 'application/xslt+xml' => 'xslt', - 'application/xspf+xml' => 'xspf', - 'application/xv+xml' => 'mxml', - 'application/yang' => 'yang', - 'application/yin+xml' => 'yin', - 'application/zip' => 'zip', - 'audio/adpcm' => 'adp', - 'audio/basic' => 'au', - 'audio/midi' => 'mid', - 'audio/mp4' => 'mp4a', - 'audio/mpeg' => 'mpga', - 'audio/ogg' => 'oga', - 'audio/vnd.dece.audio' => 'uva', - 'audio/vnd.digital-winds' => 'eol', - 'audio/vnd.dra' => 'dra', - 'audio/vnd.dts' => 'dts', - 'audio/vnd.dts.hd' => 'dtshd', - 'audio/vnd.lucent.voice' => 'lvp', - 'audio/vnd.ms-playready.media.pya' => 'pya', - 'audio/vnd.nuera.ecelp4800' => 'ecelp4800', - 'audio/vnd.nuera.ecelp7470' => 'ecelp7470', - 'audio/vnd.nuera.ecelp9600' => 'ecelp9600', - 'audio/vnd.rip' => 'rip', - 'audio/webm' => 'weba', - 'audio/x-aac' => 'aac', - 'audio/x-aiff' => 'aif', - 'audio/x-mpegurl' => 'm3u', - 'audio/x-ms-wax' => 'wax', - 'audio/x-ms-wma' => 'wma', - 'audio/x-pn-realaudio' => 'ram', - 'audio/x-pn-realaudio-plugin' => 'rmp', - 'audio/x-wav' => 'wav', - 'chemical/x-cdx' => 'cdx', - 'chemical/x-cif' => 'cif', - 'chemical/x-cmdf' => 'cmdf', - 'chemical/x-cml' => 'cml', - 'chemical/x-csml' => 'csml', - 'chemical/x-xyz' => 'xyz', - 'image/bmp' => 'bmp', - 'image/cgm' => 'cgm', - 'image/g3fax' => 'g3', - 'image/gif' => 'gif', - 'image/ief' => 'ief', - 'image/jpeg' => 'jpeg', - 'image/ktx' => 'ktx', - 'image/png' => 'png', - 'image/prs.btif' => 'btif', - 'image/svg+xml' => 'svg', - 'image/tiff' => 'tiff', - 'image/vnd.adobe.photoshop' => 'psd', - 'image/vnd.dece.graphic' => 'uvi', - 'image/vnd.dvb.subtitle' => 'sub', - 'image/vnd.djvu' => 'djvu', - 'image/vnd.dwg' => 'dwg', - 'image/vnd.dxf' => 'dxf', - 'image/vnd.fastbidsheet' => 'fbs', - 'image/vnd.fpx' => 'fpx', - 'image/vnd.fst' => 'fst', - 'image/vnd.fujixerox.edmics-mmr' => 'mmr', - 'image/vnd.fujixerox.edmics-rlc' => 'rlc', - 'image/vnd.ms-modi' => 'mdi', - 'image/vnd.net-fpx' => 'npx', - 'image/vnd.wap.wbmp' => 'wbmp', - 'image/vnd.xiff' => 'xif', - 'image/webp' => 'webp', - 'image/x-cmu-raster' => 'ras', - 'image/x-cmx' => 'cmx', - 'image/x-freehand' => 'fh', - 'image/x-icon' => 'ico', - 'image/x-pcx' => 'pcx', - 'image/x-pict' => 'pic', - 'image/x-portable-anymap' => 'pnm', - 'image/x-portable-bitmap' => 'pbm', - 'image/x-portable-graymap' => 'pgm', - 'image/x-portable-pixmap' => 'ppm', - 'image/x-rgb' => 'rgb', - 'image/x-xbitmap' => 'xbm', - 'image/x-xpixmap' => 'xpm', - 'image/x-xwindowdump' => 'xwd', - 'message/rfc822' => 'eml', - 'model/iges' => 'igs', - 'model/mesh' => 'msh', - 'model/vnd.collada+xml' => 'dae', - 'model/vnd.dwf' => 'dwf', - 'model/vnd.gdl' => 'gdl', - 'model/vnd.gtw' => 'gtw', - 'model/vnd.mts' => 'mts', - 'model/vnd.vtu' => 'vtu', - 'model/vrml' => 'wrl', - 'text/calendar' => 'ics', - 'text/css' => 'css', - 'text/csv' => 'csv', - 'text/html' => 'html', - 'text/n3' => 'n3', - 'text/plain' => 'txt', - 'text/prs.lines.tag' => 'dsc', - 'text/richtext' => 'rtx', - 'text/sgml' => 'sgml', - 'text/tab-separated-values' => 'tsv', - 'text/troff' => 't', - 'text/turtle' => 'ttl', - 'text/uri-list' => 'uri', - 'text/vcard' => 'vcard', - 'text/vnd.curl' => 'curl', - 'text/vnd.curl.dcurl' => 'dcurl', - 'text/vnd.curl.scurl' => 'scurl', - 'text/vnd.curl.mcurl' => 'mcurl', - 'text/vnd.dvb.subtitle' => 'sub', - 'text/vnd.fly' => 'fly', - 'text/vnd.fmi.flexstor' => 'flx', - 'text/vnd.graphviz' => 'gv', - 'text/vnd.in3d.3dml' => '3dml', - 'text/vnd.in3d.spot' => 'spot', - 'text/vnd.sun.j2me.app-descriptor' => 'jad', - 'text/vnd.wap.wml' => 'wml', - 'text/vnd.wap.wmlscript' => 'wmls', - 'text/x-asm' => 's', - 'text/x-c' => 'c', - 'text/x-fortran' => 'f', - 'text/x-pascal' => 'p', - 'text/x-java-source' => 'java', - 'text/x-setext' => 'etx', - 'text/x-uuencode' => 'uu', - 'text/x-vcalendar' => 'vcs', - 'text/x-vcard' => 'vcf', - 'video/3gpp' => '3gp', - 'video/3gpp2' => '3g2', - 'video/h261' => 'h261', - 'video/h263' => 'h263', - 'video/h264' => 'h264', - 'video/jpeg' => 'jpgv', - 'video/jpm' => 'jpm', - 'video/mj2' => 'mj2', - 'video/mp4' => 'mp4', - 'video/mpeg' => 'mpeg', - 'video/ogg' => 'ogv', - 'video/quicktime' => 'qt', - 'video/vnd.dece.hd' => 'uvh', - 'video/vnd.dece.mobile' => 'uvm', - 'video/vnd.dece.pd' => 'uvp', - 'video/vnd.dece.sd' => 'uvs', - 'video/vnd.dece.video' => 'uvv', - 'video/vnd.dvb.file' => 'dvb', - 'video/vnd.fvt' => 'fvt', - 'video/vnd.mpegurl' => 'mxu', - 'video/vnd.ms-playready.media.pyv' => 'pyv', - 'video/vnd.uvvu.mp4' => 'uvu', - 'video/vnd.vivo' => 'viv', - 'video/webm' => 'webm', - 'video/x-f4v' => 'f4v', - 'video/x-fli' => 'fli', - 'video/x-flv' => 'flv', - 'video/x-m4v' => 'm4v', - 'video/x-ms-asf' => 'asf', - 'video/x-ms-wm' => 'wm', - 'video/x-ms-wmv' => 'wmv', - 'video/x-ms-wmx' => 'wmx', - 'video/x-ms-wvx' => 'wvx', - 'video/x-msvideo' => 'avi', - 'video/x-sgi-movie' => 'movie', - 'x-conference/x-cooltalk' => 'ice', - ); - - /** - * {@inheritdoc} - */ - public function guess($mimeType) - { - return isset($this->defaultExtensions[$mimeType]) ? $this->defaultExtensions[$mimeType] : null; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.php b/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.php deleted file mode 100755 index a8247ab4..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.php +++ /dev/null @@ -1,124 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\MimeType; - -use Symfony\Component\HttpFoundation\File\Exception\FileException; -use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException; -use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException; - -/** - * A singleton mime type guesser. - * - * By default, all mime type guessers provided by the framework are installed - * (if available on the current OS/PHP setup). You can register custom - * guessers by calling the register() method on the singleton instance. - * - * - * $guesser = MimeTypeGuesser::getInstance(); - * $guesser->register(new MyCustomMimeTypeGuesser()); - * - * - * The last registered guesser is preferred over previously registered ones. - * - * @author Bernhard Schussek - */ -class MimeTypeGuesser implements MimeTypeGuesserInterface -{ - /** - * The singleton instance - * - * @var MimeTypeGuesser - */ - private static $instance = null; - - /** - * All registered MimeTypeGuesserInterface instances - * - * @var array - */ - protected $guessers = array(); - - /** - * Returns the singleton instance - * - * @return MimeTypeGuesser - */ - public static function getInstance() - { - if (null === self::$instance) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Registers all natively provided mime type guessers - */ - private function __construct() - { - if (FileBinaryMimeTypeGuesser::isSupported()) { - $this->register(new FileBinaryMimeTypeGuesser()); - } - - if (FileinfoMimeTypeGuesser::isSupported()) { - $this->register(new FileinfoMimeTypeGuesser()); - } - } - - /** - * Registers a new mime type guesser - * - * When guessing, this guesser is preferred over previously registered ones. - * - * @param MimeTypeGuesserInterface $guesser - */ - public function register(MimeTypeGuesserInterface $guesser) - { - array_unshift($this->guessers, $guesser); - } - - /** - * Tries to guess the mime type of the given file - * - * The file is passed to each registered mime type guesser in reverse order - * of their registration (last registered is queried first). Once a guesser - * returns a value that is not NULL, this method terminates and returns the - * value. - * - * @param string $path The path to the file - * - * @return string The mime type or NULL, if none could be guessed - * - * @throws FileException If the file does not exist - */ - public function guess($path) - { - if (!is_file($path)) { - throw new FileNotFoundException($path); - } - - if (!is_readable($path)) { - throw new AccessDeniedException($path); - } - - if (!$this->guessers) { - throw new \LogicException('Unable to guess the mime type as no guessers are available (Did you enable the php_fileinfo extension?)'); - } - - foreach ($this->guessers as $guesser) { - if (null !== $mimeType = $guesser->guess($path)) { - return $mimeType; - } - } - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesserInterface.php b/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesserInterface.php deleted file mode 100755 index 87ea20ff..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesserInterface.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\MimeType; - -use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException; -use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException; - -/** - * Guesses the mime type of a file - * - * @author Bernhard Schussek - */ -interface MimeTypeGuesserInterface -{ - /** - * Guesses the mime type of the file with the given path. - * - * @param string $path The path to the file - * - * @return string The mime type or NULL, if none could be guessed - * - * @throws FileNotFoundException If the file does not exist - * @throws AccessDeniedException If the file could not be read - */ - public function guess($path); -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/File/UploadedFile.php b/laravel/vendor/Symfony/Component/HttpFoundation/File/UploadedFile.php deleted file mode 100755 index d201e2dc..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/File/UploadedFile.php +++ /dev/null @@ -1,236 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File; - -use Symfony\Component\HttpFoundation\File\Exception\FileException; -use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException; - -/** - * A file uploaded through a form. - * - * @author Bernhard Schussek - * @author Florian Eckerstorfer - * @author Fabien Potencier - * - * @api - */ -class UploadedFile extends File -{ - /** - * Whether the test mode is activated. - * - * Local files are used in test mode hence the code should not enforce HTTP uploads. - * - * @var Boolean - */ - private $test = false; - - /** - * The original name of the uploaded file. - * - * @var string - */ - private $originalName; - - /** - * The mime type provided by the uploader. - * - * @var string - */ - private $mimeType; - - /** - * The file size provided by the uploader. - * - * @var string - */ - private $size; - - /** - * The UPLOAD_ERR_XXX constant provided by the uploader. - * - * @var integer - */ - private $error; - - /** - * Accepts the information of the uploaded file as provided by the PHP global $_FILES. - * - * The file object is only created when the uploaded file is valid (i.e. when the - * isValid() method returns true). Otherwise the only methods that could be called - * on an UploadedFile instance are: - * - * * getClientOriginalName, - * * getClientMimeType, - * * isValid, - * * getError. - * - * Calling any other method on an non-valid instance will cause an unpredictable result. - * - * @param string $path The full temporary path to the file - * @param string $originalName The original file name - * @param string $mimeType The type of the file as provided by PHP - * @param integer $size The file size - * @param integer $error The error constant of the upload (one of PHP's UPLOAD_ERR_XXX constants) - * @param Boolean $test Whether the test mode is active - * - * @throws FileException If file_uploads is disabled - * @throws FileNotFoundException If the file does not exist - * - * @api - */ - public function __construct($path, $originalName, $mimeType = null, $size = null, $error = null, $test = false) - { - if (!ini_get('file_uploads')) { - throw new FileException(sprintf('Unable to create UploadedFile because "file_uploads" is disabled in your php.ini file (%s)', get_cfg_var('cfg_file_path'))); - } - - $this->originalName = $this->getName($originalName); - $this->mimeType = $mimeType ?: 'application/octet-stream'; - $this->size = $size; - $this->error = $error ?: UPLOAD_ERR_OK; - $this->test = (Boolean) $test; - - parent::__construct($path, UPLOAD_ERR_OK === $this->error); - } - - /** - * Returns the original file name. - * - * It is extracted from the request from which the file has been uploaded. - * Then is should not be considered as a safe value. - * - * @return string|null The original name - * - * @api - */ - public function getClientOriginalName() - { - return $this->originalName; - } - - /** - * Returns the file mime type. - * - * It is extracted from the request from which the file has been uploaded. - * Then is should not be considered as a safe value. - * - * @return string|null The mime type - * - * @api - */ - public function getClientMimeType() - { - return $this->mimeType; - } - - /** - * Returns the file size. - * - * It is extracted from the request from which the file has been uploaded. - * Then is should not be considered as a safe value. - * - * @return integer|null The file size - * - * @api - */ - public function getClientSize() - { - return $this->size; - } - - /** - * Returns the upload error. - * - * If the upload was successful, the constant UPLOAD_ERR_OK is returned. - * Otherwise one of the other UPLOAD_ERR_XXX constants is returned. - * - * @return integer The upload error - * - * @api - */ - public function getError() - { - return $this->error; - } - - /** - * Returns whether the file was uploaded successfully. - * - * @return Boolean True if no error occurred during uploading - * - * @api - */ - public function isValid() - { - return $this->error === UPLOAD_ERR_OK; - } - - /** - * Moves the file to a new location. - * - * @param string $directory The destination folder - * @param string $name The new file name - * - * @return File A File object representing the new file - * - * @throws FileException if the file has not been uploaded via Http - * - * @api - */ - public function move($directory, $name = null) - { - if ($this->isValid()) { - if ($this->test) { - return parent::move($directory, $name); - } elseif (is_uploaded_file($this->getPathname())) { - $target = $this->getTargetFile($directory, $name); - - if (!@move_uploaded_file($this->getPathname(), $target)) { - $error = error_get_last(); - throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $target, strip_tags($error['message']))); - } - - @chmod($target, 0666 & ~umask()); - - return $target; - } - } - - throw new FileException(sprintf('The file "%s" has not been uploaded via Http', $this->getPathname())); - } - - /** - * Returns the maximum size of an uploaded file as configured in php.ini - * - * @return int The maximum size of an uploaded file in bytes - */ - public static function getMaxFilesize() - { - $max = trim(ini_get('upload_max_filesize')); - - if ('' === $max) { - return PHP_INT_MAX; - } - - switch (strtolower(substr($max, -1))) { - case 'g': - $max *= 1024; - case 'm': - $max *= 1024; - case 'k': - $max *= 1024; - } - - return (integer) $max; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/FileBag.php b/laravel/vendor/Symfony/Component/HttpFoundation/FileBag.php deleted file mode 100755 index b2775efb..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/FileBag.php +++ /dev/null @@ -1,155 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -use Symfony\Component\HttpFoundation\File\UploadedFile; - -/** - * FileBag is a container for HTTP headers. - * - * @author Fabien Potencier - * @author Bulat Shakirzyanov - * - * @api - */ -class FileBag extends ParameterBag -{ - private static $fileKeys = array('error', 'name', 'size', 'tmp_name', 'type'); - - /** - * Constructor. - * - * @param array $parameters An array of HTTP files - * - * @api - */ - public function __construct(array $parameters = array()) - { - $this->replace($parameters); - } - - /** - * {@inheritdoc} - * - * @api - */ - public function replace(array $files = array()) - { - $this->parameters = array(); - $this->add($files); - } - - /** - * {@inheritdoc} - * - * @api - */ - public function set($key, $value) - { - if (!is_array($value) && !$value instanceof UploadedFile) { - throw new \InvalidArgumentException('An uploaded file must be an array or an instance of UploadedFile.'); - } - - parent::set($key, $this->convertFileInformation($value)); - } - - /** - * {@inheritdoc} - * - * @api - */ - public function add(array $files = array()) - { - foreach ($files as $key => $file) { - $this->set($key, $file); - } - } - - /** - * Converts uploaded files to UploadedFile instances. - * - * @param array|UploadedFile $file A (multi-dimensional) array of uploaded file information - * - * @return array A (multi-dimensional) array of UploadedFile instances - */ - protected function convertFileInformation($file) - { - if ($file instanceof UploadedFile) { - return $file; - } - - $file = $this->fixPhpFilesArray($file); - if (is_array($file)) { - $keys = array_keys($file); - sort($keys); - - if ($keys == self::$fileKeys) { - if (UPLOAD_ERR_NO_FILE == $file['error']) { - $file = null; - } else { - $file = new UploadedFile($file['tmp_name'], $file['name'], $file['type'], $file['size'], $file['error']); - } - } else { - $file = array_map(array($this, 'convertFileInformation'), $file); - } - } - - return $file; - } - - /** - * Fixes a malformed PHP $_FILES array. - * - * PHP has a bug that the format of the $_FILES array differs, depending on - * whether the uploaded file fields had normal field names or array-like - * field names ("normal" vs. "parent[child]"). - * - * This method fixes the array to look like the "normal" $_FILES array. - * - * It's safe to pass an already converted array, in which case this method - * just returns the original array unmodified. - * - * @param array $data - * - * @return array - */ - protected function fixPhpFilesArray($data) - { - if (!is_array($data)) { - return $data; - } - - $keys = array_keys($data); - sort($keys); - - if (self::$fileKeys != $keys || !isset($data['name']) || !is_array($data['name'])) { - return $data; - } - - $files = $data; - foreach (self::$fileKeys as $k) { - unset($files[$k]); - } - - foreach (array_keys($data['name']) as $key) { - $files[$key] = $this->fixPhpFilesArray(array( - 'error' => $data['error'][$key], - 'name' => $data['name'][$key], - 'type' => $data['type'][$key], - 'tmp_name' => $data['tmp_name'][$key], - 'size' => $data['size'][$key] - )); - } - - return $files; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/HeaderBag.php b/laravel/vendor/Symfony/Component/HttpFoundation/HeaderBag.php deleted file mode 100755 index 2360e55b..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/HeaderBag.php +++ /dev/null @@ -1,325 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * HeaderBag is a container for HTTP headers. - * - * @author Fabien Potencier - * - * @api - */ -class HeaderBag implements \IteratorAggregate, \Countable -{ - protected $headers; - protected $cacheControl; - - /** - * Constructor. - * - * @param array $headers An array of HTTP headers - * - * @api - */ - public function __construct(array $headers = array()) - { - $this->cacheControl = array(); - $this->headers = array(); - foreach ($headers as $key => $values) { - $this->set($key, $values); - } - } - - /** - * Returns the headers as a string. - * - * @return string The headers - */ - public function __toString() - { - if (!$this->headers) { - return ''; - } - - $max = max(array_map('strlen', array_keys($this->headers))) + 1; - $content = ''; - ksort($this->headers); - foreach ($this->headers as $name => $values) { - $name = implode('-', array_map('ucfirst', explode('-', $name))); - foreach ($values as $value) { - $content .= sprintf("%-{$max}s %s\r\n", $name.':', $value); - } - } - - return $content; - } - - /** - * Returns the headers. - * - * @return array An array of headers - * - * @api - */ - public function all() - { - return $this->headers; - } - - /** - * Returns the parameter keys. - * - * @return array An array of parameter keys - * - * @api - */ - public function keys() - { - return array_keys($this->headers); - } - - /** - * Replaces the current HTTP headers by a new set. - * - * @param array $headers An array of HTTP headers - * - * @api - */ - public function replace(array $headers = array()) - { - $this->headers = array(); - $this->add($headers); - } - - /** - * Adds new headers the current HTTP headers set. - * - * @param array $headers An array of HTTP headers - * - * @api - */ - public function add(array $headers) - { - foreach ($headers as $key => $values) { - $this->set($key, $values); - } - } - - /** - * Returns a header value by name. - * - * @param string $key The header name - * @param mixed $default The default value - * @param Boolean $first Whether to return the first value or all header values - * - * @return string|array The first header value if $first is true, an array of values otherwise - * - * @api - */ - public function get($key, $default = null, $first = true) - { - $key = strtr(strtolower($key), '_', '-'); - - if (!array_key_exists($key, $this->headers)) { - if (null === $default) { - return $first ? null : array(); - } - - return $first ? $default : array($default); - } - - if ($first) { - return count($this->headers[$key]) ? $this->headers[$key][0] : $default; - } - - return $this->headers[$key]; - } - - /** - * Sets a header by name. - * - * @param string $key The key - * @param string|array $values The value or an array of values - * @param Boolean $replace Whether to replace the actual value of not (true by default) - * - * @api - */ - public function set($key, $values, $replace = true) - { - $key = strtr(strtolower($key), '_', '-'); - - $values = array_values((array) $values); - - if (true === $replace || !isset($this->headers[$key])) { - $this->headers[$key] = $values; - } else { - $this->headers[$key] = array_merge($this->headers[$key], $values); - } - - if ('cache-control' === $key) { - $this->cacheControl = $this->parseCacheControl($values[0]); - } - } - - /** - * Returns true if the HTTP header is defined. - * - * @param string $key The HTTP header - * - * @return Boolean true if the parameter exists, false otherwise - * - * @api - */ - public function has($key) - { - return array_key_exists(strtr(strtolower($key), '_', '-'), $this->headers); - } - - /** - * Returns true if the given HTTP header contains the given value. - * - * @param string $key The HTTP header name - * @param string $value The HTTP value - * - * @return Boolean true if the value is contained in the header, false otherwise - * - * @api - */ - public function contains($key, $value) - { - return in_array($value, $this->get($key, null, false)); - } - - /** - * Removes a header. - * - * @param string $key The HTTP header name - * - * @api - */ - public function remove($key) - { - $key = strtr(strtolower($key), '_', '-'); - - unset($this->headers[$key]); - - if ('cache-control' === $key) { - $this->cacheControl = array(); - } - } - - /** - * Returns the HTTP header value converted to a date. - * - * @param string $key The parameter key - * @param \DateTime $default The default value - * - * @return null|\DateTime The filtered value - * - * @throws \RuntimeException When the HTTP header is not parseable - * - * @api - */ - public function getDate($key, \DateTime $default = null) - { - if (null === $value = $this->get($key)) { - return $default; - } - - if (false === $date = \DateTime::createFromFormat(DATE_RFC2822, $value)) { - throw new \RuntimeException(sprintf('The %s HTTP header is not parseable (%s).', $key, $value)); - } - - return $date; - } - - public function addCacheControlDirective($key, $value = true) - { - $this->cacheControl[$key] = $value; - - $this->set('Cache-Control', $this->getCacheControlHeader()); - } - - public function hasCacheControlDirective($key) - { - return array_key_exists($key, $this->cacheControl); - } - - public function getCacheControlDirective($key) - { - return array_key_exists($key, $this->cacheControl) ? $this->cacheControl[$key] : null; - } - - public function removeCacheControlDirective($key) - { - unset($this->cacheControl[$key]); - - $this->set('Cache-Control', $this->getCacheControlHeader()); - } - - /** - * Returns an iterator for headers. - * - * @return \ArrayIterator An \ArrayIterator instance - */ - public function getIterator() - { - return new \ArrayIterator($this->headers); - } - - /** - * Returns the number of headers. - * - * @return int The number of headers - */ - public function count() - { - return count($this->headers); - } - - protected function getCacheControlHeader() - { - $parts = array(); - ksort($this->cacheControl); - foreach ($this->cacheControl as $key => $value) { - if (true === $value) { - $parts[] = $key; - } else { - if (preg_match('#[^a-zA-Z0-9._-]#', $value)) { - $value = '"'.$value.'"'; - } - - $parts[] = "$key=$value"; - } - } - - return implode(', ', $parts); - } - - /** - * Parses a Cache-Control HTTP header. - * - * @param string $header The value of the Cache-Control HTTP header - * - * @return array An array representing the attribute values - */ - protected function parseCacheControl($header) - { - $cacheControl = array(); - preg_match_all('#([a-zA-Z][a-zA-Z_-]*)\s*(?:=(?:"([^"]*)"|([^ \t",;]*)))?#', $header, $matches, PREG_SET_ORDER); - foreach ($matches as $match) { - $cacheControl[strtolower($match[1])] = isset($match[3]) ? $match[3] : (isset($match[2]) ? $match[2] : true); - } - - return $cacheControl; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/JsonResponse.php b/laravel/vendor/Symfony/Component/HttpFoundation/JsonResponse.php deleted file mode 100755 index 29b4cc7b..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/JsonResponse.php +++ /dev/null @@ -1,113 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * Response represents an HTTP response in JSON format. - * - * @author Igor Wiedler - */ -class JsonResponse extends Response -{ - protected $data; - protected $callback; - - /** - * Constructor. - * - * @param mixed $data The response data - * @param integer $status The response status code - * @param array $headers An array of response headers - */ - public function __construct($data = array(), $status = 200, $headers = array()) - { - parent::__construct('', $status, $headers); - - $this->setData($data); - } - - /** - * {@inheritDoc} - */ - public static function create($data = array(), $status = 200, $headers = array()) - { - return new static($data, $status, $headers); - } - - /** - * Sets the JSONP callback. - * - * @param string $callback - * - * @return JsonResponse - */ - public function setCallback($callback = null) - { - if (null !== $callback) { - // taken from http://www.geekality.net/2011/08/03/valid-javascript-identifier/ - $pattern = '/^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{200C}\x{200D}]*+$/u'; - $parts = explode('.', $callback); - foreach ($parts as $part) { - if (!preg_match($pattern, $part)) { - throw new \InvalidArgumentException('The callback name is not valid.'); - } - } - } - - $this->callback = $callback; - - return $this->update(); - } - - /** - * Sets the data to be sent as json. - * - * @param mixed $data - * - * @return JsonResponse - */ - public function setData($data = array()) - { - // root should be JSON object, not array - if (is_array($data) && 0 === count($data)) { - $data = new \ArrayObject(); - } - - // Encode <, >, ', &, and " for RFC4627-compliant JSON, which may also be embedded into HTML. - $this->data = json_encode($data, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT); - - return $this->update(); - } - - /** - * Updates the content and headers according to the json data and callback. - * - * @return JsonResponse - */ - protected function update() - { - if (null !== $this->callback) { - // Not using application/javascript for compatibility reasons with older browsers. - $this->headers->set('Content-Type', 'text/javascript'); - - return $this->setContent(sprintf('%s(%s);', $this->callback, $this->data)); - } - - // Only set the header when there is none or when it equals 'text/javascript' (from a previous update with callback) - // in order to not overwrite a custom definition. - if (!$this->headers->has('Content-Type') || 'text/javascript' === $this->headers->get('Content-Type')) { - $this->headers->set('Content-Type', 'application/json'); - } - - return $this->setContent($this->data); - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/LICENSE b/laravel/vendor/Symfony/Component/HttpFoundation/LICENSE deleted file mode 100755 index cdffe7ae..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2012 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/LaravelRequest.php b/laravel/vendor/Symfony/Component/HttpFoundation/LaravelRequest.php deleted file mode 100644 index 7b0d4672..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/LaravelRequest.php +++ /dev/null @@ -1,38 +0,0 @@ -server->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded') - || (0 === strpos($request->server->get('HTTP_CONTENT_TYPE'), 'application/x-www-form-urlencoded'))) - && in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH')) - ) { - parse_str($request->getContent(), $data); - if (magic_quotes()) $data = array_strip_slashes($data); - $request->request = new ParameterBag($data); - } - - return $request; - } - - /** - * Get the root URL of the application. - * - * @return string - */ - public function getRootUrl() - { - return $this->getScheme().'://'.$this->getHttpHost().$this->getBasePath(); - } - -} \ No newline at end of file diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/LaravelResponse.php b/laravel/vendor/Symfony/Component/HttpFoundation/LaravelResponse.php deleted file mode 100644 index 9fe45ecf..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/LaravelResponse.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * @api - */ -class LaravelResponse extends Response -{ - - /** - * Sends HTTP headers and content. - * - * @return Response - * - * @api - */ - public function send() - { - $this->sendHeaders(); - $this->sendContent(); - - return $this; - } - - /** - * Finishes the request for PHP-FastCGI - * - * @return void - */ - public function finish() - { - if (function_exists('fastcgi_finish_request')) { - fastcgi_finish_request(); - } - } - -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/ParameterBag.php b/laravel/vendor/Symfony/Component/HttpFoundation/ParameterBag.php deleted file mode 100755 index 0273d933..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/ParameterBag.php +++ /dev/null @@ -1,303 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * ParameterBag is a container for key/value pairs. - * - * @author Fabien Potencier - * - * @api - */ -class ParameterBag implements \IteratorAggregate, \Countable -{ - /** - * Parameter storage. - * - * @var array - */ - protected $parameters; - - /** - * Constructor. - * - * @param array $parameters An array of parameters - * - * @api - */ - public function __construct(array $parameters = array()) - { - $this->parameters = $parameters; - } - - /** - * Returns the parameters. - * - * @return array An array of parameters - * - * @api - */ - public function all() - { - return $this->parameters; - } - - /** - * Returns the parameter keys. - * - * @return array An array of parameter keys - * - * @api - */ - public function keys() - { - return array_keys($this->parameters); - } - - /** - * Replaces the current parameters by a new set. - * - * @param array $parameters An array of parameters - * - * @api - */ - public function replace(array $parameters = array()) - { - $this->parameters = $parameters; - } - - /** - * Adds parameters. - * - * @param array $parameters An array of parameters - * - * @api - */ - public function add(array $parameters = array()) - { - $this->parameters = array_replace($this->parameters, $parameters); - } - - /** - * Returns a parameter by name. - * - * @param string $path The key - * @param mixed $default The default value if the parameter key does not exist - * @param boolean $deep If true, a path like foo[bar] will find deeper items - * - * @return mixed - * - * @api - */ - public function get($path, $default = null, $deep = false) - { - if (!$deep || false === $pos = strpos($path, '[')) { - return array_key_exists($path, $this->parameters) ? $this->parameters[$path] : $default; - } - - $root = substr($path, 0, $pos); - if (!array_key_exists($root, $this->parameters)) { - return $default; - } - - $value = $this->parameters[$root]; - $currentKey = null; - for ($i = $pos, $c = strlen($path); $i < $c; $i++) { - $char = $path[$i]; - - if ('[' === $char) { - if (null !== $currentKey) { - throw new \InvalidArgumentException(sprintf('Malformed path. Unexpected "[" at position %d.', $i)); - } - - $currentKey = ''; - } elseif (']' === $char) { - if (null === $currentKey) { - throw new \InvalidArgumentException(sprintf('Malformed path. Unexpected "]" at position %d.', $i)); - } - - if (!is_array($value) || !array_key_exists($currentKey, $value)) { - return $default; - } - - $value = $value[$currentKey]; - $currentKey = null; - } else { - if (null === $currentKey) { - throw new \InvalidArgumentException(sprintf('Malformed path. Unexpected "%s" at position %d.', $char, $i)); - } - - $currentKey .= $char; - } - } - - if (null !== $currentKey) { - throw new \InvalidArgumentException(sprintf('Malformed path. Path must end with "]".')); - } - - return $value; - } - - /** - * Sets a parameter by name. - * - * @param string $key The key - * @param mixed $value The value - * - * @api - */ - public function set($key, $value) - { - $this->parameters[$key] = $value; - } - - /** - * Returns true if the parameter is defined. - * - * @param string $key The key - * - * @return Boolean true if the parameter exists, false otherwise - * - * @api - */ - public function has($key) - { - return array_key_exists($key, $this->parameters); - } - - /** - * Removes a parameter. - * - * @param string $key The key - * - * @api - */ - public function remove($key) - { - unset($this->parameters[$key]); - } - - /** - * Returns the alphabetic characters of the parameter value. - * - * @param string $key The parameter key - * @param mixed $default The default value if the parameter key does not exist - * @param boolean $deep If true, a path like foo[bar] will find deeper items - * - * @return string The filtered value - * - * @api - */ - public function getAlpha($key, $default = '', $deep = false) - { - return preg_replace('/[^[:alpha:]]/', '', $this->get($key, $default, $deep)); - } - - /** - * Returns the alphabetic characters and digits of the parameter value. - * - * @param string $key The parameter key - * @param mixed $default The default value if the parameter key does not exist - * @param boolean $deep If true, a path like foo[bar] will find deeper items - * - * @return string The filtered value - * - * @api - */ - public function getAlnum($key, $default = '', $deep = false) - { - return preg_replace('/[^[:alnum:]]/', '', $this->get($key, $default, $deep)); - } - - /** - * Returns the digits of the parameter value. - * - * @param string $key The parameter key - * @param mixed $default The default value if the parameter key does not exist - * @param boolean $deep If true, a path like foo[bar] will find deeper items - * - * @return string The filtered value - * - * @api - */ - public function getDigits($key, $default = '', $deep = false) - { - // we need to remove - and + because they're allowed in the filter - return str_replace(array('-', '+'), '', $this->filter($key, $default, $deep, FILTER_SANITIZE_NUMBER_INT)); - } - - /** - * Returns the parameter value converted to integer. - * - * @param string $key The parameter key - * @param mixed $default The default value if the parameter key does not exist - * @param boolean $deep If true, a path like foo[bar] will find deeper items - * - * @return integer The filtered value - * - * @api - */ - public function getInt($key, $default = 0, $deep = false) - { - return (int) $this->get($key, $default, $deep); - } - - /** - * Filter key. - * - * @param string $key Key. - * @param mixed $default Default = null. - * @param boolean $deep Default = false. - * @param integer $filter FILTER_* constant. - * @param mixed $options Filter options. - * - * @see http://php.net/manual/en/function.filter-var.php - * - * @return mixed - */ - public function filter($key, $default = null, $deep = false, $filter=FILTER_DEFAULT, $options=array()) - { - $value = $this->get($key, $default, $deep); - - // Always turn $options into an array - this allows filter_var option shortcuts. - if (!is_array($options) && $options) { - $options = array('flags' => $options); - } - - // Add a convenience check for arrays. - if (is_array($value) && !isset($options['flags'])) { - $options['flags'] = FILTER_REQUIRE_ARRAY; - } - - return filter_var($value, $filter, $options); - } - - /** - * Returns an iterator for parameters. - * - * @return \ArrayIterator An \ArrayIterator instance - */ - public function getIterator() - { - return new \ArrayIterator($this->parameters); - } - - /** - * Returns the number of parameters. - * - * @return int The number of parameters - */ - public function count() - { - return count($this->parameters); - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/README.md b/laravel/vendor/Symfony/Component/HttpFoundation/README.md deleted file mode 100755 index bb6f02c4..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/README.md +++ /dev/null @@ -1,46 +0,0 @@ -HttpFoundation Component -======================== - -HttpFoundation defines an object-oriented layer for the HTTP specification. - -It provides an abstraction for requests, responses, uploaded files, cookies, -sessions, ... - -In this example, we get a Request object from the current PHP global -variables: - - use Symfony\Component\HttpFoundation\Request; - use Symfony\Component\HttpFoundation\Response; - - $request = Request::createFromGlobals(); - echo $request->getPathInfo(); - -You can also create a Request directly -- that's interesting for unit testing: - - $request = Request::create('/?foo=bar', 'GET'); - echo $request->getPathInfo(); - -And here is how to create and send a Response: - - $response = new Response('Not Found', 404, array('Content-Type' => 'text/plain')); - $response->send(); - -The Request and the Response classes have many other methods that implement -the HTTP specification. - -Loading -------- - -If you are using PHP 5.3.x you must add the following to your autoloader: - - // SessionHandlerInterface - if (!interface_exists('SessionHandlerInterface')) { - $loader->registerPrefixFallback(__DIR__.'/../vendor/symfony/src/Symfony/Component/HttpFoundation/Resources/stubs'); - } - -Resources ---------- - -You can run the unit tests with the following command: - - phpunit diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/RedirectResponse.php b/laravel/vendor/Symfony/Component/HttpFoundation/RedirectResponse.php deleted file mode 100755 index a9d98e6b..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/RedirectResponse.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * RedirectResponse represents an HTTP response doing a redirect. - * - * @author Fabien Potencier - * - * @api - */ -class RedirectResponse extends Response -{ - protected $targetUrl; - - /** - * Creates a redirect response so that it conforms to the rules defined for a redirect status code. - * - * @param string $url The URL to redirect to - * @param integer $status The status code (302 by default) - * @param array $headers The headers (Location is always set to the given url) - * - * @see http://tools.ietf.org/html/rfc2616#section-10.3 - * - * @api - */ - public function __construct($url, $status = 302, $headers = array()) - { - if (empty($url)) { - throw new \InvalidArgumentException('Cannot redirect to an empty URL.'); - } - - parent::__construct('', $status, $headers); - - $this->setTargetUrl($url); - - if (!$this->isRedirect()) { - throw new \InvalidArgumentException(sprintf('The HTTP status code is not a redirect ("%s" given).', $status)); - } - } - - /** - * {@inheritDoc} - */ - public static function create($url = '', $status = 302, $headers = array()) - { - return new static($url, $status, $headers); - } - - /** - * Returns the target URL. - * - * @return string target URL - */ - public function getTargetUrl() - { - return $this->targetUrl; - } - - /** - * Sets the redirect target of this response. - * - * @param string $url The URL to redirect to - * - * @return RedirectResponse The current response. - */ - public function setTargetUrl($url) - { - if (empty($url)) { - throw new \InvalidArgumentException('Cannot redirect to an empty URL.'); - } - - $this->targetUrl = $url; - - $this->setContent( - sprintf(' - - - - - - Redirecting to %1$s - - - Redirecting to %1$s. - -', htmlspecialchars($url, ENT_QUOTES, 'UTF-8'))); - - $this->headers->set('Location', $url); - - return $this; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Request.php b/laravel/vendor/Symfony/Component/HttpFoundation/Request.php deleted file mode 100755 index 18e5480c..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Request.php +++ /dev/null @@ -1,1634 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -use Symfony\Component\HttpFoundation\Session\SessionInterface; - -/** - * Request represents an HTTP request. - * - * The methods dealing with URL accept / return a raw path (% encoded): - * * getBasePath - * * getBaseUrl - * * getPathInfo - * * getRequestUri - * * getUri - * * getUriForPath - * - * @author Fabien Potencier - * - * @api - */ -class Request -{ - const HEADER_CLIENT_IP = 'client_ip'; - const HEADER_CLIENT_HOST = 'client_host'; - const HEADER_CLIENT_PROTO = 'client_proto'; - const HEADER_CLIENT_PORT = 'client_port'; - - protected static $trustProxy = false; - - protected static $trustedProxies = array(); - - /** - * Names for headers that can be trusted when - * using trusted proxies. - * - * The default names are non-standard, but widely used - * by popular reverse proxies (like Apache mod_proxy or Amazon EC2). - */ - protected static $trustedHeaders = array( - self::HEADER_CLIENT_IP => 'X_FORWARDED_FOR', - self::HEADER_CLIENT_HOST => 'X_FORWARDED_HOST', - self::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO', - self::HEADER_CLIENT_PORT => 'X_FORWARDED_PORT', - ); - - /** - * @var \Symfony\Component\HttpFoundation\ParameterBag - * - * @api - */ - public $attributes; - - /** - * @var \Symfony\Component\HttpFoundation\ParameterBag - * - * @api - */ - public $request; - - /** - * @var \Symfony\Component\HttpFoundation\ParameterBag - * - * @api - */ - public $query; - - /** - * @var \Symfony\Component\HttpFoundation\ServerBag - * - * @api - */ - public $server; - - /** - * @var \Symfony\Component\HttpFoundation\FileBag - * - * @api - */ - public $files; - - /** - * @var \Symfony\Component\HttpFoundation\ParameterBag - * - * @api - */ - public $cookies; - - /** - * @var \Symfony\Component\HttpFoundation\HeaderBag - * - * @api - */ - public $headers; - - /** - * @var string - */ - protected $content; - - /** - * @var array - */ - protected $languages; - - /** - * @var array - */ - protected $charsets; - - /** - * @var array - */ - protected $acceptableContentTypes; - - /** - * @var string - */ - protected $pathInfo; - - /** - * @var string - */ - protected $requestUri; - - /** - * @var string - */ - protected $baseUrl; - - /** - * @var string - */ - protected $basePath; - - /** - * @var string - */ - protected $method; - - /** - * @var string - */ - protected $format; - - /** - * @var \Symfony\Component\HttpFoundation\Session\SessionInterface - */ - protected $session; - - /** - * @var string - */ - protected $locale; - - /** - * @var string - */ - protected $defaultLocale = 'en'; - - /** - * @var array - */ - protected static $formats; - - /** - * Constructor. - * - * @param array $query The GET parameters - * @param array $request The POST parameters - * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) - * @param array $cookies The COOKIE parameters - * @param array $files The FILES parameters - * @param array $server The SERVER parameters - * @param string $content The raw body data - * - * @api - */ - public function __construct(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null) - { - $this->initialize($query, $request, $attributes, $cookies, $files, $server, $content); - } - - /** - * Sets the parameters for this request. - * - * This method also re-initializes all properties. - * - * @param array $query The GET parameters - * @param array $request The POST parameters - * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) - * @param array $cookies The COOKIE parameters - * @param array $files The FILES parameters - * @param array $server The SERVER parameters - * @param string $content The raw body data - * - * @api - */ - public function initialize(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null) - { - $this->request = new ParameterBag($request); - $this->query = new ParameterBag($query); - $this->attributes = new ParameterBag($attributes); - $this->cookies = new ParameterBag($cookies); - $this->files = new FileBag($files); - $this->server = new ServerBag($server); - $this->headers = new HeaderBag($this->server->getHeaders()); - - $this->content = $content; - $this->languages = null; - $this->charsets = null; - $this->acceptableContentTypes = null; - $this->pathInfo = null; - $this->requestUri = null; - $this->baseUrl = null; - $this->basePath = null; - $this->method = null; - $this->format = null; - } - - /** - * Creates a new request with values from PHP's super globals. - * - * @return Request A new request - * - * @api - */ - public static function createFromGlobals() - { - $request = new static($_GET, $_POST, array(), $_COOKIE, $_FILES, $_SERVER); - - if (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded') - && in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH')) - ) { - parse_str($request->getContent(), $data); - $request->request = new ParameterBag($data); - } - - return $request; - } - - /** - * Creates a Request based on a given URI and configuration. - * - * @param string $uri The URI - * @param string $method The HTTP method - * @param array $parameters The query (GET) or request (POST) parameters - * @param array $cookies The request cookies ($_COOKIE) - * @param array $files The request files ($_FILES) - * @param array $server The server parameters ($_SERVER) - * @param string $content The raw body data - * - * @return Request A Request instance - * - * @api - */ - public static function create($uri, $method = 'GET', $parameters = array(), $cookies = array(), $files = array(), $server = array(), $content = null) - { - $defaults = array( - 'SERVER_NAME' => 'localhost', - 'SERVER_PORT' => 80, - 'HTTP_HOST' => 'localhost', - 'HTTP_USER_AGENT' => 'Symfony/2.X', - 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5', - 'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', - 'REMOTE_ADDR' => '127.0.0.1', - 'SCRIPT_NAME' => '', - 'SCRIPT_FILENAME' => '', - 'SERVER_PROTOCOL' => 'HTTP/1.1', - 'REQUEST_TIME' => time(), - ); - - $components = parse_url($uri); - if (isset($components['host'])) { - $defaults['SERVER_NAME'] = $components['host']; - $defaults['HTTP_HOST'] = $components['host']; - } - - if (isset($components['scheme'])) { - if ('https' === $components['scheme']) { - $defaults['HTTPS'] = 'on'; - $defaults['SERVER_PORT'] = 443; - } - } - - if (isset($components['port'])) { - $defaults['SERVER_PORT'] = $components['port']; - $defaults['HTTP_HOST'] = $defaults['HTTP_HOST'].':'.$components['port']; - } - - if (isset($components['user'])) { - $defaults['PHP_AUTH_USER'] = $components['user']; - } - - if (isset($components['pass'])) { - $defaults['PHP_AUTH_PW'] = $components['pass']; - } - - if (!isset($components['path'])) { - $components['path'] = '/'; - } - - switch (strtoupper($method)) { - case 'POST': - case 'PUT': - case 'DELETE': - $defaults['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'; - case 'PATCH': - $request = $parameters; - $query = array(); - break; - default: - $request = array(); - $query = $parameters; - break; - } - - if (isset($components['query'])) { - parse_str(html_entity_decode($components['query']), $qs); - $query = array_replace($qs, $query); - } - $queryString = http_build_query($query, '', '&'); - - $uri = $components['path'].('' !== $queryString ? '?'.$queryString : ''); - - $server = array_replace($defaults, $server, array( - 'REQUEST_METHOD' => strtoupper($method), - 'PATH_INFO' => '', - 'REQUEST_URI' => $uri, - 'QUERY_STRING' => $queryString, - )); - - return new static($query, $request, array(), $cookies, $files, $server, $content); - } - - /** - * Clones a request and overrides some of its parameters. - * - * @param array $query The GET parameters - * @param array $request The POST parameters - * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) - * @param array $cookies The COOKIE parameters - * @param array $files The FILES parameters - * @param array $server The SERVER parameters - * - * @return Request The duplicated request - * - * @api - */ - public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null) - { - $dup = clone $this; - if ($query !== null) { - $dup->query = new ParameterBag($query); - } - if ($request !== null) { - $dup->request = new ParameterBag($request); - } - if ($attributes !== null) { - $dup->attributes = new ParameterBag($attributes); - } - if ($cookies !== null) { - $dup->cookies = new ParameterBag($cookies); - } - if ($files !== null) { - $dup->files = new FileBag($files); - } - if ($server !== null) { - $dup->server = new ServerBag($server); - $dup->headers = new HeaderBag($dup->server->getHeaders()); - } - $dup->languages = null; - $dup->charsets = null; - $dup->acceptableContentTypes = null; - $dup->pathInfo = null; - $dup->requestUri = null; - $dup->baseUrl = null; - $dup->basePath = null; - $dup->method = null; - $dup->format = null; - - return $dup; - } - - /** - * Clones the current request. - * - * Note that the session is not cloned as duplicated requests - * are most of the time sub-requests of the main one. - */ - public function __clone() - { - $this->query = clone $this->query; - $this->request = clone $this->request; - $this->attributes = clone $this->attributes; - $this->cookies = clone $this->cookies; - $this->files = clone $this->files; - $this->server = clone $this->server; - $this->headers = clone $this->headers; - } - - /** - * Returns the request as a string. - * - * @return string The request - */ - public function __toString() - { - return - sprintf('%s %s %s', $this->getMethod(), $this->getRequestUri(), $this->server->get('SERVER_PROTOCOL'))."\r\n". - $this->headers."\r\n". - $this->getContent(); - } - - /** - * Overrides the PHP global variables according to this request instance. - * - * It overrides $_GET, $_POST, $_REQUEST, $_SERVER, $_COOKIE. - * $_FILES is never override, see rfc1867 - * - * @api - */ - public function overrideGlobals() - { - $_GET = $this->query->all(); - $_POST = $this->request->all(); - $_SERVER = $this->server->all(); - $_COOKIE = $this->cookies->all(); - - foreach ($this->headers->all() as $key => $value) { - $key = strtoupper(str_replace('-', '_', $key)); - if (in_array($key, array('CONTENT_TYPE', 'CONTENT_LENGTH'))) { - $_SERVER[$key] = implode(', ', $value); - } else { - $_SERVER['HTTP_'.$key] = implode(', ', $value); - } - } - - $request = array('g' => $_GET, 'p' => $_POST, 'c' => $_COOKIE); - - $requestOrder = ini_get('request_order') ?: ini_get('variable_order'); - $requestOrder = preg_replace('#[^cgp]#', '', strtolower($requestOrder)) ?: 'gp'; - - $_REQUEST = array(); - foreach (str_split($requestOrder) as $order) { - $_REQUEST = array_merge($_REQUEST, $request[$order]); - } - } - - /** - * Trusts $_SERVER entries coming from proxies. - * - * @deprecated Deprecated since version 2.0, to be removed in 2.3. Use setTrustedProxies instead. - */ - public static function trustProxyData() - { - self::$trustProxy = true; - } - - /** - * Sets a list of trusted proxies. - * - * You should only list the reverse proxies that you manage directly. - * - * @param array $proxies A list of trusted proxies - * - * @api - */ - public static function setTrustedProxies(array $proxies) - { - self::$trustedProxies = $proxies; - self::$trustProxy = $proxies ? true : false; - } - - /** - * Sets the name for trusted headers. - * - * The following header keys are supported: - * - * * Request::HEADER_CLIENT_IP: defaults to X-Forwarded-For (see getClientIp()) - * * Request::HEADER_CLIENT_HOST: defaults to X-Forwarded-Host (see getClientHost()) - * * Request::HEADER_CLIENT_PORT: defaults to X-Forwarded-Port (see getClientPort()) - * * Request::HEADER_CLIENT_PROTO: defaults to X-Forwarded-Proto (see getScheme() and isSecure()) - * - * Setting an empty value allows to disable the trusted header for the given key. - * - * @param string $key The header key - * @param string $value The header name - */ - public static function setTrustedHeaderName($key, $value) - { - if (!array_key_exists($key, self::$trustedHeaders)) { - throw new \InvalidArgumentException(sprintf('Unable to set the trusted header name for key "%s".', $key)); - } - - self::$trustedHeaders[$key] = $value; - } - - /** - * Returns true if $_SERVER entries coming from proxies are trusted, - * false otherwise. - * - * @return boolean - */ - public static function isProxyTrusted() - { - return self::$trustProxy; - } - - /** - * Normalizes a query string. - * - * It builds a normalized query string, where keys/value pairs are alphabetized, - * have consistent escaping and unneeded delimiters are removed. - * - * @param string $qs Query string - * - * @return string A normalized query string for the Request - */ - public static function normalizeQueryString($qs) - { - if ('' == $qs) { - return ''; - } - - $parts = array(); - $order = array(); - - foreach (explode('&', $qs) as $param) { - if ('' === $param || '=' === $param[0]) { - // Ignore useless delimiters, e.g. "x=y&". - // Also ignore pairs with empty key, even if there was a value, e.g. "=value", as such nameless values cannot be retrieved anyway. - // PHP also does not include them when building _GET. - continue; - } - - $keyValuePair = explode('=', $param, 2); - - // GET parameters, that are submitted from a HTML form, encode spaces as "+" by default (as defined in enctype application/x-www-form-urlencoded). - // PHP also converts "+" to spaces when filling the global _GET or when using the function parse_str. This is why we use urldecode and then normalize to - // RFC 3986 with rawurlencode. - $parts[] = isset($keyValuePair[1]) ? - rawurlencode(urldecode($keyValuePair[0])).'='.rawurlencode(urldecode($keyValuePair[1])) : - rawurlencode(urldecode($keyValuePair[0])); - $order[] = urldecode($keyValuePair[0]); - } - - array_multisort($order, SORT_ASC, $parts); - - return implode('&', $parts); - } - - /** - * Gets a "parameter" value. - * - * This method is mainly useful for libraries that want to provide some flexibility. - * - * Order of precedence: GET, PATH, POST - * - * Avoid using this method in controllers: - * - * * slow - * * prefer to get from a "named" source - * - * It is better to explicitly get request parameters from the appropriate - * public property instead (query, attributes, request). - * - * @param string $key the key - * @param mixed $default the default value - * @param Boolean $deep is parameter deep in multidimensional array - * - * @return mixed - */ - public function get($key, $default = null, $deep = false) - { - return $this->query->get($key, $this->attributes->get($key, $this->request->get($key, $default, $deep), $deep), $deep); - } - - /** - * Gets the Session. - * - * @return SessionInterface|null The session - * - * @api - */ - public function getSession() - { - return $this->session; - } - - /** - * Whether the request contains a Session which was started in one of the - * previous requests. - * - * @return Boolean - * - * @api - */ - public function hasPreviousSession() - { - // the check for $this->session avoids malicious users trying to fake a session cookie with proper name - return $this->hasSession() && $this->cookies->has($this->session->getName()); - } - - /** - * Whether the request contains a Session object. - * - * This method does not give any information about the state of the session object, - * like whether the session is started or not. It is just a way to check if this Request - * is associated with a Session instance. - * - * @return Boolean true when the Request contains a Session object, false otherwise - * - * @api - */ - public function hasSession() - { - return null !== $this->session; - } - - /** - * Sets the Session. - * - * @param SessionInterface $session The Session - * - * @api - */ - public function setSession(SessionInterface $session) - { - $this->session = $session; - } - - /** - * Returns the client IP address. - * - * This method can read the client IP address from the "X-Forwarded-For" header - * when trusted proxies were set via "setTrustedProxies()". The "X-Forwarded-For" - * header value is a comma+space separated list of IP addresses, the left-most - * being the original client, and each successive proxy that passed the request - * adding the IP address where it received the request from. - * - * If your reverse proxy uses a different header name than "X-Forwarded-For", - * ("Client-Ip" for instance), configure it via "setTrustedHeaderName()" with - * the "client-ip" key. - * - * @return string The client IP address - * - * @see http://en.wikipedia.org/wiki/X-Forwarded-For - * - * @deprecated The proxy argument is deprecated since version 2.0 and will be removed in 2.3. Use setTrustedProxies instead. - * - * @api - */ - public function getClientIp() - { - $ip = $this->server->get('REMOTE_ADDR'); - - if (!self::$trustProxy) { - return $ip; - } - - if (!self::$trustedHeaders[self::HEADER_CLIENT_IP] || !$this->headers->has(self::$trustedHeaders[self::HEADER_CLIENT_IP])) { - return $ip; - } - - $clientIps = array_map('trim', explode(',', $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_IP]))); - $clientIps[] = $ip; - - $trustedProxies = self::$trustProxy && !self::$trustedProxies ? array($ip) : self::$trustedProxies; - $clientIps = array_diff($clientIps, $trustedProxies); - - return array_pop($clientIps); - } - - /** - * Returns current script name. - * - * @return string - * - * @api - */ - public function getScriptName() - { - return $this->server->get('SCRIPT_NAME', $this->server->get('ORIG_SCRIPT_NAME', '')); - } - - /** - * Returns the path being requested relative to the executed script. - * - * The path info always starts with a /. - * - * Suppose this request is instantiated from /mysite on localhost: - * - * * http://localhost/mysite returns an empty string - * * http://localhost/mysite/about returns '/about' - * * htpp://localhost/mysite/enco%20ded returns '/enco%20ded' - * * http://localhost/mysite/about?var=1 returns '/about' - * - * @return string The raw path (i.e. not urldecoded) - * - * @api - */ - public function getPathInfo() - { - if (null === $this->pathInfo) { - $this->pathInfo = $this->preparePathInfo(); - } - - return $this->pathInfo; - } - - /** - * Returns the root path from which this request is executed. - * - * Suppose that an index.php file instantiates this request object: - * - * * http://localhost/index.php returns an empty string - * * http://localhost/index.php/page returns an empty string - * * http://localhost/web/index.php returns '/web' - * * http://localhost/we%20b/index.php returns '/we%20b' - * - * @return string The raw path (i.e. not urldecoded) - * - * @api - */ - public function getBasePath() - { - if (null === $this->basePath) { - $this->basePath = $this->prepareBasePath(); - } - - return $this->basePath; - } - - /** - * Returns the root url from which this request is executed. - * - * The base URL never ends with a /. - * - * This is similar to getBasePath(), except that it also includes the - * script filename (e.g. index.php) if one exists. - * - * @return string The raw url (i.e. not urldecoded) - * - * @api - */ - public function getBaseUrl() - { - if (null === $this->baseUrl) { - $this->baseUrl = $this->prepareBaseUrl(); - } - - return $this->baseUrl; - } - - /** - * Gets the request's scheme. - * - * @return string - * - * @api - */ - public function getScheme() - { - return $this->isSecure() ? 'https' : 'http'; - } - - /** - * Returns the port on which the request is made. - * - * This method can read the client port from the "X-Forwarded-Port" header - * when trusted proxies were set via "setTrustedProxies()". - * - * The "X-Forwarded-Port" header must contain the client port. - * - * If your reverse proxy uses a different header name than "X-Forwarded-Port", - * configure it via "setTrustedHeaderName()" with the "client-port" key. - * - * @return string - * - * @api - */ - public function getPort() - { - if (self::$trustProxy && self::$trustedHeaders[self::HEADER_CLIENT_PORT] && $port = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PORT])) { - return $port; - } - - return $this->server->get('SERVER_PORT'); - } - - /** - * Returns the user. - * - * @return string|null - */ - public function getUser() - { - return $this->server->get('PHP_AUTH_USER'); - } - - /** - * Returns the password. - * - * @return string|null - */ - public function getPassword() - { - return $this->server->get('PHP_AUTH_PW'); - } - - /** - * Gets the user info. - * - * @return string A user name and, optionally, scheme-specific information about how to gain authorization to access the server - */ - public function getUserInfo() - { - $userinfo = $this->getUser(); - - $pass = $this->getPassword(); - if ('' != $pass) { - $userinfo .= ":$pass"; - } - - return $userinfo; - } - - /** - * Returns the HTTP host being requested. - * - * The port name will be appended to the host if it's non-standard. - * - * @return string - * - * @api - */ - public function getHttpHost() - { - $scheme = $this->getScheme(); - $port = $this->getPort(); - - if (('http' == $scheme && $port == 80) || ('https' == $scheme && $port == 443)) { - return $this->getHost(); - } - - return $this->getHost().':'.$port; - } - - /** - * Returns the requested URI. - * - * @return string The raw URI (i.e. not urldecoded) - * - * @api - */ - public function getRequestUri() - { - if (null === $this->requestUri) { - $this->requestUri = $this->prepareRequestUri(); - } - - return $this->requestUri; - } - - /** - * Gets the scheme and HTTP host. - * - * If the URL was called with basic authentication, the user - * and the password are not added to the generated string. - * - * @return string The scheme and HTTP host - */ - public function getSchemeAndHttpHost() - { - return $this->getScheme().'://'.$this->getHttpHost(); - } - - /** - * Generates a normalized URI for the Request. - * - * @return string A normalized URI for the Request - * - * @see getQueryString() - * - * @api - */ - public function getUri() - { - $qs = $this->getQueryString(); - if (null !== $qs) { - $qs = '?'.$qs; - } - - return $this->getSchemeAndHttpHost().$this->getBaseUrl().$this->getPathInfo().$qs; - } - - /** - * Generates a normalized URI for the given path. - * - * @param string $path A path to use instead of the current one - * - * @return string The normalized URI for the path - * - * @api - */ - public function getUriForPath($path) - { - return $this->getSchemeAndHttpHost().$this->getBaseUrl().$path; - } - - /** - * Generates the normalized query string for the Request. - * - * It builds a normalized query string, where keys/value pairs are alphabetized - * and have consistent escaping. - * - * @return string|null A normalized query string for the Request - * - * @api - */ - public function getQueryString() - { - $qs = static::normalizeQueryString($this->server->get('QUERY_STRING')); - - return '' === $qs ? null : $qs; - } - - /** - * Checks whether the request is secure or not. - * - * This method can read the client port from the "X-Forwarded-Proto" header - * when trusted proxies were set via "setTrustedProxies()". - * - * The "X-Forwarded-Proto" header must contain the protocol: "https" or "http". - * - * If your reverse proxy uses a different header name than "X-Forwarded-Proto" - * ("SSL_HTTPS" for instance), configure it via "setTrustedHeaderName()" with - * the "client-proto" key. - * - * @return Boolean - * - * @api - */ - public function isSecure() - { - if (self::$trustProxy && self::$trustedHeaders[self::HEADER_CLIENT_PROTO] && $proto = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PROTO])) { - return in_array(strtolower($proto), array('https', 'on', '1')); - } - - return 'on' == strtolower($this->server->get('HTTPS')) || 1 == $this->server->get('HTTPS'); - } - - /** - * Returns the host name. - * - * This method can read the client port from the "X-Forwarded-Host" header - * when trusted proxies were set via "setTrustedProxies()". - * - * The "X-Forwarded-Host" header must contain the client host name. - * - * If your reverse proxy uses a different header name than "X-Forwarded-Host", - * configure it via "setTrustedHeaderName()" with the "client-host" key. - * - * @return string - * - * @throws \UnexpectedValueException when the host name is invalid - * - * @api - */ - public function getHost() - { - if (self::$trustProxy && self::$trustedHeaders[self::HEADER_CLIENT_HOST] && $host = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_HOST])) { - $elements = explode(',', $host); - - $host = $elements[count($elements) - 1]; - } elseif (!$host = $this->headers->get('HOST')) { - if (!$host = $this->server->get('SERVER_NAME')) { - $host = $this->server->get('SERVER_ADDR', ''); - } - } - - // trim and remove port number from host - // host is lowercase as per RFC 952/2181 - $host = strtolower(preg_replace('/:\d+$/', '', trim($host))); - - // as the host can come from the user (HTTP_HOST and depending on the configuration, SERVER_NAME too can come from the user) - // check that it does not contain forbidden characters (see RFC 952 and RFC 2181) - if ($host && !preg_match('/^\[?(?:[a-zA-Z0-9-:\]_]+\.?)+$/', $host)) { - throw new \UnexpectedValueException('Invalid Host'); - } - - return $host; - } - - /** - * Sets the request method. - * - * @param string $method - * - * @api - */ - public function setMethod($method) - { - $this->method = null; - $this->server->set('REQUEST_METHOD', $method); - } - - /** - * Gets the request method. - * - * The method is always an uppercased string. - * - * @return string The request method - * - * @api - */ - public function getMethod() - { - if (null === $this->method) { - $this->method = strtoupper($this->server->get('REQUEST_METHOD', 'GET')); - if ('POST' === $this->method) { - $this->method = strtoupper($this->headers->get('X-HTTP-METHOD-OVERRIDE', $this->request->get('_method', $this->query->get('_method', 'POST')))); - } - } - - return $this->method; - } - - /** - * Gets the mime type associated with the format. - * - * @param string $format The format - * - * @return string The associated mime type (null if not found) - * - * @api - */ - public function getMimeType($format) - { - if (null === static::$formats) { - static::initializeFormats(); - } - - return isset(static::$formats[$format]) ? static::$formats[$format][0] : null; - } - - /** - * Gets the format associated with the mime type. - * - * @param string $mimeType The associated mime type - * - * @return string|null The format (null if not found) - * - * @api - */ - public function getFormat($mimeType) - { - if (false !== $pos = strpos($mimeType, ';')) { - $mimeType = substr($mimeType, 0, $pos); - } - - if (null === static::$formats) { - static::initializeFormats(); - } - - foreach (static::$formats as $format => $mimeTypes) { - if (in_array($mimeType, (array) $mimeTypes)) { - return $format; - } - } - - return null; - } - - /** - * Associates a format with mime types. - * - * @param string $format The format - * @param string|array $mimeTypes The associated mime types (the preferred one must be the first as it will be used as the content type) - * - * @api - */ - public function setFormat($format, $mimeTypes) - { - if (null === static::$formats) { - static::initializeFormats(); - } - - static::$formats[$format] = is_array($mimeTypes) ? $mimeTypes : array($mimeTypes); - } - - /** - * Gets the request format. - * - * Here is the process to determine the format: - * - * * format defined by the user (with setRequestFormat()) - * * _format request parameter - * * $default - * - * @param string $default The default format - * - * @return string The request format - * - * @api - */ - public function getRequestFormat($default = 'html') - { - if (null === $this->format) { - $this->format = $this->get('_format', $default); - } - - return $this->format; - } - - /** - * Sets the request format. - * - * @param string $format The request format. - * - * @api - */ - public function setRequestFormat($format) - { - $this->format = $format; - } - - /** - * Gets the format associated with the request. - * - * @return string|null The format (null if no content type is present) - * - * @api - */ - public function getContentType() - { - return $this->getFormat($this->headers->get('CONTENT_TYPE')); - } - - /** - * Sets the default locale. - * - * @param string $locale - * - * @api - */ - public function setDefaultLocale($locale) - { - $this->defaultLocale = $locale; - - if (null === $this->locale) { - $this->setPhpDefaultLocale($locale); - } - } - - /** - * Sets the locale. - * - * @param string $locale - * - * @api - */ - public function setLocale($locale) - { - $this->setPhpDefaultLocale($this->locale = $locale); - } - - /** - * Get the locale. - * - * @return string - */ - public function getLocale() - { - return null === $this->locale ? $this->defaultLocale : $this->locale; - } - - /** - * Checks if the request method is of specified type. - * - * @param string $method Uppercase request method (GET, POST etc). - * - * @return Boolean - */ - public function isMethod($method) - { - return $this->getMethod() === strtoupper($method); - } - - /** - * Checks whether the method is safe or not. - * - * @return Boolean - * - * @api - */ - public function isMethodSafe() - { - return in_array($this->getMethod(), array('GET', 'HEAD')); - } - - /** - * Returns the request body content. - * - * @param Boolean $asResource If true, a resource will be returned - * - * @return string|resource The request body content or a resource to read the body stream. - */ - public function getContent($asResource = false) - { - if (false === $this->content || (true === $asResource && null !== $this->content)) { - throw new \LogicException('getContent() can only be called once when using the resource return type.'); - } - - if (true === $asResource) { - $this->content = false; - - return fopen('php://input', 'rb'); - } - - if (null === $this->content) { - $this->content = file_get_contents('php://input'); - } - - return $this->content; - } - - /** - * Gets the Etags. - * - * @return array The entity tags - */ - public function getETags() - { - return preg_split('/\s*,\s*/', $this->headers->get('if_none_match'), null, PREG_SPLIT_NO_EMPTY); - } - - /** - * @return Boolean - */ - public function isNoCache() - { - return $this->headers->hasCacheControlDirective('no-cache') || 'no-cache' == $this->headers->get('Pragma'); - } - - /** - * Returns the preferred language. - * - * @param array $locales An array of ordered available locales - * - * @return string|null The preferred locale - * - * @api - */ - public function getPreferredLanguage(array $locales = null) - { - $preferredLanguages = $this->getLanguages(); - - if (empty($locales)) { - return isset($preferredLanguages[0]) ? $preferredLanguages[0] : null; - } - - if (!$preferredLanguages) { - return $locales[0]; - } - - $preferredLanguages = array_values(array_intersect($preferredLanguages, $locales)); - - return isset($preferredLanguages[0]) ? $preferredLanguages[0] : $locales[0]; - } - - /** - * Gets a list of languages acceptable by the client browser. - * - * @return array Languages ordered in the user browser preferences - * - * @api - */ - public function getLanguages() - { - if (null !== $this->languages) { - return $this->languages; - } - - $languages = $this->splitHttpAcceptHeader($this->headers->get('Accept-Language')); - $this->languages = array(); - foreach ($languages as $lang => $q) { - if (strstr($lang, '-')) { - $codes = explode('-', $lang); - if ($codes[0] == 'i') { - // Language not listed in ISO 639 that are not variants - // of any listed language, which can be registered with the - // i-prefix, such as i-cherokee - if (count($codes) > 1) { - $lang = $codes[1]; - } - } else { - for ($i = 0, $max = count($codes); $i < $max; $i++) { - if ($i == 0) { - $lang = strtolower($codes[0]); - } else { - $lang .= '_'.strtoupper($codes[$i]); - } - } - } - } - - $this->languages[] = $lang; - } - - return $this->languages; - } - - /** - * Gets a list of charsets acceptable by the client browser. - * - * @return array List of charsets in preferable order - * - * @api - */ - public function getCharsets() - { - if (null !== $this->charsets) { - return $this->charsets; - } - - return $this->charsets = array_keys($this->splitHttpAcceptHeader($this->headers->get('Accept-Charset'))); - } - - /** - * Gets a list of content types acceptable by the client browser - * - * @return array List of content types in preferable order - * - * @api - */ - public function getAcceptableContentTypes() - { - if (null !== $this->acceptableContentTypes) { - return $this->acceptableContentTypes; - } - - return $this->acceptableContentTypes = array_keys($this->splitHttpAcceptHeader($this->headers->get('Accept'))); - } - - /** - * Returns true if the request is a XMLHttpRequest. - * - * It works if your JavaScript library set an X-Requested-With HTTP header. - * It is known to work with Prototype, Mootools, jQuery. - * - * @return Boolean true if the request is an XMLHttpRequest, false otherwise - * - * @api - */ - public function isXmlHttpRequest() - { - return 'XMLHttpRequest' == $this->headers->get('X-Requested-With'); - } - - /** - * Splits an Accept-* HTTP header. - * - * @param string $header Header to split - * - * @return array Array indexed by the values of the Accept-* header in preferred order - */ - public function splitHttpAcceptHeader($header) - { - if (!$header) { - return array(); - } - - $values = array(); - $groups = array(); - foreach (array_filter(explode(',', $header)) as $value) { - // Cut off any q-value that might come after a semi-colon - if (preg_match('/;\s*(q=.*$)/', $value, $match)) { - $q = substr(trim($match[1]), 2); - $value = trim(substr($value, 0, -strlen($match[0]))); - } else { - $q = 1; - } - - $groups[$q][] = $value; - } - - krsort($groups); - - foreach ($groups as $q => $items) { - $q = (float) $q; - - if (0 < $q) { - foreach ($items as $value) { - $values[trim($value)] = $q; - } - } - } - - return $values; - } - - /* - * The following methods are derived from code of the Zend Framework (1.10dev - 2010-01-24) - * - * Code subject to the new BSD license (http://framework.zend.com/license/new-bsd). - * - * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) - */ - - protected function prepareRequestUri() - { - $requestUri = ''; - - if ($this->headers->has('X_ORIGINAL_URL') && false !== stripos(PHP_OS, 'WIN')) { - // IIS with Microsoft Rewrite Module - $requestUri = $this->headers->get('X_ORIGINAL_URL'); - } elseif ($this->headers->has('X_REWRITE_URL') && false !== stripos(PHP_OS, 'WIN')) { - // IIS with ISAPI_Rewrite - $requestUri = $this->headers->get('X_REWRITE_URL'); - } elseif ($this->server->get('IIS_WasUrlRewritten') == '1' && $this->server->get('UNENCODED_URL') != '') { - // IIS7 with URL Rewrite: make sure we get the unencoded url (double slash problem) - $requestUri = $this->server->get('UNENCODED_URL'); - } elseif ($this->server->has('REQUEST_URI')) { - $requestUri = $this->server->get('REQUEST_URI'); - // HTTP proxy reqs setup request uri with scheme and host [and port] + the url path, only use url path - $schemeAndHttpHost = $this->getSchemeAndHttpHost(); - if (strpos($requestUri, $schemeAndHttpHost) === 0) { - $requestUri = substr($requestUri, strlen($schemeAndHttpHost)); - } - } elseif ($this->server->has('ORIG_PATH_INFO')) { - // IIS 5.0, PHP as CGI - $requestUri = $this->server->get('ORIG_PATH_INFO'); - if ('' != $this->server->get('QUERY_STRING')) { - $requestUri .= '?'.$this->server->get('QUERY_STRING'); - } - } - - return $requestUri; - } - - /** - * Prepares the base URL. - * - * @return string - */ - protected function prepareBaseUrl() - { - $filename = basename($this->server->get('SCRIPT_FILENAME')); - - if (basename($this->server->get('SCRIPT_NAME')) === $filename) { - $baseUrl = $this->server->get('SCRIPT_NAME'); - } elseif (basename($this->server->get('PHP_SELF')) === $filename) { - $baseUrl = $this->server->get('PHP_SELF'); - } elseif (basename($this->server->get('ORIG_SCRIPT_NAME')) === $filename) { - $baseUrl = $this->server->get('ORIG_SCRIPT_NAME'); // 1and1 shared hosting compatibility - } else { - // Backtrack up the script_filename to find the portion matching - // php_self - $path = $this->server->get('PHP_SELF', ''); - $file = $this->server->get('SCRIPT_FILENAME', ''); - $segs = explode('/', trim($file, '/')); - $segs = array_reverse($segs); - $index = 0; - $last = count($segs); - $baseUrl = ''; - do { - $seg = $segs[$index]; - $baseUrl = '/'.$seg.$baseUrl; - ++$index; - } while (($last > $index) && (false !== ($pos = strpos($path, $baseUrl))) && (0 != $pos)); - } - - // Does the baseUrl have anything in common with the request_uri? - $requestUri = $this->getRequestUri(); - - if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, $baseUrl)) { - // full $baseUrl matches - return $prefix; - } - - if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, dirname($baseUrl))) { - // directory portion of $baseUrl matches - return rtrim($prefix, '/'); - } - - $truncatedRequestUri = $requestUri; - if (($pos = strpos($requestUri, '?')) !== false) { - $truncatedRequestUri = substr($requestUri, 0, $pos); - } - - $basename = basename($baseUrl); - if (empty($basename) || !strpos(rawurldecode($truncatedRequestUri), $basename)) { - // no match whatsoever; set it blank - return ''; - } - - // If using mod_rewrite or ISAPI_Rewrite strip the script filename - // out of baseUrl. $pos !== 0 makes sure it is not matching a value - // from PATH_INFO or QUERY_STRING - if ((strlen($requestUri) >= strlen($baseUrl)) && ((false !== ($pos = strpos($requestUri, $baseUrl))) && ($pos !== 0))) { - $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl)); - } - - return rtrim($baseUrl, '/'); - } - - /** - * Prepares the base path. - * - * @return string base path - */ - protected function prepareBasePath() - { - $filename = basename($this->server->get('SCRIPT_FILENAME')); - $baseUrl = $this->getBaseUrl(); - if (empty($baseUrl)) { - return ''; - } - - if (basename($baseUrl) === $filename) { - $basePath = dirname($baseUrl); - } else { - $basePath = $baseUrl; - } - - if ('\\' === DIRECTORY_SEPARATOR) { - $basePath = str_replace('\\', '/', $basePath); - } - - return rtrim($basePath, '/'); - } - - /** - * Prepares the path info. - * - * @return string path info - */ - protected function preparePathInfo() - { - $baseUrl = $this->getBaseUrl(); - - if (null === ($requestUri = $this->getRequestUri())) { - return '/'; - } - - $pathInfo = '/'; - - // Remove the query string from REQUEST_URI - if ($pos = strpos($requestUri, '?')) { - $requestUri = substr($requestUri, 0, $pos); - } - - if ((null !== $baseUrl) && (false === ($pathInfo = substr($requestUri, strlen($baseUrl))))) { - // If substr() returns false then PATH_INFO is set to an empty string - return '/'; - } elseif (null === $baseUrl) { - return $requestUri; - } - - return (string) $pathInfo; - } - - /** - * Initializes HTTP request formats. - */ - protected static function initializeFormats() - { - static::$formats = array( - 'html' => array('text/html', 'application/xhtml+xml'), - 'txt' => array('text/plain'), - 'js' => array('application/javascript', 'application/x-javascript', 'text/javascript'), - 'css' => array('text/css'), - 'json' => array('application/json', 'application/x-json'), - 'xml' => array('text/xml', 'application/xml', 'application/x-xml'), - 'rdf' => array('application/rdf+xml'), - 'atom' => array('application/atom+xml'), - 'rss' => array('application/rss+xml'), - ); - } - - /** - * Sets the default PHP locale. - * - * @param string $locale - */ - private function setPhpDefaultLocale($locale) - { - // if either the class Locale doesn't exist, or an exception is thrown when - // setting the default locale, the intl module is not installed, and - // the call can be ignored: - try { - if (class_exists('Locale', false)) { - \Locale::setDefault($locale); - } - } catch (\Exception $e) { - } - } - - /* - * Returns the prefix as encoded in the string when the string starts with - * the given prefix, false otherwise. - * - * @param string $string The urlencoded string - * @param string $prefix The prefix not encoded - * - * @return string|false The prefix as it is encoded in $string, or false - */ - private function getUrlencodedPrefix($string, $prefix) - { - if (0 !== strpos(rawurldecode($string), $prefix)) { - return false; - } - - $len = strlen($prefix); - - if (preg_match("#^(%[[:xdigit:]]{2}|.){{$len}}#", $string, $match)) { - return $match[0]; - } - - return false; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/RequestMatcher.php b/laravel/vendor/Symfony/Component/HttpFoundation/RequestMatcher.php deleted file mode 100755 index 7ebae28b..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/RequestMatcher.php +++ /dev/null @@ -1,237 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * RequestMatcher compares a pre-defined set of checks against a Request instance. - * - * @author Fabien Potencier - * - * @api - */ -class RequestMatcher implements RequestMatcherInterface -{ - /** - * @var string - */ - private $path; - - /** - * @var string - */ - private $host; - - /** - * @var array - */ - private $methods = array(); - - /** - * @var string - */ - private $ip; - - /** - * @var array - */ - private $attributes = array(); - - /** - * @param string|null $path - * @param string|null $host - * @param string|string[]|null $methods - * @param string|null $ip - * @param array $attributes - */ - public function __construct($path = null, $host = null, $methods = null, $ip = null, array $attributes = array()) - { - $this->matchPath($path); - $this->matchHost($host); - $this->matchMethod($methods); - $this->matchIp($ip); - foreach ($attributes as $k => $v) { - $this->matchAttribute($k, $v); - } - } - - /** - * Adds a check for the URL host name. - * - * @param string $regexp A Regexp - */ - public function matchHost($regexp) - { - $this->host = $regexp; - } - - /** - * Adds a check for the URL path info. - * - * @param string $regexp A Regexp - */ - public function matchPath($regexp) - { - $this->path = $regexp; - } - - /** - * Adds a check for the client IP. - * - * @param string $ip A specific IP address or a range specified using IP/netmask like 192.168.1.0/24 - */ - public function matchIp($ip) - { - $this->ip = $ip; - } - - /** - * Adds a check for the HTTP method. - * - * @param string|string[]|null $method An HTTP method or an array of HTTP methods - */ - public function matchMethod($method) - { - $this->methods = array_map('strtoupper', (array) $method); - } - - /** - * Adds a check for request attribute. - * - * @param string $key The request attribute name - * @param string $regexp A Regexp - */ - public function matchAttribute($key, $regexp) - { - $this->attributes[$key] = $regexp; - } - - /** - * {@inheritdoc} - * - * @api - */ - public function matches(Request $request) - { - if ($this->methods && !in_array($request->getMethod(), $this->methods)) { - return false; - } - - foreach ($this->attributes as $key => $pattern) { - if (!preg_match('#'.str_replace('#', '\\#', $pattern).'#', $request->attributes->get($key))) { - return false; - } - } - - if (null !== $this->path) { - $path = str_replace('#', '\\#', $this->path); - - if (!preg_match('#'.$path.'#', rawurldecode($request->getPathInfo()))) { - return false; - } - } - - if (null !== $this->host && !preg_match('#'.str_replace('#', '\\#', $this->host).'#i', $request->getHost())) { - return false; - } - - if (null !== $this->ip && !$this->checkIp($request->getClientIp(), $this->ip)) { - return false; - } - - return true; - } - - /** - * Validates an IP address. - * - * @param string $requestIp - * @param string $ip - * - * @return boolean True valid, false if not. - */ - protected function checkIp($requestIp, $ip) - { - // IPv6 address - if (false !== strpos($requestIp, ':')) { - return $this->checkIp6($requestIp, $ip); - } else { - return $this->checkIp4($requestIp, $ip); - } - } - - /** - * Validates an IPv4 address. - * - * @param string $requestIp - * @param string $ip - * - * @return boolean True valid, false if not. - */ - protected function checkIp4($requestIp, $ip) - { - if (false !== strpos($ip, '/')) { - list($address, $netmask) = explode('/', $ip, 2); - - if ($netmask < 1 || $netmask > 32) { - return false; - } - } else { - $address = $ip; - $netmask = 32; - } - - return 0 === substr_compare(sprintf('%032b', ip2long($requestIp)), sprintf('%032b', ip2long($address)), 0, $netmask); - } - - /** - * Validates an IPv6 address. - * - * @author David Soria Parra - * @see https://github.com/dsp/v6tools - * - * @param string $requestIp - * @param string $ip - * - * @return boolean True valid, false if not. - */ - protected function checkIp6($requestIp, $ip) - { - if (!((extension_loaded('sockets') && defined('AF_INET6')) || @inet_pton('::1'))) { - throw new \RuntimeException('Unable to check Ipv6. Check that PHP was not compiled with option "disable-ipv6".'); - } - - if (false !== strpos($ip, '/')) { - list($address, $netmask) = explode('/', $ip, 2); - - if ($netmask < 1 || $netmask > 128) { - return false; - } - } else { - $address = $ip; - $netmask = 128; - } - - $bytesAddr = unpack("n*", inet_pton($address)); - $bytesTest = unpack("n*", inet_pton($requestIp)); - - for ($i = 1, $ceil = ceil($netmask / 16); $i <= $ceil; $i++) { - $left = $netmask - 16 * ($i-1); - $left = ($left <= 16) ? $left : 16; - $mask = ~(0xffff >> $left) & 0xffff; - if (($bytesAddr[$i] & $mask) != ($bytesTest[$i] & $mask)) { - return false; - } - } - - return true; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/RequestMatcherInterface.php b/laravel/vendor/Symfony/Component/HttpFoundation/RequestMatcherInterface.php deleted file mode 100755 index 695fd217..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/RequestMatcherInterface.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * RequestMatcherInterface is an interface for strategies to match a Request. - * - * @author Fabien Potencier - * - * @api - */ -interface RequestMatcherInterface -{ - /** - * Decides whether the rule(s) implemented by the strategy matches the supplied request. - * - * @param Request $request The request to check for a match - * - * @return Boolean true if the request matches, false otherwise - * - * @api - */ - public function matches(Request $request); -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php b/laravel/vendor/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php deleted file mode 100755 index b6bbfc2d..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * SessionHandlerInterface - * - * Provides forward compatibility with PHP 5.4 - * - * Extensive documentation can be found at php.net, see links: - * - * @see http://php.net/sessionhandlerinterface - * @see http://php.net/session.customhandler - * @see http://php.net/session-set-save-handler - * - * @author Drak - */ -interface SessionHandlerInterface -{ - /** - * Open session. - * - * @see http://php.net/sessionhandlerinterface.open - * - * @param string $savePath Save path. - * @param string $sessionName Session Name. - * - * @throws \RuntimeException If something goes wrong starting the session. - * - * @return boolean - */ - public function open($savePath, $sessionName); - - /** - * Close session. - * - * @see http://php.net/sessionhandlerinterface.close - * - * @return boolean - */ - public function close(); - - /** - * Read session. - * - * @param string $sessionId - * - * @see http://php.net/sessionhandlerinterface.read - * - * @throws \RuntimeException On fatal error but not "record not found". - * - * @return string String as stored in persistent storage or empty string in all other cases. - */ - public function read($sessionId); - - /** - * Commit session to storage. - * - * @see http://php.net/sessionhandlerinterface.write - * - * @param string $sessionId Session ID. - * @param string $data Session serialized data to save. - * - * @return boolean - */ - public function write($sessionId, $data); - - /** - * Destroys this session. - * - * @see http://php.net/sessionhandlerinterface.destroy - * - * @param string $sessionId Session ID. - * - * @throws \RuntimeException On fatal error. - * - * @return boolean - */ - public function destroy($sessionId); - - /** - * Garbage collection for storage. - * - * @see http://php.net/sessionhandlerinterface.gc - * - * @param integer $lifetime Max lifetime in seconds to keep sessions stored. - * - * @throws \RuntimeException On fatal error. - * - * @return boolean - */ - public function gc($lifetime); -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Response.php b/laravel/vendor/Symfony/Component/HttpFoundation/Response.php deleted file mode 100755 index 7428b9a9..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Response.php +++ /dev/null @@ -1,1159 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * Response represents an HTTP response. - * - * @author Fabien Potencier - * - * @api - */ -class Response -{ - /** - * @var \Symfony\Component\HttpFoundation\ResponseHeaderBag - */ - public $headers; - - /** - * @var string - */ - protected $content; - - /** - * @var string - */ - protected $version; - - /** - * @var integer - */ - protected $statusCode; - - /** - * @var string - */ - protected $statusText; - - /** - * @var string - */ - protected $charset; - - /** - * Status codes translation table. - * - * The list of codes is complete according to the - * {@link http://www.iana.org/assignments/http-status-codes/ Hypertext Transfer Protocol (HTTP) Status Code Registry} - * (last updated 2012-02-13). - * - * Unless otherwise noted, the status code is defined in RFC2616. - * - * @var array - */ - public static $statusTexts = array( - 100 => 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', // RFC2518 - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - 207 => 'Multi-Status', // RFC4918 - 208 => 'Already Reported', // RFC5842 - 226 => 'IM Used', // RFC3229 - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 306 => 'Reserved', - 307 => 'Temporary Redirect', - 308 => 'Permanent Redirect', // RFC-reschke-http-status-308-07 - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Request Entity Too Large', - 414 => 'Request-URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Requested Range Not Satisfiable', - 417 => 'Expectation Failed', - 418 => 'I\'m a teapot', // RFC2324 - 422 => 'Unprocessable Entity', // RFC4918 - 423 => 'Locked', // RFC4918 - 424 => 'Failed Dependency', // RFC4918 - 425 => 'Reserved for WebDAV advanced collections expired proposal', // RFC2817 - 426 => 'Upgrade Required', // RFC2817 - 428 => 'Precondition Required', // RFC6585 - 429 => 'Too Many Requests', // RFC6585 - 431 => 'Request Header Fields Too Large', // RFC6585 - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 506 => 'Variant Also Negotiates (Experimental)', // RFC2295 - 507 => 'Insufficient Storage', // RFC4918 - 508 => 'Loop Detected', // RFC5842 - 510 => 'Not Extended', // RFC2774 - 511 => 'Network Authentication Required', // RFC6585 - ); - - /** - * Constructor. - * - * @param string $content The response content - * @param integer $status The response status code - * @param array $headers An array of response headers - * - * @api - */ - public function __construct($content = '', $status = 200, $headers = array()) - { - $this->headers = new ResponseHeaderBag($headers); - $this->setContent($content); - $this->setStatusCode($status); - $this->setProtocolVersion('1.0'); - if (!$this->headers->has('Date')) { - $this->setDate(new \DateTime(null, new \DateTimeZone('UTC'))); - } - } - - /** - * Factory method for chainability - * - * Example: - * - * return Response::create($body, 200) - * ->setSharedMaxAge(300); - * - * @param string $content The response content - * @param integer $status The response status code - * @param array $headers An array of response headers - * - * @return Response - */ - public static function create($content = '', $status = 200, $headers = array()) - { - return new static($content, $status, $headers); - } - - /** - * Returns the Response as an HTTP string. - * - * The string representation of the Response is the same as the - * one that will be sent to the client only if the prepare() method - * has been called before. - * - * @return string The Response as an HTTP string - * - * @see prepare() - */ - public function __toString() - { - return - sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText)."\r\n". - $this->headers."\r\n". - $this->getContent(); - } - - /** - * Clones the current Response instance. - */ - public function __clone() - { - $this->headers = clone $this->headers; - } - - /** - * Prepares the Response before it is sent to the client. - * - * This method tweaks the Response to ensure that it is - * compliant with RFC 2616. Most of the changes are based on - * the Request that is "associated" with this Response. - * - * @param Request $request A Request instance - * - * @return Response The current response. - */ - public function prepare(Request $request) - { - $headers = $this->headers; - - if ($this->isInformational() || in_array($this->statusCode, array(204, 304))) { - $this->setContent(null); - } - - // Content-type based on the Request - if (!$headers->has('Content-Type')) { - $format = $request->getRequestFormat(); - if (null !== $format && $mimeType = $request->getMimeType($format)) { - $headers->set('Content-Type', $mimeType); - } - } - - // Fix Content-Type - $charset = $this->charset ?: 'UTF-8'; - if (!$headers->has('Content-Type')) { - $headers->set('Content-Type', 'text/html; charset='.$charset); - } elseif (0 === strpos($headers->get('Content-Type'), 'text/') && false === strpos($headers->get('Content-Type'), 'charset')) { - // add the charset - $headers->set('Content-Type', $headers->get('Content-Type').'; charset='.$charset); - } - - // Fix Content-Length - if ($headers->has('Transfer-Encoding')) { - $headers->remove('Content-Length'); - } - - if ('HEAD' === $request->getMethod()) { - // cf. RFC2616 14.13 - $length = $headers->get('Content-Length'); - $this->setContent(null); - if ($length) { - $headers->set('Content-Length', $length); - } - } - - // Fix protocol - if ('HTTP/1.0' != $request->server->get('SERVER_PROTOCOL')) { - $this->setProtocolVersion('1.1'); - } - - // Check if we need to send extra expire info headers - if ('1.0' == $this->getProtocolVersion() && 'no-cache' == $this->headers->get('Cache-Control')) { - $this->headers->set('pragma', 'no-cache'); - $this->headers->set('expires', -1); - } - - return $this; - } - - /** - * Sends HTTP headers. - * - * @return Response - */ - public function sendHeaders() - { - // headers have already been sent by the developer - if (headers_sent()) { - return $this; - } - - // status - header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText)); - - // headers - foreach ($this->headers->all() as $name => $values) { - foreach ($values as $value) { - header($name.': '.$value, false); - } - } - - // cookies - foreach ($this->headers->getCookies() as $cookie) { - setcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly()); - } - - return $this; - } - - /** - * Sends content for the current web response. - * - * @return Response - */ - public function sendContent() - { - echo $this->content; - - return $this; - } - - /** - * Sends HTTP headers and content. - * - * @return Response - * - * @api - */ - public function send() - { - $this->sendHeaders(); - $this->sendContent(); - - if (function_exists('fastcgi_finish_request')) { - fastcgi_finish_request(); - } elseif ('cli' !== PHP_SAPI) { - // ob_get_level() never returns 0 on some Windows configurations, so if - // the level is the same two times in a row, the loop should be stopped. - $previous = null; - $obStatus = ob_get_status(1); - while (($level = ob_get_level()) > 0 && $level !== $previous) { - $previous = $level; - if ($obStatus[$level - 1] && isset($obStatus[$level - 1]['del']) && $obStatus[$level - 1]['del']) { - ob_end_flush(); - } - } - flush(); - } - - return $this; - } - - /** - * Sets the response content. - * - * Valid types are strings, numbers, and objects that implement a __toString() method. - * - * @param mixed $content - * - * @return Response - * - * @api - */ - public function setContent($content) - { - if (null !== $content && !is_string($content) && !is_numeric($content) && !is_callable(array($content, '__toString'))) { - throw new \UnexpectedValueException('The Response content must be a string or object implementing __toString(), "'.gettype($content).'" given.'); - } - - $this->content = (string) $content; - - return $this; - } - - /** - * Gets the current response content. - * - * @return string Content - * - * @api - */ - public function getContent() - { - return $this->content; - } - - /** - * Sets the HTTP protocol version (1.0 or 1.1). - * - * @param string $version The HTTP protocol version - * - * @return Response - * - * @api - */ - public function setProtocolVersion($version) - { - $this->version = $version; - - return $this; - } - - /** - * Gets the HTTP protocol version. - * - * @return string The HTTP protocol version - * - * @api - */ - public function getProtocolVersion() - { - return $this->version; - } - - /** - * Sets the response status code. - * - * @param integer $code HTTP status code - * @param mixed $text HTTP status text - * - * If the status text is null it will be automatically populated for the known - * status codes and left empty otherwise. - * - * @return Response - * - * @throws \InvalidArgumentException When the HTTP status code is not valid - * - * @api - */ - public function setStatusCode($code, $text = null) - { - $this->statusCode = $code = (int) $code; - if ($this->isInvalid()) { - throw new \InvalidArgumentException(sprintf('The HTTP status code "%s" is not valid.', $code)); - } - - if (null === $text) { - $this->statusText = isset(self::$statusTexts[$code]) ? self::$statusTexts[$code] : ''; - - return $this; - } - - if (false === $text) { - $this->statusText = ''; - - return $this; - } - - $this->statusText = $text; - - return $this; - } - - /** - * Retrieves the status code for the current web response. - * - * @return string Status code - * - * @api - */ - public function getStatusCode() - { - return $this->statusCode; - } - - /** - * Sets the response charset. - * - * @param string $charset Character set - * - * @return Response - * - * @api - */ - public function setCharset($charset) - { - $this->charset = $charset; - - return $this; - } - - /** - * Retrieves the response charset. - * - * @return string Character set - * - * @api - */ - public function getCharset() - { - return $this->charset; - } - - /** - * Returns true if the response is worth caching under any circumstance. - * - * Responses marked "private" with an explicit Cache-Control directive are - * considered uncacheable. - * - * Responses with neither a freshness lifetime (Expires, max-age) nor cache - * validator (Last-Modified, ETag) are considered uncacheable. - * - * @return Boolean true if the response is worth caching, false otherwise - * - * @api - */ - public function isCacheable() - { - if (!in_array($this->statusCode, array(200, 203, 300, 301, 302, 404, 410))) { - return false; - } - - if ($this->headers->hasCacheControlDirective('no-store') || $this->headers->getCacheControlDirective('private')) { - return false; - } - - return $this->isValidateable() || $this->isFresh(); - } - - /** - * Returns true if the response is "fresh". - * - * Fresh responses may be served from cache without any interaction with the - * origin. A response is considered fresh when it includes a Cache-Control/max-age - * indicator or Expiration header and the calculated age is less than the freshness lifetime. - * - * @return Boolean true if the response is fresh, false otherwise - * - * @api - */ - public function isFresh() - { - return $this->getTtl() > 0; - } - - /** - * Returns true if the response includes headers that can be used to validate - * the response with the origin server using a conditional GET request. - * - * @return Boolean true if the response is validateable, false otherwise - * - * @api - */ - public function isValidateable() - { - return $this->headers->has('Last-Modified') || $this->headers->has('ETag'); - } - - /** - * Marks the response as "private". - * - * It makes the response ineligible for serving other clients. - * - * @return Response - * - * @api - */ - public function setPrivate() - { - $this->headers->removeCacheControlDirective('public'); - $this->headers->addCacheControlDirective('private'); - - return $this; - } - - /** - * Marks the response as "public". - * - * It makes the response eligible for serving other clients. - * - * @return Response - * - * @api - */ - public function setPublic() - { - $this->headers->addCacheControlDirective('public'); - $this->headers->removeCacheControlDirective('private'); - - return $this; - } - - /** - * Returns true if the response must be revalidated by caches. - * - * This method indicates that the response must not be served stale by a - * cache in any circumstance without first revalidating with the origin. - * When present, the TTL of the response should not be overridden to be - * greater than the value provided by the origin. - * - * @return Boolean true if the response must be revalidated by a cache, false otherwise - * - * @api - */ - public function mustRevalidate() - { - return $this->headers->hasCacheControlDirective('must-revalidate') || $this->headers->has('proxy-revalidate'); - } - - /** - * Returns the Date header as a DateTime instance. - * - * @return \DateTime A \DateTime instance - * - * @throws \RuntimeException When the header is not parseable - * - * @api - */ - public function getDate() - { - return $this->headers->getDate('Date', new \DateTime()); - } - - /** - * Sets the Date header. - * - * @param \DateTime $date A \DateTime instance - * - * @return Response - * - * @api - */ - public function setDate(\DateTime $date) - { - $date->setTimezone(new \DateTimeZone('UTC')); - $this->headers->set('Date', $date->format('D, d M Y H:i:s').' GMT'); - - return $this; - } - - /** - * Returns the age of the response. - * - * @return integer The age of the response in seconds - */ - public function getAge() - { - if ($age = $this->headers->get('Age')) { - return $age; - } - - return max(time() - $this->getDate()->format('U'), 0); - } - - /** - * Marks the response stale by setting the Age header to be equal to the maximum age of the response. - * - * @return Response - * - * @api - */ - public function expire() - { - if ($this->isFresh()) { - $this->headers->set('Age', $this->getMaxAge()); - } - - return $this; - } - - /** - * Returns the value of the Expires header as a DateTime instance. - * - * @return \DateTime A DateTime instance - * - * @api - */ - public function getExpires() - { - return $this->headers->getDate('Expires'); - } - - /** - * Sets the Expires HTTP header with a DateTime instance. - * - * If passed a null value, it removes the header. - * - * @param \DateTime $date A \DateTime instance - * - * @return Response - * - * @api - */ - public function setExpires(\DateTime $date = null) - { - if (null === $date) { - $this->headers->remove('Expires'); - } else { - $date = clone $date; - $date->setTimezone(new \DateTimeZone('UTC')); - $this->headers->set('Expires', $date->format('D, d M Y H:i:s').' GMT'); - } - - return $this; - } - - /** - * Sets the number of seconds after the time specified in the response's Date - * header when the the response should no longer be considered fresh. - * - * First, it checks for a s-maxage directive, then a max-age directive, and then it falls - * back on an expires header. It returns null when no maximum age can be established. - * - * @return integer|null Number of seconds - * - * @api - */ - public function getMaxAge() - { - if ($age = $this->headers->getCacheControlDirective('s-maxage')) { - return $age; - } - - if ($age = $this->headers->getCacheControlDirective('max-age')) { - return $age; - } - - if (null !== $this->getExpires()) { - return $this->getExpires()->format('U') - $this->getDate()->format('U'); - } - - return null; - } - - /** - * Sets the number of seconds after which the response should no longer be considered fresh. - * - * This methods sets the Cache-Control max-age directive. - * - * @param integer $value Number of seconds - * - * @return Response - * - * @api - */ - public function setMaxAge($value) - { - $this->headers->addCacheControlDirective('max-age', $value); - - return $this; - } - - /** - * Sets the number of seconds after which the response should no longer be considered fresh by shared caches. - * - * This methods sets the Cache-Control s-maxage directive. - * - * @param integer $value Number of seconds - * - * @return Response - * - * @api - */ - public function setSharedMaxAge($value) - { - $this->setPublic(); - $this->headers->addCacheControlDirective('s-maxage', $value); - - return $this; - } - - /** - * Returns the response's time-to-live in seconds. - * - * It returns null when no freshness information is present in the response. - * - * When the responses TTL is <= 0, the response may not be served from cache without first - * revalidating with the origin. - * - * @return integer|null The TTL in seconds - * - * @api - */ - public function getTtl() - { - if ($maxAge = $this->getMaxAge()) { - return $maxAge - $this->getAge(); - } - - return null; - } - - /** - * Sets the response's time-to-live for shared caches. - * - * This method adjusts the Cache-Control/s-maxage directive. - * - * @param integer $seconds Number of seconds - * - * @return Response - * - * @api - */ - public function setTtl($seconds) - { - $this->setSharedMaxAge($this->getAge() + $seconds); - - return $this; - } - - /** - * Sets the response's time-to-live for private/client caches. - * - * This method adjusts the Cache-Control/max-age directive. - * - * @param integer $seconds Number of seconds - * - * @return Response - * - * @api - */ - public function setClientTtl($seconds) - { - $this->setMaxAge($this->getAge() + $seconds); - - return $this; - } - - /** - * Returns the Last-Modified HTTP header as a DateTime instance. - * - * @return \DateTime A DateTime instance - * - * @api - */ - public function getLastModified() - { - return $this->headers->getDate('Last-Modified'); - } - - /** - * Sets the Last-Modified HTTP header with a DateTime instance. - * - * If passed a null value, it removes the header. - * - * @param \DateTime $date A \DateTime instance - * - * @return Response - * - * @api - */ - public function setLastModified(\DateTime $date = null) - { - if (null === $date) { - $this->headers->remove('Last-Modified'); - } else { - $date = clone $date; - $date->setTimezone(new \DateTimeZone('UTC')); - $this->headers->set('Last-Modified', $date->format('D, d M Y H:i:s').' GMT'); - } - - return $this; - } - - /** - * Returns the literal value of the ETag HTTP header. - * - * @return string The ETag HTTP header - * - * @api - */ - public function getEtag() - { - return $this->headers->get('ETag'); - } - - /** - * Sets the ETag value. - * - * @param string $etag The ETag unique identifier - * @param Boolean $weak Whether you want a weak ETag or not - * - * @return Response - * - * @api - */ - public function setEtag($etag = null, $weak = false) - { - if (null === $etag) { - $this->headers->remove('Etag'); - } else { - if (0 !== strpos($etag, '"')) { - $etag = '"'.$etag.'"'; - } - - $this->headers->set('ETag', (true === $weak ? 'W/' : '').$etag); - } - - return $this; - } - - /** - * Sets the response's cache headers (validation and/or expiration). - * - * Available options are: etag, last_modified, max_age, s_maxage, private, and public. - * - * @param array $options An array of cache options - * - * @return Response - * - * @api - */ - public function setCache(array $options) - { - if ($diff = array_diff(array_keys($options), array('etag', 'last_modified', 'max_age', 's_maxage', 'private', 'public'))) { - throw new \InvalidArgumentException(sprintf('Response does not support the following options: "%s".', implode('", "', array_values($diff)))); - } - - if (isset($options['etag'])) { - $this->setEtag($options['etag']); - } - - if (isset($options['last_modified'])) { - $this->setLastModified($options['last_modified']); - } - - if (isset($options['max_age'])) { - $this->setMaxAge($options['max_age']); - } - - if (isset($options['s_maxage'])) { - $this->setSharedMaxAge($options['s_maxage']); - } - - if (isset($options['public'])) { - if ($options['public']) { - $this->setPublic(); - } else { - $this->setPrivate(); - } - } - - if (isset($options['private'])) { - if ($options['private']) { - $this->setPrivate(); - } else { - $this->setPublic(); - } - } - - return $this; - } - - /** - * Modifies the response so that it conforms to the rules defined for a 304 status code. - * - * This sets the status, removes the body, and discards any headers - * that MUST NOT be included in 304 responses. - * - * @return Response - * - * @see http://tools.ietf.org/html/rfc2616#section-10.3.5 - * - * @api - */ - public function setNotModified() - { - $this->setStatusCode(304); - $this->setContent(null); - - // remove headers that MUST NOT be included with 304 Not Modified responses - foreach (array('Allow', 'Content-Encoding', 'Content-Language', 'Content-Length', 'Content-MD5', 'Content-Type', 'Last-Modified') as $header) { - $this->headers->remove($header); - } - - return $this; - } - - /** - * Returns true if the response includes a Vary header. - * - * @return Boolean true if the response includes a Vary header, false otherwise - * - * @api - */ - public function hasVary() - { - return (Boolean) $this->headers->get('Vary'); - } - - /** - * Returns an array of header names given in the Vary header. - * - * @return array An array of Vary names - * - * @api - */ - public function getVary() - { - if (!$vary = $this->headers->get('Vary')) { - return array(); - } - - return is_array($vary) ? $vary : preg_split('/[\s,]+/', $vary); - } - - /** - * Sets the Vary header. - * - * @param string|array $headers - * @param Boolean $replace Whether to replace the actual value of not (true by default) - * - * @return Response - * - * @api - */ - public function setVary($headers, $replace = true) - { - $this->headers->set('Vary', $headers, $replace); - - return $this; - } - - /** - * Determines if the Response validators (ETag, Last-Modified) match - * a conditional value specified in the Request. - * - * If the Response is not modified, it sets the status code to 304 and - * removes the actual content by calling the setNotModified() method. - * - * @param Request $request A Request instance - * - * @return Boolean true if the Response validators match the Request, false otherwise - * - * @api - */ - public function isNotModified(Request $request) - { - if (!$request->isMethodSafe()) { - return false; - } - - $lastModified = $request->headers->get('If-Modified-Since'); - $notModified = false; - if ($etags = $request->getEtags()) { - $notModified = (in_array($this->getEtag(), $etags) || in_array('*', $etags)) && (!$lastModified || $this->headers->get('Last-Modified') == $lastModified); - } elseif ($lastModified) { - $notModified = $lastModified == $this->headers->get('Last-Modified'); - } - - if ($notModified) { - $this->setNotModified(); - } - - return $notModified; - } - - // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html - /** - * Is response invalid? - * - * @return Boolean - * - * @api - */ - public function isInvalid() - { - return $this->statusCode < 100 || $this->statusCode >= 600; - } - - /** - * Is response informative? - * - * @return Boolean - * - * @api - */ - public function isInformational() - { - return $this->statusCode >= 100 && $this->statusCode < 200; - } - - /** - * Is response successful? - * - * @return Boolean - * - * @api - */ - public function isSuccessful() - { - return $this->statusCode >= 200 && $this->statusCode < 300; - } - - /** - * Is the response a redirect? - * - * @return Boolean - * - * @api - */ - public function isRedirection() - { - return $this->statusCode >= 300 && $this->statusCode < 400; - } - - /** - * Is there a client error? - * - * @return Boolean - * - * @api - */ - public function isClientError() - { - return $this->statusCode >= 400 && $this->statusCode < 500; - } - - /** - * Was there a server side error? - * - * @return Boolean - * - * @api - */ - public function isServerError() - { - return $this->statusCode >= 500 && $this->statusCode < 600; - } - - /** - * Is the response OK? - * - * @return Boolean - * - * @api - */ - public function isOk() - { - return 200 === $this->statusCode; - } - - /** - * Is the reponse forbidden? - * - * @return Boolean - * - * @api - */ - public function isForbidden() - { - return 403 === $this->statusCode; - } - - /** - * Is the response a not found error? - * - * @return Boolean - * - * @api - */ - public function isNotFound() - { - return 404 === $this->statusCode; - } - - /** - * Is the response a redirect of some form? - * - * @param string $location - * - * @return Boolean - * - * @api - */ - public function isRedirect($location = null) - { - return in_array($this->statusCode, array(201, 301, 302, 303, 307, 308)) && (null === $location ?: $location == $this->headers->get('Location')); - } - - /** - * Is the response empty? - * - * @return Boolean - * - * @api - */ - public function isEmpty() - { - return in_array($this->statusCode, array(201, 204, 304)); - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/ResponseHeaderBag.php b/laravel/vendor/Symfony/Component/HttpFoundation/ResponseHeaderBag.php deleted file mode 100755 index c27d8116..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/ResponseHeaderBag.php +++ /dev/null @@ -1,293 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * ResponseHeaderBag is a container for Response HTTP headers. - * - * @author Fabien Potencier - * - * @api - */ -class ResponseHeaderBag extends HeaderBag -{ - const COOKIES_FLAT = 'flat'; - const COOKIES_ARRAY = 'array'; - - const DISPOSITION_ATTACHMENT = 'attachment'; - const DISPOSITION_INLINE = 'inline'; - - /** - * @var array - */ - protected $computedCacheControl = array(); - - /** - * @var array - */ - protected $cookies = array(); - - /** - * Constructor. - * - * @param array $headers An array of HTTP headers - * - * @api - */ - public function __construct(array $headers = array()) - { - parent::__construct($headers); - - if (!isset($this->headers['cache-control'])) { - $this->set('cache-control', ''); - } - } - - /** - * {@inheritdoc} - */ - public function __toString() - { - $cookies = ''; - foreach ($this->getCookies() as $cookie) { - $cookies .= 'Set-Cookie: '.$cookie."\r\n"; - } - - return parent::__toString().$cookies; - } - - /** - * {@inheritdoc} - * - * @api - */ - public function replace(array $headers = array()) - { - parent::replace($headers); - - if (!isset($this->headers['cache-control'])) { - $this->set('cache-control', ''); - } - } - - /** - * {@inheritdoc} - * - * @api - */ - public function set($key, $values, $replace = true) - { - parent::set($key, $values, $replace); - - // ensure the cache-control header has sensible defaults - if (in_array(strtr(strtolower($key), '_', '-'), array('cache-control', 'etag', 'last-modified', 'expires'))) { - $computed = $this->computeCacheControlValue(); - $this->headers['cache-control'] = array($computed); - $this->computedCacheControl = $this->parseCacheControl($computed); - } - } - - /** - * {@inheritdoc} - * - * @api - */ - public function remove($key) - { - parent::remove($key); - - if ('cache-control' === strtr(strtolower($key), '_', '-')) { - $this->computedCacheControl = array(); - } - } - - /** - * {@inheritdoc} - */ - public function hasCacheControlDirective($key) - { - return array_key_exists($key, $this->computedCacheControl); - } - - /** - * {@inheritdoc} - */ - public function getCacheControlDirective($key) - { - return array_key_exists($key, $this->computedCacheControl) ? $this->computedCacheControl[$key] : null; - } - - /** - * Sets a cookie. - * - * @param Cookie $cookie - * - * @api - */ - public function setCookie(Cookie $cookie) - { - $this->cookies[$cookie->getDomain()][$cookie->getPath()][$cookie->getName()] = $cookie; - } - - /** - * Removes a cookie from the array, but does not unset it in the browser - * - * @param string $name - * @param string $path - * @param string $domain - * - * @api - */ - public function removeCookie($name, $path = '/', $domain = null) - { - if (null === $path) { - $path = '/'; - } - - unset($this->cookies[$domain][$path][$name]); - - if (empty($this->cookies[$domain][$path])) { - unset($this->cookies[$domain][$path]); - - if (empty($this->cookies[$domain])) { - unset($this->cookies[$domain]); - } - } - } - - /** - * Returns an array with all cookies - * - * @param string $format - * - * @throws \InvalidArgumentException When the $format is invalid - * - * @return array - * - * @api - */ - public function getCookies($format = self::COOKIES_FLAT) - { - if (!in_array($format, array(self::COOKIES_FLAT, self::COOKIES_ARRAY))) { - throw new \InvalidArgumentException(sprintf('Format "%s" invalid (%s).', $format, implode(', ', array(self::COOKIES_FLAT, self::COOKIES_ARRAY)))); - } - - if (self::COOKIES_ARRAY === $format) { - return $this->cookies; - } - - $flattenedCookies = array(); - foreach ($this->cookies as $path) { - foreach ($path as $cookies) { - foreach ($cookies as $cookie) { - $flattenedCookies[] = $cookie; - } - } - } - - return $flattenedCookies; - } - - /** - * Clears a cookie in the browser - * - * @param string $name - * @param string $path - * @param string $domain - * - * @api - */ - public function clearCookie($name, $path = '/', $domain = null) - { - $this->setCookie(new Cookie($name, null, 1, $path, $domain)); - } - - /** - * Generates a HTTP Content-Disposition field-value. - * - * @param string $disposition One of "inline" or "attachment" - * @param string $filename A unicode string - * @param string $filenameFallback A string containing only ASCII characters that - * is semantically equivalent to $filename. If the filename is already ASCII, - * it can be omitted, or just copied from $filename - * - * @return string A string suitable for use as a Content-Disposition field-value. - * - * @throws \InvalidArgumentException - * @see RFC 6266 - */ - public function makeDisposition($disposition, $filename, $filenameFallback = '') - { - if (!in_array($disposition, array(self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE))) { - throw new \InvalidArgumentException(sprintf('The disposition must be either "%s" or "%s".', self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE)); - } - - if ('' == $filenameFallback) { - $filenameFallback = $filename; - } - - // filenameFallback is not ASCII. - if (!preg_match('/^[\x20-\x7e]*$/', $filenameFallback)) { - throw new \InvalidArgumentException('The filename fallback must only contain ASCII characters.'); - } - - // percent characters aren't safe in fallback. - if (false !== strpos($filenameFallback, '%')) { - throw new \InvalidArgumentException('The filename fallback cannot contain the "%" character.'); - } - - // path separators aren't allowed in either. - if (false !== strpos($filename, '/') || false !== strpos($filename, '\\') || false !== strpos($filenameFallback, '/') || false !== strpos($filenameFallback, '\\')) { - throw new \InvalidArgumentException('The filename and the fallback cannot contain the "/" and "\\" characters.'); - } - - $output = sprintf('%s; filename="%s"', $disposition, str_replace('"', '\\"', $filenameFallback)); - - if ($filename !== $filenameFallback) { - $output .= sprintf("; filename*=utf-8''%s", rawurlencode($filename)); - } - - return $output; - } - - /** - * Returns the calculated value of the cache-control header. - * - * This considers several other headers and calculates or modifies the - * cache-control header to a sensible, conservative value. - * - * @return string - */ - protected function computeCacheControlValue() - { - if (!$this->cacheControl && !$this->has('ETag') && !$this->has('Last-Modified') && !$this->has('Expires')) { - return 'no-cache'; - } - - if (!$this->cacheControl) { - // conservative by default - return 'private, must-revalidate'; - } - - $header = $this->getCacheControlHeader(); - if (isset($this->cacheControl['public']) || isset($this->cacheControl['private'])) { - return $header; - } - - // public if s-maxage is defined, private otherwise - if (!isset($this->cacheControl['s-maxage'])) { - return $header.', private'; - } - - return $header; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/ServerBag.php b/laravel/vendor/Symfony/Component/HttpFoundation/ServerBag.php deleted file mode 100755 index fcb41cc5..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/ServerBag.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * ServerBag is a container for HTTP headers from the $_SERVER variable. - * - * @author Fabien Potencier - * @author Bulat Shakirzyanov - * @author Robert Kiss - */ -class ServerBag extends ParameterBag -{ - /** - * Gets the HTTP headers. - * - * @return array - */ - public function getHeaders() - { - $headers = array(); - foreach ($this->parameters as $key => $value) { - if (0 === strpos($key, 'HTTP_')) { - $headers[substr($key, 5)] = $value; - } - // CONTENT_* are not prefixed with HTTP_ - elseif (in_array($key, array('CONTENT_LENGTH', 'CONTENT_MD5', 'CONTENT_TYPE'))) { - $headers[$key] = $value; - } - } - - if (isset($this->parameters['PHP_AUTH_USER'])) { - $headers['PHP_AUTH_USER'] = $this->parameters['PHP_AUTH_USER']; - $headers['PHP_AUTH_PW'] = isset($this->parameters['PHP_AUTH_PW']) ? $this->parameters['PHP_AUTH_PW'] : ''; - } else { - /* - * php-cgi under Apache does not pass HTTP Basic user/pass to PHP by default - * For this workaround to work, add these lines to your .htaccess file: - * RewriteCond %{HTTP:Authorization} ^(.+)$ - * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - * - * A sample .htaccess file: - * RewriteEngine On - * RewriteCond %{HTTP:Authorization} ^(.+)$ - * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - * RewriteCond %{REQUEST_FILENAME} !-f - * RewriteRule ^(.*)$ app.php [QSA,L] - */ - - $authorizationHeader = null; - if (isset($this->parameters['HTTP_AUTHORIZATION'])) { - $authorizationHeader = $this->parameters['HTTP_AUTHORIZATION']; - } elseif (isset($this->parameters['REDIRECT_HTTP_AUTHORIZATION'])) { - $authorizationHeader = $this->parameters['REDIRECT_HTTP_AUTHORIZATION']; - } - - // Decode AUTHORIZATION header into PHP_AUTH_USER and PHP_AUTH_PW when authorization header is basic - if ((null !== $authorizationHeader) && (0 === stripos($authorizationHeader, 'basic'))) { - $exploded = explode(':', base64_decode(substr($authorizationHeader, 6))); - if (count($exploded) == 2) { - list($headers['PHP_AUTH_USER'], $headers['PHP_AUTH_PW']) = $exploded; - } - } - } - - // PHP_AUTH_USER/PHP_AUTH_PW - if (isset($headers['PHP_AUTH_USER'])) { - $headers['AUTHORIZATION'] = 'Basic '.base64_encode($headers['PHP_AUTH_USER'].':'.$headers['PHP_AUTH_PW']); - } - - return $headers; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php deleted file mode 100755 index 2f1a4222..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php +++ /dev/null @@ -1,157 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Attribute; - -/** - * This class relates to session attribute storage - */ -class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Countable -{ - private $name = 'attributes'; - - /** - * @var string - */ - private $storageKey; - - /** - * @var array - */ - protected $attributes = array(); - - /** - * Constructor. - * - * @param string $storageKey The key used to store flashes in the session. - */ - public function __construct($storageKey = '_sf2_attributes') - { - $this->storageKey = $storageKey; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->name; - } - - public function setName($name) - { - $this->name = $name; - } - - /** - * {@inheritdoc} - */ - public function initialize(array &$attributes) - { - $this->attributes = &$attributes; - } - - /** - * {@inheritdoc} - */ - public function getStorageKey() - { - return $this->storageKey; - } - - /** - * {@inheritdoc} - */ - public function has($name) - { - return array_key_exists($name, $this->attributes); - } - - /** - * {@inheritdoc} - */ - public function get($name, $default = null) - { - return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default; - } - - /** - * {@inheritdoc} - */ - public function set($name, $value) - { - $this->attributes[$name] = $value; - } - - /** - * {@inheritdoc} - */ - public function all() - { - return $this->attributes; - } - - /** - * {@inheritdoc} - */ - public function replace(array $attributes) - { - $this->attributes = array(); - foreach ($attributes as $key => $value) { - $this->set($key, $value); - } - } - - /** - * {@inheritdoc} - */ - public function remove($name) - { - $retval = null; - if (array_key_exists($name, $this->attributes)) { - $retval = $this->attributes[$name]; - unset($this->attributes[$name]); - } - - return $retval; - } - - /** - * {@inheritdoc} - */ - public function clear() - { - $return = $this->attributes; - $this->attributes = array(); - - return $return; - } - - /** - * Returns an iterator for attributes. - * - * @return \ArrayIterator An \ArrayIterator instance - */ - public function getIterator() - { - return new \ArrayIterator($this->attributes); - } - - /** - * Returns the number of attributes. - * - * @return int The number of attributes - */ - public function count() - { - return count($this->attributes); - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php deleted file mode 100755 index 5f1f37be..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Attribute; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; - -/** - * Attributes store. - * - * @author Drak - */ -interface AttributeBagInterface extends SessionBagInterface -{ - /** - * Checks if an attribute is defined. - * - * @param string $name The attribute name - * - * @return Boolean true if the attribute is defined, false otherwise - */ - public function has($name); - - /** - * Returns an attribute. - * - * @param string $name The attribute name - * @param mixed $default The default value if not found. - * - * @return mixed - */ - public function get($name, $default = null); - - /** - * Sets an attribute. - * - * @param string $name - * @param mixed $value - */ - public function set($name, $value); - - /** - * Returns attributes. - * - * @return array Attributes - */ - public function all(); - - /** - * Sets attributes. - * - * @param array $attributes Attributes - */ - public function replace(array $attributes); - - /** - * Removes an attribute. - * - * @param string $name - * - * @return mixed The removed value - */ - public function remove($name); -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php deleted file mode 100755 index 138aa361..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php +++ /dev/null @@ -1,154 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Attribute; - -/** - * This class provides structured storage of session attributes using - * a name spacing character in the key. - * - * @author Drak - */ -class NamespacedAttributeBag extends AttributeBag -{ - /** - * Namespace character. - * - * @var string - */ - private $namespaceCharacter; - - /** - * Constructor. - * - * @param string $storageKey Session storage key. - * @param string $namespaceCharacter Namespace character to use in keys. - */ - public function __construct($storageKey = '_sf2_attributes', $namespaceCharacter = '/') - { - $this->namespaceCharacter = $namespaceCharacter; - parent::__construct($storageKey); - } - - /** - * {@inheritdoc} - */ - public function has($name) - { - $attributes = $this->resolveAttributePath($name); - $name = $this->resolveKey($name); - - return array_key_exists($name, $attributes); - } - - /** - * {@inheritdoc} - */ - public function get($name, $default = null) - { - $attributes = $this->resolveAttributePath($name); - $name = $this->resolveKey($name); - - return array_key_exists($name, $attributes) ? $attributes[$name] : $default; - } - - /** - * {@inheritdoc} - */ - public function set($name, $value) - { - $attributes = & $this->resolveAttributePath($name, true); - $name = $this->resolveKey($name); - $attributes[$name] = $value; - } - - /** - * {@inheritdoc} - */ - public function remove($name) - { - $retval = null; - $attributes = & $this->resolveAttributePath($name); - $name = $this->resolveKey($name); - if (array_key_exists($name, $attributes)) { - $retval = $attributes[$name]; - unset($attributes[$name]); - } - - return $retval; - } - - /** - * Resolves a path in attributes property and returns it as a reference. - * - * This method allows structured namespacing of session attributes. - * - * @param string $name Key name - * @param boolean $writeContext Write context, default false - * - * @return array - */ - protected function &resolveAttributePath($name, $writeContext = false) - { - $array = & $this->attributes; - $name = (strpos($name, $this->namespaceCharacter) === 0) ? substr($name, 1) : $name; - - // Check if there is anything to do, else return - if (!$name) { - return $array; - } - - $parts = explode($this->namespaceCharacter, $name); - if (count($parts) < 2) { - if (!$writeContext) { - return $array; - } - - $array[$parts[0]] = array(); - - return $array; - } - - unset($parts[count($parts)-1]); - - foreach ($parts as $part) { - if (!array_key_exists($part, $array)) { - if (!$writeContext) { - return $array; - } - - $array[$part] = array(); - } - - $array = & $array[$part]; - } - - return $array; - } - - /** - * Resolves the key from the name. - * - * This is the last part in a dot separated string. - * - * @param string $name - * - * @return string - */ - protected function resolveKey($name) - { - if (strpos($name, $this->namespaceCharacter) !== false) { - $name = substr($name, strrpos($name, $this->namespaceCharacter)+1, strlen($name)); - } - - return $name; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php deleted file mode 100755 index c6e41de6..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php +++ /dev/null @@ -1,176 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Flash; - -/** - * AutoExpireFlashBag flash message container. - * - * @author Drak - */ -class AutoExpireFlashBag implements FlashBagInterface -{ - private $name = 'flashes'; - - /** - * Flash messages. - * - * @var array - */ - private $flashes = array(); - - /** - * The storage key for flashes in the session - * - * @var string - */ - private $storageKey; - - /** - * Constructor. - * - * @param string $storageKey The key used to store flashes in the session. - */ - public function __construct($storageKey = '_sf2_flashes') - { - $this->storageKey = $storageKey; - $this->flashes = array('display' => array(), 'new' => array()); - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->name; - } - - public function setName($name) - { - $this->name = $name; - } - - /** - * {@inheritdoc} - */ - public function initialize(array &$flashes) - { - $this->flashes = &$flashes; - - // The logic: messages from the last request will be stored in new, so we move them to previous - // This request we will show what is in 'display'. What is placed into 'new' this time round will - // be moved to display next time round. - $this->flashes['display'] = array_key_exists('new', $this->flashes) ? $this->flashes['new'] : array(); - $this->flashes['new'] = array(); - } - - /** - * {@inheritdoc} - */ - public function add($type, $message) - { - $this->flashes['new'][$type][] = $message; - } - - /** - * {@inheritdoc} - */ - public function peek($type, array $default = array()) - { - return $this->has($type) ? $this->flashes['display'][$type] : $default; - } - - /** - * {@inheritdoc} - */ - public function peekAll() - { - return array_key_exists('display', $this->flashes) ? (array) $this->flashes['display'] : array(); - } - - /** - * {@inheritdoc} - */ - public function get($type, array $default = array()) - { - $return = $default; - - if (!$this->has($type)) { - return $return; - } - - if (isset($this->flashes['display'][$type])) { - $return = $this->flashes['display'][$type]; - unset($this->flashes['display'][$type]); - } - - return $return; - } - - /** - * {@inheritdoc} - */ - public function all() - { - $return = $this->flashes['display']; - $this->flashes = array('new' => array(), 'display' => array()); - - return $return; - } - - /** - * {@inheritdoc} - */ - public function setAll(array $messages) - { - $this->flashes['new'] = $messages; - } - - /** - * {@inheritdoc} - */ - public function set($type, $messages) - { - $this->flashes['new'][$type] = (array) $messages; - } - - /** - * {@inheritdoc} - */ - public function has($type) - { - return array_key_exists($type, $this->flashes['display']) && $this->flashes['display'][$type]; - } - - /** - * {@inheritdoc} - */ - public function keys() - { - return array_keys($this->flashes['display']); - } - - /** - * {@inheritdoc} - */ - public function getStorageKey() - { - return $this->storageKey; - } - - /** - * {@inheritdoc} - */ - public function clear() - { - return $this->all(); - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php deleted file mode 100755 index ce9308e1..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php +++ /dev/null @@ -1,186 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Flash; - -/** - * FlashBag flash message container. - * - * @author Drak - */ -class FlashBag implements FlashBagInterface, \IteratorAggregate, \Countable -{ - private $name = 'flashes'; - - /** - * Flash messages. - * - * @var array - */ - private $flashes = array(); - - /** - * The storage key for flashes in the session - * - * @var string - */ - private $storageKey; - - /** - * Constructor. - * - * @param string $storageKey The key used to store flashes in the session. - */ - public function __construct($storageKey = '_sf2_flashes') - { - $this->storageKey = $storageKey; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->name; - } - - public function setName($name) - { - $this->name = $name; - } - - /** - * {@inheritdoc} - */ - public function initialize(array &$flashes) - { - $this->flashes = &$flashes; - } - - /** - * {@inheritdoc} - */ - public function add($type, $message) - { - $this->flashes[$type][] = $message; - } - - /** - * {@inheritdoc} - */ - public function peek($type, array $default =array()) - { - return $this->has($type) ? $this->flashes[$type] : $default; - } - - /** - * {@inheritdoc} - */ - public function peekAll() - { - return $this->flashes; - } - - /** - * {@inheritdoc} - */ - public function get($type, array $default = array()) - { - if (!$this->has($type)) { - return $default; - } - - $return = $this->flashes[$type]; - - unset($this->flashes[$type]); - - return $return; - } - - /** - * {@inheritdoc} - */ - public function all() - { - $return = $this->peekAll(); - $this->flashes = array(); - - return $return; - } - - /** - * {@inheritdoc} - */ - public function set($type, $messages) - { - $this->flashes[$type] = (array) $messages; - } - - /** - * {@inheritdoc} - */ - public function setAll(array $messages) - { - $this->flashes = $messages; - } - - /** - * {@inheritdoc} - */ - public function has($type) - { - return array_key_exists($type, $this->flashes) && $this->flashes[$type]; - } - - /** - * {@inheritdoc} - */ - public function keys() - { - return array_keys($this->flashes); - } - - /** - * {@inheritdoc} - */ - public function getStorageKey() - { - return $this->storageKey; - } - - /** - * {@inheritdoc} - */ - public function clear() - { - return $this->all(); - } - - /** - * Returns an iterator for flashes. - * - * @return \ArrayIterator An \ArrayIterator instance - */ - public function getIterator() - { - return new \ArrayIterator($this->all()); - } - - /** - * Returns the number of flashes. - * - * @return int The number of flashes - */ - public function count() - { - return count($this->flashes); - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php deleted file mode 100755 index a68dcfdd..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php +++ /dev/null @@ -1,93 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Flash; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; - -/** - * FlashBagInterface. - * - * @author Drak - */ -interface FlashBagInterface extends SessionBagInterface -{ - /** - * Adds a flash message for type. - * - * @param string $type - * @param string $message - */ - public function add($type, $message); - - /** - * Registers a message for a given type. - * - * @param string $type - * @param string|array $message - */ - public function set($type, $message); - - /** - * Gets flash messages for a given type. - * - * @param string $type Message category type. - * @param array $default Default value if $type does not exist. - * - * @return array - */ - public function peek($type, array $default = array()); - - /** - * Gets all flash messages. - * - * @return array - */ - public function peekAll(); - - /** - * Gets and clears flash from the stack. - * - * @param string $type - * @param array $default Default value if $type does not exist. - * - * @return array - */ - public function get($type, array $default = array()); - - /** - * Gets and clears flashes from the stack. - * - * @return array - */ - public function all(); - - /** - * Sets all flash messages. - */ - public function setAll(array $messages); - - /** - * Has flash messages for a given type? - * - * @param string $type - * - * @return boolean - */ - public function has($type); - - /** - * Returns a list of all defined types. - * - * @return array - */ - public function keys(); -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Session.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Session.php deleted file mode 100755 index ee987c67..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Session.php +++ /dev/null @@ -1,347 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session; - -use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface; -use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag; -use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface; -use Symfony\Component\HttpFoundation\Session\Flash\FlashBag; -use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; -use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage; - -/** - * Session. - * - * @author Fabien Potencier - * @author Drak - * - * @api - */ -class Session implements SessionInterface, \IteratorAggregate, \Countable -{ - /** - * Storage driver. - * - * @var SessionStorageInterface - */ - protected $storage; - - /** - * @var string - */ - private $flashName; - - /** - * @var string - */ - private $attributeName; - - /** - * Constructor. - * - * @param SessionStorageInterface $storage A SessionStorageInterface instance. - * @param AttributeBagInterface $attributes An AttributeBagInterface instance, (defaults null for default AttributeBag) - * @param FlashBagInterface $flashes A FlashBagInterface instance (defaults null for default FlashBag) - */ - public function __construct(SessionStorageInterface $storage = null, AttributeBagInterface $attributes = null, FlashBagInterface $flashes = null) - { - $this->storage = $storage ?: new NativeSessionStorage(); - - $attributes = $attributes ?: new AttributeBag(); - $this->attributeName = $attributes->getName(); - $this->registerBag($attributes); - - $flashes = $flashes ?: new FlashBag(); - $this->flashName = $flashes->getName(); - $this->registerBag($flashes); - } - - /** - * {@inheritdoc} - */ - public function start() - { - return $this->storage->start(); - } - - /** - * {@inheritdoc} - */ - public function has($name) - { - return $this->storage->getBag($this->attributeName)->has($name); - } - - /** - * {@inheritdoc} - */ - public function get($name, $default = null) - { - return $this->storage->getBag($this->attributeName)->get($name, $default); - } - - /** - * {@inheritdoc} - */ - public function set($name, $value) - { - $this->storage->getBag($this->attributeName)->set($name, $value); - } - - /** - * {@inheritdoc} - */ - public function all() - { - return $this->storage->getBag($this->attributeName)->all(); - } - - /** - * {@inheritdoc} - */ - public function replace(array $attributes) - { - $this->storage->getBag($this->attributeName)->replace($attributes); - } - - /** - * {@inheritdoc} - */ - public function remove($name) - { - return $this->storage->getBag($this->attributeName)->remove($name); - } - - /** - * {@inheritdoc} - */ - public function clear() - { - $this->storage->getBag($this->attributeName)->clear(); - } - - /** - * {@inheritdoc} - */ - public function isStarted() - { - return $this->storage->isStarted(); - } - - /** - * Returns an iterator for attributes. - * - * @return \ArrayIterator An \ArrayIterator instance - */ - public function getIterator() - { - return new \ArrayIterator($this->storage->getBag($this->attributeName)->all()); - } - - /** - * Returns the number of attributes. - * - * @return int The number of attributes - */ - public function count() - { - return count($this->storage->getBag($this->attributeName)->all()); - } - - /** - * {@inheritdoc} - */ - public function invalidate($lifetime = null) - { - $this->storage->clear(); - - return $this->migrate(true, $lifetime); - } - - /** - * {@inheritdoc} - */ - public function migrate($destroy = false, $lifetime = null) - { - return $this->storage->regenerate($destroy, $lifetime); - } - - /** - * {@inheritdoc} - */ - public function save() - { - $this->storage->save(); - } - - /** - * {@inheritdoc} - */ - public function getId() - { - return $this->storage->getId(); - } - - /** - * {@inheritdoc} - */ - public function setId($id) - { - $this->storage->setId($id); - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->storage->getName(); - } - - /** - * {@inheritdoc} - */ - public function setName($name) - { - $this->storage->setName($name); - } - - /** - * {@inheritdoc} - */ - public function getMetadataBag() - { - return $this->storage->getMetadataBag(); - } - - /** - * {@inheritdoc} - */ - public function registerBag(SessionBagInterface $bag) - { - $this->storage->registerBag($bag); - } - - /** - * {@inheritdoc} - */ - public function getBag($name) - { - return $this->storage->getBag($name); - } - - /** - * Gets the flashbag interface. - * - * @return FlashBagInterface - */ - public function getFlashBag() - { - return $this->getBag($this->flashName); - } - - // the following methods are kept for compatibility with Symfony 2.0 (they will be removed for Symfony 2.3) - - /** - * @return array - * - * @deprecated since 2.1, will be removed from 2.3 - */ - public function getFlashes() - { - $all = $this->getBag($this->flashName)->all(); - - $return = array(); - if ($all) { - foreach ($all as $name => $array) { - if (is_numeric(key($array))) { - $return[$name] = reset($array); - } else { - $return[$name] = $array; - } - } - } - - return $return; - } - - /** - * @param array $values - * - * @deprecated since 2.1, will be removed from 2.3 - */ - public function setFlashes($values) - { - foreach ($values as $name => $value) { - $this->getBag($this->flashName)->set($name, $value); - } - } - - /** - * @param string $name - * @param string $default - * - * @return string - * - * @deprecated since 2.1, will be removed from 2.3 - */ - public function getFlash($name, $default = null) - { - $return = $this->getBag($this->flashName)->get($name); - - return empty($return) ? $default : reset($return); - } - - /** - * @param string $name - * @param string $value - * - * @deprecated since 2.1, will be removed from 2.3 - */ - public function setFlash($name, $value) - { - $this->getBag($this->flashName)->set($name, $value); - } - - /** - * @param string $name - * - * @return Boolean - * - * @deprecated since 2.1, will be removed from 2.3 - */ - public function hasFlash($name) - { - return $this->getBag($this->flashName)->has($name); - } - - /** - * @param string $name - * - * @deprecated since 2.1, will be removed from 2.3 - */ - public function removeFlash($name) - { - $this->getBag($this->flashName)->get($name); - } - - /** - * @return array - * - * @deprecated since 2.1, will be removed from 2.3 - */ - public function clearFlashes() - { - return $this->getBag($this->flashName)->clear(); - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/SessionBagInterface.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/SessionBagInterface.php deleted file mode 100755 index f8d3d327..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/SessionBagInterface.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session; - -/** - * Session Bag store. - * - * @author Drak - */ -interface SessionBagInterface -{ - /** - * Gets this bag's name - * - * @return string - */ - public function getName(); - - /** - * Initializes the Bag - * - * @param array $array - */ - public function initialize(array &$array); - - /** - * Gets the storage key for this bag. - * - * @return string - */ - public function getStorageKey(); - - /** - * Clears out data from bag. - * - * @return mixed Whatever data was contained. - */ - public function clear(); -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/SessionInterface.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/SessionInterface.php deleted file mode 100755 index a94fad00..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/SessionInterface.php +++ /dev/null @@ -1,208 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session; - -use Symfony\Component\HttpFoundation\Session\Storage\MetadataBag; - -/** - * Interface for the session. - * - * @author Drak - */ -interface SessionInterface -{ - /** - * Starts the session storage. - * - * @return Boolean True if session started. - * - * @throws \RuntimeException If session fails to start. - * - * @api - */ - public function start(); - - /** - * Returns the session ID. - * - * @return string The session ID. - * - * @api - */ - public function getId(); - - /** - * Sets the session ID - * - * @param string $id - * - * @api - */ - public function setId($id); - - /** - * Returns the session name. - * - * @return mixed The session name. - * - * @api - */ - public function getName(); - - /** - * Sets the session name. - * - * @param string $name - * - * @api - */ - public function setName($name); - - /** - * Invalidates the current session. - * - * Clears all session attributes and flashes and regenerates the - * session and deletes the old session from persistence. - * - * @param integer $lifetime Sets the cookie lifetime for the session cookie. A null value - * will leave the system settings unchanged, 0 sets the cookie - * to expire with browser session. Time is in seconds, and is - * not a Unix timestamp. - * - * @return Boolean True if session invalidated, false if error. - * - * @api - */ - public function invalidate($lifetime = null); - - /** - * Migrates the current session to a new session id while maintaining all - * session attributes. - * - * @param Boolean $destroy Whether to delete the old session or leave it to garbage collection. - * @param integer $lifetime Sets the cookie lifetime for the session cookie. A null value - * will leave the system settings unchanged, 0 sets the cookie - * to expire with browser session. Time is in seconds, and is - * not a Unix timestamp. - * - * @return Boolean True if session migrated, false if error. - * - * @api - */ - public function migrate($destroy = false, $lifetime = null); - - /** - * Force the session to be saved and closed. - * - * This method is generally not required for real sessions as - * the session will be automatically saved at the end of - * code execution. - */ - public function save(); - - /** - * Checks if an attribute is defined. - * - * @param string $name The attribute name - * - * @return Boolean true if the attribute is defined, false otherwise - * - * @api - */ - public function has($name); - - /** - * Returns an attribute. - * - * @param string $name The attribute name - * @param mixed $default The default value if not found. - * - * @return mixed - * - * @api - */ - public function get($name, $default = null); - - /** - * Sets an attribute. - * - * @param string $name - * @param mixed $value - * - * @api - */ - public function set($name, $value); - - /** - * Returns attributes. - * - * @return array Attributes - * - * @api - */ - public function all(); - - /** - * Sets attributes. - * - * @param array $attributes Attributes - */ - public function replace(array $attributes); - - /** - * Removes an attribute. - * - * @param string $name - * - * @return mixed The removed value - * - * @api - */ - public function remove($name); - - /** - * Clears all attributes. - * - * @api - */ - public function clear(); - - /** - * Checks if the session was started. - * - * @return Boolean - */ - public function isStarted(); - - /** - * Registers a SessionBagInterface with the session. - * - * @param SessionBagInterface $bag - */ - public function registerBag(SessionBagInterface $bag); - - /** - * Gets a bag instance by name. - * - * @param string $name - * - * @return SessionBagInterface - */ - public function getBag($name); - - /** - * Gets session meta. - * - * @return MetadataBag - */ - public function getMetadataBag(); -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php deleted file mode 100755 index 4a5e6398..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php +++ /dev/null @@ -1,109 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * MemcacheSessionHandler. - * - * @author Drak - */ -class MemcacheSessionHandler implements \SessionHandlerInterface -{ - /** - * @var \Memcache Memcache driver. - */ - private $memcache; - - /** - * @var integer Time to live in seconds - */ - private $ttl; - - /** - * @var string Key prefix for shared environments. - */ - private $prefix; - - /** - * Constructor. - * - * List of available options: - * * prefix: The prefix to use for the memcache keys in order to avoid collision - * * expiretime: The time to live in seconds - * - * @param \Memcache $memcache A \Memcache instance - * @param array $options An associative array of Memcache options - * - * @throws \InvalidArgumentException When unsupported options are passed - */ - public function __construct(\Memcache $memcache, array $options = array()) - { - if ($diff = array_diff(array_keys($options), array('prefix', 'expiretime'))) { - throw new \InvalidArgumentException(sprintf( - 'The following options are not supported "%s"', implode(', ', $diff) - )); - } - - $this->memcache = $memcache; - $this->ttl = isset($options['expiretime']) ? (int) $options['expiretime'] : 86400; - $this->prefix = isset($options['prefix']) ? $options['prefix'] : 'sf2s'; - } - - /** - * {@inheritDoc} - */ - public function open($savePath, $sessionName) - { - return true; - } - - /** - * {@inheritDoc} - */ - public function close() - { - return $this->memcache->close(); - } - - /** - * {@inheritDoc} - */ - public function read($sessionId) - { - return $this->memcache->get($this->prefix.$sessionId) ?: ''; - } - - /** - * {@inheritDoc} - */ - public function write($sessionId, $data) - { - return $this->memcache->set($this->prefix.$sessionId, $data, 0, time() + $this->ttl); - } - - /** - * {@inheritDoc} - */ - public function destroy($sessionId) - { - return $this->memcache->delete($this->prefix.$sessionId); - } - - /** - * {@inheritDoc} - */ - public function gc($lifetime) - { - // not required here because memcache will auto expire the records anyhow. - return true; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php deleted file mode 100755 index b3ca0bd3..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php +++ /dev/null @@ -1,115 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * MemcachedSessionHandler. - * - * Memcached based session storage handler based on the Memcached class - * provided by the PHP memcached extension. - * - * @see http://php.net/memcached - * - * @author Drak - */ -class MemcachedSessionHandler implements \SessionHandlerInterface -{ - /** - * @var \Memcached Memcached driver. - */ - private $memcached; - - /** - * @var integer Time to live in seconds - */ - private $ttl; - - /** - * @var string Key prefix for shared environments. - */ - private $prefix; - - /** - * Constructor. - * - * List of available options: - * * prefix: The prefix to use for the memcached keys in order to avoid collision - * * expiretime: The time to live in seconds - * - * @param \Memcached $memcached A \Memcached instance - * @param array $options An associative array of Memcached options - * - * @throws \InvalidArgumentException When unsupported options are passed - */ - public function __construct(\Memcached $memcached, array $options = array()) - { - $this->memcached = $memcached; - - if ($diff = array_diff(array_keys($options), array('prefix', 'expiretime'))) { - throw new \InvalidArgumentException(sprintf( - 'The following options are not supported "%s"', implode(', ', $diff) - )); - } - - $this->ttl = isset($options['expiretime']) ? (int) $options['expiretime'] : 86400; - $this->prefix = isset($options['prefix']) ? $options['prefix'] : 'sf2s'; - } - - /** - * {@inheritDoc} - */ - public function open($savePath, $sessionName) - { - return true; - } - - /** - * {@inheritDoc} - */ - public function close() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function read($sessionId) - { - return $this->memcached->get($this->prefix.$sessionId) ?: ''; - } - - /** - * {@inheritDoc} - */ - public function write($sessionId, $data) - { - return $this->memcached->set($this->prefix.$sessionId, $data, time() + $this->ttl); - } - - /** - * {@inheritDoc} - */ - public function destroy($sessionId) - { - return $this->memcached->delete($this->prefix.$sessionId); - } - - /** - * {@inheritDoc} - */ - public function gc($lifetime) - { - // not required here because memcached will auto expire the records anyhow. - return true; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php deleted file mode 100755 index 93a57296..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php +++ /dev/null @@ -1,150 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * MongoDB session handler - * - * @author Markus Bachmann - */ -class MongoDbSessionHandler implements \SessionHandlerInterface -{ - /** - * @var \Mongo - */ - private $mongo; - - /** - * @var \MongoCollection - */ - private $collection; - - /** - * @var array - */ - private $options; - - /** - * Constructor. - * - * @param \Mongo|\MongoClient $mongo A MongoClient or Mongo instance - * @param array $options An associative array of field options - * - * @throws \InvalidArgumentException When MongoClient or Mongo instance not provided - * @throws \InvalidArgumentException When "database" or "collection" not provided - */ - public function __construct($mongo, array $options) - { - if (!($mongo instanceof \MongoClient || $mongo instanceof \Mongo)) { - throw new \InvalidArgumentException('MongoClient or Mongo instance required'); - } - - if (!isset($options['database']) || !isset($options['collection'])) { - throw new \InvalidArgumentException('You must provide the "database" and "collection" option for MongoDBSessionHandler'); - } - - $this->mongo = $mongo; - - $this->options = array_merge(array( - 'id_field' => 'sess_id', - 'data_field' => 'sess_data', - 'time_field' => 'sess_time', - ), $options); - } - - /** - * {@inheritDoc} - */ - public function open($savePath, $sessionName) - { - return true; - } - - /** - * {@inheritDoc} - */ - public function close() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function destroy($sessionId) - { - $this->getCollection()->remove( - array($this->options['id_field'] => $sessionId), - array('justOne' => true) - ); - - return true; - } - - /** - * {@inheritDoc} - */ - public function gc($lifetime) - { - $time = new \MongoTimestamp(time() - $lifetime); - - $this->getCollection()->remove(array( - $this->options['time_field'] => array('$lt' => $time), - )); - } - - /** - * {@inheritDoc] - */ - public function write($sessionId, $data) - { - $data = array( - $this->options['id_field'] => $sessionId, - $this->options['data_field'] => new \MongoBinData($data, \MongoBinData::BYTE_ARRAY), - $this->options['time_field'] => new \MongoTimestamp() - ); - - $this->getCollection()->update( - array($this->options['id_field'] => $sessionId), - array('$set' => $data), - array('upsert' => true) - ); - - return true; - } - - /** - * {@inheritDoc} - */ - public function read($sessionId) - { - $dbData = $this->getCollection()->findOne(array( - $this->options['id_field'] => $sessionId, - )); - - return null === $dbData ? '' : $dbData[$this->options['data_field']]->bin; - } - - /** - * Return a "MongoCollection" instance - * - * @return \MongoCollection - */ - private function getCollection() - { - if (null === $this->collection) { - $this->collection = $this->mongo->selectCollection($this->options['database'], $this->options['collection']); - } - - return $this->collection; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeFileSessionHandler.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeFileSessionHandler.php deleted file mode 100755 index f39235cb..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeFileSessionHandler.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * NativeFileSessionHandler. - * - * Native session handler using PHP's built in file storage. - * - * @author Drak - */ -class NativeFileSessionHandler extends NativeSessionHandler -{ - /** - * Constructor. - * - * @param string $savePath Path of directory to save session files. - * Default null will leave setting as defined by PHP. - * '/path', 'N;/path', or 'N;octal-mode;/path - * - * @see http://php.net/session.configuration.php#ini.session.save-path for further details. - * - * @throws \InvalidArgumentException On invalid $savePath - */ - public function __construct($savePath = null) - { - if (null === $savePath) { - $savePath = ini_get('session.save_path'); - } - - $baseDir = $savePath; - - if ($count = substr_count($savePath, ';')) { - if ($count > 2) { - throw new \InvalidArgumentException(sprintf('Invalid argument $savePath \'%s\'', $savePath)); - } - - // characters after last ';' are the path - $baseDir = ltrim(strrchr($savePath, ';'), ';'); - } - - if ($baseDir && !is_dir($baseDir)) { - mkdir($baseDir, 0777, true); - } - - ini_set('session.save_path', $savePath); - ini_set('session.save_handler', 'files'); - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.php deleted file mode 100755 index 1260ad0d..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * Adds SessionHandler functionality if available. - * - * @see http://php.net/sessionhandler - */ - -if (version_compare(phpversion(), '5.4.0', '>=')) { - class NativeSessionHandler extends \SessionHandler {} -} else { - class NativeSessionHandler {} -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php deleted file mode 100755 index 62068aff..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * NullSessionHandler. - * - * Can be used in unit testing or in a situations where persisted sessions are not desired. - * - * @author Drak - * - * @api - */ -class NullSessionHandler implements \SessionHandlerInterface -{ - /** - * {@inheritdoc} - */ - public function open($savePath, $sessionName) - { - return true; - } - - /** - * {@inheritdoc} - */ - public function close() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function read($sessionId) - { - return ''; - } - - /** - * {@inheritdoc} - */ - public function write($sessionId, $data) - { - return true; - } - - /** - * {@inheritdoc} - */ - public function destroy($sessionId) - { - return true; - } - - /** - * {@inheritdoc} - */ - public function gc($lifetime) - { - return true; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php deleted file mode 100755 index 487dbc41..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php +++ /dev/null @@ -1,241 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * PdoSessionHandler. - * - * @author Fabien Potencier - * @author Michael Williams - */ -class PdoSessionHandler implements \SessionHandlerInterface -{ - /** - * @var \PDO PDO instance. - */ - private $pdo; - - /** - * @var array Database options. - */ - private $dbOptions; - - /** - * Constructor. - * - * List of available options: - * * db_table: The name of the table [required] - * * db_id_col: The column where to store the session id [default: sess_id] - * * db_data_col: The column where to store the session data [default: sess_data] - * * db_time_col: The column where to store the timestamp [default: sess_time] - * - * @param \PDO $pdo A \PDO instance - * @param array $dbOptions An associative array of DB options - * - * @throws \InvalidArgumentException When "db_table" option is not provided - */ - public function __construct(\PDO $pdo, array $dbOptions = array()) - { - if (!array_key_exists('db_table', $dbOptions)) { - throw new \InvalidArgumentException('You must provide the "db_table" option for a PdoSessionStorage.'); - } - - $this->pdo = $pdo; - $this->dbOptions = array_merge(array( - 'db_id_col' => 'sess_id', - 'db_data_col' => 'sess_data', - 'db_time_col' => 'sess_time', - ), $dbOptions); - } - - /** - * {@inheritDoc} - */ - public function open($path, $name) - { - return true; - } - - /** - * {@inheritDoc} - */ - public function close() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function destroy($id) - { - // get table/column - $dbTable = $this->dbOptions['db_table']; - $dbIdCol = $this->dbOptions['db_id_col']; - - // delete the record associated with this id - $sql = "DELETE FROM $dbTable WHERE $dbIdCol = :id"; - - try { - $stmt = $this->pdo->prepare($sql); - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - $stmt->execute(); - } catch (\PDOException $e) { - throw new \RuntimeException(sprintf('PDOException was thrown when trying to manipulate session data: %s', $e->getMessage()), 0, $e); - } - - return true; - } - - /** - * {@inheritDoc} - */ - public function gc($lifetime) - { - // get table/column - $dbTable = $this->dbOptions['db_table']; - $dbTimeCol = $this->dbOptions['db_time_col']; - - // delete the session records that have expired - $sql = "DELETE FROM $dbTable WHERE $dbTimeCol < :time"; - - try { - $stmt = $this->pdo->prepare($sql); - $stmt->bindValue(':time', time() - $lifetime, \PDO::PARAM_INT); - $stmt->execute(); - } catch (\PDOException $e) { - throw new \RuntimeException(sprintf('PDOException was thrown when trying to manipulate session data: %s', $e->getMessage()), 0, $e); - } - - return true; - } - - /** - * {@inheritDoc} - */ - public function read($id) - { - // get table/columns - $dbTable = $this->dbOptions['db_table']; - $dbDataCol = $this->dbOptions['db_data_col']; - $dbIdCol = $this->dbOptions['db_id_col']; - - try { - $sql = "SELECT $dbDataCol FROM $dbTable WHERE $dbIdCol = :id"; - - $stmt = $this->pdo->prepare($sql); - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - - $stmt->execute(); - // it is recommended to use fetchAll so that PDO can close the DB cursor - // we anyway expect either no rows, or one row with one column. fetchColumn, seems to be buggy #4777 - $sessionRows = $stmt->fetchAll(\PDO::FETCH_NUM); - - if (count($sessionRows) == 1) { - return base64_decode($sessionRows[0][0]); - } - - // session does not exist, create it - $this->createNewSession($id); - - return ''; - } catch (\PDOException $e) { - throw new \RuntimeException(sprintf('PDOException was thrown when trying to read the session data: %s', $e->getMessage()), 0, $e); - } - } - - /** - * {@inheritDoc} - */ - public function write($id, $data) - { - // get table/column - $dbTable = $this->dbOptions['db_table']; - $dbDataCol = $this->dbOptions['db_data_col']; - $dbIdCol = $this->dbOptions['db_id_col']; - $dbTimeCol = $this->dbOptions['db_time_col']; - - //session data can contain non binary safe characters so we need to encode it - $encoded = base64_encode($data); - - try { - $driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME); - - if ('mysql' === $driver) { - // MySQL would report $stmt->rowCount() = 0 on UPDATE when the data is left unchanged - // it could result in calling createNewSession() whereas the session already exists in - // the DB which would fail as the id is unique - $stmt = $this->pdo->prepare( - "INSERT INTO $dbTable ($dbIdCol, $dbDataCol, $dbTimeCol) VALUES (:id, :data, :time) " . - "ON DUPLICATE KEY UPDATE $dbDataCol = VALUES($dbDataCol), $dbTimeCol = VALUES($dbTimeCol)" - ); - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR); - $stmt->bindValue(':time', time(), \PDO::PARAM_INT); - $stmt->execute(); - } elseif ('oci' === $driver) { - $stmt = $this->pdo->prepare("MERGE INTO $dbTable USING DUAL ON($dbIdCol = :id) ". - "WHEN NOT MATCHED THEN INSERT ($dbIdCol, $dbDataCol, $dbTimeCol) VALUES (:id, :data, sysdate) " . - "WHEN MATCHED THEN UPDATE SET $dbDataCol = :data WHERE $dbIdCol = :id"); - - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR); - $stmt->execute(); - } else { - $stmt = $this->pdo->prepare("UPDATE $dbTable SET $dbDataCol = :data, $dbTimeCol = :time WHERE $dbIdCol = :id"); - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR); - $stmt->bindValue(':time', time(), \PDO::PARAM_INT); - $stmt->execute(); - - if (!$stmt->rowCount()) { - // No session exists in the database to update. This happens when we have called - // session_regenerate_id() - $this->createNewSession($id, $data); - } - } - } catch (\PDOException $e) { - throw new \RuntimeException(sprintf('PDOException was thrown when trying to write the session data: %s', $e->getMessage()), 0, $e); - } - - return true; - } - - /** - * Creates a new session with the given $id and $data - * - * @param string $id - * @param string $data - * - * @return boolean True. - */ - private function createNewSession($id, $data = '') - { - // get table/column - $dbTable = $this->dbOptions['db_table']; - $dbDataCol = $this->dbOptions['db_data_col']; - $dbIdCol = $this->dbOptions['db_id_col']; - $dbTimeCol = $this->dbOptions['db_time_col']; - - $sql = "INSERT INTO $dbTable ($dbIdCol, $dbDataCol, $dbTimeCol) VALUES (:id, :data, :time)"; - - //session data can contain non binary safe characters so we need to encode it - $encoded = base64_encode($data); - $stmt = $this->pdo->prepare($sql); - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR); - $stmt->bindValue(':time', time(), \PDO::PARAM_INT); - $stmt->execute(); - - return true; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php deleted file mode 100755 index 892d004b..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php +++ /dev/null @@ -1,160 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; - -/** - * Metadata container. - * - * Adds metadata to the session. - * - * @author Drak - */ -class MetadataBag implements SessionBagInterface -{ - const CREATED = 'c'; - const UPDATED = 'u'; - const LIFETIME = 'l'; - - /** - * @var string - */ - private $name = '__metadata'; - - /** - * @var string - */ - private $storageKey; - - /** - * @var array - */ - protected $meta = array(); - - /** - * Unix timestamp. - * - * @var integer - */ - private $lastUsed; - - /** - * Constructor. - * - * @param string $storageKey The key used to store bag in the session. - */ - public function __construct($storageKey = '_sf2_meta') - { - $this->storageKey = $storageKey; - $this->meta = array(self::CREATED => 0, self::UPDATED => 0, self::LIFETIME => 0); - } - - /** - * {@inheritdoc} - */ - public function initialize(array &$array) - { - $this->meta = &$array; - - if (isset($array[self::CREATED])) { - $this->lastUsed = $this->meta[self::UPDATED]; - $this->meta[self::UPDATED] = time(); - } else { - $this->stampCreated(); - } - } - - /** - * Gets the lifetime that the session cookie was set with. - * - * @return integer - */ - public function getLifetime() - { - return $this->meta[self::LIFETIME]; - } - - /** - * Stamps a new session's metadata. - * - * @param integer $lifetime Sets the cookie lifetime for the session cookie. A null value - * will leave the system settings unchanged, 0 sets the cookie - * to expire with browser session. Time is in seconds, and is - * not a Unix timestamp. - */ - public function stampNew($lifetime = null) - { - $this->stampCreated($lifetime); - } - - /** - * {@inheritdoc} - */ - public function getStorageKey() - { - return $this->storageKey; - } - - /** - * Gets the created timestamp metadata. - * - * @return integer Unix timestamp - */ - public function getCreated() - { - return $this->meta[self::CREATED]; - } - - /** - * Gets the last used metadata. - * - * @return integer Unix timestamp - */ - public function getLastUsed() - { - return $this->lastUsed; - } - - /** - * {@inheritdoc} - */ - public function clear() - { - // nothing to do - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->name; - } - - /** - * Sets name. - * - * @param string $name - */ - public function setName($name) - { - $this->name = $name; - } - - private function stampCreated($lifetime = null) - { - $timeStamp = time(); - $this->meta[self::CREATED] = $this->meta[self::UPDATED] = $this->lastUsed = $timeStamp; - $this->meta[self::LIFETIME] = (null === $lifetime) ? ini_get('session.cookie_lifetime') : $lifetime; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php deleted file mode 100755 index a1fcf539..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php +++ /dev/null @@ -1,268 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; -use Symfony\Component\HttpFoundation\Session\Storage\MetadataBag; - -/** - * MockArraySessionStorage mocks the session for unit tests. - * - * No PHP session is actually started since a session can be initialized - * and shutdown only once per PHP execution cycle. - * - * When doing functional testing, you should use MockFileSessionStorage instead. - * - * @author Fabien Potencier - * @author Bulat Shakirzyanov - * @author Drak - */ -class MockArraySessionStorage implements SessionStorageInterface -{ - /** - * @var string - */ - protected $id = ''; - - /** - * @var string - */ - protected $name; - - /** - * @var boolean - */ - protected $started = false; - - /** - * @var boolean - */ - protected $closed = false; - - /** - * @var array - */ - protected $data = array(); - - /** - * @var MetadataBag - */ - protected $metadataBag; - - /** - * @var array - */ - protected $bags; - - /** - * Constructor. - * - * @param string $name Session name - * @param MetadataBag $metaBag MetadataBag instance. - */ - public function __construct($name = 'MOCKSESSID', MetadataBag $metaBag = null) - { - $this->name = $name; - $this->setMetadataBag($metaBag); - } - - /** - * Sets the session data. - * - * @param array $array - */ - public function setSessionData(array $array) - { - $this->data = $array; - } - - /** - * {@inheritdoc} - */ - public function start() - { - if ($this->started && !$this->closed) { - return true; - } - - if (empty($this->id)) { - $this->id = $this->generateId(); - } - - $this->loadSession(); - - return true; - } - - /** - * {@inheritdoc} - */ - public function regenerate($destroy = false, $lifetime = null) - { - if (!$this->started) { - $this->start(); - } - - $this->metadataBag->stampNew($lifetime); - $this->id = $this->generateId(); - - return true; - } - - /** - * {@inheritdoc} - */ - public function getId() - { - return $this->id; - } - - /** - * {@inheritdoc} - */ - public function setId($id) - { - if ($this->started) { - throw new \LogicException('Cannot set session ID after the session has started.'); - } - - $this->id = $id; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->name; - } - - /** - * {@inheritdoc} - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * {@inheritdoc} - */ - public function save() - { - if (!$this->started || $this->closed) { - throw new \RuntimeException("Trying to save a session that was not started yet or was already closed"); - } - // nothing to do since we don't persist the session data - $this->closed = false; - } - - /** - * {@inheritdoc} - */ - public function clear() - { - // clear out the bags - foreach ($this->bags as $bag) { - $bag->clear(); - } - - // clear out the session - $this->data = array(); - - // reconnect the bags to the session - $this->loadSession(); - } - - /** - * {@inheritdoc} - */ - public function registerBag(SessionBagInterface $bag) - { - $this->bags[$bag->getName()] = $bag; - } - - /** - * {@inheritdoc} - */ - public function getBag($name) - { - if (!isset($this->bags[$name])) { - throw new \InvalidArgumentException(sprintf('The SessionBagInterface %s is not registered.', $name)); - } - - if (!$this->started) { - $this->start(); - } - - return $this->bags[$name]; - } - - /** - * {@inheritdoc} - */ - public function isStarted() - { - return $this->started; - } - - /** - * Sets the MetadataBag. - * - * @param MetadataBag $bag - */ - public function setMetadataBag(MetadataBag $bag = null) - { - if (null === $bag) { - $bag = new MetadataBag(); - } - - $this->metadataBag = $bag; - } - - /** - * Gets the MetadataBag. - * - * @return MetadataBag - */ - public function getMetadataBag() - { - return $this->metadataBag; - } - - /** - * Generates a session ID. - * - * This doesn't need to be particularly cryptographically secure since this is just - * a mock. - * - * @return string - */ - protected function generateId() - { - return sha1(uniqid(mt_rand())); - } - - protected function loadSession() - { - $bags = array_merge($this->bags, array($this->metadataBag)); - - foreach ($bags as $bag) { - $key = $bag->getStorageKey(); - $this->data[$key] = isset($this->data[$key]) ? $this->data[$key] : array(); - $bag->initialize($this->data[$key]); - } - - $this->started = true; - $this->closed = false; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php deleted file mode 100755 index 28063091..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php +++ /dev/null @@ -1,143 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -/** - * MockFileSessionStorage is used to mock sessions for - * functional testing when done in a single PHP process. - * - * No PHP session is actually started since a session can be initialized - * and shutdown only once per PHP execution cycle and this class does - * not pollute any session related globals, including session_*() functions - * or session.* PHP ini directives. - * - * @author Drak - */ -class MockFileSessionStorage extends MockArraySessionStorage -{ - /** - * @var string - */ - private $savePath; - - /** - * @var array - */ - private $sessionData; - - /** - * Constructor. - * - * @param string $savePath Path of directory to save session files. - * @param string $name Session name. - * @param MetadataBag $metaBag MetadataBag instance. - */ - public function __construct($savePath = null, $name = 'MOCKSESSID', MetadataBag $metaBag = null) - { - if (null === $savePath) { - $savePath = sys_get_temp_dir(); - } - - if (!is_dir($savePath)) { - mkdir($savePath, 0777, true); - } - - $this->savePath = $savePath; - - parent::__construct($name, $metaBag); - } - - /** - * {@inheritdoc} - */ - public function start() - { - if ($this->started) { - return true; - } - - if (!$this->id) { - $this->id = $this->generateId(); - } - - $this->read(); - - $this->started = true; - - return true; - } - - /** - * {@inheritdoc} - */ - public function regenerate($destroy = false, $lifetime = null) - { - if (!$this->started) { - $this->start(); - } - - if ($destroy) { - $this->destroy(); - } - - return parent::regenerate($destroy, $lifetime); - } - - /** - * {@inheritdoc} - */ - public function save() - { - if (!$this->started) { - throw new \RuntimeException("Trying to save a session that was not started yet or was already closed"); - } - - file_put_contents($this->getFilePath(), serialize($this->data)); - - // this is needed for Silex, where the session object is re-used across requests - // in functional tests. In Symfony, the container is rebooted, so we don't have - // this issue - $this->started = false; - } - - /** - * Deletes a session from persistent storage. - * Deliberately leaves session data in memory intact. - */ - private function destroy() - { - if (is_file($this->getFilePath())) { - unlink($this->getFilePath()); - } - } - - /** - * Calculate path to file. - * - * @return string File path - */ - private function getFilePath() - { - return $this->savePath.'/'.$this->id.'.mocksess'; - } - - /** - * Reads session from storage and loads session. - */ - private function read() - { - $filePath = $this->getFilePath(); - $this->data = is_readable($filePath) && is_file($filePath) ? unserialize(file_get_contents($filePath)) : array(); - - $this->loadSession(); - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php deleted file mode 100755 index 2dc85648..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php +++ /dev/null @@ -1,400 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; -use Symfony\Component\HttpFoundation\Session\Storage\MetadataBag; -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy; -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy; -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy; - -/** - * This provides a base class for session attribute storage. - * - * @author Drak - */ -class NativeSessionStorage implements SessionStorageInterface -{ - /** - * Array of SessionBagInterface - * - * @var array - */ - protected $bags; - - /** - * @var boolean - */ - protected $started = false; - - /** - * @var boolean - */ - protected $closed = false; - - /** - * @var AbstractProxy - */ - protected $saveHandler; - - /** - * @var MetadataBag - */ - protected $metadataBag; - - /** - * Constructor. - * - * Depending on how you want the storage driver to behave you probably - * want to override this constructor entirely. - * - * List of options for $options array with their defaults. - * @see http://php.net/session.configuration for options - * but we omit 'session.' from the beginning of the keys for convenience. - * - * ("auto_start", is not supported as it tells PHP to start a session before - * PHP starts to execute user-land code. Setting during runtime has no effect). - * - * cache_limiter, "nocache" (use "0" to prevent headers from being sent entirely). - * cookie_domain, "" - * cookie_httponly, "" - * cookie_lifetime, "0" - * cookie_path, "/" - * cookie_secure, "" - * entropy_file, "" - * entropy_length, "0" - * gc_divisor, "100" - * gc_maxlifetime, "1440" - * gc_probability, "1" - * hash_bits_per_character, "4" - * hash_function, "0" - * name, "PHPSESSID" - * referer_check, "" - * serialize_handler, "php" - * use_cookies, "1" - * use_only_cookies, "1" - * use_trans_sid, "0" - * upload_progress.enabled, "1" - * upload_progress.cleanup, "1" - * upload_progress.prefix, "upload_progress_" - * upload_progress.name, "PHP_SESSION_UPLOAD_PROGRESS" - * upload_progress.freq, "1%" - * upload_progress.min-freq, "1" - * url_rewriter.tags, "a=href,area=href,frame=src,form=,fieldset=" - * - * @param array $options Session configuration options. - * @param object $handler SessionHandlerInterface. - * @param MetadataBag $metaBag MetadataBag. - */ - public function __construct(array $options = array(), $handler = null, MetadataBag $metaBag = null) - { - ini_set('session.cache_limiter', ''); // disable by default because it's managed by HeaderBag (if used) - ini_set('session.use_cookies', 1); - - if (version_compare(phpversion(), '5.4.0', '>=')) { - session_register_shutdown(); - } else { - register_shutdown_function('session_write_close'); - } - - $this->setMetadataBag($metaBag); - $this->setOptions($options); - $this->setSaveHandler($handler); - } - - /** - * Gets the save handler instance. - * - * @return AbstractProxy - */ - public function getSaveHandler() - { - return $this->saveHandler; - } - - /** - * {@inheritdoc} - */ - public function start() - { - if ($this->started && !$this->closed) { - return true; - } - - // catch condition where session was started automatically by PHP - if (!$this->started && !$this->closed && $this->saveHandler->isActive() - && $this->saveHandler->isSessionHandlerInterface()) { - $this->loadSession(); - - return true; - } - - if (ini_get('session.use_cookies') && headers_sent()) { - throw new \RuntimeException('Failed to start the session because headers have already been sent.'); - } - - // start the session - if (!session_start()) { - throw new \RuntimeException('Failed to start the session'); - } - - $this->loadSession(); - - if (!$this->saveHandler->isWrapper() && !$this->saveHandler->isSessionHandlerInterface()) { - $this->saveHandler->setActive(false); - } - - return true; - } - - /** - * {@inheritdoc} - */ - public function getId() - { - if (!$this->started) { - return ''; // returning empty is consistent with session_id() behaviour - } - - return $this->saveHandler->getId(); - } - - /** - * {@inheritdoc} - */ - public function setId($id) - { - $this->saveHandler->setId($id); - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->saveHandler->getName(); - } - - /** - * {@inheritdoc} - */ - public function setName($name) - { - $this->saveHandler->setName($name); - } - - /** - * {@inheritdoc} - */ - public function regenerate($destroy = false, $lifetime = null) - { - if (null !== $lifetime) { - ini_set('session.cookie_lifetime', $lifetime); - } - - if ($destroy) { - $this->metadataBag->stampNew(); - } - - return session_regenerate_id($destroy); - } - - /** - * {@inheritdoc} - */ - public function save() - { - session_write_close(); - - if (!$this->saveHandler->isWrapper() && !$this->getSaveHandler()->isSessionHandlerInterface()) { - $this->saveHandler->setActive(false); - } - - $this->closed = true; - } - - /** - * {@inheritdoc} - */ - public function clear() - { - // clear out the bags - foreach ($this->bags as $bag) { - $bag->clear(); - } - - // clear out the session - $_SESSION = array(); - - // reconnect the bags to the session - $this->loadSession(); - } - - /** - * {@inheritdoc} - */ - public function registerBag(SessionBagInterface $bag) - { - $this->bags[$bag->getName()] = $bag; - } - - /** - * {@inheritdoc} - */ - public function getBag($name) - { - if (!isset($this->bags[$name])) { - throw new \InvalidArgumentException(sprintf('The SessionBagInterface %s is not registered.', $name)); - } - - if ($this->saveHandler->isActive() && !$this->started) { - $this->loadSession(); - } elseif (!$this->started) { - $this->start(); - } - - return $this->bags[$name]; - } - - /** - * Sets the MetadataBag. - * - * @param MetadataBag $metaBag - */ - public function setMetadataBag(MetadataBag $metaBag = null) - { - if (null === $metaBag) { - $metaBag = new MetadataBag(); - } - - $this->metadataBag = $metaBag; - } - - /** - * Gets the MetadataBag. - * - * @return MetadataBag - */ - public function getMetadataBag() - { - return $this->metadataBag; - } - - /** - * {@inheritdoc} - */ - public function isStarted() - { - return $this->started; - } - - /** - * Sets session.* ini variables. - * - * For convenience we omit 'session.' from the beginning of the keys. - * Explicitly ignores other ini keys. - * - * @param array $options Session ini directives array(key => value). - * - * @see http://php.net/session.configuration - */ - public function setOptions(array $options) - { - $validOptions = array_flip(array( - 'cache_limiter', 'cookie_domain', 'cookie_httponly', - 'cookie_lifetime', 'cookie_path', 'cookie_secure', - 'entropy_file', 'entropy_length', 'gc_divisor', - 'gc_maxlifetime', 'gc_probability', 'hash_bits_per_character', - 'hash_function', 'name', 'referer_check', - 'serialize_handler', 'use_cookies', - 'use_only_cookies', 'use_trans_sid', 'upload_progress.enabled', - 'upload_progress.cleanup', 'upload_progress.prefix', 'upload_progress.name', - 'upload_progress.freq', 'upload_progress.min-freq', 'url_rewriter.tags', - )); - - foreach ($options as $key => $value) { - if (isset($validOptions[$key])) { - ini_set('session.'.$key, $value); - } - } - } - - /** - * Registers save handler as a PHP session handler. - * - * To use internal PHP session save handlers, override this method using ini_set with - * session.save_handlers and session.save_path e.g. - * - * ini_set('session.save_handlers', 'files'); - * ini_set('session.save_path', /tmp'); - * - * @see http://php.net/session-set-save-handler - * @see http://php.net/sessionhandlerinterface - * @see http://php.net/sessionhandler - * - * @param object $saveHandler Default null means NativeProxy. - */ - public function setSaveHandler($saveHandler = null) - { - // Wrap $saveHandler in proxy - if (!$saveHandler instanceof AbstractProxy && $saveHandler instanceof \SessionHandlerInterface) { - $saveHandler = new SessionHandlerProxy($saveHandler); - } elseif (!$saveHandler instanceof AbstractProxy) { - $saveHandler = new NativeProxy(); - } - - $this->saveHandler = $saveHandler; - - if ($this->saveHandler instanceof \SessionHandlerInterface) { - if (version_compare(phpversion(), '5.4.0', '>=')) { - session_set_save_handler($this->saveHandler, false); - } else { - session_set_save_handler( - array($this->saveHandler, 'open'), - array($this->saveHandler, 'close'), - array($this->saveHandler, 'read'), - array($this->saveHandler, 'write'), - array($this->saveHandler, 'destroy'), - array($this->saveHandler, 'gc') - ); - } - } - } - - /** - * Load the session with attributes. - * - * After starting the session, PHP retrieves the session from whatever handlers - * are set to (either PHP's internal, or a custom save handler set with session_set_save_handler()). - * PHP takes the return value from the read() handler, unserializes it - * and populates $_SESSION with the result automatically. - * - * @param array|null $session - */ - protected function loadSession(array &$session = null) - { - if (null === $session) { - $session = &$_SESSION; - } - - $bags = array_merge($this->bags, array($this->metadataBag)); - - foreach ($bags as $bag) { - $key = $bag->getStorageKey(); - $session[$key] = isset($session[$key]) ? $session[$key] : array(); - $bag->initialize($session[$key]); - } - - $this->started = true; - $this->closed = false; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php deleted file mode 100755 index 0d4cb8b6..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php +++ /dev/null @@ -1,135 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy; - -/** - * AbstractProxy. - * - * @author Drak - */ -abstract class AbstractProxy -{ - /** - * Flag if handler wraps an internal PHP session handler (using \SessionHandler). - * - * @var boolean - */ - protected $wrapper = false; - - /** - * @var boolean - */ - protected $active = false; - - /** - * @var string - */ - protected $saveHandlerName; - - /** - * Gets the session.save_handler name. - * - * @return string - */ - public function getSaveHandlerName() - { - return $this->saveHandlerName; - } - - /** - * Is this proxy handler and instance of \SessionHandlerInterface. - * - * @return boolean - */ - public function isSessionHandlerInterface() - { - return ($this instanceof \SessionHandlerInterface); - } - - /** - * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler. - * - * @return Boolean - */ - public function isWrapper() - { - return $this->wrapper; - } - - /** - * Has a session started? - * - * @return Boolean - */ - public function isActive() - { - return $this->active; - } - - /** - * Sets the active flag. - * - * @param Boolean $flag - */ - public function setActive($flag) - { - $this->active = (bool) $flag; - } - - /** - * Gets the session ID. - * - * @return string - */ - public function getId() - { - return session_id(); - } - - /** - * Sets the session ID. - * - * @param string $id - */ - public function setId($id) - { - if ($this->isActive()) { - throw new \LogicException('Cannot change the ID of an active session'); - } - - session_id($id); - } - - /** - * Gets the session name. - * - * @return string - */ - public function getName() - { - return session_name(); - } - - /** - * Sets the session name. - * - * @param string $name - */ - public function setName($name) - { - if ($this->isActive()) { - throw new \LogicException('Cannot change the name of an active session'); - } - - session_name($name); - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php deleted file mode 100755 index 23eebb32..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy; - -/** - * NativeProxy. - * - * This proxy is built-in session handlers in PHP 5.3.x - * - * @author Drak - */ -class NativeProxy extends AbstractProxy -{ - /** - * Constructor. - */ - public function __construct() - { - // this makes an educated guess as to what the handler is since it should already be set. - $this->saveHandlerName = ini_get('session.save_handler'); - } - - /** - * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler. - * - * @return Boolean False. - */ - public function isWrapper() - { - return false; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php deleted file mode 100755 index e1f4fff1..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy; - -/** - * SessionHandler proxy. - * - * @author Drak - */ -class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterface -{ - /** - * @var \SessionHandlerInterface - */ - protected $handler; - - /** - * Constructor. - * - * @param \SessionHandlerInterface $handler - */ - public function __construct(\SessionHandlerInterface $handler) - { - $this->handler = $handler; - $this->wrapper = ($handler instanceof \SessionHandler); - $this->saveHandlerName = $this->wrapper ? ini_get('session.save_handler') : 'user'; - } - - // \SessionHandlerInterface - - /** - * {@inheritdoc} - */ - public function open($savePath, $sessionName) - { - $return = (bool) $this->handler->open($savePath, $sessionName); - - if (true === $return) { - $this->active = true; - } - - return $return; - } - - /** - * {@inheritdoc} - */ - public function close() - { - $this->active = false; - - return (bool) $this->handler->close(); - } - - /** - * {@inheritdoc} - */ - public function read($id) - { - return (string) $this->handler->read($id); - } - - /** - * {@inheritdoc} - */ - public function write($id, $data) - { - return (bool) $this->handler->write($id, $data); - } - - /** - * {@inheritdoc} - */ - public function destroy($id) - { - return (bool) $this->handler->destroy($id); - } - - /** - * {@inheritdoc} - */ - public function gc($maxlifetime) - { - return (bool) $this->handler->gc($maxlifetime); - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php b/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php deleted file mode 100755 index 711eaa29..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php +++ /dev/null @@ -1,146 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; -use Symfony\Component\HttpFoundation\Session\Storage\MetadataBag; - -/** - * StorageInterface. - * - * @author Fabien Potencier - * @author Drak - * - * @api - */ -interface SessionStorageInterface -{ - /** - * Starts the session. - * - * @throws \RuntimeException If something goes wrong starting the session. - * - * @return boolean True if started. - * - * @api - */ - public function start(); - - /** - * Checks if the session is started. - * - * @return boolean True if started, false otherwise. - */ - public function isStarted(); - - /** - * Returns the session ID - * - * @return string The session ID or empty. - * - * @api - */ - public function getId(); - - /** - * Sets the session ID - * - * @param string $id - * - * @api - */ - public function setId($id); - - /** - * Returns the session name - * - * @return mixed The session name. - * - * @api - */ - public function getName(); - - /** - * Sets the session name - * - * @param string $name - * - * @api - */ - public function setName($name); - - /** - * Regenerates id that represents this storage. - * - * This method must invoke session_regenerate_id($destroy) unless - * this interface is used for a storage object designed for unit - * or functional testing where a real PHP session would interfere - * with testing. - * - * Note regenerate+destroy should not clear the session data in memory - * only delete the session data from persistent storage. - * - * @param Boolean $destroy Destroy session when regenerating? - * @param integer $lifetime Sets the cookie lifetime for the session cookie. A null value - * will leave the system settings unchanged, 0 sets the cookie - * to expire with browser session. Time is in seconds, and is - * not a Unix timestamp. - * - * @return Boolean True if session regenerated, false if error - * - * @throws \RuntimeException If an error occurs while regenerating this storage - * - * @api - */ - public function regenerate($destroy = false, $lifetime = null); - - /** - * Force the session to be saved and closed. - * - * This method must invoke session_write_close() unless this interface is - * used for a storage object design for unit or functional testing where - * a real PHP session would interfere with testing, in which case it - * it should actually persist the session data if required. - * - * @throws \RuntimeException If the session is saved without being started, or if the session - * is already closed. - */ - public function save(); - - /** - * Clear all session data in memory. - */ - public function clear(); - - /** - * Gets a SessionBagInterface by name. - * - * @param string $name - * - * @return SessionBagInterface - * - * @throws \InvalidArgumentException If the bag does not exist - */ - public function getBag($name); - - /** - * Registers a SessionBagInterface for use. - * - * @param SessionBagInterface $bag - */ - public function registerBag(SessionBagInterface $bag); - - /** - * @return MetadataBag - */ - public function getMetadataBag(); -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/StreamedResponse.php b/laravel/vendor/Symfony/Component/HttpFoundation/StreamedResponse.php deleted file mode 100755 index 53bdbe64..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/StreamedResponse.php +++ /dev/null @@ -1,125 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * StreamedResponse represents a streamed HTTP response. - * - * A StreamedResponse uses a callback for its content. - * - * The callback should use the standard PHP functions like echo - * to stream the response back to the client. The flush() method - * can also be used if needed. - * - * @see flush() - * - * @author Fabien Potencier - * - * @api - */ -class StreamedResponse extends Response -{ - protected $callback; - protected $streamed; - - /** - * Constructor. - * - * @param mixed $callback A valid PHP callback - * @param integer $status The response status code - * @param array $headers An array of response headers - * - * @api - */ - public function __construct($callback = null, $status = 200, $headers = array()) - { - parent::__construct(null, $status, $headers); - - if (null !== $callback) { - $this->setCallback($callback); - } - $this->streamed = false; - } - - /** - * {@inheritDoc} - */ - public static function create($callback = null, $status = 200, $headers = array()) - { - return new static($callback, $status, $headers); - } - - /** - * Sets the PHP callback associated with this Response. - * - * @param mixed $callback A valid PHP callback - */ - public function setCallback($callback) - { - if (!is_callable($callback)) { - throw new \LogicException('The Response callback must be a valid PHP callable.'); - } - $this->callback = $callback; - } - - /** - * {@inheritdoc} - */ - public function prepare(Request $request) - { - $this->headers->set('Cache-Control', 'no-cache'); - - return parent::prepare($request); - } - - /** - * {@inheritdoc} - * - * This method only sends the content once. - */ - public function sendContent() - { - if ($this->streamed) { - return; - } - - $this->streamed = true; - - if (null === $this->callback) { - throw new \LogicException('The Response callback must not be null.'); - } - - call_user_func($this->callback); - } - - /** - * {@inheritdoc} - * - * @throws \LogicException when the content is not null - */ - public function setContent($content) - { - if (null !== $content) { - throw new \LogicException('The content cannot be set on a StreamedResponse instance.'); - } - } - - /** - * {@inheritdoc} - * - * @return false - */ - public function getContent() - { - return false; - } -} diff --git a/laravel/vendor/Symfony/Component/HttpFoundation/composer.json b/laravel/vendor/Symfony/Component/HttpFoundation/composer.json deleted file mode 100755 index e9f54948..00000000 --- a/laravel/vendor/Symfony/Component/HttpFoundation/composer.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "symfony/http-foundation", - "type": "library", - "description": "Symfony HttpFoundation Component", - "keywords": [], - "homepage": "http://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "require": { - "php": ">=5.3.3" - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\HttpFoundation": "", - "SessionHandlerInterface": "Symfony/Component/HttpFoundation/Resources/stubs" - } - }, - "target-dir": "Symfony/Component/HttpFoundation", - "minimum-stability": "dev" -} diff --git a/laravel/view.php b/laravel/view.php deleted file mode 100644 index b9854d2a..00000000 --- a/laravel/view.php +++ /dev/null @@ -1,609 +0,0 @@ - - * // Create a new view instance - * $view = new View('home.index'); - * - * // Create a new view instance of a bundle's view - * $view = new View('admin::home.index'); - * - * // Create a new view instance with bound data - * $view = new View('home.index', array('name' => 'Taylor')); - * - * - * @param string $view - * @param array $data - * @return void - */ - public function __construct($view, $data = array()) - { - $this->view = $view; - $this->data = $data; - - // In order to allow developers to load views outside of the normal loading - // conventions, we'll allow for a raw path to be given in place of the - // typical view name, giving total freedom on view loading. - if (starts_with($view, 'path: ')) - { - $this->path = substr($view, 6); - } - else - { - $this->path = $this->path($view); - } - - // If a session driver has been specified, we will bind an instance of the - // validation error message container to every view. If an error instance - // exists in the session, we will use that instance. - if ( ! isset($this->data['errors'])) - { - if (Session::started() and Session::has('errors')) - { - $this->data['errors'] = Session::get('errors'); - } - else - { - $this->data['errors'] = new Messages; - } - } - } - - /** - * Determine if the given view exists. - * - * @param string $view - * @param boolean $return_path - * @return string|bool - */ - public static function exists($view, $return_path = false) - { - if (starts_with($view, 'name: ') and array_key_exists($name = substr($view, 6), static::$names)) - { - $view = static::$names[$name]; - } - - list($bundle, $view) = Bundle::parse($view); - - $view = str_replace('.', '/', $view); - - // We delegate the determination of view paths to the view loader event - // so that the developer is free to override and manage the loading - // of views in any way they see fit for their application. - $path = Event::until(static::loader, array($bundle, $view)); - - if ( ! is_null($path)) - { - return $return_path ? $path : true; - } - - return false; - } - - /** - * Get the path to a given view on disk. - * - * @param string $view - * @return string - */ - protected function path($view) - { - if ($path = $this->exists($view,true)) - { - return $path; - } - - throw new \Exception("View [$view] doesn't exist."); - } - - /** - * Get the path to a view using the default folder convention. - * - * @param string $bundle - * @param string $view - * @param string $directory - * @return string - */ - public static function file($bundle, $view, $directory) - { - $directory = str_finish($directory, DS); - - // Views may have either the default PHP file extension or the "Blade" - // extension, so we will need to check for both in the view path - // and return the first one we find for the given view. - if (file_exists($path = $directory.$view.EXT)) - { - return $path; - } - elseif (file_exists($path = $directory.$view.BLADE_EXT)) - { - return $path; - } - } - - /** - * Create a new view instance. - * - * - * // Create a new view instance - * $view = View::make('home.index'); - * - * // Create a new view instance of a bundle's view - * $view = View::make('admin::home.index'); - * - * // Create a new view instance with bound data - * $view = View::make('home.index', array('name' => 'Taylor')); - * - * - * @param string $view - * @param array $data - * @return View - */ - public static function make($view, $data = array()) - { - return new static($view, $data); - } - - /** - * Create a new view instance of a named view. - * - * - * // Create a new named view instance - * $view = View::of('profile'); - * - * // Create a new named view instance with bound data - * $view = View::of('profile', array('name' => 'Taylor')); - * - * - * @param string $name - * @param array $data - * @return View - */ - public static function of($name, $data = array()) - { - return new static(static::$names[$name], $data); - } - - /** - * Assign a name to a view. - * - * - * // Assign a name to a view - * View::name('partials.profile', 'profile'); - * - * // Resolve an instance of a named view - * $view = View::of('profile'); - * - * - * @param string $view - * @param string $name - * @return void - */ - public static function name($view, $name) - { - static::$names[$name] = $view; - } - - /** - * Register a view composer with the Event class. - * - * - * // Register a composer for the "home.index" view - * View::composer('home.index', function($view) - * { - * $view['title'] = 'Home'; - * }); - * - * - * @param string|array $views - * @param Closure $composer - * @return void - */ - public static function composer($views, $composer) - { - $views = (array) $views; - - foreach ($views as $view) - { - Event::listen("laravel.composing: {$view}", $composer); - } - } - - /** - * Get the rendered contents of a partial from a loop. - * - * @param string $view - * @param array $data - * @param string $iterator - * @param string $empty - * @return string - */ - public static function render_each($view, array $data, $iterator, $empty = 'raw|') - { - $result = ''; - - // If is actually data in the array, we will loop through the data and - // append an instance of the partial view to the final result HTML, - // passing in the iterated value of the data array. - if (count($data) > 0) - { - foreach ($data as $key => $value) - { - $with = array('key' => $key, $iterator => $value); - - $result .= render($view, $with); - } - } - - // If there is no data in the array, we will render the contents of - // the "empty" view. Alternatively, the "empty view" can be a raw - // string that is prefixed with "raw|" for convenience. - else - { - if (starts_with($empty, 'raw|')) - { - $result = substr($empty, 4); - } - else - { - $result = render($empty); - } - } - - return $result; - } - - /** - * Get the evaluated string content of the view. - * - * @return string - */ - public function render() - { - static::$render_count++; - - Event::fire("laravel.composing: {$this->view}", array($this)); - - $contents = null; - - // If there are listeners to the view engine event, we'll pass them - // the view so they can render it according to their needs, which - // allows easy attachment of other view parsers. - if (Event::listeners(static::engine)) - { - $result = Event::until(static::engine, array($this)); - - if ( ! is_null($result)) $contents = $result; - } - - if (is_null($contents)) $contents = $this->get(); - - static::$render_count--; - - if (static::$render_count == 0) - { - Section::$sections = array(); - } - - return $contents; - } - - /** - * Get the evaluated contents of the view. - * - * @return string - */ - public function get() - { - $__data = $this->data(); - - // The contents of each view file is cached in an array for the - // request since partial views may be rendered inside of for - // loops which could incur performance penalties. - $__contents = $this->load(); - - ob_start() and extract($__data, EXTR_SKIP); - - // We'll include the view contents for parsing within a catcher - // so we can avoid any WSOD errors. If an exception occurs we - // will throw it out to the exception handler. - try - { - eval('?>'.$__contents); - } - - // If we caught an exception, we'll silently flush the output - // buffer so that no partially rendered views get thrown out - // to the client and confuse the user with junk. - catch (\Exception $e) - { - ob_get_clean(); throw $e; - } - - $content = ob_get_clean(); - - // The view filter event gives us a last chance to modify the - // evaluated contents of the view and return them. This lets - // us do something like run the contents through Jade, etc. - if (Event::listeners('view.filter')) - { - return Event::first('view.filter', array($content, $this->path)); - } - - return $content; - } - - /** - * Get the contents of the view file from disk. - * - * @return string - */ - protected function load() - { - static::$last = array('name' => $this->view, 'path' => $this->path); - - if (isset(static::$cache[$this->path])) - { - return static::$cache[$this->path]; - } - else - { - return static::$cache[$this->path] = file_get_contents($this->path); - } - } - - /** - * Get the array of view data for the view instance. - * - * The shared view data will be combined with the view data. - * - * @return array - */ - public function data() - { - $data = array_merge($this->data, static::$shared); - - // All nested views and responses are evaluated before the main view. - // This allows the assets used by nested views to be added to the - // asset container before the main view is evaluated. - foreach ($data as $key => $value) - { - if ($value instanceof View or $value instanceof Response) - { - $data[$key] = $value->render(); - } - } - - return $data; - } - - /** - * Add a view instance to the view data. - * - * - * // Add a view instance to a view's data - * $view = View::make('foo')->nest('footer', 'partials.footer'); - * - * // Equivalent functionality using the "with" method - * $view = View::make('foo')->with('footer', View::make('partials.footer')); - * - * - * @param string $key - * @param string $view - * @param array $data - * @return View - */ - public function nest($key, $view, $data = array()) - { - return $this->with($key, static::make($view, $data)); - } - - /** - * Add a key / value pair to the view data. - * - * Bound data will be available to the view as variables. - * - * @param string $key - * @param mixed $value - * @return View - */ - public function with($key, $value = null) - { - if (is_array($key)) - { - $this->data = array_merge($this->data, $key); - } - else - { - $this->data[$key] = $value; - } - - return $this; - } - - /** - * Add a key / value pair to the shared view data. - * - * Shared view data is accessible to every view created by the application. - * - * @param string $key - * @param mixed $value - * @return View - */ - public function shares($key, $value) - { - static::share($key, $value); - return $this; - } - - /** - * Add a key / value pair to the shared view data. - * - * Shared view data is accessible to every view created by the application. - * - * @param string $key - * @param mixed $value - * @return void - */ - public static function share($key, $value) - { - static::$shared[$key] = $value; - } - - /** - * Implementation of the ArrayAccess offsetExists method. - */ - public function offsetExists($offset) - { - return array_key_exists($offset, $this->data); - } - - /** - * Implementation of the ArrayAccess offsetGet method. - */ - public function offsetGet($offset) - { - if (isset($this[$offset])) return $this->data[$offset]; - } - - /** - * Implementation of the ArrayAccess offsetSet method. - */ - public function offsetSet($offset, $value) - { - $this->data[$offset] = $value; - } - - /** - * Implementation of the ArrayAccess offsetUnset method. - */ - public function offsetUnset($offset) - { - unset($this->data[$offset]); - } - - /** - * Magic Method for handling dynamic data access. - */ - public function __get($key) - { - return $this->data[$key]; - } - - /** - * Magic Method for handling the dynamic setting of data. - */ - public function __set($key, $value) - { - $this->data[$key] = $value; - } - - /** - * Magic Method for checking dynamically-set data. - */ - public function __isset($key) - { - return isset($this->data[$key]); - } - - /** - * Get the evaluated string content of the view. - * - * @return string - */ - public function __toString() - { - return $this->render(); - } - - /** - * Magic Method for handling dynamic functions. - * - * This method handles calls to dynamic with helpers. - */ - public function __call($method, $parameters) - { - if (strpos($method, 'with_') === 0) - { - $key = substr($method, 5); - return $this->with($key, $parameters[0]); - } - - throw new \Exception("Method [$method] is not defined on the View class."); - } - -} \ No newline at end of file diff --git a/license.txt b/license.txt deleted file mode 100644 index b0a3efdf..00000000 --- a/license.txt +++ /dev/null @@ -1,46 +0,0 @@ -MIT License - -Copyright (c) <2012> - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Developer’s Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. \ No newline at end of file diff --git a/paths.php b/paths.php deleted file mode 100644 index 37c5b1ed..00000000 --- a/paths.php +++ /dev/null @@ -1,148 +0,0 @@ - - * @link http://laravel.com - */ - -/* -|---------------------------------------------------------------- -| Application Environments -|---------------------------------------------------------------- -| -| Laravel takes a dead simple approach to environments, and we -| think you'll love it. Just specify which URLs belong to a -| given environment, and when you access your application -| from a URL matching that pattern, we'll be sure to -| merge in that environment's configuration files. -| -*/ - -$environments = array( - - 'local' => array('http://localhost*', '*.dev'), - -); - -// -------------------------------------------------------------- -// The path to the application directory. -// -------------------------------------------------------------- -$paths['app'] = 'application'; - -// -------------------------------------------------------------- -// The path to the Laravel directory. -// -------------------------------------------------------------- -$paths['sys'] = 'laravel'; - -// -------------------------------------------------------------- -// The path to the bundles directory. -// -------------------------------------------------------------- -$paths['bundle'] = 'bundles'; - -// -------------------------------------------------------------- -// The path to the storage directory. -// -------------------------------------------------------------- -$paths['storage'] = 'storage'; - -// -------------------------------------------------------------- -// The path to the public directory. -// -------------------------------------------------------------- -$paths['public'] = 'public'; - -// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- -// END OF USER CONFIGURATION. HERE BE DRAGONS! -// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- -/* - .~))>> - .~)>> - .~))))>>> - .~))>> ___ - .~))>>)))>> .-~))>> - .~)))))>> .-~))>>)> - .~)))>>))))>> .-~)>>)> - ) .~))>>))))>> .-~)))))>>)> - ( )@@*) //)>)))))) .-~))))>>)> - ).@(@@ //))>>))) .-~))>>)))))>>)> - (( @.@). //))))) .-~)>>)))))>>)> - )) )@@*.@@ ) //)>))) //))))))>>))))>>)> - (( ((@@@.@@ |/))))) //)))))>>)))>>)> - )) @@*. )@@ ) (\_(\-\b |))>)) //)))>>)))))))>>)> - (( @@@(.@(@ . _/`-` ~|b |>))) //)>>)))))))>>)> - )* @@@ )@* (@) (@) /\b|))) //))))))>>))))>> - (( @. )@( @ . _/ / / \b)) //))>>)))))>>>_._ - )@@ (@@*)@@. (6///6)- / ^ \b)//))))))>>)))>> ~~-. - ( @jgs@@. @@@.*@_ VvvvvV// ^ \b/)>>))))>> _. `bb - ((@@ @@@*.(@@ . - | o |' \ ( ^ \b)))>> .' b`, - ((@@).*@@ )@ ) \^^^/ (( ^ ~)_ \ / b `, - (@@. (@@ ). `-' ((( ^ `\ \ \ \ \| b `. - (*.@* / (((( \| | | \ . b `. - / / ((((( \ \ / _.-~\ Y, b ; - / / / (((((( \ \.-~ _.`" _.-~`, b ; - / / `(((((() ) (((((~ `, b ; - _/ _/ `"""/ /' ; b ; - _.-~_.-~ / /' _.'~bb _.' - ((((~~ / /' _.'~bb.--~ - (((( __.-~bb.-~ - .' b .~~ - :bb ,' - ~~~~ -*/ - -// -------------------------------------------------------------- -// Change to the current working directory. -// -------------------------------------------------------------- -chdir(__DIR__); - -// -------------------------------------------------------------- -// Define the directory separator for the environment. -// -------------------------------------------------------------- -if ( ! defined('DS')) -{ - define('DS', DIRECTORY_SEPARATOR); -} - -// -------------------------------------------------------------- -// Define the path to the base directory. -// -------------------------------------------------------------- -$GLOBALS['laravel_paths']['base'] = __DIR__.DS; - -// -------------------------------------------------------------- -// Define each constant if it hasn't been defined. -// -------------------------------------------------------------- -foreach ($paths as $name => $path) -{ - if ( ! isset($GLOBALS['laravel_paths'][$name])) - { - $GLOBALS['laravel_paths'][$name] = realpath($path).DS; - } -} - -/** - * A global path helper function. - * - * - * $storage = path('storage'); - * - * - * @param string $path - * @return string - */ -function path($path) -{ - return $GLOBALS['laravel_paths'][$path]; -} - -/** - * A global path setter function. - * - * @param string $path - * @param string $value - * @return void - */ -function set_path($path, $value) -{ - $GLOBALS['laravel_paths'][$path] = $value; -} \ No newline at end of file diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 00000000..a4c7609f --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,18 @@ + + + + + ./app/tests/ + + + \ No newline at end of file diff --git a/public/.htaccess b/public/.htaccess index 6e89138e..969cfdab 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -1,23 +1,6 @@ -# Apache configuration file -# http://httpd.apache.org/docs/2.2/mod/quickreference.html - -# Note: ".htaccess" files are an overhead for each request. This logic should -# be placed in your Apache config whenever possible. -# http://httpd.apache.org/docs/2.2/howto/htaccess.html - -# Turning on the rewrite engine is necessary for the following rules and -# features. "+FollowSymLinks" must be enabled for this to work symbolically. - - Options +FollowSymLinks - RewriteEngine On - - -# For all files not found in the file system, reroute the request to the -# "index.php" front controller, keeping the query string intact - - - RewriteCond %{REQUEST_FILENAME} !-f - RewriteCond %{REQUEST_FILENAME} !-d - RewriteRule ^(.*)$ index.php/$1 [L] + Options -MultiViews + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] \ No newline at end of file diff --git a/public/bundles/.gitignore b/public/bundles/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/public/css/.gitignore b/public/css/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/public/img/.gitignore b/public/img/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/public/index.php b/public/index.php index 5da356f2..5fb64679 100644 --- a/public/index.php +++ b/public/index.php @@ -3,32 +3,65 @@ * Laravel - A PHP Framework For Web Artisans * * @package Laravel - * @version 3.2.13 * @author Taylor Otwell - * @link http://laravel.com */ -// -------------------------------------------------------------- -// Tick... Tock... Tick... Tock... -// -------------------------------------------------------------- define('LARAVEL_START', microtime(true)); -// -------------------------------------------------------------- -// Indicate that the request is from the web. -// -------------------------------------------------------------- -$web = true; +/* +|-------------------------------------------------------------------------- +| Register The Composer Auto Loader +|-------------------------------------------------------------------------- +| +| Composer provides a convenient, automatically generated class loader +| for our application. We just need to utilize it! We'll require it +| into the script here so that we do not have to worry about the +| loading of any our classes "manually". Feels great to relax. +| +*/ -// -------------------------------------------------------------- -// Set the core Laravel path constants. -// -------------------------------------------------------------- -require '../paths.php'; +require __DIR__.'/../vendor/autoload.php'; -// -------------------------------------------------------------- -// Unset the temporary web variable. -// -------------------------------------------------------------- -unset($web); +/* +|-------------------------------------------------------------------------- +| Register The Workbench Loaders +|-------------------------------------------------------------------------- +| +| The Laravel workbench provides a convenient place to develop packages +| when working locally. However we will need to load in the Composer +| auto-load files for the packages so that these can be used here. +| +*/ -// -------------------------------------------------------------- -// Launch Laravel. -// -------------------------------------------------------------- -require path('sys').'laravel.php'; \ No newline at end of file +if (is_dir($workbench = __DIR__.'/../workbench')) +{ + Illuminate\Workbench\Starter::start($workbench); +} + +/* +|-------------------------------------------------------------------------- +| Turn On The Lights +|-------------------------------------------------------------------------- +| +| We need to illuminate PHP development, so let's turn on the lights. +| This bootstrap the framework and gets it ready for use, then it +| will load up this application so that we can run it and send +| the responses back to the browser and delight these users. +| +*/ + +$app = require_once __DIR__.'/../start.php'; + +/* +|-------------------------------------------------------------------------- +| Run The Application +|-------------------------------------------------------------------------- +| +| Once we have the application, we can simple call the run method, +| which will execute the request and send the response back to +| the client's browser allowing them to enjoy the creative +| this wonderful applications we have created for them. +| +*/ + +$app->run(); \ No newline at end of file diff --git a/public/js/.gitignore b/public/js/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/public/laravel/css/style.css b/public/laravel/css/style.css deleted file mode 100755 index d3333c94..00000000 --- a/public/laravel/css/style.css +++ /dev/null @@ -1,378 +0,0 @@ -@import url(http://fonts.googleapis.com/css?family=Ubuntu); -@import url(http://fonts.googleapis.com/css?family=Droid+Sans); - -article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block; } -audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; } -audio:not([controls]) { display: none; } -[hidden] { display: none; } -html { font-size: 100%; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } -html, button, input, select, textarea { font-family: sans-serif; color: #222; } -body { margin: 0; font-size: 1em; line-height: 1.4; } -::-moz-selection { background: #E37B52; color: #fff; text-shadow: none; } -::selection { background: #E37B52; color: #fff; text-shadow: none; } -a { color: #00e; } -a:visited { color: #551a8b; } -a:hover { color: #06e; } -a:focus { outline: thin dotted; } -a:hover, a:active { outline: 0; } -abbr[title] { border-bottom: 1px dotted; } -b, strong { font-weight: bold; } -blockquote { margin: 1em 40px; } -dfn { font-style: italic; } -hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; } -ins { background: #ff9; color: #000; text-decoration: none; } -mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; } -pre, code, kbd, samp { font-family: monospace, serif; _font-family: 'courier new', monospace; font-size: 1em; } -pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; } -q { quotes: none; } -q:before, q:after { content: ""; content: none; } -small { font-size: 85%; } -sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } -sup { top: -0.5em; } -sub { bottom: -0.25em; } -ul, ol { margin: 1em 0; padding: 0 0 0 40px; } -dd { margin: 0 0 0 40px; } -nav ul, nav ol { list-style: none; list-style-image: none; margin: 0; padding: 0; } -img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; } -svg:not(:root) { overflow: hidden; } -figure { margin: 0; } -form { margin: 0; } -fieldset { border: 0; margin: 0; padding: 0; } -label { cursor: pointer; } -legend { border: 0; *margin-left: -7px; padding: 0; white-space: normal; } -button, input, select, textarea { font-size: 100%; margin: 0; vertical-align: baseline; *vertical-align: middle; } -button, input { line-height: normal; } -button, input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; *overflow: visible; } -button[disabled], input[disabled] { cursor: default; } -input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; *width: 13px; *height: 13px; } -input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; } -input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; } -button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } -textarea { overflow: auto; vertical-align: top; resize: vertical; } -input:valid, textarea:valid { } -input:invalid, textarea:invalid { background-color: #f0dddd; } -table { border-collapse: collapse; border-spacing: 0; } -td { vertical-align: top; } - -body -{ - font-family:'Droid Sans', sans-serif; - font-size:10pt; - color:#555; - line-height: 25px; -} - -.wrapper -{ - width:760px; - margin:0 auto 5em auto; -} - -.wrapper>header -{ - border-bottom:1px solid #eee; - background-image:url(../img/logoback.png); - background-repeat:no-repeat; - background-position:right; - text-shadow:1px 1px 0px #fff; - padding-top:2.5em; -} - -.wrapper>header h1 -{ - font-size: 28pt; - font-family: 'Ubuntu'; - margin: 0 0 10px 0; - letter-spacing: 2px; -} - -.wrapper>header h2 -{ - margin:0; - color:#888; - letter-spacing: 2px; -} - -.slogan -{ - font-size:0.8em; -} - -.intro-text -{ - width:480px; - line-height:1.4em; - margin-top:45px; -} - -.main -{ - overflow:hidden; -} - -.content -{ - width:540px; - float:right; - border-left:1px solid #eee; - padding-left:1.5em; -} - -.content blockquote p -{ - background-color:#f8f8f8; - padding:0.5em 1em; - border-left:3px solid #E3591E; - text-shadow:1px 1px 0 #fff; - font-style:italic; - margin:3em 0; -} - -.content p -{ - line-height:1.6em; - margin:1.5em 0; -} - -.content>h1 { - font-size: 18pt; -} - -.content>h2 { - font-size: 14pt; - margin-top:2.2em; -} - -div.home>h2:not(:first-child) { - margin-top:2.2em; -} - -div.home>h2 { - font-size: 14pt; -} - -.content>h3 { - font-size: 12pt; -} - -.content>h4 { - font-size: 10pt; -} - -.content>h1:not(:first-child) { - margin-top: 30px; -} - -.content table -{ - border-collapse:collapse; - border: 1px solid #eee; - width:100%; - line-height:1.5em; -} - -.content table code -{ - background-color:transparent; - font-size:0.9em; -} - -.content table td, .content table th -{ - border:1px solid #eee; - padding:0.5em 0.7em; - vertical-align:middle; - text-align:left; -} - -.content table th -{ - background-color:#f5f5f5; -} - -.content li -{ - line-height:1.5em; - margin-bottom:1em; -} - -a, a:visited -{ - color:#2972A3; - text-decoration:none; -} - -a:hover -{ - color:#72ADD4; - text-decoration:underline; -} - -.sidebar -{ - width:180px; - float:left; - font-size:0.9em; -} - -.sidebar>ul -{ - list-style-type:none; - padding-left:1em; - margin:0; - padding: 0; -} - -.sidebar>ul li:before -{ - text-decoration:none; - color:#777; - margin-right:0.2em; -} - -.sidebar>ul ul -{ - list-style-type:none; - margin:0 0 0 1.5em; - padding:0; -} - -.sidebar>ul ul>li:before -{ - content:"\2013"; - margin-right:0.4em; -} - -pre, code -{ - font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; -} - -pre -{ - border:1px solid #eee; - padding:0.5em 1em; - font-size:0.8em; - background-color:#f5f5f5; - text-shadow:1px 1px 0 #fff; - line-height:1.5em; -} - -.content pre li -{ - margin:0.2em 0; -} - -code -{ - background-color:#FFE5DB; - font-size:0.8em; - display:inline-block; - padding:0.2em 0.4em; - text-shadow:1px 1px 0 #fff; -} - -.out-links -{ - margin:0; - padding:0; -} - -.out-links li -{ - display:inline-block; -} - -.out-links li:not(:first-child):before -{ - content:"/"; - padding:0 1em; - color:#888; -} - -#toTop -{ - display:none; - padding:0.2em 1em 0.05em 1em; - position:fixed; - top:1.2em; - right:1.2em; - background-color:#777; - text-align:center; - color:#fff; - text-decoration:none; - text-transform:uppercase; - font-size:0.9em; - border-radius:3px; -} - -#toTop:hover -{ - background-color:#E3591E; -} - - -/* Prettify Styles -------------- */ - -.com { - color: #93a1a1; -} - -.lit { - color: #195f91; -} - -.pun, .opn, .clo { - color: #93a1a1; -} - -.fun { - color: #dc322f; -} - -.str, .atv { - color: #D14; -} - -.kwd, .linenums .tag { - color: #1e347b; -} - -.typ, -.atn, -.dec, -.var { - color: teal; -} - -.pln { - color: #48484c; -} - -.prettyprint -{ - padding:0; - text-shadow:1px 1px 0 #fff; -} - -.prettyprint ol -{ - color:#ccc; -} - -/* end ------------------------ */ - -@media print { - * { background: transparent !important; color: black !important; box-shadow:none !important; text-shadow: none !important; filter:none !important; -ms-filter: none !important; } - a, a:visited { text-decoration: underline; } - a[href]:after { content: " (" attr(href) ")"; } - abbr[title]:after { content: " (" attr(title) ")"; } - .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } - pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } - thead { display: table-header-group; } - tr, img { page-break-inside: avoid; } - img { max-width: 100% !important; } - @page { margin: 0.5cm; } - p, h2, h3 { orphans: 3; widows: 3; } - h2, h3 { page-break-after: avoid; } -} diff --git a/public/laravel/img/logoback.png b/public/laravel/img/logoback.png deleted file mode 100755 index 48f73b46797281529351f216f645bb35922bb035..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10295 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 E00?PoF8}}l diff --git a/public/laravel/js/modernizr-2.5.3.min.js b/public/laravel/js/modernizr-2.5.3.min.js deleted file mode 100755 index 27fcdae8..00000000 --- a/public/laravel/js/modernizr-2.5.3.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Modernizr 2.5.3 (Custom Build) | MIT & BSD - * Build: http://www.modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load - */ -;window.Modernizr=function(a,b,c){function D(a){j.cssText=a}function E(a,b){return D(n.join(a+";")+(b||""))}function F(a,b){return typeof a===b}function G(a,b){return!!~(""+a).indexOf(b)}function H(a,b){for(var d in a)if(j[a[d]]!==c)return b=="pfx"?a[d]:!0;return!1}function I(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:F(f,"function")?f.bind(d||b):f}return!1}function J(a,b,c){var d=a.charAt(0).toUpperCase()+a.substr(1),e=(a+" "+p.join(d+" ")+d).split(" ");return F(b,"string")||F(b,"undefined")?H(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),I(e,b,c))}function L(){e.input=function(c){for(var d=0,e=c.length;d",a,""].join(""),k.id=h,m.innerHTML+=f,m.appendChild(k),l||(m.style.background="",g.appendChild(m)),i=c(k,a),l?k.parentNode.removeChild(k):m.parentNode.removeChild(m),!!i},z=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b).matches;var d;return y("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},A=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=F(e[d],"function"),F(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),B={}.hasOwnProperty,C;!F(B,"undefined")&&!F(B.call,"undefined")?C=function(a,b){return B.call(a,b)}:C=function(a,b){return b in a&&F(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e});var K=function(c,d){var f=c.join(""),g=d.length;y(f,function(c,d){var f=b.styleSheets[b.styleSheets.length-1],h=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"",i=c.childNodes,j={};while(g--)j[i[g].id]=i[g];e.touch="ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch||(j.touch&&j.touch.offsetTop)===9,e.csstransforms3d=(j.csstransforms3d&&j.csstransforms3d.offsetLeft)===9&&j.csstransforms3d.offsetHeight===3,e.generatedcontent=(j.generatedcontent&&j.generatedcontent.offsetHeight)>=1,e.fontface=/src/i.test(h)&&h.indexOf(d.split(" ")[0])===0},g,d)}(['@font-face {font-family:"font";src:url("https://")}',["@media (",n.join("touch-enabled),("),h,")","{#touch{top:9px;position:absolute}}"].join(""),["@media (",n.join("transform-3d),("),h,")","{#csstransforms3d{left:9px;position:absolute;height:3px;}}"].join(""),['#generatedcontent:after{content:"',l,'";visibility:hidden}'].join("")],["fontface","touch","csstransforms3d","generatedcontent"]);s.flexbox=function(){return J("flexOrder")},s.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},s.canvastext=function(){return!!e.canvas&&!!F(b.createElement("canvas").getContext("2d").fillText,"function")},s.webgl=function(){try{var d=b.createElement("canvas"),e;e=!(!a.WebGLRenderingContext||!d.getContext("experimental-webgl")&&!d.getContext("webgl")),d=c}catch(f){e=!1}return e},s.touch=function(){return e.touch},s.geolocation=function(){return!!navigator.geolocation},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!J("indexedDB",a)},s.hashchange=function(){return A("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){for(var b=-1,c=p.length;++b",d.insertBefore(c.lastChild,d.firstChild)}function h(){var a=k.elements;return typeof a=="string"?a.split(" "):a}function i(a){var b={},c=a.createElement,e=a.createDocumentFragment,f=e();a.createElement=function(a){var e=(b[a]||(b[a]=c(a))).cloneNode();return k.shivMethods&&e.canHaveChildren&&!d.test(a)?f.appendChild(e):e},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+h().join().replace(/\w+/g,function(a){return b[a]=c(a),f.createElement(a),'c("'+a+'")'})+");return n}")(k,f)}function j(a){var b;return a.documentShived?a:(k.shivCSS&&!e&&(b=!!g(a,"article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio{display:none}canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}mark{background:#FF0;color:#000}")),f||(b=!i(a)),b&&(a.documentShived=b),a)}var c=a.html5||{},d=/^<|^(?:button|form|map|select|textarea)$/i,e,f;(function(){var a=b.createElement("a");a.innerHTML="",e="hidden"in a,f=a.childNodes.length==1||function(){try{b.createElement("a")}catch(a){return!0}var c=b.createDocumentFragment();return typeof c.cloneNode=="undefined"||typeof c.createDocumentFragment=="undefined"||typeof c.createElement=="undefined"}()})();var k={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:j};a.html5=k,j(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.mq=z,e.hasEvent=A,e.testProp=function(a){return H([a])},e.testAllProps=J,e.testStyles=y,e.prefixed=function(a,b,c){return b?J(a,b,c):J(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return o.call(a)=="[object Function]"}function e(a){return typeof a=="string"}function f(){}function g(a){return!a||a=="loaded"||a=="complete"||a=="uninitialized"}function h(){var a=p.shift();q=1,a?a.t?m(function(){(a.t=="c"?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){a!="img"&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l={},o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};y[c]===1&&(r=1,y[c]=[],l=b.createElement(a)),a=="object"?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),a!="img"&&(r||y[c]===2?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i(b=="c"?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),p.length==1&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&o.call(a.opera)=="[object Opera]",l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return o.call(a)=="[object Array]"},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f - * For a fairly comprehensive set of languages see the - * README - * file that came with this source. At a minimum, the lexer should work on a - * number of languages including C and friends, Java, Python, Bash, SQL, HTML, - * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk - * and a subset of Perl, but, because of commenting conventions, doesn't work on - * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class. - *

    - * Usage:

      - *
    1. include this source file in an html page via - * {@code } - *
    2. define style rules. See the example page for examples. - *
    3. mark the {@code
      } and {@code } tags in your source with
      - *    {@code class=prettyprint.}
      - *    You can also use the (html deprecated) {@code } tag, but the pretty
      - *    printer needs to do more substantial DOM manipulations to support that, so
      - *    some css styles may not be preserved.
      - * </ol>
      - * That's it.  I wanted to keep the API as simple as possible, so there's no
      - * need to specify which language the code is in, but if you wish, you can add
      - * another class to the {@code <pre>} or {@code <code>} element to specify the
      - * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
      - * starts with "lang-" followed by a file extension, specifies the file type.
      - * See the "lang-*.js" files in this directory for code that implements
      - * per-language file handlers.
      - * <p>
      - * Change log:<br>
      - * cbeust, 2006/08/22
      - * <blockquote>
      - *   Java annotations (start with "@") are now captured as literals ("lit")
      - * </blockquote>
      - * @requires console
      - */
      -
      -// JSLint declarations
      -/*global console, document, navigator, setTimeout, window */
      -
      -/**
      - * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
      - * UI events.
      - * If set to {@code false}, {@code prettyPrint()} is synchronous.
      - */
      -window['PR_SHOULD_USE_CONTINUATION'] = true;
      -
      -(function () {
      -  // Keyword lists for various languages.
      -  // We use things that coerce to strings to make them compact when minified
      -  // and to defeat aggressive optimizers that fold large string constants.
      -  var FLOW_CONTROL_KEYWORDS = ["break,continue,do,else,for,if,return,while"];
      -  var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,"auto,case,char,const,default," + 
      -      "double,enum,extern,float,goto,int,long,register,short,signed,sizeof," +
      -      "static,struct,switch,typedef,union,unsigned,void,volatile"];
      -  var COMMON_KEYWORDS = [C_KEYWORDS,"catch,class,delete,false,import," +
      -      "new,operator,private,protected,public,this,throw,true,try,typeof"];
      -  var CPP_KEYWORDS = [COMMON_KEYWORDS,"alignof,align_union,asm,axiom,bool," +
      -      "concept,concept_map,const_cast,constexpr,decltype," +
      -      "dynamic_cast,explicit,export,friend,inline,late_check," +
      -      "mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast," +
      -      "template,typeid,typename,using,virtual,where"];
      -  var JAVA_KEYWORDS = [COMMON_KEYWORDS,
      -      "abstract,boolean,byte,extends,final,finally,implements,import," +
      -      "instanceof,null,native,package,strictfp,super,synchronized,throws," +
      -      "transient"];
      -  var CSHARP_KEYWORDS = [JAVA_KEYWORDS,
      -      "as,base,by,checked,decimal,delegate,descending,dynamic,event," +
      -      "fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock," +
      -      "object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed," +
      -      "stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];
      -  var COFFEE_KEYWORDS = "all,and,by,catch,class,else,extends,false,finally," +
      -      "for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then," +
      -      "true,try,unless,until,when,while,yes";
      -  var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,
      -      "debugger,eval,export,function,get,null,set,undefined,var,with," +
      -      "Infinity,NaN"];
      -  var PERL_KEYWORDS = "caller,delete,die,do,dump,elsif,eval,exit,foreach,for," +
      -      "goto,if,import,last,local,my,next,no,our,print,package,redo,require," +
      -      "sub,undef,unless,until,use,wantarray,while,BEGIN,END";
      -  var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "and,as,assert,class,def,del," +
      -      "elif,except,exec,finally,from,global,import,in,is,lambda," +
      -      "nonlocal,not,or,pass,print,raise,try,with,yield," +
      -      "False,True,None"];
      -  var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "alias,and,begin,case,class," +
      -      "def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo," +
      -      "rescue,retry,self,super,then,true,undef,unless,until,when,yield," +
      -      "BEGIN,END"];
      -  var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "case,done,elif,esac,eval,fi," +
      -      "function,in,local,set,then,until"];
      -  var ALL_KEYWORDS = [
      -      CPP_KEYWORDS, CSHARP_KEYWORDS, JSCRIPT_KEYWORDS, PERL_KEYWORDS +
      -      PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];
      -  var C_TYPES = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;
      -
      -  // token style names.  correspond to css classes
      -  /**
      -   * token style for a string literal
      -   * @const
      -   */
      -  var PR_STRING = 'str';
      -  /**
      -   * token style for a keyword
      -   * @const
      -   */
      -  var PR_KEYWORD = 'kwd';
      -  /**
      -   * token style for a comment
      -   * @const
      -   */
      -  var PR_COMMENT = 'com';
      -  /**
      -   * token style for a type
      -   * @const
      -   */
      -  var PR_TYPE = 'typ';
      -  /**
      -   * token style for a literal value.  e.g. 1, null, true.
      -   * @const
      -   */
      -  var PR_LITERAL = 'lit';
      -  /**
      -   * token style for a punctuation string.
      -   * @const
      -   */
      -  var PR_PUNCTUATION = 'pun';
      -  /**
      -   * token style for a punctuation string.
      -   * @const
      -   */
      -  var PR_PLAIN = 'pln';
      -
      -  /**
      -   * token style for an sgml tag.
      -   * @const
      -   */
      -  var PR_TAG = 'tag';
      -  /**
      -   * token style for a markup declaration such as a DOCTYPE.
      -   * @const
      -   */
      -  var PR_DECLARATION = 'dec';
      -  /**
      -   * token style for embedded source.
      -   * @const
      -   */
      -  var PR_SOURCE = 'src';
      -  /**
      -   * token style for an sgml attribute name.
      -   * @const
      -   */
      -  var PR_ATTRIB_NAME = 'atn';
      -  /**
      -   * token style for an sgml attribute value.
      -   * @const
      -   */
      -  var PR_ATTRIB_VALUE = 'atv';
      -
      -  /**
      -   * A class that indicates a section of markup that is not code, e.g. to allow
      -   * embedding of line numbers within code listings.
      -   * @const
      -   */
      -  var PR_NOCODE = 'nocode';
      -
      -
      -
      -/**
      - * A set of tokens that can precede a regular expression literal in
      - * javascript
      - * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
      - * has the full list, but I've removed ones that might be problematic when
      - * seen in languages that don't support regular expression literals.
      - *
      - * <p>Specifically, I've removed any keywords that can't precede a regexp
      - * literal in a syntactically legal javascript program, and I've removed the
      - * "in" keyword since it's not a keyword in many languages, and might be used
      - * as a count of inches.
      - *
      - * <p>The link a above does not accurately describe EcmaScript rules since
      - * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
      - * very well in practice.
      - *
      - * @private
      - * @const
      - */
      -var REGEXP_PRECEDER_PATTERN = '(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*';
      -
      -// CAVEAT: this does not properly handle the case where a regular
      -// expression immediately follows another since a regular expression may
      -// have flags for case-sensitivity and the like.  Having regexp tokens
      -// adjacent is not valid in any language I'm aware of, so I'm punting.
      -// TODO: maybe style special characters inside a regexp as punctuation.
      -
      -
      -  /**
      -   * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
      -   * matches the union of the sets of strings matched by the input RegExp.
      -   * Since it matches globally, if the input strings have a start-of-input
      -   * anchor (/^.../), it is ignored for the purposes of unioning.
      -   * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
      -   * @return {RegExp} a global regex.
      -   */
      -  function combinePrefixPatterns(regexs) {
      -    var capturedGroupIndex = 0;
      -  
      -    var needToFoldCase = false;
      -    var ignoreCase = false;
      -    for (var i = 0, n = regexs.length; i < n; ++i) {
      -      var regex = regexs[i];
      -      if (regex.ignoreCase) {
      -        ignoreCase = true;
      -      } else if (/[a-z]/i.test(regex.source.replace(
      -                     /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
      -        needToFoldCase = true;
      -        ignoreCase = false;
      -        break;
      -      }
      -    }
      -  
      -    var escapeCharToCodeUnit = {
      -      'b': 8,
      -      't': 9,
      -      'n': 0xa,
      -      'v': 0xb,
      -      'f': 0xc,
      -      'r': 0xd
      -    };
      -  
      -    function decodeEscape(charsetPart) {
      -      var cc0 = charsetPart.charCodeAt(0);
      -      if (cc0 !== 92 /* \\ */) {
      -        return cc0;
      -      }
      -      var c1 = charsetPart.charAt(1);
      -      cc0 = escapeCharToCodeUnit[c1];
      -      if (cc0) {
      -        return cc0;
      -      } else if ('0' <= c1 && c1 <= '7') {
      -        return parseInt(charsetPart.substring(1), 8);
      -      } else if (c1 === 'u' || c1 === 'x') {
      -        return parseInt(charsetPart.substring(2), 16);
      -      } else {
      -        return charsetPart.charCodeAt(1);
      -      }
      -    }
      -  
      -    function encodeEscape(charCode) {
      -      if (charCode < 0x20) {
      -        return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
      -      }
      -      var ch = String.fromCharCode(charCode);
      -      if (ch === '\\' || ch === '-' || ch === '[' || ch === ']') {
      -        ch = '\\' + ch;
      -      }
      -      return ch;
      -    }
      -  
      -    function caseFoldCharset(charSet) {
      -      var charsetParts = charSet.substring(1, charSet.length - 1).match(
      -          new RegExp(
      -              '\\\\u[0-9A-Fa-f]{4}'
      -              + '|\\\\x[0-9A-Fa-f]{2}'
      -              + '|\\\\[0-3][0-7]{0,2}'
      -              + '|\\\\[0-7]{1,2}'
      -              + '|\\\\[\\s\\S]'
      -              + '|-'
      -              + '|[^-\\\\]',
      -              'g'));
      -      var groups = [];
      -      var ranges = [];
      -      var inverse = charsetParts[0] === '^';
      -      for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
      -        var p = charsetParts[i];
      -        if (/\\[bdsw]/i.test(p)) {  // Don't muck with named groups.
      -          groups.push(p);
      -        } else {
      -          var start = decodeEscape(p);
      -          var end;
      -          if (i + 2 < n && '-' === charsetParts[i + 1]) {
      -            end = decodeEscape(charsetParts[i + 2]);
      -            i += 2;
      -          } else {
      -            end = start;
      -          }
      -          ranges.push([start, end]);
      -          // If the range might intersect letters, then expand it.
      -          // This case handling is too simplistic.
      -          // It does not deal with non-latin case folding.
      -          // It works for latin source code identifiers though.
      -          if (!(end < 65 || start > 122)) {
      -            if (!(end < 65 || start > 90)) {
      -              ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
      -            }
      -            if (!(end < 97 || start > 122)) {
      -              ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
      -            }
      -          }
      -        }
      -      }
      -  
      -      // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
      -      // -> [[1, 12], [14, 14], [16, 17]]
      -      ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
      -      var consolidatedRanges = [];
      -      var lastRange = [NaN, NaN];
      -      for (var i = 0; i < ranges.length; ++i) {
      -        var range = ranges[i];
      -        if (range[0] <= lastRange[1] + 1) {
      -          lastRange[1] = Math.max(lastRange[1], range[1]);
      -        } else {
      -          consolidatedRanges.push(lastRange = range);
      -        }
      -      }
      -  
      -      var out = ['['];
      -      if (inverse) { out.push('^'); }
      -      out.push.apply(out, groups);
      -      for (var i = 0; i < consolidatedRanges.length; ++i) {
      -        var range = consolidatedRanges[i];
      -        out.push(encodeEscape(range[0]));
      -        if (range[1] > range[0]) {
      -          if (range[1] + 1 > range[0]) { out.push('-'); }
      -          out.push(encodeEscape(range[1]));
      -        }
      -      }
      -      out.push(']');
      -      return out.join('');
      -    }
      -  
      -    function allowAnywhereFoldCaseAndRenumberGroups(regex) {
      -      // Split into character sets, escape sequences, punctuation strings
      -      // like ('(', '(?:', ')', '^'), and runs of characters that do not
      -      // include any of the above.
      -      var parts = regex.source.match(
      -          new RegExp(
      -              '(?:'
      -              + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
      -              + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
      -              + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
      -              + '|\\\\[0-9]+'  // a back-reference or octal escape
      -              + '|\\\\[^ux0-9]'  // other escape sequence
      -              + '|\\(\\?[:!=]'  // start of a non-capturing group
      -              + '|[\\(\\)\\^]'  // start/emd of a group, or line start
      -              + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
      -              + ')',
      -              'g'));
      -      var n = parts.length;
      -  
      -      // Maps captured group numbers to the number they will occupy in
      -      // the output or to -1 if that has not been determined, or to
      -      // undefined if they need not be capturing in the output.
      -      var capturedGroups = [];
      -  
      -      // Walk over and identify back references to build the capturedGroups
      -      // mapping.
      -      for (var i = 0, groupIndex = 0; i < n; ++i) {
      -        var p = parts[i];
      -        if (p === '(') {
      -          // groups are 1-indexed, so max group index is count of '('
      -          ++groupIndex;
      -        } else if ('\\' === p.charAt(0)) {
      -          var decimalValue = +p.substring(1);
      -          if (decimalValue && decimalValue <= groupIndex) {
      -            capturedGroups[decimalValue] = -1;
      -          }
      -        }
      -      }
      -  
      -      // Renumber groups and reduce capturing groups to non-capturing groups
      -      // where possible.
      -      for (var i = 1; i < capturedGroups.length; ++i) {
      -        if (-1 === capturedGroups[i]) {
      -          capturedGroups[i] = ++capturedGroupIndex;
      -        }
      -      }
      -      for (var i = 0, groupIndex = 0; i < n; ++i) {
      -        var p = parts[i];
      -        if (p === '(') {
      -          ++groupIndex;
      -          if (capturedGroups[groupIndex] === undefined) {
      -            parts[i] = '(?:';
      -          }
      -        } else if ('\\' === p.charAt(0)) {
      -          var decimalValue = +p.substring(1);
      -          if (decimalValue && decimalValue <= groupIndex) {
      -            parts[i] = '\\' + capturedGroups[groupIndex];
      -          }
      -        }
      -      }
      -  
      -      // Remove any prefix anchors so that the output will match anywhere.
      -      // ^^ really does mean an anchored match though.
      -      for (var i = 0, groupIndex = 0; i < n; ++i) {
      -        if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
      -      }
      -  
      -      // Expand letters to groups to handle mixing of case-sensitive and
      -      // case-insensitive patterns if necessary.
      -      if (regex.ignoreCase && needToFoldCase) {
      -        for (var i = 0; i < n; ++i) {
      -          var p = parts[i];
      -          var ch0 = p.charAt(0);
      -          if (p.length >= 2 && ch0 === '[') {
      -            parts[i] = caseFoldCharset(p);
      -          } else if (ch0 !== '\\') {
      -            // TODO: handle letters in numeric escapes.
      -            parts[i] = p.replace(
      -                /[a-zA-Z]/g,
      -                function (ch) {
      -                  var cc = ch.charCodeAt(0);
      -                  return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
      -                });
      -          }
      -        }
      -      }
      -  
      -      return parts.join('');
      -    }
      -  
      -    var rewritten = [];
      -    for (var i = 0, n = regexs.length; i < n; ++i) {
      -      var regex = regexs[i];
      -      if (regex.global || regex.multiline) { throw new Error('' + regex); }
      -      rewritten.push(
      -          '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
      -    }
      -  
      -    return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
      -  }
      -
      -
      -  /**
      -   * Split markup into a string of source code and an array mapping ranges in
      -   * that string to the text nodes in which they appear.
      -   *
      -   * <p>
      -   * The HTML DOM structure:</p>
      -   * <pre>
      -   * (Element   "p"
      -   *   (Element "b"
      -   *     (Text  "print "))       ; #1
      -   *   (Text    "'Hello '")      ; #2
      -   *   (Element "br")            ; #3
      -   *   (Text    "  + 'World';")) ; #4
      -   * </pre>
      -   * <p>
      -   * corresponds to the HTML
      -   * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>
      -   *
      -   * <p>
      -   * It will produce the output:</p>
      -   * <pre>
      -   * {
      -   *   sourceCode: "print 'Hello '\n  + 'World';",
      -   *   //                 1         2
      -   *   //       012345678901234 5678901234567
      -   *   spans: [0, #1, 6, #2, 14, #3, 15, #4]
      -   * }
      -   * </pre>
      -   * <p>
      -   * where #1 is a reference to the {@code "print "} text node above, and so
      -   * on for the other text nodes.
      -   * </p>
      -   *
      -   * <p>
      -   * The {@code} spans array is an array of pairs.  Even elements are the start
      -   * indices of substrings, and odd elements are the text nodes (or BR elements)
      -   * that contain the text for those substrings.
      -   * Substrings continue until the next index or the end of the source.
      -   * </p>
      -   *
      -   * @param {Node} node an HTML DOM subtree containing source-code.
      -   * @return {Object} source code and the text nodes in which they occur.
      -   */
      -  function extractSourceSpans(node) {
      -    var nocode = /(?:^|\s)nocode(?:\s|$)/;
      -  
      -    var chunks = [];
      -    var length = 0;
      -    var spans = [];
      -    var k = 0;
      -  
      -    var whitespace;
      -    if (node.currentStyle) {
      -      whitespace = node.currentStyle.whiteSpace;
      -    } else if (window.getComputedStyle) {
      -      whitespace = document.defaultView.getComputedStyle(node, null)
      -          .getPropertyValue('white-space');
      -    }
      -    var isPreformatted = whitespace && 'pre' === whitespace.substring(0, 3);
      -  
      -    function walk(node) {
      -      switch (node.nodeType) {
      -        case 1:  // Element
      -          if (nocode.test(node.className)) { return; }
      -          for (var child = node.firstChild; child; child = child.nextSibling) {
      -            walk(child);
      -          }
      -          var nodeName = node.nodeName;
      -          if ('BR' === nodeName || 'LI' === nodeName) {
      -            chunks[k] = '\n';
      -            spans[k << 1] = length++;
      -            spans[(k++ << 1) | 1] = node;
      -          }
      -          break;
      -        case 3: case 4:  // Text
      -          var text = node.nodeValue;
      -          if (text.length) {
      -            if (!isPreformatted) {
      -              text = text.replace(/[ \t\r\n]+/g, ' ');
      -            } else {
      -              text = text.replace(/\r\n?/g, '\n');  // Normalize newlines.
      -            }
      -            // TODO: handle tabs here?
      -            chunks[k] = text;
      -            spans[k << 1] = length;
      -            length += text.length;
      -            spans[(k++ << 1) | 1] = node;
      -          }
      -          break;
      -      }
      -    }
      -  
      -    walk(node);
      -  
      -    return {
      -      sourceCode: chunks.join('').replace(/\n$/, ''),
      -      spans: spans
      -    };
      -  }
      -
      -
      -  /**
      -   * Apply the given language handler to sourceCode and add the resulting
      -   * decorations to out.
      -   * @param {number} basePos the index of sourceCode within the chunk of source
      -   *    whose decorations are already present on out.
      -   */
      -  function appendDecorations(basePos, sourceCode, langHandler, out) {
      -    if (!sourceCode) { return; }
      -    var job = {
      -      sourceCode: sourceCode,
      -      basePos: basePos
      -    };
      -    langHandler(job);
      -    out.push.apply(out, job.decorations);
      -  }
      -
      -  var notWs = /\S/;
      -
      -  /**
      -   * Given an element, if it contains only one child element and any text nodes
      -   * it contains contain only space characters, return the sole child element.
      -   * Otherwise returns undefined.
      -   * <p>
      -   * This is meant to return the CODE element in {@code <pre><code ...>} when
      -   * there is a single child element that contains all the non-space textual
      -   * content, but not to return anything where there are multiple child elements
      -   * as in {@code <pre><code>...</code><code>...</code></pre>} or when there
      -   * is textual content.
      -   */
      -  function childContentWrapper(element) {
      -    var wrapper = undefined;
      -    for (var c = element.firstChild; c; c = c.nextSibling) {
      -      var type = c.nodeType;
      -      wrapper = (type === 1)  // Element Node
      -          ? (wrapper ? element : c)
      -          : (type === 3)  // Text Node
      -          ? (notWs.test(c.nodeValue) ? element : wrapper)
      -          : wrapper;
      -    }
      -    return wrapper === element ? undefined : wrapper;
      -  }
      -
      -  /** Given triples of [style, pattern, context] returns a lexing function,
      -    * The lexing function interprets the patterns to find token boundaries and
      -    * returns a decoration list of the form
      -    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
      -    * where index_n is an index into the sourceCode, and style_n is a style
      -    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
      -    * all characters in sourceCode[index_n-1:index_n].
      -    *
      -    * The stylePatterns is a list whose elements have the form
      -    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
      -    *
      -    * Style is a style constant like PR_PLAIN, or can be a string of the
      -    * form 'lang-FOO', where FOO is a language extension describing the
      -    * language of the portion of the token in $1 after pattern executes.
      -    * E.g., if style is 'lang-lisp', and group 1 contains the text
      -    * '(hello (world))', then that portion of the token will be passed to the
      -    * registered lisp handler for formatting.
      -    * The text before and after group 1 will be restyled using this decorator
      -    * so decorators should take care that this doesn't result in infinite
      -    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
      -    * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
      -    * '<script>foo()<\/script>', which would cause the current decorator to
      -    * be called with '<script>' which would not match the same rule since
      -    * group 1 must not be empty, so it would be instead styled as PR_TAG by
      -    * the generic tag rule.  The handler registered for the 'js' extension would
      -    * then be called with 'foo()', and finally, the current decorator would
      -    * be called with '<\/script>' which would not match the original rule and
      -    * so the generic tag rule would identify it as a tag.
      -    *
      -    * Pattern must only match prefixes, and if it matches a prefix, then that
      -    * match is considered a token with the same style.
      -    *
      -    * Context is applied to the last non-whitespace, non-comment token
      -    * recognized.
      -    *
      -    * Shortcut is an optional string of characters, any of which, if the first
      -    * character, gurantee that this pattern and only this pattern matches.
      -    *
      -    * @param {Array} shortcutStylePatterns patterns that always start with
      -    *   a known character.  Must have a shortcut string.
      -    * @param {Array} fallthroughStylePatterns patterns that will be tried in
      -    *   order if the shortcut ones fail.  May have shortcuts.
      -    *
      -    * @return {function (Object)} a
      -    *   function that takes source code and returns a list of decorations.
      -    */
      -  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
      -    var shortcuts = {};
      -    var tokenizer;
      -    (function () {
      -      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
      -      var allRegexs = [];
      -      var regexKeys = {};
      -      for (var i = 0, n = allPatterns.length; i < n; ++i) {
      -        var patternParts = allPatterns[i];
      -        var shortcutChars = patternParts[3];
      -        if (shortcutChars) {
      -          for (var c = shortcutChars.length; --c >= 0;) {
      -            shortcuts[shortcutChars.charAt(c)] = patternParts;
      -          }
      -        }
      -        var regex = patternParts[1];
      -        var k = '' + regex;
      -        if (!regexKeys.hasOwnProperty(k)) {
      -          allRegexs.push(regex);
      -          regexKeys[k] = null;
      -        }
      -      }
      -      allRegexs.push(/[\0-\uffff]/);
      -      tokenizer = combinePrefixPatterns(allRegexs);
      -    })();
      -
      -    var nPatterns = fallthroughStylePatterns.length;
      -
      -    /**
      -     * Lexes job.sourceCode and produces an output array job.decorations of
      -     * style classes preceded by the position at which they start in
      -     * job.sourceCode in order.
      -     *
      -     * @param {Object} job an object like <pre>{
      -     *    sourceCode: {string} sourceText plain text,
      -     *    basePos: {int} position of job.sourceCode in the larger chunk of
      -     *        sourceCode.
      -     * }</pre>
      -     */
      -    var decorate = function (job) {
      -      var sourceCode = job.sourceCode, basePos = job.basePos;
      -      /** Even entries are positions in source in ascending order.  Odd enties
      -        * are style markers (e.g., PR_COMMENT) that run from that position until
      -        * the end.
      -        * @type {Array.<number|string>}
      -        */
      -      var decorations = [basePos, PR_PLAIN];
      -      var pos = 0;  // index into sourceCode
      -      var tokens = sourceCode.match(tokenizer) || [];
      -      var styleCache = {};
      -
      -      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
      -        var token = tokens[ti];
      -        var style = styleCache[token];
      -        var match = void 0;
      -
      -        var isEmbedded;
      -        if (typeof style === 'string') {
      -          isEmbedded = false;
      -        } else {
      -          var patternParts = shortcuts[token.charAt(0)];
      -          if (patternParts) {
      -            match = token.match(patternParts[1]);
      -            style = patternParts[0];
      -          } else {
      -            for (var i = 0; i < nPatterns; ++i) {
      -              patternParts = fallthroughStylePatterns[i];
      -              match = token.match(patternParts[1]);
      -              if (match) {
      -                style = patternParts[0];
      -                break;
      -              }
      -            }
      -
      -            if (!match) {  // make sure that we make progress
      -              style = PR_PLAIN;
      -            }
      -          }
      -
      -          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
      -          if (isEmbedded && !(match && typeof match[1] === 'string')) {
      -            isEmbedded = false;
      -            style = PR_SOURCE;
      -          }
      -
      -          if (!isEmbedded) { styleCache[token] = style; }
      -        }
      -
      -        var tokenStart = pos;
      -        pos += token.length;
      -
      -        if (!isEmbedded) {
      -          decorations.push(basePos + tokenStart, style);
      -        } else {  // Treat group 1 as an embedded block of source code.
      -          var embeddedSource = match[1];
      -          var embeddedSourceStart = token.indexOf(embeddedSource);
      -          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
      -          if (match[2]) {
      -            // If embeddedSource can be blank, then it would match at the
      -            // beginning which would cause us to infinitely recurse on the
      -            // entire token, so we catch the right context in match[2].
      -            embeddedSourceEnd = token.length - match[2].length;
      -            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
      -          }
      -          var lang = style.substring(5);
      -          // Decorate the left of the embedded source
      -          appendDecorations(
      -              basePos + tokenStart,
      -              token.substring(0, embeddedSourceStart),
      -              decorate, decorations);
      -          // Decorate the embedded source
      -          appendDecorations(
      -              basePos + tokenStart + embeddedSourceStart,
      -              embeddedSource,
      -              langHandlerForExtension(lang, embeddedSource),
      -              decorations);
      -          // Decorate the right of the embedded section
      -          appendDecorations(
      -              basePos + tokenStart + embeddedSourceEnd,
      -              token.substring(embeddedSourceEnd),
      -              decorate, decorations);
      -        }
      -      }
      -      job.decorations = decorations;
      -    };
      -    return decorate;
      -  }
      -
      -  /** returns a function that produces a list of decorations from source text.
      -    *
      -    * This code treats ", ', and ` as string delimiters, and \ as a string
      -    * escape.  It does not recognize perl's qq() style strings.
      -    * It has no special handling for double delimiter escapes as in basic, or
      -    * the tripled delimiters used in python, but should work on those regardless
      -    * although in those cases a single string literal may be broken up into
      -    * multiple adjacent string literals.
      -    *
      -    * It recognizes C, C++, and shell style comments.
      -    *
      -    * @param {Object} options a set of optional parameters.
      -    * @return {function (Object)} a function that examines the source code
      -    *     in the input job and builds the decoration list.
      -    */
      -  function sourceDecorator(options) {
      -    var shortcutStylePatterns = [], fallthroughStylePatterns = [];
      -    if (options['tripleQuotedStrings']) {
      -      // '''multi-line-string''', 'single-line-string', and double-quoted
      -      shortcutStylePatterns.push(
      -          [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
      -           null, '\'"']);
      -    } else if (options['multiLineStrings']) {
      -      // 'multi-line-string', "multi-line-string"
      -      shortcutStylePatterns.push(
      -          [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
      -           null, '\'"`']);
      -    } else {
      -      // 'single-line-string', "single-line-string"
      -      shortcutStylePatterns.push(
      -          [PR_STRING,
      -           /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
      -           null, '"\'']);
      -    }
      -    if (options['verbatimStrings']) {
      -      // verbatim-string-literal production from the C# grammar.  See issue 93.
      -      fallthroughStylePatterns.push(
      -          [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
      -    }
      -    var hc = options['hashComments'];
      -    if (hc) {
      -      if (options['cStyleComments']) {
      -        if (hc > 1) {  // multiline hash comments
      -          shortcutStylePatterns.push(
      -              [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
      -        } else {
      -          // Stop C preprocessor declarations at an unclosed open comment
      -          shortcutStylePatterns.push(
      -              [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,
      -               null, '#']);
      -        }
      -        fallthroughStylePatterns.push(
      -            [PR_STRING,
      -             /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,
      -             null]);
      -      } else {
      -        shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
      -      }
      -    }
      -    if (options['cStyleComments']) {
      -      fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
      -      fallthroughStylePatterns.push(
      -          [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
      -    }
      -    if (options['regexLiterals']) {
      -      /**
      -       * @const
      -       */
      -      var REGEX_LITERAL = (
      -          // A regular expression literal starts with a slash that is
      -          // not followed by * or / so that it is not confused with
      -          // comments.
      -          '/(?=[^/*])'
      -          // and then contains any number of raw characters,
      -          + '(?:[^/\\x5B\\x5C]'
      -          // escape sequences (\x5C),
      -          +    '|\\x5C[\\s\\S]'
      -          // or non-nesting character sets (\x5B\x5D);
      -          +    '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
      -          // finally closed by a /.
      -          + '/');
      -      fallthroughStylePatterns.push(
      -          ['lang-regex',
      -           new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
      -           ]);
      -    }
      -
      -    var types = options['types'];
      -    if (types) {
      -      fallthroughStylePatterns.push([PR_TYPE, types]);
      -    }
      -
      -    var keywords = ("" + options['keywords']).replace(/^ | $/g, '');
      -    if (keywords.length) {
      -      fallthroughStylePatterns.push(
      -          [PR_KEYWORD,
      -           new RegExp('^(?:' + keywords.replace(/[\s,]+/g, '|') + ')\\b'),
      -           null]);
      -    }
      -
      -    shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
      -    fallthroughStylePatterns.push(
      -        // TODO(mikesamuel): recognize non-latin letters and numerals in idents
      -        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
      -        [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null],
      -        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
      -        [PR_LITERAL,
      -         new RegExp(
      -             '^(?:'
      -             // A hex number
      -             + '0x[a-f0-9]+'
      -             // or an octal or decimal number,
      -             + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
      -             // possibly in scientific notation
      -             + '(?:e[+\\-]?\\d+)?'
      -             + ')'
      -             // with an optional modifier like UL for unsigned long
      -             + '[a-z]*', 'i'),
      -         null, '0123456789'],
      -        // Don't treat escaped quotes in bash as starting strings.  See issue 144.
      -        [PR_PLAIN,       /^\\[\s\S]?/, null],
      -        [PR_PUNCTUATION, /^.[^\s\w\.$@\'\"\`\/\#\\]*/, null]);
      -
      -    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
      -  }
      -
      -  var decorateSource = sourceDecorator({
      -        'keywords': ALL_KEYWORDS,
      -        'hashComments': true,
      -        'cStyleComments': true,
      -        'multiLineStrings': true,
      -        'regexLiterals': true
      -      });
      -
      -  /**
      -   * Given a DOM subtree, wraps it in a list, and puts each line into its own
      -   * list item.
      -   *
      -   * @param {Node} node modified in place.  Its content is pulled into an
      -   *     HTMLOListElement, and each line is moved into a separate list item.
      -   *     This requires cloning elements, so the input might not have unique
      -   *     IDs after numbering.
      -   */
      -  function numberLines(node, opt_startLineNum) {
      -    var nocode = /(?:^|\s)nocode(?:\s|$)/;
      -    var lineBreak = /\r\n?|\n/;
      -  
      -    var document = node.ownerDocument;
      -  
      -    var whitespace;
      -    if (node.currentStyle) {
      -      whitespace = node.currentStyle.whiteSpace;
      -    } else if (window.getComputedStyle) {
      -      whitespace = document.defaultView.getComputedStyle(node, null)
      -          .getPropertyValue('white-space');
      -    }
      -    // If it's preformatted, then we need to split lines on line breaks
      -    // in addition to <BR>s.
      -    var isPreformatted = whitespace && 'pre' === whitespace.substring(0, 3);
      -  
      -    var li = document.createElement('LI');
      -    while (node.firstChild) {
      -      li.appendChild(node.firstChild);
      -    }
      -    // An array of lines.  We split below, so this is initialized to one
      -    // un-split line.
      -    var listItems = [li];
      -  
      -    function walk(node) {
      -      switch (node.nodeType) {
      -        case 1:  // Element
      -          if (nocode.test(node.className)) { break; }
      -          if ('BR' === node.nodeName) {
      -            breakAfter(node);
      -            // Discard the <BR> since it is now flush against a </LI>.
      -            if (node.parentNode) {
      -              node.parentNode.removeChild(node);
      -            }
      -          } else {
      -            for (var child = node.firstChild; child; child = child.nextSibling) {
      -              walk(child);
      -            }
      -          }
      -          break;
      -        case 3: case 4:  // Text
      -          if (isPreformatted) {
      -            var text = node.nodeValue;
      -            var match = text.match(lineBreak);
      -            if (match) {
      -              var firstLine = text.substring(0, match.index);
      -              node.nodeValue = firstLine;
      -              var tail = text.substring(match.index + match[0].length);
      -              if (tail) {
      -                var parent = node.parentNode;
      -                parent.insertBefore(
      -                    document.createTextNode(tail), node.nextSibling);
      -              }
      -              breakAfter(node);
      -              if (!firstLine) {
      -                // Don't leave blank text nodes in the DOM.
      -                node.parentNode.removeChild(node);
      -              }
      -            }
      -          }
      -          break;
      -      }
      -    }
      -  
      -    // Split a line after the given node.
      -    function breakAfter(lineEndNode) {
      -      // If there's nothing to the right, then we can skip ending the line
      -      // here, and move root-wards since splitting just before an end-tag
      -      // would require us to create a bunch of empty copies.
      -      while (!lineEndNode.nextSibling) {
      -        lineEndNode = lineEndNode.parentNode;
      -        if (!lineEndNode) { return; }
      -      }
      -  
      -      function breakLeftOf(limit, copy) {
      -        // Clone shallowly if this node needs to be on both sides of the break.
      -        var rightSide = copy ? limit.cloneNode(false) : limit;
      -        var parent = limit.parentNode;
      -        if (parent) {
      -          // We clone the parent chain.
      -          // This helps us resurrect important styling elements that cross lines.
      -          // E.g. in <i>Foo<br>Bar</i>
      -          // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.
      -          var parentClone = breakLeftOf(parent, 1);
      -          // Move the clone and everything to the right of the original
      -          // onto the cloned parent.
      -          var next = limit.nextSibling;
      -          parentClone.appendChild(rightSide);
      -          for (var sibling = next; sibling; sibling = next) {
      -            next = sibling.nextSibling;
      -            parentClone.appendChild(sibling);
      -          }
      -        }
      -        return rightSide;
      -      }
      -  
      -      var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);
      -  
      -      // Walk the parent chain until we reach an unattached LI.
      -      for (var parent;
      -           // Check nodeType since IE invents document fragments.
      -           (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {
      -        copiedListItem = parent;
      -      }
      -      // Put it on the list of lines for later processing.
      -      listItems.push(copiedListItem);
      -    }
      -  
      -    // Split lines while there are lines left to split.
      -    for (var i = 0;  // Number of lines that have been split so far.
      -         i < listItems.length;  // length updated by breakAfter calls.
      -         ++i) {
      -      walk(listItems[i]);
      -    }
      -  
      -    // Make sure numeric indices show correctly.
      -    if (opt_startLineNum === (opt_startLineNum|0)) {
      -      listItems[0].setAttribute('value', opt_startLineNum);
      -    }
      -  
      -    var ol = document.createElement('OL');
      -    ol.className = 'linenums';
      -    var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0;
      -    for (var i = 0, n = listItems.length; i < n; ++i) {
      -      li = listItems[i];
      -      // Stick a class on the LIs so that stylesheets can
      -      // color odd/even rows, or any other row pattern that
      -      // is co-prime with 10.
      -      li.className = 'L' + ((i + offset) % 10);
      -      if (!li.firstChild) {
      -        li.appendChild(document.createTextNode('\xA0'));
      -      }
      -      ol.appendChild(li);
      -    }
      -  
      -    node.appendChild(ol);
      -  }
      -
      -  /**
      -   * Breaks {@code job.sourceCode} around style boundaries in
      -   * {@code job.decorations} and modifies {@code job.sourceNode} in place.
      -   * @param {Object} job like <pre>{
      -   *    sourceCode: {string} source as plain text,
      -   *    spans: {Array.<number|Node>} alternating span start indices into source
      -   *       and the text node or element (e.g. {@code <BR>}) corresponding to that
      -   *       span.
      -   *    decorations: {Array.<number|string} an array of style classes preceded
      -   *       by the position at which they start in job.sourceCode in order
      -   * }</pre>
      -   * @private
      -   */
      -  function recombineTagsAndDecorations(job) {
      -    var isIE = /\bMSIE\b/.test(navigator.userAgent);
      -    var newlineRe = /\n/g;
      -  
      -    var source = job.sourceCode;
      -    var sourceLength = source.length;
      -    // Index into source after the last code-unit recombined.
      -    var sourceIndex = 0;
      -  
      -    var spans = job.spans;
      -    var nSpans = spans.length;
      -    // Index into spans after the last span which ends at or before sourceIndex.
      -    var spanIndex = 0;
      -  
      -    var decorations = job.decorations;
      -    var nDecorations = decorations.length;
      -    // Index into decorations after the last decoration which ends at or before
      -    // sourceIndex.
      -    var decorationIndex = 0;
      -  
      -    // Remove all zero-length decorations.
      -    decorations[nDecorations] = sourceLength;
      -    var decPos, i;
      -    for (i = decPos = 0; i < nDecorations;) {
      -      if (decorations[i] !== decorations[i + 2]) {
      -        decorations[decPos++] = decorations[i++];
      -        decorations[decPos++] = decorations[i++];
      -      } else {
      -        i += 2;
      -      }
      -    }
      -    nDecorations = decPos;
      -  
      -    // Simplify decorations.
      -    for (i = decPos = 0; i < nDecorations;) {
      -      var startPos = decorations[i];
      -      // Conflate all adjacent decorations that use the same style.
      -      var startDec = decorations[i + 1];
      -      var end = i + 2;
      -      while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {
      -        end += 2;
      -      }
      -      decorations[decPos++] = startPos;
      -      decorations[decPos++] = startDec;
      -      i = end;
      -    }
      -  
      -    nDecorations = decorations.length = decPos;
      -  
      -    var decoration = null;
      -    while (spanIndex < nSpans) {
      -      var spanStart = spans[spanIndex];
      -      var spanEnd = spans[spanIndex + 2] || sourceLength;
      -  
      -      var decStart = decorations[decorationIndex];
      -      var decEnd = decorations[decorationIndex + 2] || sourceLength;
      -  
      -      var end = Math.min(spanEnd, decEnd);
      -  
      -      var textNode = spans[spanIndex + 1];
      -      var styledText;
      -      if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s
      -          // Don't introduce spans around empty text nodes.
      -          && (styledText = source.substring(sourceIndex, end))) {
      -        // This may seem bizarre, and it is.  Emitting LF on IE causes the
      -        // code to display with spaces instead of line breaks.
      -        // Emitting Windows standard issue linebreaks (CRLF) causes a blank
      -        // space to appear at the beginning of every line but the first.
      -        // Emitting an old Mac OS 9 line separator makes everything spiffy.
      -        if (isIE) { styledText = styledText.replace(newlineRe, '\r'); }
      -        textNode.nodeValue = styledText;
      -        var document = textNode.ownerDocument;
      -        var span = document.createElement('SPAN');
      -        span.className = decorations[decorationIndex + 1];
      -        var parentNode = textNode.parentNode;
      -        parentNode.replaceChild(span, textNode);
      -        span.appendChild(textNode);
      -        if (sourceIndex < spanEnd) {  // Split off a text node.
      -          spans[spanIndex + 1] = textNode
      -              // TODO: Possibly optimize by using '' if there's no flicker.
      -              = document.createTextNode(source.substring(end, spanEnd));
      -          parentNode.insertBefore(textNode, span.nextSibling);
      -        }
      -      }
      -  
      -      sourceIndex = end;
      -  
      -      if (sourceIndex >= spanEnd) {
      -        spanIndex += 2;
      -      }
      -      if (sourceIndex >= decEnd) {
      -        decorationIndex += 2;
      -      }
      -    }
      -  }
      -
      -
      -  /** Maps language-specific file extensions to handlers. */
      -  var langHandlerRegistry = {};
      -  /** Register a language handler for the given file extensions.
      -    * @param {function (Object)} handler a function from source code to a list
      -    *      of decorations.  Takes a single argument job which describes the
      -    *      state of the computation.   The single parameter has the form
      -    *      {@code {
      -    *        sourceCode: {string} as plain text.
      -    *        decorations: {Array.<number|string>} an array of style classes
      -    *                     preceded by the position at which they start in
      -    *                     job.sourceCode in order.
      -    *                     The language handler should assigned this field.
      -    *        basePos: {int} the position of source in the larger source chunk.
      -    *                 All positions in the output decorations array are relative
      -    *                 to the larger source chunk.
      -    *      } }
      -    * @param {Array.<string>} fileExtensions
      -    */
      -  function registerLangHandler(handler, fileExtensions) {
      -    for (var i = fileExtensions.length; --i >= 0;) {
      -      var ext = fileExtensions[i];
      -      if (!langHandlerRegistry.hasOwnProperty(ext)) {
      -        langHandlerRegistry[ext] = handler;
      -      } else if (window['console']) {
      -        console['warn']('cannot override language handler %s', ext);
      -      }
      -    }
      -  }
      -  function langHandlerForExtension(extension, source) {
      -    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
      -      // Treat it as markup if the first non whitespace character is a < and
      -      // the last non-whitespace character is a >.
      -      extension = /^\s*</.test(source)
      -          ? 'default-markup'
      -          : 'default-code';
      -    }
      -    return langHandlerRegistry[extension];
      -  }
      -  registerLangHandler(decorateSource, ['default-code']);
      -  registerLangHandler(
      -      createSimpleLexer(
      -          [],
      -          [
      -           [PR_PLAIN,       /^[^<?]+/],
      -           [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
      -           [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
      -           // Unescaped content in an unknown language
      -           ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
      -           ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
      -           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
      -           ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
      -           // Unescaped content in javascript.  (Or possibly vbscript).
      -           ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
      -           // Contains unescaped stylesheet content
      -           ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
      -           ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
      -          ]),
      -      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
      -  registerLangHandler(
      -      createSimpleLexer(
      -          [
      -           [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
      -           [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
      -           ],
      -          [
      -           [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
      -           [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
      -           ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
      -           [PR_PUNCTUATION,  /^[=<>\/]+/],
      -           ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
      -           ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
      -           ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
      -           ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
      -           ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
      -           ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
      -           ]),
      -      ['in.tag']);
      -  registerLangHandler(
      -      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': CPP_KEYWORDS,
      -          'hashComments': true,
      -          'cStyleComments': true,
      -          'types': C_TYPES
      -        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': 'null,true,false'
      -        }), ['json']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': CSHARP_KEYWORDS,
      -          'hashComments': true,
      -          'cStyleComments': true,
      -          'verbatimStrings': true,
      -          'types': C_TYPES
      -        }), ['cs']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': JAVA_KEYWORDS,
      -          'cStyleComments': true
      -        }), ['java']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': SH_KEYWORDS,
      -          'hashComments': true,
      -          'multiLineStrings': true
      -        }), ['bsh', 'csh', 'sh']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': PYTHON_KEYWORDS,
      -          'hashComments': true,
      -          'multiLineStrings': true,
      -          'tripleQuotedStrings': true
      -        }), ['cv', 'py']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': PERL_KEYWORDS,
      -          'hashComments': true,
      -          'multiLineStrings': true,
      -          'regexLiterals': true
      -        }), ['perl', 'pl', 'pm']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': RUBY_KEYWORDS,
      -          'hashComments': true,
      -          'multiLineStrings': true,
      -          'regexLiterals': true
      -        }), ['rb']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': JSCRIPT_KEYWORDS,
      -          'cStyleComments': true,
      -          'regexLiterals': true
      -        }), ['js']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': COFFEE_KEYWORDS,
      -          'hashComments': 3,  // ### style block comments
      -          'cStyleComments': true,
      -          'multilineStrings': true,
      -          'tripleQuotedStrings': true,
      -          'regexLiterals': true
      -        }), ['coffee']);
      -  registerLangHandler(createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
      -
      -  function applyDecorator(job) {
      -    var opt_langExtension = job.langExtension;
      -
      -    try {
      -      // Extract tags, and convert the source code to plain text.
      -      var sourceAndSpans = extractSourceSpans(job.sourceNode);
      -      /** Plain text. @type {string} */
      -      var source = sourceAndSpans.sourceCode;
      -      job.sourceCode = source;
      -      job.spans = sourceAndSpans.spans;
      -      job.basePos = 0;
      -
      -      // Apply the appropriate language handler
      -      langHandlerForExtension(opt_langExtension, source)(job);
      -
      -      // Integrate the decorations and tags back into the source code,
      -      // modifying the sourceNode in place.
      -      recombineTagsAndDecorations(job);
      -    } catch (e) {
      -      if ('console' in window) {
      -        console['log'](e && e['stack'] ? e['stack'] : e);
      -      }
      -    }
      -  }
      -
      -  /**
      -   * @param sourceCodeHtml {string} The HTML to pretty print.
      -   * @param opt_langExtension {string} The language name to use.
      -   *     Typically, a filename extension like 'cpp' or 'java'.
      -   * @param opt_numberLines {number|boolean} True to number lines,
      -   *     or the 1-indexed number of the first line in sourceCodeHtml.
      -   */
      -  function prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
      -    var container = document.createElement('PRE');
      -    // This could cause images to load and onload listeners to fire.
      -    // E.g. <img onerror="alert(1337)" src="nosuchimage.png">.
      -    // We assume that the inner HTML is from a trusted source.
      -    container.innerHTML = sourceCodeHtml;
      -    if (opt_numberLines) {
      -      numberLines(container, opt_numberLines);
      -    }
      -
      -    var job = {
      -      langExtension: opt_langExtension,
      -      numberLines: opt_numberLines,
      -      sourceNode: container
      -    };
      -    applyDecorator(job);
      -    return container.innerHTML;
      -  }
      -
      -  function prettyPrint(opt_whenDone) {
      -    function byTagName(tn) { return document.getElementsByTagName(tn); }
      -    // fetch a list of nodes to rewrite
      -    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
      -    var elements = [];
      -    for (var i = 0; i < codeSegments.length; ++i) {
      -      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
      -        elements.push(codeSegments[i][j]);
      -      }
      -    }
      -    codeSegments = null;
      -
      -    var clock = Date;
      -    if (!clock['now']) {
      -      clock = { 'now': function () { return +(new Date); } };
      -    }
      -
      -    // The loop is broken into a series of continuations to make sure that we
      -    // don't make the browser unresponsive when rewriting a large page.
      -    var k = 0;
      -    var prettyPrintingJob;
      -
      -    var langExtensionRe = /\blang(?:uage)?-([\w.]+)(?!\S)/;
      -    var prettyPrintRe = /\bprettyprint\b/;
      -
      -    function doWork() {
      -      var endTime = (window['PR_SHOULD_USE_CONTINUATION'] ?
      -                     clock['now']() + 250 /* ms */ :
      -                     Infinity);
      -      for (; k < elements.length && clock['now']() < endTime; k++) {
      -        var cs = elements[k];
      -        var className = cs.className;
      -        if (className.indexOf('prettyprint') >= 0) {
      -          // If the classes includes a language extensions, use it.
      -          // Language extensions can be specified like
      -          //     <pre class="prettyprint lang-cpp">
      -          // the language extension "cpp" is used to find a language handler as
      -          // passed to PR.registerLangHandler.
      -          // HTML5 recommends that a language be specified using "language-"
      -          // as the prefix instead.  Google Code Prettify supports both.
      -          // http://dev.w3.org/html5/spec-author-view/the-code-element.html
      -          var langExtension = className.match(langExtensionRe);
      -          // Support <pre class="prettyprint"><code class="language-c">
      -          var wrapper;
      -          if (!langExtension && (wrapper = childContentWrapper(cs))
      -              && "CODE" === wrapper.tagName) {
      -            langExtension = wrapper.className.match(langExtensionRe);
      -          }
      -
      -          if (langExtension) {
      -            langExtension = langExtension[1];
      -          }
      -
      -          // make sure this is not nested in an already prettified element
      -          var nested = false;
      -          for (var p = cs.parentNode; p; p = p.parentNode) {
      -            if ((p.tagName === 'pre' || p.tagName === 'code' ||
      -                 p.tagName === 'xmp') &&
      -                p.className && p.className.indexOf('prettyprint') >= 0) {
      -              nested = true;
      -              break;
      -            }
      -          }
      -          if (!nested) {
      -            // Look for a class like linenums or linenums:<n> where <n> is the
      -            // 1-indexed number of the first line.
      -            var lineNums = cs.className.match(/\blinenums\b(?::(\d+))?/);
      -            lineNums = lineNums
      -                  ? lineNums[1] && lineNums[1].length ? +lineNums[1] : true
      -                  : false;
      -            if (lineNums) { numberLines(cs, lineNums); }
      -
      -            // do the pretty printing
      -            prettyPrintingJob = {
      -              langExtension: langExtension,
      -              sourceNode: cs,
      -              numberLines: lineNums
      -            };
      -            applyDecorator(prettyPrintingJob);
      -          }
      -        }
      -      }
      -      if (k < elements.length) {
      -        // finish up in a continuation
      -        setTimeout(doWork, 250);
      -      } else if (opt_whenDone) {
      -        opt_whenDone();
      -      }
      -    }
      -
      -    doWork();
      -  }
      -
      -   /**
      -    * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
      -    * {@code class=prettyprint} and prettify them.
      -    *
      -    * @param {Function?} opt_whenDone if specified, called when the last entry
      -    *     has been finished.
      -    */
      -  window['prettyPrintOne'] = prettyPrintOne;
      -   /**
      -    * Pretty print a chunk of code.
      -    *
      -    * @param {string} sourceCodeHtml code as html
      -    * @return {string} code as html, but prettier
      -    */
      -  window['prettyPrint'] = prettyPrint;
      -   /**
      -    * Contains functions for creating and registering new language handlers.
      -    * @type {Object}
      -    */
      -  window['PR'] = {
      -        'createSimpleLexer': createSimpleLexer,
      -        'registerLangHandler': registerLangHandler,
      -        'sourceDecorator': sourceDecorator,
      -        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
      -        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
      -        'PR_COMMENT': PR_COMMENT,
      -        'PR_DECLARATION': PR_DECLARATION,
      -        'PR_KEYWORD': PR_KEYWORD,
      -        'PR_LITERAL': PR_LITERAL,
      -        'PR_NOCODE': PR_NOCODE,
      -        'PR_PLAIN': PR_PLAIN,
      -        'PR_PUNCTUATION': PR_PUNCTUATION,
      -        'PR_SOURCE': PR_SOURCE,
      -        'PR_STRING': PR_STRING,
      -        'PR_TAG': PR_TAG,
      -        'PR_TYPE': PR_TYPE
      -      };
      -})();
      diff --git a/public/laravel/js/scroll.js b/public/laravel/js/scroll.js
      deleted file mode 100644
      index 1a4e9f05..00000000
      --- a/public/laravel/js/scroll.js
      +++ /dev/null
      @@ -1,236 +0,0 @@
      -
      -/*
      - * jQuery EasIng v1.1.2 - http://gsgd.co.uk/sandbox/jquery.easIng.php
      - *
      - * Uses the built In easIng capabilities added In jQuery 1.1
      - * to offer multiple easIng options
      - *
      - * Copyright (c) 2007 George Smith
      - * Licensed under the MIT License:
      - *   http://www.opensource.org/licenses/mit-license.php
      - */
      -
      -// t: current time, b: begInnIng value, c: change In value, d: duration
      -
      -jQuery.extend( jQuery.easing,
      -{
      -	easeInQuad: function (x, t, b, c, d) {
      -		return c*(t/=d)*t + b;
      -	},
      -	easeOutQuad: function (x, t, b, c, d) {
      -		return -c *(t/=d)*(t-2) + b;
      -	},
      -	easeInOutQuad: function (x, t, b, c, d) {
      -		if ((t/=d/2) < 1) return c/2*t*t + b;
      -		return -c/2 * ((--t)*(t-2) - 1) + b;
      -	},
      -	easeInCubic: function (x, t, b, c, d) {
      -		return c*(t/=d)*t*t + b;
      -	},
      -	easeOutCubic: function (x, t, b, c, d) {
      -		return c*((t=t/d-1)*t*t + 1) + b;
      -	},
      -	easeInOutCubic: function (x, t, b, c, d) {
      -		if ((t/=d/2) < 1) return c/2*t*t*t + b;
      -		return c/2*((t-=2)*t*t + 2) + b;
      -	},
      -	easeInQuart: function (x, t, b, c, d) {
      -		return c*(t/=d)*t*t*t + b;
      -	},
      -	easeOutQuart: function (x, t, b, c, d) {
      -		return -c * ((t=t/d-1)*t*t*t - 1) + b;
      -	},
      -	easeInOutQuart: function (x, t, b, c, d) {
      -		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
      -		return -c/2 * ((t-=2)*t*t*t - 2) + b;
      -	},
      -	easeInQuint: function (x, t, b, c, d) {
      -		return c*(t/=d)*t*t*t*t + b;
      -	},
      -	easeOutQuint: function (x, t, b, c, d) {
      -		return c*((t=t/d-1)*t*t*t*t + 1) + b;
      -	},
      -	easeInOutQuint: function (x, t, b, c, d) {
      -		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
      -		return c/2*((t-=2)*t*t*t*t + 2) + b;
      -	},
      -	easeInSine: function (x, t, b, c, d) {
      -		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
      -	},
      -	easeOutSine: function (x, t, b, c, d) {
      -		return c * Math.sin(t/d * (Math.PI/2)) + b;
      -	},
      -	easeInOutSine: function (x, t, b, c, d) {
      -		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
      -	},
      -	easeInExpo: function (x, t, b, c, d) {
      -		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
      -	},
      -	easeOutExpo: function (x, t, b, c, d) {
      -		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
      -	},
      -	easeInOutExpo: function (x, t, b, c, d) {
      -		if (t==0) return b;
      -		if (t==d) return b+c;
      -		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
      -		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
      -	},
      -	easeInCirc: function (x, t, b, c, d) {
      -		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
      -	},
      -	easeOutCirc: function (x, t, b, c, d) {
      -		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
      -	},
      -	easeInOutCirc: function (x, t, b, c, d) {
      -		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
      -		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
      -	},
      -	easeInElastic: function (x, t, b, c, d) {
      -		var s=1.70158;var p=0;var a=c;
      -		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
      -		if (a < Math.abs(c)) { a=c; var s=p/4; }
      -		else var s = p/(2*Math.PI) * Math.asin (c/a);
      -		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
      -	},
      -	easeOutElastic: function (x, t, b, c, d) {
      -		var s=1.70158;var p=0;var a=c;
      -		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
      -		if (a < Math.abs(c)) { a=c; var s=p/4; }
      -		else var s = p/(2*Math.PI) * Math.asin (c/a);
      -		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
      -	},
      -	easeInOutElastic: function (x, t, b, c, d) {
      -		var s=1.70158;var p=0;var a=c;
      -		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
      -		if (a < Math.abs(c)) { a=c; var s=p/4; }
      -		else var s = p/(2*Math.PI) * Math.asin (c/a);
      -		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
      -		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
      -	},
      -	easeInBack: function (x, t, b, c, d, s) {
      -		if (s == undefined) s = 1.70158;
      -		return c*(t/=d)*t*((s+1)*t - s) + b;
      -	},
      -	easeOutBack: function (x, t, b, c, d, s) {
      -		if (s == undefined) s = 1.70158;
      -		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
      -	},
      -	easeInOutBack: function (x, t, b, c, d, s) {
      -		if (s == undefined) s = 1.70158;
      -		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
      -		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
      -	},
      -	easeInBounce: function (x, t, b, c, d) {
      -		return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
      -	},
      -	easeOutBounce: function (x, t, b, c, d) {
      -		if ((t/=d) < (1/2.75)) {
      -			return c*(7.5625*t*t) + b;
      -		} else if (t < (2/2.75)) {
      -			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
      -		} else if (t < (2.5/2.75)) {
      -			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
      -		} else {
      -			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
      -		}
      -	},
      -	easeInOutBounce: function (x, t, b, c, d) {
      -		if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
      -		return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
      -	}
      -});
      -
      -/*
      -|--------------------------------------------------------------------------
      -| UItoTop jQuery Plugin 1.1
      -| http://www.mattvarone.com/web-design/uitotop-jquery-plugin/
      -|--------------------------------------------------------------------------
      -*/
      -
      -(function($){
      -	$.fn.UItoTop = function(options) {
      -
      - 		var defaults = {
      -			text: 'To Top',
      -			min: 200,
      -			inDelay:600,
      -			outDelay:400,
      -  			containerID: 'toTop',
      -			containerHoverID: 'toTopHover',
      -			scrollSpeed: 1200,
      -			easingType: 'linear'
      - 		};
      -
      - 		var settings = $.extend(defaults, options);
      -		var containerIDhash = '#' + settings.containerID;
      -		var containerHoverIDHash = '#'+settings.containerHoverID;
      -
      -		$('body').append('<a href="#" id="'+settings.containerID+'">'+settings.text+'</a>');
      -		$(containerIDhash).hide().click(function(){
      -			$('html, body').animate({scrollTop:0}, settings.scrollSpeed, settings.easingType);
      -			$('#'+settings.containerHoverID, this).stop().animate({'opacity': 0 }, settings.inDelay, settings.easingType);
      -			return false;
      -		})
      -		.prepend('<span id="'+settings.containerHoverID+'"></span>')
      -		.hover(function() {
      -				$(containerHoverIDHash, this).stop().animate({
      -					'opacity': 1
      -				}, 600, 'linear');
      -			}, function() {
      -				$(containerHoverIDHash, this).stop().animate({
      -					'opacity': 0
      -				}, 700, 'linear');
      -			});
      -
      -		$(window).scroll(function() {
      -			var sd = $(window).scrollTop();
      -			if(typeof document.body.style.maxHeight === "undefined") {
      -				$(containerIDhash).css({
      -					'position': 'absolute',
      -					'top': $(window).scrollTop() + $(window).height() - 50
      -				});
      -			}
      -			if ( sd > settings.min )
      -				$(containerIDhash).fadeIn(settings.inDelay);
      -			else
      -				$(containerIDhash).fadeOut(settings.Outdelay);
      -		});
      -
      -};
      -})(jQuery);
      -
      -
      -$(document).ready(function() {
      -	$().UItoTop({ easingType: 'easeOutQuart' });
      -	if ($('#docs-sidebar').length ) {
      -		$.get('/docs/sidebar', function(data) {
      -			$('.sidebar ul.toc').before(data);
      -			$('.sidebar ul.toc').hide();
      -			var url = document.location.href;
      -			// console.log(url);
      -			var parent_folder = url.substr(0, url.lastIndexOf('/'));
      -			var active = url.substr(0, url.length-document.location.hash.length);
      -
      -			$('.docs.sidebar ul ul').hide();
      -			$('.docs.sidebar ul ul').each(function() {
      -				$(this).parent('li').addClass('nav-close');
      -				var anchor = $(this).prev('a').attr('href');
      -				if (anchor == active.replace('http://laravel.com', '')) {
      -					$(this).prev('a').addClass('active');
      -					$(this).parent('li').addClass('nav-open').removeClass('nav-close');
      -					$(this).show();
      -				} else if (anchor == parent_folder.replace('http://laravel.com', '')) {
      -					$(this).prev('a').addClass('active');
      -					$(this).parent('li').addClass('nav-open').removeClass('nav-close');
      -					$(this).show();
      -				}
      -				//console.log(anchor+' == '+parent_folder);
      -				$(this).prev('a').bind('click', function(e) {
      -					$(this).parent('li').toggleClass('nav-open').toggleClass('nav-close');
      -					$(this).next('ul').animate({opacity: 'toggle', height: 'toggle'}, "slow");
      -					return false;
      -				});
      -			});
      -		});
      -	} // end if
      -});
      \ No newline at end of file
      diff --git a/laravel/tests/application/migrations/.gitignore b/public/packages/.gitkeep
      similarity index 100%
      rename from laravel/tests/application/migrations/.gitignore
      rename to public/packages/.gitkeep
      diff --git a/readme.md b/readme.md
      index 56f19dc6..001ecb60 100644
      --- a/readme.md
      +++ b/readme.md
      @@ -1,67 +1,13 @@
      -# [Laravel](http://laravel.com) - A PHP Framework For Web Artisans
      +## Laravel 4.x
       
      -Laravel is a clean and classy framework for PHP web development. Freeing you
      -from spaghetti code, Laravel helps you create wonderful applications using
      -simple, expressive syntax. Development should be a creative experience that you
      -enjoy, not something that is painful. Enjoy the fresh air.
      +### A Framework For Web Artisans
       
      -[Official Website & Documentation](http://laravel.com)
      +[Official Documentation](http://four.laravel.com) (Under Active Development)
       
      -## Feature Overview
      +### Contributing To Laravel
       
      -- Simple routing using Closures or controllers.
      -- Views and templating.
      -- Driver based session and cache handling.
      -- Database abstraction with query builder.
      -- Authentication.
      -- Migrations.
      -- PHPUnit Integration.
      -- A lot more.
      +**All issues and pull requests should be filed on the [laravel/framework](http://github.com/laravel/framework) repository.**
       
      -## A Few Examples
      +### License
       
      -### Hello World:
      -
      -```php
      -<?php
      -
      -Route::get('/', function()
      -{
      -	return "Hello World!";
      -});
      -```
      -
      -### Passing Data To Views:
      -
      -```php
      -<?php
      -
      -Route::get('user/(:num)', function($id)
      -{
      -	$user = DB::table('users')->find($id);
      -
      -	return View::make('profile')->with('user', $user);
      -});
      -```
      -
      -### Redirecting & Flashing Data To The Session:
      -
      -```php
      -<?php
      -
      -return Redirect::to('profile')->with('message', 'Welcome Back!');
      -```
      -
      -## Contributing to Laravel
      -
      -Contributions are encouraged and welcome; however, please review the Developer
      -Certificate of Origin in the "license.txt" file included in the repository. All
      -commits must be signed off using the `-s` switch.
      -
      -```bash
      -git commit -s -m "this commit will be signed off automatically!"
      -```
      -
      -## License
      -
      -Laravel is open-sourced software licensed under the MIT License.
      +The Laravel framework is open-sourced software license under the [MIT license](http://opensource.org/licenses/MIT)
      \ No newline at end of file
      diff --git a/server.php b/server.php
      new file mode 100644
      index 00000000..fc108ab1
      --- /dev/null
      +++ b/server.php
      @@ -0,0 +1,15 @@
      +<?php
      +
      +$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
      +
      +$requested = __DIR__.'/public'.$uri;
      +
      +// This file allows us to emulate Apache's "mod_rewrite" functionality from the
      +// built-in PHP web server. This provides a convenient way to test a Laravel
      +// application without having installed a "real" web server software here.
      +if ($uri !== '/' and file_exists($requested))
      +{
      +	return false;
      +}
      +
      +require_once(__DIR__ . '/public/index.php');
      \ No newline at end of file
      diff --git a/start.php b/start.php
      new file mode 100644
      index 00000000..1320a86c
      --- /dev/null
      +++ b/start.php
      @@ -0,0 +1,72 @@
      +<?php
      +
      +/*
      +|--------------------------------------------------------------------------
      +| Create The Application
      +|--------------------------------------------------------------------------
      +|
      +| The first thing we will do is create a new Laravel application instance
      +| which serves as the "glue" for all the components of Laravel, and is
      +| the IoC container for the system binding all of the various parts.
      +|
      +*/
      +
      +$app = new Illuminate\Foundation\Application;
      +
      +/*
      +|--------------------------------------------------------------------------
      +| Define The Application Path
      +|--------------------------------------------------------------------------
      +|
      +| Here we just defined the path to the application directory. Most likely
      +| you will never need to change this value as the default setup should
      +| work perfectly fine for the vast majority of all our applications.
      +|
      +*/
      +
      +$app->instance('path', $appPath = __DIR__.'/app');
      +
      +$app->instance('path.base', __DIR__);
      +
      +/*
      +|--------------------------------------------------------------------------
      +| Detect The Application Environment
      +|--------------------------------------------------------------------------
      +|
      +| Laravel takes a dead simple approach to your application environments
      +| so you can just specify a machine name or HTTP host that matches a
      +| given environment, then we will automatically detect it for you.
      +|
      +*/
      +
      +$env = $app->detectEnvironment(array(
      +
      +	'local' => array('your-machine-name'),
      +
      +));
      +
      +/*
      +|--------------------------------------------------------------------------
      +| Load The Application
      +|--------------------------------------------------------------------------
      +|
      +| Here we will load the Illuminate application. We'll keep this is in a
      +| separate location so we can isolate the creation of an application
      +| from the actual running of the application with a given request.
      +|
      +*/
      +
      +require $app->getBootstrapFile();
      +
      +/*
      +|--------------------------------------------------------------------------
      +| Return The Application
      +|--------------------------------------------------------------------------
      +|
      +| This script returns the application instance. The instance is given to
      +| the calling script so we can separate the building of the instances
      +| from the actual running of the application and sending responses.
      +|
      +*/
      +
      +return $app;
      \ No newline at end of file
      diff --git a/storage/database/.gitignore b/storage/database/.gitignore
      deleted file mode 100644
      index 6a91a439..00000000
      --- a/storage/database/.gitignore
      +++ /dev/null
      @@ -1 +0,0 @@
      -*.sqlite
      \ No newline at end of file
      
      From b53e6cd02e82073f90113a373cce0b6bc356883a Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Fri, 11 Jan 2013 15:37:31 -0600
      Subject: [PATCH 02/71] update server for urldecode.
      
      ---
       server.php | 2 ++
       1 file changed, 2 insertions(+)
      
      diff --git a/server.php b/server.php
      index fc108ab1..2084099c 100644
      --- a/server.php
      +++ b/server.php
      @@ -2,6 +2,8 @@
       
       $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
       
      +$uri = urldecode($uri);
      +
       $requested = __DIR__.'/public'.$uri;
       
       // This file allows us to emulate Apache's "mod_rewrite" functionality from the
      
      From b03521fabcfa32e96335e523948a384ff129b03f Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Sat, 12 Jan 2013 16:38:27 -0600
      Subject: [PATCH 03/71] added old style auto loader setup in addition to
       composer.
      
      ---
       app/config/app.php   | 59 ++++++++++++++++++++++----------------------
       app/start/global.php | 18 ++++++++++++++
       2 files changed, 48 insertions(+), 29 deletions(-)
      
      diff --git a/app/config/app.php b/app/config/app.php
      index 3925e64c..155f165b 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -135,35 +135,36 @@
       
       	'aliases' => array(
       
      -		'App'        => 'Illuminate\Support\Facades\App',
      -		'Artisan'    => 'Illuminate\Support\Facades\Artisan',
      -		'Auth'       => 'Illuminate\Support\Facades\Auth',
      -		'Blade'      => 'Illuminate\Support\Facades\Blade',
      -		'Cache'      => 'Illuminate\Support\Facades\Cache',
      -		'Config'     => 'Illuminate\Support\Facades\Config',
      -		'Controller' => 'Illuminate\Routing\Controllers\Controller',
      -		'Cookie'     => 'Illuminate\Support\Facades\Cookie',
      -		'Crypt'      => 'Illuminate\Support\Facades\Crypt',
      -		'DB'         => 'Illuminate\Support\Facades\DB',
      -		'Eloquent'   => 'Illuminate\Database\Eloquent\Model',
      -		'Event'      => 'Illuminate\Support\Facades\Event',
      -		'File'       => 'Illuminate\Support\Facades\File',
      -		'Hash'       => 'Illuminate\Support\Facades\Hash',
      -		'Input'      => 'Illuminate\Support\Facades\Input',
      -		'Lang'       => 'Illuminate\Support\Facades\Lang',
      -		'Log'        => 'Illuminate\Support\Facades\Log',
      -		'Mail'       => 'Illuminate\Support\Facades\Mail',
      -		'Paginator'  => 'Illuminate\Support\Facades\Paginator',
      -		'Redirect'   => 'Illuminate\Support\Facades\Redirect',
      -		'Redis'      => 'Illuminate\Support\Facades\Redis',
      -		'Request'    => 'Illuminate\Support\Facades\Request',
      -		'Response'   => 'Illuminate\Support\Facades\Response',
      -		'Route'      => 'Illuminate\Support\Facades\Route',
      -		'Schema'     => 'Illuminate\Support\Facades\Schema',
      -		'Session'    => 'Illuminate\Support\Facades\Session',
      -		'URL'        => 'Illuminate\Support\Facades\URL',
      -		'Validator'  => 'Illuminate\Support\Facades\Validator',
      -		'View'       => 'Illuminate\Support\Facades\View',
      +		'App'         => 'Illuminate\Support\Facades\App',
      +		'Artisan'     => 'Illuminate\Support\Facades\Artisan',
      +		'Auth'        => 'Illuminate\Support\Facades\Auth',
      +		'Blade'       => 'Illuminate\Support\Facades\Blade',
      +		'Cache'       => 'Illuminate\Support\Facades\Cache',
      +		'ClassLoader' => 'Illuminate\Foundation\ClassLoader',
      +		'Config'      => 'Illuminate\Support\Facades\Config',
      +		'Controller'  => 'Illuminate\Routing\Controllers\Controller',
      +		'Cookie'      => 'Illuminate\Support\Facades\Cookie',
      +		'Crypt'       => 'Illuminate\Support\Facades\Crypt',
      +		'DB'          => 'Illuminate\Support\Facades\DB',
      +		'Eloquent'    => 'Illuminate\Database\Eloquent\Model',
      +		'Event'       => 'Illuminate\Support\Facades\Event',
      +		'File'        => 'Illuminate\Support\Facades\File',
      +		'Hash'        => 'Illuminate\Support\Facades\Hash',
      +		'Input'       => 'Illuminate\Support\Facades\Input',
      +		'Lang'        => 'Illuminate\Support\Facades\Lang',
      +		'Log'         => 'Illuminate\Support\Facades\Log',
      +		'Mail'        => 'Illuminate\Support\Facades\Mail',
      +		'Paginator'   => 'Illuminate\Support\Facades\Paginator',
      +		'Redirect'    => 'Illuminate\Support\Facades\Redirect',
      +		'Redis'       => 'Illuminate\Support\Facades\Redis',
      +		'Request'     => 'Illuminate\Support\Facades\Request',
      +		'Response'    => 'Illuminate\Support\Facades\Response',
      +		'Route'       => 'Illuminate\Support\Facades\Route',
      +		'Schema'      => 'Illuminate\Support\Facades\Schema',
      +		'Session'     => 'Illuminate\Support\Facades\Session',
      +		'URL'         => 'Illuminate\Support\Facades\URL',
      +		'Validator'   => 'Illuminate\Support\Facades\Validator',
      +		'View'        => 'Illuminate\Support\Facades\View',
       
       	),
       
      diff --git a/app/start/global.php b/app/start/global.php
      index 37fd0c16..dbebd1f4 100644
      --- a/app/start/global.php
      +++ b/app/start/global.php
      @@ -1,5 +1,23 @@
       <?php
       
      +/*
      +|--------------------------------------------------------------------------
      +| Register The Laravel Class Loader
      +|--------------------------------------------------------------------------
      +|
      +| In addition to using Composer, you may use the Laravel class loader to
      +| load your controllers and models. This is useful for keeping all of
      +| your classes in the "global" namespace without Composer updating.
      +|
      +*/
      +
      +ClassLoader::register(new ClassLoader(array(
      +
      +	app_path().'/controllers',
      +	app_path().'/models',
      +
      +)));
      +
       /*
       |--------------------------------------------------------------------------
       | Application Error Logger
      
      From 6c7a2fac175bcf4b3ae75ee95b8316db50e10976 Mon Sep 17 00:00:00 2001
      From: Dayle Rees <thepunkfan@gmail.com>
      Date: Sun, 13 Jan 2013 22:19:26 +0000
      Subject: [PATCH 04/71] Adding EventSubscriber alias as per documentation.
      
      ---
       app/config/app.php | 61 +++++++++++++++++++++++-----------------------
       1 file changed, 31 insertions(+), 30 deletions(-)
      
      diff --git a/app/config/app.php b/app/config/app.php
      index 155f165b..1e3382a3 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -135,36 +135,37 @@
       
       	'aliases' => array(
       
      -		'App'         => 'Illuminate\Support\Facades\App',
      -		'Artisan'     => 'Illuminate\Support\Facades\Artisan',
      -		'Auth'        => 'Illuminate\Support\Facades\Auth',
      -		'Blade'       => 'Illuminate\Support\Facades\Blade',
      -		'Cache'       => 'Illuminate\Support\Facades\Cache',
      -		'ClassLoader' => 'Illuminate\Foundation\ClassLoader',
      -		'Config'      => 'Illuminate\Support\Facades\Config',
      -		'Controller'  => 'Illuminate\Routing\Controllers\Controller',
      -		'Cookie'      => 'Illuminate\Support\Facades\Cookie',
      -		'Crypt'       => 'Illuminate\Support\Facades\Crypt',
      -		'DB'          => 'Illuminate\Support\Facades\DB',
      -		'Eloquent'    => 'Illuminate\Database\Eloquent\Model',
      -		'Event'       => 'Illuminate\Support\Facades\Event',
      -		'File'        => 'Illuminate\Support\Facades\File',
      -		'Hash'        => 'Illuminate\Support\Facades\Hash',
      -		'Input'       => 'Illuminate\Support\Facades\Input',
      -		'Lang'        => 'Illuminate\Support\Facades\Lang',
      -		'Log'         => 'Illuminate\Support\Facades\Log',
      -		'Mail'        => 'Illuminate\Support\Facades\Mail',
      -		'Paginator'   => 'Illuminate\Support\Facades\Paginator',
      -		'Redirect'    => 'Illuminate\Support\Facades\Redirect',
      -		'Redis'       => 'Illuminate\Support\Facades\Redis',
      -		'Request'     => 'Illuminate\Support\Facades\Request',
      -		'Response'    => 'Illuminate\Support\Facades\Response',
      -		'Route'       => 'Illuminate\Support\Facades\Route',
      -		'Schema'      => 'Illuminate\Support\Facades\Schema',
      -		'Session'     => 'Illuminate\Support\Facades\Session',
      -		'URL'         => 'Illuminate\Support\Facades\URL',
      -		'Validator'   => 'Illuminate\Support\Facades\Validator',
      -		'View'        => 'Illuminate\Support\Facades\View',
      +		'App'             => 'Illuminate\Support\Facades\App',
      +		'Artisan'         => 'Illuminate\Support\Facades\Artisan',
      +		'Auth'            => 'Illuminate\Support\Facades\Auth',
      +		'Blade'           => 'Illuminate\Support\Facades\Blade',
      +		'Cache'           => 'Illuminate\Support\Facades\Cache',
      +		'ClassLoader'     => 'Illuminate\Foundation\ClassLoader',
      +		'Config'          => 'Illuminate\Support\Facades\Config',
      +		'Controller'      => 'Illuminate\Routing\Controllers\Controller',
      +		'Cookie'          => 'Illuminate\Support\Facades\Cookie',
      +		'Crypt'           => 'Illuminate\Support\Facades\Crypt',
      +		'DB'              => 'Illuminate\Support\Facades\DB',
      +		'Eloquent'        => 'Illuminate\Database\Eloquent\Model',
      +		'Event'           => 'Illuminate\Support\Facades\Event',
      +		'EventSubscriber' => 'Illuminate\Events\Subscriber',
      +		'File'            => 'Illuminate\Support\Facades\File',
      +		'Hash'            => 'Illuminate\Support\Facades\Hash',
      +		'Input'           => 'Illuminate\Support\Facades\Input',
      +		'Lang'            => 'Illuminate\Support\Facades\Lang',
      +		'Log'             => 'Illuminate\Support\Facades\Log',
      +		'Mail'            => 'Illuminate\Support\Facades\Mail',
      +		'Paginator'       => 'Illuminate\Support\Facades\Paginator',
      +		'Redirect'        => 'Illuminate\Support\Facades\Redirect',
      +		'Redis'           => 'Illuminate\Support\Facades\Redis',
      +		'Request'         => 'Illuminate\Support\Facades\Request',
      +		'Response'        => 'Illuminate\Support\Facades\Response',
      +		'Route'           => 'Illuminate\Support\Facades\Route',
      +		'Schema'          => 'Illuminate\Support\Facades\Schema',
      +		'Session'         => 'Illuminate\Support\Facades\Session',
      +		'URL'             => 'Illuminate\Support\Facades\URL',
      +		'Validator'       => 'Illuminate\Support\Facades\Validator',
      +		'View'            => 'Illuminate\Support\Facades\View',
       
       	),
       
      
      From 3ad58caba6c79c487deecb2fd7b0ea94e45b4f38 Mon Sep 17 00:00:00 2001
      From: Richard Bradshaw <merryidleness@gmail.com>
      Date: Sat, 19 Jan 2013 19:34:38 +0000
      Subject: [PATCH 05/71] Fixup typo in comment block.
      
      Fix a couple of typos in the comment block.
      ---
       public/index.php | 6 +++---
       1 file changed, 3 insertions(+), 3 deletions(-)
      
      diff --git a/public/index.php b/public/index.php
      index 5fb64679..85b2ec5f 100644
      --- a/public/index.php
      +++ b/public/index.php
      @@ -57,11 +57,11 @@
       | Run The Application
       |--------------------------------------------------------------------------
       |
      -| Once we have the application, we can simple call the run method,
      +| Once we have the application, we can simply call the run method,
       | which will execute the request and send the response back to
       | the client's browser allowing them to enjoy the creative
      -| this wonderful applications we have created for them.
      +| and wonderful applications we have created for them.
       |
       */
       
      -$app->run();
      \ No newline at end of file
      +$app->run();
      
      From 9d3c3ea0381d2071a77a8f1dd2890bae665c6400 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Wed, 23 Jan 2013 23:33:47 -0600
      Subject: [PATCH 06/71] tweak how autoloaders are called. adjust phpunit
       bootstrap.
      
      ---
       artisan                | 20 ++------------------
       bootstrap/autoload.php | 31 +++++++++++++++++++++++++++++++
       phpunit.xml            |  2 +-
       public/index.php       | 20 ++------------------
       4 files changed, 36 insertions(+), 37 deletions(-)
       create mode 100644 bootstrap/autoload.php
      
      diff --git a/artisan b/artisan
      index 14ccfd6f..a70a6c64 100644
      --- a/artisan
      +++ b/artisan
      @@ -3,7 +3,7 @@
       
       /*
       |--------------------------------------------------------------------------
      -| Register The Composer Auto Loader
      +| Register The Auto Loader
       |--------------------------------------------------------------------------
       |
       | Composer provides a convenient, automatically generated class loader
      @@ -13,23 +13,7 @@
       |
       */
       
      -require __DIR__.'/vendor/autoload.php';
      -
      -/*
      -|--------------------------------------------------------------------------
      -| Register The Workbench Loaders
      -|--------------------------------------------------------------------------
      -|
      -| The Laravel workbench provides a convenient place to develop packages
      -| when working locally. However we will need to load in the Composer
      -| auto-load files for the packages so that these can be used here.
      -|
      -*/
      -
      -if (is_dir($workbench = __DIR__.'/workbench'))
      -{
      -	Illuminate\Workbench\Starter::start($workbench);
      -}
      +require __DIR__.'/bootstrap/autoload.php';
       
       /*
       |--------------------------------------------------------------------------
      diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php
      new file mode 100644
      index 00000000..f6adac71
      --- /dev/null
      +++ b/bootstrap/autoload.php
      @@ -0,0 +1,31 @@
      +<?php
      +
      +/*
      +|--------------------------------------------------------------------------
      +| Register The Composer Auto Loader
      +|--------------------------------------------------------------------------
      +|
      +| Composer provides a convenient, automatically generated class loader
      +| for our application. We just need to utilize it! We'll require it
      +| into the script here so that we do not have to worry about the
      +| loading of any our classes "manually". Feels great to relax.
      +|
      +*/
      +
      +require __DIR__.'/../vendor/autoload.php';
      +
      +/*
      +|--------------------------------------------------------------------------
      +| Register The Workbench Loaders
      +|--------------------------------------------------------------------------
      +|
      +| The Laravel workbench provides a convenient place to develop packages
      +| when working locally. However we will need to load in the Composer
      +| auto-load files for the packages so that these can be used here.
      +|
      +*/
      +
      +if (is_dir($workbench = __DIR__.'/../workbench'))
      +{
      +	Illuminate\Workbench\Starter::start($workbench);
      +}
      \ No newline at end of file
      diff --git a/phpunit.xml b/phpunit.xml
      index a4c7609f..c42dc4f7 100644
      --- a/phpunit.xml
      +++ b/phpunit.xml
      @@ -1,7 +1,7 @@
       <?xml version="1.0" encoding="UTF-8"?>
       <phpunit backupGlobals="false"
                backupStaticAttributes="false"
      -         bootstrap="vendor/autoload.php"
      +         bootstrap="bootstrap/autoload.php"
                colors="true"
                convertErrorsToExceptions="true"
                convertNoticesToExceptions="true"
      diff --git a/public/index.php b/public/index.php
      index 85b2ec5f..d11628e3 100644
      --- a/public/index.php
      +++ b/public/index.php
      @@ -10,7 +10,7 @@
       
       /*
       |--------------------------------------------------------------------------
      -| Register The Composer Auto Loader
      +| Register The Auto Loader
       |--------------------------------------------------------------------------
       |
       | Composer provides a convenient, automatically generated class loader
      @@ -20,23 +20,7 @@
       |
       */
       
      -require __DIR__.'/../vendor/autoload.php';
      -
      -/*
      -|--------------------------------------------------------------------------
      -| Register The Workbench Loaders
      -|--------------------------------------------------------------------------
      -|
      -| The Laravel workbench provides a convenient place to develop packages
      -| when working locally. However we will need to load in the Composer
      -| auto-load files for the packages so that these can be used here.
      -|
      -*/
      -
      -if (is_dir($workbench = __DIR__.'/../workbench'))
      -{
      -	Illuminate\Workbench\Starter::start($workbench);
      -}
      +require __DIR__.'/../bootstrap/autoload.php';
       
       /*
       |--------------------------------------------------------------------------
      
      From 5ad3707ca4043f54c9adb4a74bd7bb69e895b707 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Wed, 23 Jan 2013 23:43:28 -0600
      Subject: [PATCH 07/71] boot the application on all artisan commands.
      
      ---
       artisan | 2 ++
       1 file changed, 2 insertions(+)
      
      diff --git a/artisan b/artisan
      index a70a6c64..f47ca23d 100644
      --- a/artisan
      +++ b/artisan
      @@ -29,6 +29,8 @@ require __DIR__.'/bootstrap/autoload.php';
       
       $app = require_once __DIR__.'/start.php';
       
      +$app->boot();
      +
       /*
       |--------------------------------------------------------------------------
       | Load The Artisan Console Application
      
      From caa65bbef6001cdd4f5be7b82825c83703161267 Mon Sep 17 00:00:00 2001
      From: Alex Whitman <alex@alexwhitman.com>
      Date: Fri, 25 Jan 2013 20:01:01 +0000
      Subject: [PATCH 08/71] Add date validation messages
      
      ---
       app/lang/en/validation.php | 2 ++
       1 file changed, 2 insertions(+)
      
      diff --git a/app/lang/en/validation.php b/app/lang/en/validation.php
      index 28279f3b..a67a1148 100644
      --- a/app/lang/en/validation.php
      +++ b/app/lang/en/validation.php
      @@ -26,6 +26,8 @@
       		"string"  => "The :attribute must be between :min - :max characters.",
       	),
       	"confirmed"       => "The :attribute confirmation does not match.",
      +	"date"            => "The :attribute is not a valid date.",
      +	"date_format"     => "The :attribute does not match the format :format.",
       	"different"       => "The :attribute and :other must be different.",
       	"digits"          => "The :attribute must be :digits digits.",
       	"digits_between"  => "The :attribute must be between :min and :max digits.",
      
      From f6ad08698bc7caf15aa59a0d0248eba98c4141e7 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Mon, 28 Jan 2013 11:58:38 -0600
      Subject: [PATCH 09/71] added queue config and service provider.
      
      ---
       app/config/app.php   |  1 +
       app/config/queue.php | 45 ++++++++++++++++++++++++++++++++++++++++++++
       2 files changed, 46 insertions(+)
       create mode 100644 app/config/queue.php
      
      diff --git a/app/config/app.php b/app/config/app.php
      index 1e3382a3..335ac6e9 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -97,6 +97,7 @@
       		'Illuminate\Database\MigrationServiceProvider',
       		'Illuminate\Pagination\PaginationServiceProvider',
       		'Illuminate\Foundation\Providers\PublisherServiceProvider',
      +		'Illuminate\Queue\QueueServiceProvider',
       		'Illuminate\Redis\RedisServiceProvider',
       		'Illuminate\Database\SeedServiceProvider',
       		'Illuminate\Foundation\Providers\ServerServiceProvider',
      diff --git a/app/config/queue.php b/app/config/queue.php
      new file mode 100644
      index 00000000..5dc5cb0c
      --- /dev/null
      +++ b/app/config/queue.php
      @@ -0,0 +1,45 @@
      +<?php
      +
      +return array(
      +
      +	/*
      +	|--------------------------------------------------------------------------
      +	| Default Queue Driver
      +	|--------------------------------------------------------------------------
      +	|
      +	| The Laravel queue API supports a variety of back-ends via an unified
      +	| API, giving you convenient access to each back-end using the same
      +	| syntax for each one. Here you may set the default queue driver.
      +	|
      +	| Supported: "sync", "beanstalkd"
      +	|
      +	*/
      +
      +	'default' => 'sync',
      +
      +	/*
      +	|--------------------------------------------------------------------------
      +	| Queue Connections
      +	|--------------------------------------------------------------------------
      +	|
      +	| Here you may configure the connection information for each server that
      +	| is used by your application. A default configuration has been added
      +	| for each back-end shipped with Laravel. You are free to add more.
      +	|
      +	*/
      +
      +	'connections' => array(
      +
      +		'sync' => array(
      +			'driver' => 'sync',
      +		),
      +
      +		'beanstalkd' => array(
      +			'driver' => 'beanstalkd',
      +			'host'   => 'localhost',
      +			'queue'  => 'default',
      +		),
      +
      +	),
      +
      +);
      \ No newline at end of file
      
      From 5446db12524b5832eb492016cd4caae0e18a9a56 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Mon, 28 Jan 2013 12:03:59 -0600
      Subject: [PATCH 10/71] added queue facade.
      
      ---
       app/config/app.php | 1 +
       1 file changed, 1 insertion(+)
      
      diff --git a/app/config/app.php b/app/config/app.php
      index 335ac6e9..730ba87d 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -157,6 +157,7 @@
       		'Log'             => 'Illuminate\Support\Facades\Log',
       		'Mail'            => 'Illuminate\Support\Facades\Mail',
       		'Paginator'       => 'Illuminate\Support\Facades\Paginator',
      +		'Queue'           => 'Illuminate\Support\Facades\Queue',
       		'Redirect'        => 'Illuminate\Support\Facades\Redirect',
       		'Redis'           => 'Illuminate\Support\Facades\Redis',
       		'Request'         => 'Illuminate\Support\Facades\Request',
      
      From 0e5b8ae8f77735b9532f7444c472a4fd1a893683 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Mon, 28 Jan 2013 20:28:15 -0600
      Subject: [PATCH 11/71] added reminder service provider and password alias.
      
      ---
       app/config/app.php | 2 ++
       1 file changed, 2 insertions(+)
      
      diff --git a/app/config/app.php b/app/config/app.php
      index 730ba87d..8fb1035e 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -99,6 +99,7 @@
       		'Illuminate\Foundation\Providers\PublisherServiceProvider',
       		'Illuminate\Queue\QueueServiceProvider',
       		'Illuminate\Redis\RedisServiceProvider',
      +		'Illuminate\Auth\ReminderServiceProvider',
       		'Illuminate\Database\SeedServiceProvider',
       		'Illuminate\Foundation\Providers\ServerServiceProvider',
       		'Illuminate\Session\SessionServiceProvider',
      @@ -157,6 +158,7 @@
       		'Log'             => 'Illuminate\Support\Facades\Log',
       		'Mail'            => 'Illuminate\Support\Facades\Mail',
       		'Paginator'       => 'Illuminate\Support\Facades\Paginator',
      +		'Password'        => 'Illuminate\Support\Facades\Password',
       		'Queue'           => 'Illuminate\Support\Facades\Queue',
       		'Redirect'        => 'Illuminate\Support\Facades\Redirect',
       		'Redis'           => 'Illuminate\Support\Facades\Redis',
      
      From 098c6c6295872b3b01fa4aae281c615de00818bc Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Wed, 30 Jan 2013 19:46:36 -0600
      Subject: [PATCH 12/71] tweak how autoloader works.
      
      ---
       app/config/app.php     |  2 +-
       app/start/global.php   |  4 ++--
       bootstrap/autoload.php | 13 +++++++++++++
       3 files changed, 16 insertions(+), 3 deletions(-)
      
      diff --git a/app/config/app.php b/app/config/app.php
      index 8fb1035e..4a29b10e 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -142,7 +142,7 @@
       		'Auth'            => 'Illuminate\Support\Facades\Auth',
       		'Blade'           => 'Illuminate\Support\Facades\Blade',
       		'Cache'           => 'Illuminate\Support\Facades\Cache',
      -		'ClassLoader'     => 'Illuminate\Foundation\ClassLoader',
      +		'ClassLoader'     => 'Illuminate\Support\ClassLoader',
       		'Config'          => 'Illuminate\Support\Facades\Config',
       		'Controller'      => 'Illuminate\Routing\Controllers\Controller',
       		'Cookie'          => 'Illuminate\Support\Facades\Cookie',
      diff --git a/app/start/global.php b/app/start/global.php
      index dbebd1f4..c6bad0d1 100644
      --- a/app/start/global.php
      +++ b/app/start/global.php
      @@ -11,12 +11,12 @@
       |
       */
       
      -ClassLoader::register(new ClassLoader(array(
      +ClassLoader::addDirectories(array(
       
       	app_path().'/controllers',
       	app_path().'/models',
       
      -)));
      +));
       
       /*
       |--------------------------------------------------------------------------
      diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php
      index f6adac71..5030dae4 100644
      --- a/bootstrap/autoload.php
      +++ b/bootstrap/autoload.php
      @@ -14,6 +14,19 @@
       
       require __DIR__.'/../vendor/autoload.php';
       
      +/*
      +|--------------------------------------------------------------------------
      +| Register The Laravel Auto Loader
      +|--------------------------------------------------------------------------
      +|
      +| We register an auto-loader "behind" the Composer loader that can load
      +| model classes on the fly, even if the autoload files have not been
      +| regenerated for the application. We'll add it to the stack here.
      +|
      +*/
      +
      +Illuminate\Support\ClassLoader::register();
      +
       /*
       |--------------------------------------------------------------------------
       | Register The Workbench Loaders
      
      From df6021a26d1c8812fe311b89cf2e8b9e9073daf2 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Wed, 30 Jan 2013 22:42:27 -0600
      Subject: [PATCH 13/71] added config for password reminders.
      
      ---
       app/config/auth.php | 19 ++++++++++++++++++-
       1 file changed, 18 insertions(+), 1 deletion(-)
      
      diff --git a/app/config/auth.php b/app/config/auth.php
      index 3eceea3c..f39e3259 100644
      --- a/app/config/auth.php
      +++ b/app/config/auth.php
      @@ -43,4 +43,21 @@
       
       	'table' => 'users',
       
      -);
      +	/*
      +	|--------------------------------------------------------------------------
      +	| Password Reminder Settings
      +	|--------------------------------------------------------------------------
      +	|
      +	| Here you may set the settings for password reminders, including a view
      +	| that should be used as your password reminder e-mail. You will also
      +	| be able to set the name of the table that holds the reset tokens.
      +	|
      +	*/
      +
      +	'reminder' => array(
      +
      +		'email' => 'auth.password', 'table' => 'password_reminders',
      +
      +	),
      +
      +);
      \ No newline at end of file
      
      From 441ad9252dcc16d03966ca7e961f1c798d89fb50 Mon Sep 17 00:00:00 2001
      From: Edwin <tkaw220@gmail.com>
      Date: Fri, 1 Feb 2013 11:55:19 +0800
      Subject: [PATCH 14/71] Convert spaces to tab.
      
      Signed-off-by: Edwin <tkaw220@gmail.com>
      ---
       app/config/database.php | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/app/config/database.php b/app/config/database.php
      index d811e9aa..5370043b 100644
      --- a/app/config/database.php
      +++ b/app/config/database.php
      @@ -71,7 +71,7 @@
       			'password' => '',
       			'charset'  => 'utf8',
       			'prefix'   => '',
      -            'schema'   => 'public',
      +			'schema'   => 'public',
       		),
       
       		'sqlsrv' => array(
      
      From af4381f7de05b21246b1ba1466afa1bb6561be28 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Thu, 31 Jan 2013 22:40:41 -0600
      Subject: [PATCH 15/71] implement remindable interface on default user.
      
      ---
       app/models/User.php | 13 ++++++++++++-
       1 file changed, 12 insertions(+), 1 deletion(-)
      
      diff --git a/app/models/User.php b/app/models/User.php
      index e2bcec57..999321b9 100644
      --- a/app/models/User.php
      +++ b/app/models/User.php
      @@ -1,8 +1,9 @@
       <?php
       
       use Illuminate\Auth\UserInterface;
      +use Illuminate\Auth\RemindableInterface;
       
      -class User extends Eloquent implements UserInterface {
      +class User extends Eloquent implements UserInterface, RemindableInterface {
       
       	/**
       	 * The database table used by the model.
      @@ -38,4 +39,14 @@ public function getAuthPassword()
       		return $this->password;
       	}
       
      +	/**
      +	 * Get the e-mail address where password reminders are sent.
      +	 *
      +	 * @return string
      +	 */
      +	public function getReminderEmail()
      +	{
      +		return $this->email;
      +	}
      +
       }
      \ No newline at end of file
      
      From 15a52eefaf523aa788b9784f249547ca5c77fbbc Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Thu, 31 Jan 2013 23:15:07 -0600
      Subject: [PATCH 16/71] update service provider class name.
      
      ---
       app/config/app.php | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/app/config/app.php b/app/config/app.php
      index 4a29b10e..f2773bb2 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -99,7 +99,7 @@
       		'Illuminate\Foundation\Providers\PublisherServiceProvider',
       		'Illuminate\Queue\QueueServiceProvider',
       		'Illuminate\Redis\RedisServiceProvider',
      -		'Illuminate\Auth\ReminderServiceProvider',
      +		'Illuminate\Auth\Reminders\ReminderServiceProvider',
       		'Illuminate\Database\SeedServiceProvider',
       		'Illuminate\Foundation\Providers\ServerServiceProvider',
       		'Illuminate\Session\SessionServiceProvider',
      
      From ae43bff49baebfb65fd9b557b734b69623cb87f2 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Thu, 31 Jan 2013 23:27:03 -0600
      Subject: [PATCH 17/71] added a new service provider.
      
      ---
       app/config/app.php | 1 +
       1 file changed, 1 insertion(+)
      
      diff --git a/app/config/app.php b/app/config/app.php
      index f2773bb2..73c2faf9 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -84,6 +84,7 @@
       		'Illuminate\Auth\AuthServiceProvider',
       		'Illuminate\Cache\CacheServiceProvider',
       		'Illuminate\Foundation\Providers\CommandCreatorServiceProvider',
      +		'Illuminate\Session\CommandsServiceProvider',
       		'Illuminate\Foundation\Providers\ComposerServiceProvider',
       		'Illuminate\Routing\ControllerServiceProvider',
       		'Illuminate\Cookie\CookieServiceProvider',
      
      From 106d3b7287108e168af39da737102cc8f8859370 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Fri, 1 Feb 2013 08:30:52 -0600
      Subject: [PATCH 18/71] fix namespace.
      
      ---
       app/models/User.php | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/app/models/User.php b/app/models/User.php
      index 999321b9..42fe853f 100644
      --- a/app/models/User.php
      +++ b/app/models/User.php
      @@ -1,7 +1,7 @@
       <?php
       
       use Illuminate\Auth\UserInterface;
      -use Illuminate\Auth\RemindableInterface;
      +use Illuminate\Auth\Reminders\RemindableInterface;
       
       class User extends Eloquent implements UserInterface, RemindableInterface {
       
      
      From 8a5f18e139c9cbbe57a2d3de7be73cadbf99fa3b Mon Sep 17 00:00:00 2001
      From: Ben Corlett <bencorlett@me.com>
      Date: Thu, 7 Feb 2013 09:12:56 +1100
      Subject: [PATCH 19/71] Moving start.php to bootstrap/start.php to collate all
       bootstrapping files.
      
      Signed-off-by: Ben Corlett <bencorlett@me.com>
      ---
       app/tests/TestCase.php           | 4 ++--
       artisan                          | 4 ++--
       bootstrap/autoload.php           | 2 +-
       start.php => bootstrap/start.php | 6 +++---
       public/index.php                 | 2 +-
       5 files changed, 9 insertions(+), 9 deletions(-)
       rename start.php => bootstrap/start.php (95%)
      
      diff --git a/app/tests/TestCase.php b/app/tests/TestCase.php
      index 1af7071e..8b1ef7da 100644
      --- a/app/tests/TestCase.php
      +++ b/app/tests/TestCase.php
      @@ -13,7 +13,7 @@ public function createApplication()
       
               $testEnvironment = 'testing';
       
      -    	return require __DIR__.'/../../start.php';
      +    	return require __DIR__.'/../../bootstrap/start.php';
           }
       
      -}
      \ No newline at end of file
      +}
      diff --git a/artisan b/artisan
      index f47ca23d..ce2189de 100644
      --- a/artisan
      +++ b/artisan
      @@ -27,7 +27,7 @@ require __DIR__.'/bootstrap/autoload.php';
       |
       */
       
      -$app = require_once __DIR__.'/start.php';
      +$app = require_once __DIR__.'/bootstrap/start.php';
       
       $app->boot();
       
      @@ -56,4 +56,4 @@ $artisan = Illuminate\Console\Application::start($app);
       |
       */
       
      -$artisan->run();
      \ No newline at end of file
      +$artisan->run();
      diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php
      index 5030dae4..461a1a80 100644
      --- a/bootstrap/autoload.php
      +++ b/bootstrap/autoload.php
      @@ -41,4 +41,4 @@
       if (is_dir($workbench = __DIR__.'/../workbench'))
       {
       	Illuminate\Workbench\Starter::start($workbench);
      -}
      \ No newline at end of file
      +}
      diff --git a/start.php b/bootstrap/start.php
      similarity index 95%
      rename from start.php
      rename to bootstrap/start.php
      index 1320a86c..25e90653 100644
      --- a/start.php
      +++ b/bootstrap/start.php
      @@ -24,9 +24,9 @@
       |
       */
       
      -$app->instance('path', $appPath = __DIR__.'/app');
      +$app->instance('path', $appPath = __DIR__.'/../app');
       
      -$app->instance('path.base', __DIR__);
      +$app->instance('path.base', __DIR__.'/..');
       
       /*
       |--------------------------------------------------------------------------
      @@ -69,4 +69,4 @@
       |
       */
       
      -return $app;
      \ No newline at end of file
      +return $app;
      diff --git a/public/index.php b/public/index.php
      index d11628e3..030db7d1 100644
      --- a/public/index.php
      +++ b/public/index.php
      @@ -34,7 +34,7 @@
       |
       */
       
      -$app = require_once __DIR__.'/../start.php';
      +$app = require_once __DIR__.'/../bootstrap/start.php';
       
       /*
       |--------------------------------------------------------------------------
      
      From 24e158e88929f397a4b418222bc23a1e619176ba Mon Sep 17 00:00:00 2001
      From: Ben Corlett <bencorlett@me.com>
      Date: Thu, 7 Feb 2013 10:58:28 +1100
      Subject: [PATCH 20/71] Adding bootstrap/paths.php to allow specification of
       custom paths for sections of Laravel.
      
      Signed-off-by: Ben Corlett <bencorlett@me.com>
      ---
       bootstrap/paths.php | 42 ++++++++++++++++++++++++++++++++++++++++++
       bootstrap/start.php | 15 +++++++++------
       composer.json       |  2 +-
       server.php          |  6 ++++--
       4 files changed, 56 insertions(+), 9 deletions(-)
       create mode 100644 bootstrap/paths.php
      
      diff --git a/bootstrap/paths.php b/bootstrap/paths.php
      new file mode 100644
      index 00000000..c4a965e7
      --- /dev/null
      +++ b/bootstrap/paths.php
      @@ -0,0 +1,42 @@
      +<?php
      +
      +return array(
      +
      +	/*
      +	|--------------------------------------------------------------------------
      +	| Application Path
      +	|--------------------------------------------------------------------------
      +	|
      +	| Here we just defined the path to the application directory. Most likely
      +	| you will never need to change this value as the default setup should
      +	| work perfectly fine for the vast majority of all our applications.
      +	|
      +	*/
      +
      +	'app' => __DIR__.'/../app',
      +
      +	/*
      +	|--------------------------------------------------------------------------
      +	| Public Path
      +	|--------------------------------------------------------------------------
      +	|
      +	| We understand that not all hosting environments allow flexibility with
      +	| public paths. That's why we allow you to change where your public path
      +	| is below.
      +	|
      +	*/
      +
      +	'public' => __DIR__.'/../public',
      +
      +	/*
      +	|-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
      +	| Base Path
      +	|-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
      +	|
      +	| You probably shouldn't be editing this.
      +	|
      +	*/
      +
      +	'base' => __DIR__.'/..',
      +
      +);
      diff --git a/bootstrap/start.php b/bootstrap/start.php
      index 25e90653..643e1017 100644
      --- a/bootstrap/start.php
      +++ b/bootstrap/start.php
      @@ -15,18 +15,21 @@
       
       /*
       |--------------------------------------------------------------------------
      -| Define The Application Path
      +| Bind Paths
       |--------------------------------------------------------------------------
       |
      -| Here we just defined the path to the application directory. Most likely
      -| you will never need to change this value as the default setup should
      -| work perfectly fine for the vast majority of all our applications.
      +| Here we are binding the paths configured in paths.php to the app. You
      +| should not be changing these here but rather in paths.php.
       |
       */
       
      -$app->instance('path', $appPath = __DIR__.'/../app');
      +$paths = require __DIR__.'/paths.php';
       
      -$app->instance('path.base', __DIR__.'/..');
      +$app->instance('path', $appPath = $paths['app']);
      +
      +$app->instance('path.base', $paths['base']);
      +
      +$app->instance('path.public', $paths['public']);
       
       /*
       |--------------------------------------------------------------------------
      diff --git a/composer.json b/composer.json
      index d4a91bf9..9afd6c00 100644
      --- a/composer.json
      +++ b/composer.json
      @@ -12,4 +12,4 @@
       		]
       	},
       	"minimum-stability": "dev"
      -}
      \ No newline at end of file
      +}
      diff --git a/server.php b/server.php
      index 2084099c..5f187f34 100644
      --- a/server.php
      +++ b/server.php
      @@ -4,7 +4,9 @@
       
       $uri = urldecode($uri);
       
      -$requested = __DIR__.'/public'.$uri;
      +$paths = require __DIR__.'/bootstrap/paths.php';
      +
      +$requested = $paths['public'].$uri;
       
       // This file allows us to emulate Apache's "mod_rewrite" functionality from the
       // built-in PHP web server. This provides a convenient way to test a Laravel
      @@ -14,4 +16,4 @@
       	return false;
       }
       
      -require_once(__DIR__ . '/public/index.php');
      \ No newline at end of file
      +require_once $paths['public'].'/index.php';
      
      From c07f552c7045d2c3f005f28ccfd8a7487c7f340c Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Wed, 6 Feb 2013 22:04:36 -0600
      Subject: [PATCH 21/71] cleaning up comments for my ocd.
      
      ---
       bootstrap/paths.php | 16 +++++++++-------
       bootstrap/start.php | 37 +++++++++++++++++++------------------
       2 files changed, 28 insertions(+), 25 deletions(-)
      
      diff --git a/bootstrap/paths.php b/bootstrap/paths.php
      index c4a965e7..8d2fd971 100644
      --- a/bootstrap/paths.php
      +++ b/bootstrap/paths.php
      @@ -20,20 +20,22 @@
       	| Public Path
       	|--------------------------------------------------------------------------
       	|
      -	| We understand that not all hosting environments allow flexibility with
      -	| public paths. That's why we allow you to change where your public path
      -	| is below.
      +	| The public path contains the assets for your web application, such as
      +	| your JavaScript and CSS files, and also contains the primary entry
      +	| point for web requests into these applications from the outside.
       	|
       	*/
       
       	'public' => __DIR__.'/../public',
       
       	/*
      -	|-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
      -	| Base Path
      -	|-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
      +	|--------------------------------------------------------------------------
      +	| Public Path
      +	|--------------------------------------------------------------------------
       	|
      -	| You probably shouldn't be editing this.
      +	| The base path is the root of the Laravel installation. Most likely you
      +	| will not need to change this value. But, if for some wild reason it
      +	| is necessary you will do so here, just proceed with some caution.
       	|
       	*/
       
      diff --git a/bootstrap/start.php b/bootstrap/start.php
      index 643e1017..bd903538 100644
      --- a/bootstrap/start.php
      +++ b/bootstrap/start.php
      @@ -13,24 +13,6 @@
       
       $app = new Illuminate\Foundation\Application;
       
      -/*
      -|--------------------------------------------------------------------------
      -| Bind Paths
      -|--------------------------------------------------------------------------
      -|
      -| Here we are binding the paths configured in paths.php to the app. You
      -| should not be changing these here but rather in paths.php.
      -|
      -*/
      -
      -$paths = require __DIR__.'/paths.php';
      -
      -$app->instance('path', $appPath = $paths['app']);
      -
      -$app->instance('path.base', $paths['base']);
      -
      -$app->instance('path.public', $paths['public']);
      -
       /*
       |--------------------------------------------------------------------------
       | Detect The Application Environment
      @@ -48,6 +30,25 @@
       
       ));
       
      +/*
      +|--------------------------------------------------------------------------
      +| Bind Paths
      +|--------------------------------------------------------------------------
      +|
      +| Here we are binding the paths configured in paths.php to the app. You
      +| should not be changing these here. If you need to change these you
      +| may do so within the paths.php file and they will be bound here.
      +|
      +*/
      +
      +$paths = require __DIR__.'/paths.php';
      +
      +$app->instance('path', $appPath = $paths['app']);
      +
      +$app->instance('path.base', $paths['base']);
      +
      +$app->instance('path.public', $paths['public']);
      +
       /*
       |--------------------------------------------------------------------------
       | Load The Application
      
      From 59d6d74a2305c90c1a24a2aedc76ad6a2a489d9d Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Wed, 6 Feb 2013 22:11:29 -0600
      Subject: [PATCH 22/71] clean up start file.
      
      ---
       bootstrap/start.php | 8 +-------
       1 file changed, 1 insertion(+), 7 deletions(-)
      
      diff --git a/bootstrap/start.php b/bootstrap/start.php
      index bd903538..bf3cc6b3 100644
      --- a/bootstrap/start.php
      +++ b/bootstrap/start.php
      @@ -41,13 +41,7 @@
       |
       */
       
      -$paths = require __DIR__.'/paths.php';
      -
      -$app->instance('path', $appPath = $paths['app']);
      -
      -$app->instance('path.base', $paths['base']);
      -
      -$app->instance('path.public', $paths['public']);
      +$app->bindInstallPaths(require __DIR__.'/paths.php');
       
       /*
       |--------------------------------------------------------------------------
      
      From ce0a7f654511216fc9a3c9b8e7bc2a8b2069fa69 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Thu, 7 Feb 2013 08:53:07 -0600
      Subject: [PATCH 23/71] fix typo.
      
      ---
       bootstrap/paths.php | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/bootstrap/paths.php b/bootstrap/paths.php
      index 8d2fd971..19f47434 100644
      --- a/bootstrap/paths.php
      +++ b/bootstrap/paths.php
      @@ -30,7 +30,7 @@
       
       	/*
       	|--------------------------------------------------------------------------
      -	| Public Path
      +	| Base Path
       	|--------------------------------------------------------------------------
       	|
       	| The base path is the root of the Laravel installation. Most likely you
      
      From 25ad84b1f3a1dc22c91b8060e73127e2d376e6cd Mon Sep 17 00:00:00 2001
      From: Bruno Gaspar <brunofgaspar1@gmail.com>
      Date: Thu, 7 Feb 2013 17:49:21 +0000
      Subject: [PATCH 24/71] convert spaces to tabs
      
      ---
       app/config/database.php | 4 ++--
       1 file changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/app/config/database.php b/app/config/database.php
      index d811e9aa..c154f767 100644
      --- a/app/config/database.php
      +++ b/app/config/database.php
      @@ -71,7 +71,7 @@
       			'password' => '',
       			'charset'  => 'utf8',
       			'prefix'   => '',
      -            'schema'   => 'public',
      +			'schema'   => 'public',
       		),
       
       		'sqlsrv' => array(
      @@ -119,4 +119,4 @@
       
       	),
       
      -);
      \ No newline at end of file
      +);
      
      From 6c40ce69fb9672e4b84598560a185a019eacbf29 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Thu, 7 Feb 2013 14:51:28 -0600
      Subject: [PATCH 25/71] setup seeder.
      
      ---
       app/config/app.php                    |  1 +
       app/database/seeds/DatabaseSeeder.php | 15 +++++++++++++++
       app/start/global.php                  |  1 +
       composer.json                         |  1 +
       4 files changed, 18 insertions(+)
       create mode 100644 app/database/seeds/DatabaseSeeder.php
      
      diff --git a/app/config/app.php b/app/config/app.php
      index 73c2faf9..298134e6 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -167,6 +167,7 @@
       		'Response'        => 'Illuminate\Support\Facades\Response',
       		'Route'           => 'Illuminate\Support\Facades\Route',
       		'Schema'          => 'Illuminate\Support\Facades\Schema',
      +		'Seeder'          => 'Illuminate\Database\Seeder',
       		'Session'         => 'Illuminate\Support\Facades\Session',
       		'URL'             => 'Illuminate\Support\Facades\URL',
       		'Validator'       => 'Illuminate\Support\Facades\Validator',
      diff --git a/app/database/seeds/DatabaseSeeder.php b/app/database/seeds/DatabaseSeeder.php
      new file mode 100644
      index 00000000..8a3cacc1
      --- /dev/null
      +++ b/app/database/seeds/DatabaseSeeder.php
      @@ -0,0 +1,15 @@
      +<?php
      +
      +class DatabaseSeeder extends Seeder {
      +
      +	/**
      +	 * Run the database seeds.
      +	 *
      +	 * @return void
      +	 */
      +	public function run()
      +	{
      +		// $this->call('UserTableSeeder');
      +	}
      +
      +}
      \ No newline at end of file
      diff --git a/app/start/global.php b/app/start/global.php
      index c6bad0d1..2b0af430 100644
      --- a/app/start/global.php
      +++ b/app/start/global.php
      @@ -15,6 +15,7 @@
       
       	app_path().'/controllers',
       	app_path().'/models',
      +	app_path().'/database/seeds',
       
       ));
       
      diff --git a/composer.json b/composer.json
      index 9afd6c00..2b59484f 100644
      --- a/composer.json
      +++ b/composer.json
      @@ -8,6 +8,7 @@
       			"app/controllers",
       			"app/models",
       			"app/database/migrations",
      +			"app/database/seeds",
       			"app/tests/TestCase.php"
       		]
       	},
      
      From 5d409fe0d5f724ba110b6ec15c0e22610581a4a3 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Thu, 7 Feb 2013 16:42:54 -0600
      Subject: [PATCH 26/71] remove unneeded alias.
      
      ---
       app/config/app.php | 1 -
       1 file changed, 1 deletion(-)
      
      diff --git a/app/config/app.php b/app/config/app.php
      index 298134e6..1697b8e2 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -151,7 +151,6 @@
       		'DB'              => 'Illuminate\Support\Facades\DB',
       		'Eloquent'        => 'Illuminate\Database\Eloquent\Model',
       		'Event'           => 'Illuminate\Support\Facades\Event',
      -		'EventSubscriber' => 'Illuminate\Events\Subscriber',
       		'File'            => 'Illuminate\Support\Facades\File',
       		'Hash'            => 'Illuminate\Support\Facades\Hash',
       		'Input'           => 'Illuminate\Support\Facades\Input',
      
      From 4355a334f754fff68093e0c17d0bfc43cc6ecd7e Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Fri, 8 Feb 2013 09:31:43 -0600
      Subject: [PATCH 27/71] update session config.
      
      ---
       app/config/session.php | 15 ++++++++++++++-
       1 file changed, 14 insertions(+), 1 deletion(-)
      
      diff --git a/app/config/session.php b/app/config/session.php
      index 188c8c7c..3ba07f17 100644
      --- a/app/config/session.php
      +++ b/app/config/session.php
      @@ -83,4 +83,17 @@
       
       	'lottery' => array(2, 100),
       
      -);
      +	/*
      +	|--------------------------------------------------------------------------
      +	| Session Cookie Name
      +	|--------------------------------------------------------------------------
      +	|
      +	| Here you may change the name of the cookie used to identify a session
      +	| instance by ID. The name specified here will get used every time a
      +	| new session cookie is created by the framework for every driver.
      +	|
      +	*/
      +
      +	'cookie' => 'laravel_session',
      +
      +);
      \ No newline at end of file
      
      From 6674b34a644172bfc362d2e8c8cc2d7a486f95f0 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Fri, 8 Feb 2013 11:14:17 -0600
      Subject: [PATCH 28/71] update log file name to include sapi name.
      
      ---
       app/start/global.php | 4 +++-
       1 file changed, 3 insertions(+), 1 deletion(-)
      
      diff --git a/app/start/global.php b/app/start/global.php
      index 2b0af430..d9bd0b9c 100644
      --- a/app/start/global.php
      +++ b/app/start/global.php
      @@ -30,7 +30,9 @@
       |
       */
       
      -Log::useDailyFiles(__DIR__.'/../storage/logs/log.txt');
      +$logFile = 'log-'.php_sapi_name().'.txt';
      +
      +Log::useDailyFiles(__DIR__.'/../storage/logs/'.$logFile);
       
       /*
       |--------------------------------------------------------------------------
      
      From df319a2178da3a7d28e014f8d70c41364d56835c Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Fri, 8 Feb 2013 14:24:18 -0600
      Subject: [PATCH 29/71] added a reminders language file.
      
      ---
       app/lang/en/pagination.php |  1 +
       app/lang/en/reminders.php  | 22 ++++++++++++++++++++++
       2 files changed, 23 insertions(+)
       create mode 100644 app/lang/en/reminders.php
      
      diff --git a/app/lang/en/pagination.php b/app/lang/en/pagination.php
      index c889ea3b..eb9be3ba 100644
      --- a/app/lang/en/pagination.php
      +++ b/app/lang/en/pagination.php
      @@ -14,6 +14,7 @@
       	*/
       
       	'previous' => '&laquo; Previous',
      +
       	'next'     => 'Next &raquo;',
       
       );
      \ No newline at end of file
      diff --git a/app/lang/en/reminders.php b/app/lang/en/reminders.php
      new file mode 100644
      index 00000000..4a9f1766
      --- /dev/null
      +++ b/app/lang/en/reminders.php
      @@ -0,0 +1,22 @@
      +<?php
      +
      +return array(
      +
      +	/*
      +	|--------------------------------------------------------------------------
      +	| Password Reminder Language Lines
      +	|--------------------------------------------------------------------------
      +	|
      +	| The following language lines are the default lines which match reasons
      +	| that are given by the password broker for a password update attempt
      +	| has failed, such as for an invalid token or invalid new password.
      +	|
      +	*/
      +
      +	"password" => "Passwords must be six characters and match the confirmation.",
      +
      +	"user"     => "We can't find a user with that e-mail address.",
      +
      +	"token"    => "This password reset token is invalid.",
      +
      +);
      \ No newline at end of file
      
      From 3ad5edcc109e09143cf15bb49cc7beec35b072a0 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Fri, 8 Feb 2013 14:49:12 -0600
      Subject: [PATCH 30/71] adding a default password reminder e-mail.
      
      ---
       app/config/auth.php                      |  2 +-
       app/views/emails/auth/reminder.blade.php | 13 +++++++++++++
       2 files changed, 14 insertions(+), 1 deletion(-)
       create mode 100644 app/views/emails/auth/reminder.blade.php
      
      diff --git a/app/config/auth.php b/app/config/auth.php
      index f39e3259..62ea9c3d 100644
      --- a/app/config/auth.php
      +++ b/app/config/auth.php
      @@ -56,7 +56,7 @@
       
       	'reminder' => array(
       
      -		'email' => 'auth.password', 'table' => 'password_reminders',
      +		'email' => 'emails.auth.reminder', 'table' => 'password_reminders',
       
       	),
       
      diff --git a/app/views/emails/auth/reminder.blade.php b/app/views/emails/auth/reminder.blade.php
      new file mode 100644
      index 00000000..2976327b
      --- /dev/null
      +++ b/app/views/emails/auth/reminder.blade.php
      @@ -0,0 +1,13 @@
      +<!DOCTYPE html>
      +<html lang="en-US">
      +	<head>
      +		<meta charset="utf-8">
      +	</head>
      +	<body>
      +		<h2>Password Reset</h2>
      +
      +		<div>
      +			To reset your password, complete this form: {{ URL::to('password/reset', array($token)) }}.
      +		</div>
      +	</body>
      +</html>
      \ No newline at end of file
      
      From 96237d884e75c9fcadf945c9bf6516bf27c70b2e Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Tue, 12 Feb 2013 22:23:48 -0600
      Subject: [PATCH 31/71] update queue config with sqs example.
      
      ---
       app/config/queue.php | 10 +++++++++-
       1 file changed, 9 insertions(+), 1 deletion(-)
      
      diff --git a/app/config/queue.php b/app/config/queue.php
      index 5dc5cb0c..ea05a839 100644
      --- a/app/config/queue.php
      +++ b/app/config/queue.php
      @@ -15,7 +15,7 @@
       	|
       	*/
       
      -	'default' => 'sync',
      +	'default' => 'sqs',
       
       	/*
       	|--------------------------------------------------------------------------
      @@ -40,6 +40,14 @@
       			'queue'  => 'default',
       		),
       
      +		'sqs' => array(
      +			'driver' => 'sqs',
      +			'key'    => 'your-public-key',
      +			'secret' => 'your-secret-key',
      +			'queue'  => 'your-queue-url',
      +			'region' => 'us-east-1',
      +		),
      +
       	),
       
       );
      \ No newline at end of file
      
      From 5c42c5d2e63157b274ce10bfb767663f02baaa14 Mon Sep 17 00:00:00 2001
      From: Davide Bellini <bellini.davide@gmail.com>
      Date: Wed, 13 Feb 2013 12:28:56 +0100
      Subject: [PATCH 32/71] Added "Not In" rule translation (fix issue #1701)
      
      ---
       app/lang/en/validation.php | 3 ++-
       1 file changed, 2 insertions(+), 1 deletion(-)
      
      diff --git a/app/lang/en/validation.php b/app/lang/en/validation.php
      index a67a1148..86560b70 100644
      --- a/app/lang/en/validation.php
      +++ b/app/lang/en/validation.php
      @@ -35,6 +35,7 @@
       	"exists"          => "The selected :attribute is invalid.",
       	"image"           => "The :attribute must be an image.",
       	"in"              => "The selected :attribute is invalid.",
      +	"not_in"          => "The selected :attribute is invalid.",
       	"integer"         => "The :attribute must be an integer.",
       	"ip"              => "The :attribute must be a valid IP address.",
       	"match"           => "The :attribute format is invalid.",
      @@ -88,4 +89,4 @@
       
       	'attributes' => array(),
       
      -);
      \ No newline at end of file
      +);
      
      From 32df1b62d3b72c5f8ff06bec70d9f5e75c21eb24 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Wed, 13 Feb 2013 14:01:47 -0600
      Subject: [PATCH 33/71] added Str alias.
      
      ---
       app/config/app.php | 1 +
       1 file changed, 1 insertion(+)
      
      diff --git a/app/config/app.php b/app/config/app.php
      index 1697b8e2..be62a05c 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -168,6 +168,7 @@
       		'Schema'          => 'Illuminate\Support\Facades\Schema',
       		'Seeder'          => 'Illuminate\Database\Seeder',
       		'Session'         => 'Illuminate\Support\Facades\Session',
      +		'Str'             => 'Illuminate\Support\Str',
       		'URL'             => 'Illuminate\Support\Facades\URL',
       		'Validator'       => 'Illuminate\Support\Facades\Validator',
       		'View'            => 'Illuminate\Support\Facades\View',
      
      From 79d18a3122e4211b3f8b32587df34cae20bb070c Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Thu, 14 Feb 2013 08:32:38 -0600
      Subject: [PATCH 34/71] Update app/config/session.php
      
      ---
       app/config/session.php | 4 ++--
       1 file changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/app/config/session.php b/app/config/session.php
      index 3ba07f17..09842d36 100644
      --- a/app/config/session.php
      +++ b/app/config/session.php
      @@ -8,7 +8,7 @@
       	|--------------------------------------------------------------------------
       	|
       	| This option controls the default session "driver" that will be used on
      -	| requets. By default, we will use the light-weight cookie driver but
      +	| requests. By default we will use the light-weight cookie driver but
       	| you may specify any of the other wonderful drivers provided here.
       	|
       	| Supported: "cookie", file", "database", "apc",
      @@ -96,4 +96,4 @@
       
       	'cookie' => 'laravel_session',
       
      -);
      \ No newline at end of file
      +);
      
      From efb30de6c31e2b92990f87b9e6452cdee8534328 Mon Sep 17 00:00:00 2001
      From: Brian Kiewel <brian.kiewel@gmail.com>
      Date: Sat, 16 Feb 2013 23:30:12 -0700
      Subject: [PATCH 35/71] small typo fix in readme
      
      ---
       readme.md | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/readme.md b/readme.md
      index 001ecb60..45bd6324 100644
      --- a/readme.md
      +++ b/readme.md
      @@ -10,4 +10,4 @@ ### Contributing To Laravel
       
       ### License
       
      -The Laravel framework is open-sourced software license under the [MIT license](http://opensource.org/licenses/MIT)
      \ No newline at end of file
      +The Laravel framework is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT)
      \ No newline at end of file
      
      From 69911f29cd85b35ac383a9dc6d2b28c036504ec3 Mon Sep 17 00:00:00 2001
      From: Zack Kitzmiller <zackkitzmiller@gmail.com>
      Date: Mon, 18 Feb 2013 11:03:17 -0500
      Subject: [PATCH 36/71] default queue should be synchronous.
      
      ---
       app/config/queue.php | 4 ++--
       1 file changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/app/config/queue.php b/app/config/queue.php
      index ea05a839..17848306 100644
      --- a/app/config/queue.php
      +++ b/app/config/queue.php
      @@ -15,7 +15,7 @@
       	|
       	*/
       
      -	'default' => 'sqs',
      +	'default' => 'sync',
       
       	/*
       	|--------------------------------------------------------------------------
      @@ -50,4 +50,4 @@
       
       	),
       
      -);
      \ No newline at end of file
      +);
      
      From 6d3eabf9b1fa5fd270dffd8674b4160860abbb32 Mon Sep 17 00:00:00 2001
      From: Ben Corlett <bencorlett@me.com>
      Date: Fri, 22 Feb 2013 14:49:15 -0500
      Subject: [PATCH 37/71] Remove tabs / spaces mix.
      
      ---
       app/tests/TestCase.php | 20 ++++++++++----------
       1 file changed, 10 insertions(+), 10 deletions(-)
      
      diff --git a/app/tests/TestCase.php b/app/tests/TestCase.php
      index 8b1ef7da..c7de5f7a 100644
      --- a/app/tests/TestCase.php
      +++ b/app/tests/TestCase.php
      @@ -3,17 +3,17 @@
       class TestCase extends Illuminate\Foundation\Testing\TestCase {
       
           /**
      -     * Creates the application.
      -     *
      -     * @return Symfony\Component\HttpKernel\HttpKernelInterface
      -     */
      -    public function createApplication()
      -    {
      -    	$unitTesting = true;
      +	 * Creates the application.
      +	 *
      +	 * @return Symfony\Component\HttpKernel\HttpKernelInterface
      +	 */
      +	public function createApplication()
      +	{
      +		$unitTesting = true;
       
      -        $testEnvironment = 'testing';
      +		$testEnvironment = 'testing';
       
      -    	return require __DIR__.'/../../bootstrap/start.php';
      -    }
      +		return require __DIR__.'/../../bootstrap/start.php';
      +	}
       
       }
      
      From 597c6f183113e1b276a1a65f8fdcb53acd676297 Mon Sep 17 00:00:00 2001
      From: Ben Corlett <bencorlett@me.com>
      Date: Fri, 22 Feb 2013 16:47:09 -0500
      Subject: [PATCH 38/71] Update app/tests/TestCase.php
      
      ---
       app/tests/TestCase.php | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/app/tests/TestCase.php b/app/tests/TestCase.php
      index c7de5f7a..49b80fc2 100644
      --- a/app/tests/TestCase.php
      +++ b/app/tests/TestCase.php
      @@ -2,7 +2,7 @@
       
       class TestCase extends Illuminate\Foundation\Testing\TestCase {
       
      -    /**
      +	/**
       	 * Creates the application.
       	 *
       	 * @return Symfony\Component\HttpKernel\HttpKernelInterface
      
      From c45ef54c5867fec7e604d652b2bc13012370fbb6 Mon Sep 17 00:00:00 2001
      From: Bering <bering@ringlogic.com>
      Date: Fri, 22 Feb 2013 17:25:49 -0500
      Subject: [PATCH 39/71] Fixes the validation error message for regex validation
       rule
      
      ---
       app/lang/en/validation.php | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/app/lang/en/validation.php b/app/lang/en/validation.php
      index a67a1148..1d0fb8c0 100644
      --- a/app/lang/en/validation.php
      +++ b/app/lang/en/validation.php
      @@ -37,7 +37,6 @@
       	"in"              => "The selected :attribute is invalid.",
       	"integer"         => "The :attribute must be an integer.",
       	"ip"              => "The :attribute must be a valid IP address.",
      -	"match"           => "The :attribute format is invalid.",
       	"max"             => array(
       		"numeric"     => "The :attribute must be less than :max.",
       		"file"        => "The :attribute must be less than :max kilobytes.",
      @@ -51,6 +50,7 @@
       	),
       	"notin"           => "The selected :attribute is invalid.",
       	"numeric"         => "The :attribute must be a number.",
      +	"regex"           => "The :attribute format is invalid.",
       	"required"        => "The :attribute field is required.",
       	"required_with"   => "The :attribute field is required when :values is present.",
       	"same"            => "The :attribute and :other must match.",
      
      From 05cb4ca2765b2e8769d764d95013f2476265b558 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Wed, 27 Feb 2013 22:26:58 -0600
      Subject: [PATCH 40/71] added form service provider and aliases.
      
      ---
       app/config/app.php | 3 +++
       1 file changed, 3 insertions(+)
      
      diff --git a/app/config/app.php b/app/config/app.php
      index be62a05c..f6b8ad04 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -92,6 +92,7 @@
       		'Illuminate\Encryption\EncryptionServiceProvider',
       		'Illuminate\Filesystem\FilesystemServiceProvider',
       		'Illuminate\Hashing\HashServiceProvider',
      +		'Illuminate\Html\HtmlServiceProvider',
       		'Illuminate\Foundation\Providers\KeyGeneratorServiceProvider',
       		'Illuminate\Log\LogServiceProvider',
       		'Illuminate\Mail\MailServiceProvider',
      @@ -152,7 +153,9 @@
       		'Eloquent'        => 'Illuminate\Database\Eloquent\Model',
       		'Event'           => 'Illuminate\Support\Facades\Event',
       		'File'            => 'Illuminate\Support\Facades\File',
      +		'Form'            => 'Illuminate\Support\Facades\Form',
       		'Hash'            => 'Illuminate\Support\Facades\Hash',
      +		'Html'            => 'Illuminate\Html\HtmlBuilder',
       		'Input'           => 'Illuminate\Support\Facades\Input',
       		'Lang'            => 'Illuminate\Support\Facades\Lang',
       		'Log'             => 'Illuminate\Support\Facades\Log',
      
      From 457e76a470bd0b1df51df116f3c5eaad2a8b7d53 Mon Sep 17 00:00:00 2001
      From: Dries Vints <dries.vints@gmail.com>
      Date: Tue, 5 Mar 2013 15:41:03 +0100
      Subject: [PATCH 41/71] Add sqs to list of supported drivers
      
      Just forgotten I presume.
      ---
       app/config/queue.php | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/app/config/queue.php b/app/config/queue.php
      index 17848306..030c51c6 100644
      --- a/app/config/queue.php
      +++ b/app/config/queue.php
      @@ -11,7 +11,7 @@
       	| API, giving you convenient access to each back-end using the same
       	| syntax for each one. Here you may set the default queue driver.
       	|
      -	| Supported: "sync", "beanstalkd"
      +	| Supported: "sync", "beanstalkd", "sqs"
       	|
       	*/
       
      
      From 2a14998be997329ebb86cff5b64df76d00446241 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Fri, 8 Mar 2013 10:52:24 -0600
      Subject: [PATCH 42/71] fire app shutdown event.
      
      ---
       artisan          | 13 +++++++++++++
       public/index.php | 13 +++++++++++++
       2 files changed, 26 insertions(+)
      
      diff --git a/artisan b/artisan
      index ce2189de..686d2d3b 100644
      --- a/artisan
      +++ b/artisan
      @@ -57,3 +57,16 @@ $artisan = Illuminate\Console\Application::start($app);
       */
       
       $artisan->run();
      +
      +/*
      +|--------------------------------------------------------------------------
      +| Shutdown The Application
      +|--------------------------------------------------------------------------
      +|
      +| Once Artisan has finished running. We will fire off the shutdown events
      +| so that any final work may be done by the application before we shut
      +| down the process. This is the last thing to happen to the request.
      +|
      +*/
      +
      +$app->shutdown();
      \ No newline at end of file
      diff --git a/public/index.php b/public/index.php
      index 030db7d1..8d81361b 100644
      --- a/public/index.php
      +++ b/public/index.php
      @@ -49,3 +49,16 @@
       */
       
       $app->run();
      +
      +/*
      +|--------------------------------------------------------------------------
      +| Shutdown The Application
      +|--------------------------------------------------------------------------
      +|
      +| Once Artisan has finished running. We will fire off the shutdown events
      +| so that any final work may be done by the application before we shut
      +| down the process. This is the last thing to happen to the request.
      +|
      +*/
      +
      +$app->shutdown();
      \ No newline at end of file
      
      From 6f92ee8efd69d04beedf4b70e226c1a2acf37e6f Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Mon, 11 Mar 2013 13:21:52 -0500
      Subject: [PATCH 43/71] Fix CSRF token bug.
      
      ---
       app/filters.php | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/app/filters.php b/app/filters.php
      index 2955f057..2276b4e2 100644
      --- a/app/filters.php
      +++ b/app/filters.php
      @@ -57,7 +57,7 @@
       
       Route::filter('csrf', function()
       {
      -	if (Session::getToken() != Input::get('csrf_token'))
      +	if (Session::getToken() != Input::get('_token'))
       	{
       		throw new Illuminate\Session\TokenMismatchException;
       	}
      
      From 5fac0f7b35e931a44a3685e7e5a7ddcc7d3be3e8 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Tue, 12 Mar 2013 08:23:38 -0500
      Subject: [PATCH 44/71] Added a sample IronMQ configuration.
      
      ---
       app/config/queue.php | 9 ++++++++-
       1 file changed, 8 insertions(+), 1 deletion(-)
      
      diff --git a/app/config/queue.php b/app/config/queue.php
      index 030c51c6..220998cb 100644
      --- a/app/config/queue.php
      +++ b/app/config/queue.php
      @@ -11,7 +11,7 @@
       	| API, giving you convenient access to each back-end using the same
       	| syntax for each one. Here you may set the default queue driver.
       	|
      -	| Supported: "sync", "beanstalkd", "sqs"
      +	| Supported: "sync", "beanstalkd", "sqs", "iron"
       	|
       	*/
       
      @@ -48,6 +48,13 @@
       			'region' => 'us-east-1',
       		),
       
      +		'iron' => array(
      +			'driver'  => 'iron',
      +			'project' => 'your-project-id',
      +			'token'   => 'your-token',
      +			'queue'   => 'your-queue-name',
      +		),
      +
       	),
       
       );
      
      From 216bc077332a18743a811739e9361998672fd262 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Wed, 13 Mar 2013 11:32:36 -0500
      Subject: [PATCH 45/71] Added new options to session config.
      
      ---
       app/config/session.php | 26 ++++++++++++++++++++++++++
       1 file changed, 26 insertions(+)
      
      diff --git a/app/config/session.php b/app/config/session.php
      index 09842d36..d4b81bef 100644
      --- a/app/config/session.php
      +++ b/app/config/session.php
      @@ -96,4 +96,30 @@
       
       	'cookie' => 'laravel_session',
       
      +	/*
      +	|--------------------------------------------------------------------------
      +	| Session Cookie Path
      +	|--------------------------------------------------------------------------
      +	|
      +	| The session cookie path determines the path for which the cookie will
      +	| be regarded as available. Typically, this will be the root path of
      +	| your application but you are free to change this when necessary.
      +	|
      +	*/
      +
      +	'path' => '/',
      +
      +	/*
      +	|--------------------------------------------------------------------------
      +	| Session Cookie Domain
      +	|--------------------------------------------------------------------------
      +	|
      +	| Here you may change the domain of the cookie used to identify a session
      +	| in your application. This will determine which domains the cookie is
      +	| available to in your application. A sensible default has been set.
      +	|
      +	*/
      +
      +	'domain' => null,
      +
       );
      
      From 4aaf9a8f2bf4c315a499b36e3d7311090b7d4a91 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Wed, 13 Mar 2013 11:56:39 -0500
      Subject: [PATCH 46/71] Exit with artisan status code.
      
      ---
       artisan | 6 ++++--
       1 file changed, 4 insertions(+), 2 deletions(-)
      
      diff --git a/artisan b/artisan
      index 686d2d3b..1c169f6d 100644
      --- a/artisan
      +++ b/artisan
      @@ -56,7 +56,7 @@ $artisan = Illuminate\Console\Application::start($app);
       |
       */
       
      -$artisan->run();
      +$status = $artisan->run();
       
       /*
       |--------------------------------------------------------------------------
      @@ -69,4 +69,6 @@ $artisan->run();
       |
       */
       
      -$app->shutdown();
      \ No newline at end of file
      +$app->shutdown();
      +
      +exit($status);
      \ No newline at end of file
      
      From 13adb44ddf947492ba057842219b1e3a6118263a Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Wed, 13 Mar 2013 13:29:10 -0500
      Subject: [PATCH 47/71] Rename path to files.
      
      ---
       app/config/session.php | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/app/config/session.php b/app/config/session.php
      index d4b81bef..910591e2 100644
      --- a/app/config/session.php
      +++ b/app/config/session.php
      @@ -42,7 +42,7 @@
       	|
       	*/
       
      -	'path' => __DIR__.'/../storage/sessions',
      +	'files' => __DIR__.'/../storage/sessions',
       
       	/*
       	|--------------------------------------------------------------------------
      
      From b8008ff7b309fb93c1d8671b113986365bbbc073 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Wed, 13 Mar 2013 16:40:10 -0500
      Subject: [PATCH 48/71] Fix comment.
      
      ---
       public/index.php | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/public/index.php b/public/index.php
      index 8d81361b..b16ebf0b 100644
      --- a/public/index.php
      +++ b/public/index.php
      @@ -55,7 +55,7 @@
       | Shutdown The Application
       |--------------------------------------------------------------------------
       |
      -| Once Artisan has finished running. We will fire off the shutdown events
      +| Once the app has finished running. We will fire off the shutdown events
       | so that any final work may be done by the application before we shut
       | down the process. This is the last thing to happen to the request.
       |
      
      From 0c0b68e3957a42ac4b6ce551e850647ae3dbeae7 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Wed, 13 Mar 2013 20:12:34 -0500
      Subject: [PATCH 49/71] Added payload configuration option.
      
      ---
       app/config/session.php | 13 +++++++++++++
       1 file changed, 13 insertions(+)
      
      diff --git a/app/config/session.php b/app/config/session.php
      index 910591e2..fbd506e9 100644
      --- a/app/config/session.php
      +++ b/app/config/session.php
      @@ -122,4 +122,17 @@
       
       	'domain' => null,
       
      +	/*
      +	|--------------------------------------------------------------------------
      +	| Session Payload Cookie Name
      +	|--------------------------------------------------------------------------
      +	|
      +	| When using the "cookie" session driver, you may configure the name of
      +	| the cookie used as the session "payload". This cookie actually has
      +	| the encrypted session data stored within it for the application.
      +	|
      +	*/
      +
      +	'payload' => 'laravel_payload',
      +
       );
      
      From 13d7adb38fc2e4490184ad01f3601101b7186340 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Fri, 15 Mar 2013 22:22:11 -0500
      Subject: [PATCH 50/71] Update for optimize command.
      
      ---
       .gitignore             |  1 +
       app/config/app.php     |  1 +
       app/config/compile.php | 18 ++++++++++++++++++
       bootstrap/autoload.php | 17 +++++++++++++++++
       4 files changed, 37 insertions(+)
       create mode 100644 app/config/compile.php
      
      diff --git a/.gitignore b/.gitignore
      index 2c1fc0c1..ba8704c5 100644
      --- a/.gitignore
      +++ b/.gitignore
      @@ -1,3 +1,4 @@
      +/bootstrap/compiled.php
       /vendor
       composer.phar
       composer.lock
      diff --git a/app/config/app.php b/app/config/app.php
      index f6b8ad04..4b6530da 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -97,6 +97,7 @@
       		'Illuminate\Log\LogServiceProvider',
       		'Illuminate\Mail\MailServiceProvider',
       		'Illuminate\Database\MigrationServiceProvider',
      +		'Illuminate\Foundation\Providers\OptimizeServiceProvider',
       		'Illuminate\Pagination\PaginationServiceProvider',
       		'Illuminate\Foundation\Providers\PublisherServiceProvider',
       		'Illuminate\Queue\QueueServiceProvider',
      diff --git a/app/config/compile.php b/app/config/compile.php
      new file mode 100644
      index 00000000..54d7185b
      --- /dev/null
      +++ b/app/config/compile.php
      @@ -0,0 +1,18 @@
      +<?php
      +
      +return array(
      +
      +	/*
      +	|--------------------------------------------------------------------------
      +	| Additional Compiled Classes
      +	|--------------------------------------------------------------------------
      +	|
      +	| Here you may specify additional classes to include in the compiled file
      +	| generated by the `artisan optimize` command. These should be classes
      +	| that are included on basically every request into the application.
      +	|
      +	*/
      +
      +
      +
      +);
      \ No newline at end of file
      diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php
      index 461a1a80..ee441c0a 100644
      --- a/bootstrap/autoload.php
      +++ b/bootstrap/autoload.php
      @@ -14,6 +14,23 @@
       
       require __DIR__.'/../vendor/autoload.php';
       
      +/*
      +|--------------------------------------------------------------------------
      +| Register The Composer Auto Loader
      +|--------------------------------------------------------------------------
      +|
      +| Composer provides a convenient, automatically generated class loader
      +| for our application. We just need to utilize it! We'll require it
      +| into the script here so that we do not have to worry about the
      +| loading of any our classes "manually". Feels great to relax.
      +|
      +*/
      +
      +if (file_exists($compiled = __DIR__.'/compiled.php'))
      +{
      +	require $compiled;
      +}
      +
       /*
       |--------------------------------------------------------------------------
       | Register The Laravel Auto Loader
      
      From 36e7b132d4602428eba497b8a782e8b398c9c3a3 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Sat, 16 Mar 2013 09:05:37 -0500
      Subject: [PATCH 51/71] Setup composer post update script to run php artisan
       optimize.
      
      ---
       composer.json | 3 +++
       1 file changed, 3 insertions(+)
      
      diff --git a/composer.json b/composer.json
      index 2b59484f..ae7555e9 100644
      --- a/composer.json
      +++ b/composer.json
      @@ -12,5 +12,8 @@
       			"app/tests/TestCase.php"
       		]
       	},
      +	"scripts": {
      +		"post-update-cmd": "php artisan optimize"
      +	},
       	"minimum-stability": "dev"
       }
      
      From b5b7f719647d0cad508d3450b6e9087a02dc8535 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Sun, 17 Mar 2013 14:39:11 -0500
      Subject: [PATCH 52/71] Fix comment.
      
      ---
       bootstrap/autoload.php | 9 ++++-----
       1 file changed, 4 insertions(+), 5 deletions(-)
      
      diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php
      index ee441c0a..b2043b78 100644
      --- a/bootstrap/autoload.php
      +++ b/bootstrap/autoload.php
      @@ -16,13 +16,12 @@
       
       /*
       |--------------------------------------------------------------------------
      -| Register The Composer Auto Loader
      +| Include The Compiled Class File
       |--------------------------------------------------------------------------
       |
      -| Composer provides a convenient, automatically generated class loader
      -| for our application. We just need to utilize it! We'll require it
      -| into the script here so that we do not have to worry about the
      -| loading of any our classes "manually". Feels great to relax.
      +| To dramatically increase your application's performance, you may use a
      +| compiled class file which contains all of the classes commonly used
      +| by a request. The Artisan "optimize" is used to create this file.
       |
       */
       
      
      From b6a94c02165cf7a40d8c778f470f3dc0e14312f4 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Mon, 18 Mar 2013 13:37:05 -0500
      Subject: [PATCH 53/71] Added new workbench config file.
      
      ---
       app/config/workbench.php | 31 +++++++++++++++++++++++++++++++
       1 file changed, 31 insertions(+)
       create mode 100644 app/config/workbench.php
      
      diff --git a/app/config/workbench.php b/app/config/workbench.php
      new file mode 100644
      index 00000000..623cd192
      --- /dev/null
      +++ b/app/config/workbench.php
      @@ -0,0 +1,31 @@
      +<?php
      +
      +return array(
      +
      +	/*
      +	|--------------------------------------------------------------------------
      +	| Workbench Author Name
      +	|--------------------------------------------------------------------------
      +	|
      +	| When you create new packages via the Artisan "workbench" command your
      +	| name is needed to generate the composer.json file for your package.
      +	| You may specify it now so it is used for all of your workbenches.
      +	|
      +	*/
      +
      +	'name' => '',
      +
      +	/*
      +	|--------------------------------------------------------------------------
      +	| Workbench Author E-Mail Address
      +	|--------------------------------------------------------------------------
      +	|
      +	| Like the option above, your e-mail address is used when generating new
      +	| workbench packages. The e-mail is placed in your composer.json file
      +	| automatically whwen the package is created by the workbench tool.
      +	|
      +	*/
      +
      +	'email' => '',
      +
      +);
      \ No newline at end of file
      
      From 6253fe0ae57da093ba56f0c56024ef87efb3a9be Mon Sep 17 00:00:00 2001
      From: AndreiCanta <andrei.canta@deiu.ro>
      Date: Wed, 20 Mar 2013 11:36:11 +0200
      Subject: [PATCH 54/71] Typo: missing quotes in session.php doc block
      
      ---
       app/config/session.php | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/app/config/session.php b/app/config/session.php
      index fbd506e9..c37fd837 100644
      --- a/app/config/session.php
      +++ b/app/config/session.php
      @@ -11,7 +11,7 @@
       	| requests. By default we will use the light-weight cookie driver but
       	| you may specify any of the other wonderful drivers provided here.
       	|
      -	| Supported: "cookie", file", "database", "apc",
      +	| Supported: "cookie", "file", "database", "apc",
       	|            "memcached", "redis", "array"
       	|
       	*/
      
      From bcd165ff5e4e41c39d422ef0885cf582de7bec18 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Thu, 21 Mar 2013 13:46:19 -0500
      Subject: [PATCH 55/71] Fix validation language line.
      
      ---
       app/lang/en/validation.php | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/app/lang/en/validation.php b/app/lang/en/validation.php
      index 1d0fb8c0..e25756cd 100644
      --- a/app/lang/en/validation.php
      +++ b/app/lang/en/validation.php
      @@ -48,7 +48,7 @@
       		"file"        => "The :attribute must be at least :min kilobytes.",
       		"string"      => "The :attribute must be at least :min characters.",
       	),
      -	"notin"           => "The selected :attribute is invalid.",
      +	"not_in"           => "The selected :attribute is invalid.",
       	"numeric"         => "The :attribute must be a number.",
       	"regex"           => "The :attribute format is invalid.",
       	"required"        => "The :attribute field is required.",
      
      From 07d6915c3a7a0453fd4341755477b28bef9f2793 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Thu, 21 Mar 2013 14:09:31 -0500
      Subject: [PATCH 56/71] Added a default robots.txt file.
      
      ---
       public/robots.txt | 1 +
       1 file changed, 1 insertion(+)
       create mode 100644 public/robots.txt
      
      diff --git a/public/robots.txt b/public/robots.txt
      new file mode 100644
      index 00000000..4206b878
      --- /dev/null
      +++ b/public/robots.txt
      @@ -0,0 +1 @@
      +User-agent: * Allow: /
      \ No newline at end of file
      
      From 227683be9fbddbd646c005face523dadf297a49a Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Thu, 21 Mar 2013 19:17:43 -0500
      Subject: [PATCH 57/71] Remove fallback locale.
      
      ---
       app/config/app.php | 13 -------------
       1 file changed, 13 deletions(-)
      
      diff --git a/app/config/app.php b/app/config/app.php
      index 4b6530da..205d9568 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -41,19 +41,6 @@
       
       	'locale' => 'en',
       
      -	/*
      -	|--------------------------------------------------------------------------
      -	| Application Fallback Locale
      -	|--------------------------------------------------------------------------
      -	|
      -	| The fallback locale determines the locale to use when the current one
      -	| is not available. You may change the value to correspond to any of
      -	| the language folders that are provided through your application.
      -	|
      -	*/
      -
      -	'fallback_locale' => 'en',
      -
       	/*
       	|--------------------------------------------------------------------------
       	| Encryption Key
      
      From 25a84bc000336a84e8e4f2ea0b57cdcfb8db7ab8 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Mon, 25 Mar 2013 08:32:19 -0500
      Subject: [PATCH 58/71] Change how bootstrap file is loaded.
      
      ---
       bootstrap/start.php | 4 +++-
       1 file changed, 3 insertions(+), 1 deletion(-)
      
      diff --git a/bootstrap/start.php b/bootstrap/start.php
      index bf3cc6b3..f418a138 100644
      --- a/bootstrap/start.php
      +++ b/bootstrap/start.php
      @@ -54,7 +54,9 @@
       |
       */
       
      -require $app->getBootstrapFile();
      +$framework = __DIR__.'/../vendor/laravel/framework/src';
      +
      +require $framework.'/Illuminate/Foundation/start.php';
       
       /*
       |--------------------------------------------------------------------------
      
      From 17b199b6f69b236f55d2cd3eedf02708c11e327b Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Tue, 26 Mar 2013 09:23:41 -0500
      Subject: [PATCH 59/71] Add storage path configuration.
      
      ---
       app/start/global.php |  2 +-
       bootstrap/paths.php  | 13 +++++++++++++
       2 files changed, 14 insertions(+), 1 deletion(-)
      
      diff --git a/app/start/global.php b/app/start/global.php
      index d9bd0b9c..414fe48c 100644
      --- a/app/start/global.php
      +++ b/app/start/global.php
      @@ -32,7 +32,7 @@
       
       $logFile = 'log-'.php_sapi_name().'.txt';
       
      -Log::useDailyFiles(__DIR__.'/../storage/logs/'.$logFile);
      +Log::useDailyFiles(storage_path().'/logs/'.$logFile);
       
       /*
       |--------------------------------------------------------------------------
      diff --git a/bootstrap/paths.php b/bootstrap/paths.php
      index 19f47434..5a1f640b 100644
      --- a/bootstrap/paths.php
      +++ b/bootstrap/paths.php
      @@ -41,4 +41,17 @@
       
       	'base' => __DIR__.'/..',
       
      +	/*
      +	|--------------------------------------------------------------------------
      +	| Storage Path
      +	|--------------------------------------------------------------------------
      +	|
      +	| The storage path is used by Laravel to store cached Blade views, logs
      +	| and other pieces of information. You may modify the path here when
      +	| you want to change the location of this directory for your apps.
      +	|
      +	*/
      +
      +	'storage' => __DIR__.'/../app/storage',
      +
       );
      
      From cf9c6f97cea2f92afac89d0e0dcae4d3afbda3fb Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Tue, 26 Mar 2013 10:32:55 -0500
      Subject: [PATCH 60/71] Add route list service provider.
      
      ---
       app/config/app.php | 1 +
       1 file changed, 1 insertion(+)
      
      diff --git a/app/config/app.php b/app/config/app.php
      index 205d9568..b6ad4d7d 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -90,6 +90,7 @@
       		'Illuminate\Queue\QueueServiceProvider',
       		'Illuminate\Redis\RedisServiceProvider',
       		'Illuminate\Auth\Reminders\ReminderServiceProvider',
      +		'Illuminate\Foundation\Providers\RouteListServiceProvider',
       		'Illuminate\Database\SeedServiceProvider',
       		'Illuminate\Foundation\Providers\ServerServiceProvider',
       		'Illuminate\Session\SessionServiceProvider',
      
      From 857dd663fdb8590b5f6a327747473c9cd6e33c16 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Tue, 26 Mar 2013 11:22:41 -0500
      Subject: [PATCH 61/71] Add driver to mail config.
      
      ---
       app/config/mail.php | 15 +++++++++++++++
       1 file changed, 15 insertions(+)
      
      diff --git a/app/config/mail.php b/app/config/mail.php
      index e793d886..676713f5 100644
      --- a/app/config/mail.php
      +++ b/app/config/mail.php
      @@ -2,6 +2,21 @@
       
       return array(
       
      +	/*
      +	|--------------------------------------------------------------------------
      +	| Mail Driver
      +	|--------------------------------------------------------------------------
      +	|
      +	| Laravel supports both SMTP and PHP's "mail" function as drivers for the
      +	| sending of e-mail. You may specify which one you're using throughout
      +	| your application here. By default, Laravel is setup for SMTP mail.
      +	|
      +	| Supported: "smtp", "mail"
      +	|
      +	*/
      +
      +	'driver' => 'smtp',
      +
       	/*
       	|--------------------------------------------------------------------------
       	| SMTP Host Address
      
      From 724e0e026de786d898500b652a58f55d7a375db7 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Tue, 26 Mar 2013 15:07:06 -0500
      Subject: [PATCH 62/71] Update Html alias.
      
      ---
       app/config/app.php | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/app/config/app.php b/app/config/app.php
      index b6ad4d7d..826794dd 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -144,7 +144,7 @@
       		'File'            => 'Illuminate\Support\Facades\File',
       		'Form'            => 'Illuminate\Support\Facades\Form',
       		'Hash'            => 'Illuminate\Support\Facades\Hash',
      -		'Html'            => 'Illuminate\Html\HtmlBuilder',
      +		'Html'            => 'Illuminate\Support\Facades\Html',
       		'Input'           => 'Illuminate\Support\Facades\Input',
       		'Lang'            => 'Illuminate\Support\Facades\Lang',
       		'Log'             => 'Illuminate\Support\Facades\Log',
      
      From be16de2a2feb151a20cc4f867b1de23e87ef5bb8 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Wed, 27 Mar 2013 10:12:38 -0500
      Subject: [PATCH 63/71] Switch default mail config to Mailgun.
      
      ---
       app/config/mail.php | 4 ++--
       1 file changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/app/config/mail.php b/app/config/mail.php
      index 676713f5..7b7dff67 100644
      --- a/app/config/mail.php
      +++ b/app/config/mail.php
      @@ -28,7 +28,7 @@
       	|
       	*/
       
      -	'host' => 'smtp.postmarkapp.com',
      +	'host' => 'smtp.mailgun.org',
       
       	/*
       	|--------------------------------------------------------------------------
      @@ -41,7 +41,7 @@
       	|
       	*/
       
      -	'port' => 2525,
      +	'port' => 587,
       
       	/*
       	|--------------------------------------------------------------------------
      
      From 77d748a145c6611b20d3f10bca598041505a4107 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Thu, 28 Mar 2013 11:20:48 -0500
      Subject: [PATCH 64/71] Unguard all Eloquent attributes in seeder.
      
      ---
       app/database/seeds/DatabaseSeeder.php | 2 ++
       1 file changed, 2 insertions(+)
      
      diff --git a/app/database/seeds/DatabaseSeeder.php b/app/database/seeds/DatabaseSeeder.php
      index 8a3cacc1..6a8c204c 100644
      --- a/app/database/seeds/DatabaseSeeder.php
      +++ b/app/database/seeds/DatabaseSeeder.php
      @@ -9,6 +9,8 @@ class DatabaseSeeder extends Seeder {
       	 */
       	public function run()
       	{
      +		Eloquent::unguard();
      +
       		// $this->call('UserTableSeeder');
       	}
       
      
      From 0c2389ccb31cc888eb1dcb5f129e255a2a0574df Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Thu, 28 Mar 2013 15:43:38 -0500
      Subject: [PATCH 65/71] Fix language lines.
      
      ---
       app/lang/en/validation.php | 6 +++---
       1 file changed, 3 insertions(+), 3 deletions(-)
      
      diff --git a/app/lang/en/validation.php b/app/lang/en/validation.php
      index e25756cd..af644061 100644
      --- a/app/lang/en/validation.php
      +++ b/app/lang/en/validation.php
      @@ -38,9 +38,9 @@
       	"integer"         => "The :attribute must be an integer.",
       	"ip"              => "The :attribute must be a valid IP address.",
       	"max"             => array(
      -		"numeric"     => "The :attribute must be less than :max.",
      -		"file"        => "The :attribute must be less than :max kilobytes.",
      -		"string"      => "The :attribute must be less than :max characters.",
      +		"numeric"     => "The :attribute may not be greater than :max.",
      +		"file"        => "The :attribute may not be greater than :max kilobytes.",
      +		"string"      => "The :attribute may not be greater than :max characters.",
       	),
       	"mimes"           => "The :attribute must be a file of type: :values.",
       	"min"             => array(
      
      From 18cda5037ae4d500d59e43dced68d63b20c5c791 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Thu, 28 Mar 2013 16:07:28 -0500
      Subject: [PATCH 66/71] Move location of LARAVEL_START.
      
      ---
       bootstrap/autoload.php | 2 ++
       public/index.php       | 2 --
       2 files changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php
      index b2043b78..626612a2 100644
      --- a/bootstrap/autoload.php
      +++ b/bootstrap/autoload.php
      @@ -1,5 +1,7 @@
       <?php
       
      +define('LARAVEL_START', microtime(true));
      +
       /*
       |--------------------------------------------------------------------------
       | Register The Composer Auto Loader
      diff --git a/public/index.php b/public/index.php
      index b16ebf0b..cf7f302f 100644
      --- a/public/index.php
      +++ b/public/index.php
      @@ -6,8 +6,6 @@
        * @author   Taylor Otwell <taylorotwell@gmail.com>
        */
       
      -define('LARAVEL_START', microtime(true));
      -
       /*
       |--------------------------------------------------------------------------
       | Register The Auto Loader
      
      From d29282726d39e95347a26c660b6feb7c5ef92496 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Thu, 28 Mar 2013 16:27:29 -0500
      Subject: [PATCH 67/71] Add commands to loader.
      
      ---
       app/start/global.php | 1 +
       1 file changed, 1 insertion(+)
      
      diff --git a/app/start/global.php b/app/start/global.php
      index 414fe48c..f85b9bae 100644
      --- a/app/start/global.php
      +++ b/app/start/global.php
      @@ -13,6 +13,7 @@
       
       ClassLoader::addDirectories(array(
       
      +	app_path().'/commands',
       	app_path().'/controllers',
       	app_path().'/models',
       	app_path().'/database/seeds',
      
      From 1ba8e90b706fef9551e56b17e79a1b2388016858 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Fri, 29 Mar 2013 07:52:46 -0500
      Subject: [PATCH 68/71] Use storage_path() helper in configuration files.
      
      ---
       app/config/app.php     | 2 +-
       app/config/cache.php   | 2 +-
       app/config/session.php | 2 +-
       3 files changed, 3 insertions(+), 3 deletions(-)
      
      diff --git a/app/config/app.php b/app/config/app.php
      index 826794dd..ca18595f 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -113,7 +113,7 @@
       	|
       	*/
       
      -	'manifest' => __DIR__.'/../storage/meta',
      +	'manifest' => storage_path().'/meta',
       
       	/*
       	|--------------------------------------------------------------------------
      diff --git a/app/config/cache.php b/app/config/cache.php
      index f55ca145..ce898423 100644
      --- a/app/config/cache.php
      +++ b/app/config/cache.php
      @@ -28,7 +28,7 @@
       	|
       	*/
       
      -	'path' => __DIR__.'/../storage/cache',
      +	'path' => storage_path().'/cache',
       
       	/*
       	|--------------------------------------------------------------------------
      diff --git a/app/config/session.php b/app/config/session.php
      index c37fd837..c4a3a093 100644
      --- a/app/config/session.php
      +++ b/app/config/session.php
      @@ -42,7 +42,7 @@
       	|
       	*/
       
      -	'files' => __DIR__.'/../storage/sessions',
      +	'files' => storage_path().'/sessions',
       
       	/*
       	|--------------------------------------------------------------------------
      
      From 1a6230b82aa5a17341715e82ab99723d9351791d Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Fri, 29 Mar 2013 07:54:06 -0500
      Subject: [PATCH 69/71] Remove extra not_in.
      
      ---
       app/lang/en/validation.php | 1 -
       1 file changed, 1 deletion(-)
      
      diff --git a/app/lang/en/validation.php b/app/lang/en/validation.php
      index dd979e88..a6107907 100644
      --- a/app/lang/en/validation.php
      +++ b/app/lang/en/validation.php
      @@ -35,7 +35,6 @@
       	"exists"          => "The selected :attribute is invalid.",
       	"image"           => "The :attribute must be an image.",
       	"in"              => "The selected :attribute is invalid.",
      -	"not_in"          => "The selected :attribute is invalid.",
       	"integer"         => "The :attribute must be an integer.",
       	"ip"              => "The :attribute must be a valid IP address.",
       	"max"             => array(
      
      From f0b8d2cc9dee996baf79970d0c4e156e0cbdc77e Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Fri, 29 Mar 2013 15:48:32 -0500
      Subject: [PATCH 70/71] Added locales configuration.
      
      ---
       app/config/app.php | 13 +++++++++++++
       1 file changed, 13 insertions(+)
      
      diff --git a/app/config/app.php b/app/config/app.php
      index ca18595f..ceabe927 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -41,6 +41,19 @@
       
       	'locale' => 'en',
       
      +	/*
      +	|--------------------------------------------------------------------------
      +	| Routable Locales
      +	|--------------------------------------------------------------------------
      +	|
      +	| Here you may list the locales that are "routable" for your application.
      +	| When a request with a URI beginning with one of the locales is sent
      +	| to the application, the "default" locale will be set accordingly.
      +	|
      +	*/
      +
      +	'locales' => array(),
      +
       	/*
       	|--------------------------------------------------------------------------
       	| Encryption Key
      
      From 67488916f46a00bb578b6b32308be5ef727ec1b4 Mon Sep 17 00:00:00 2001
      From: Taylor Otwell <taylorotwell@gmail.com>
      Date: Sat, 30 Mar 2013 08:46:49 -0500
      Subject: [PATCH 71/71] Remove locales.
      
      ---
       app/config/app.php | 13 -------------
       1 file changed, 13 deletions(-)
      
      diff --git a/app/config/app.php b/app/config/app.php
      index ceabe927..ca18595f 100644
      --- a/app/config/app.php
      +++ b/app/config/app.php
      @@ -41,19 +41,6 @@
       
       	'locale' => 'en',
       
      -	/*
      -	|--------------------------------------------------------------------------
      -	| Routable Locales
      -	|--------------------------------------------------------------------------
      -	|
      -	| Here you may list the locales that are "routable" for your application.
      -	| When a request with a URI beginning with one of the locales is sent
      -	| to the application, the "default" locale will be set accordingly.
      -	|
      -	*/
      -
      -	'locales' => array(),
      -
       	/*
       	|--------------------------------------------------------------------------
       	| Encryption Key